diff --git a/Gopkg.lock b/Gopkg.lock index 198c60b2d5a..4d5f6ca0a46 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -27,7 +27,37 @@ [[projects]] name = "github.com/aws/aws-sdk-go" - packages = ["aws","aws/awserr","aws/awsutil","aws/client","aws/client/metadata","aws/corehandlers","aws/credentials","aws/credentials/ec2rolecreds","aws/credentials/endpointcreds","aws/credentials/stscreds","aws/defaults","aws/ec2metadata","aws/endpoints","aws/request","aws/session","aws/signer/v4","internal/shareddefaults","private/protocol","private/protocol/ec2query","private/protocol/query","private/protocol/query/queryutil","private/protocol/rest","private/protocol/restxml","private/protocol/xml/xmlutil","service/cloudwatch","service/ec2","service/ec2/ec2iface","service/s3","service/sts"] + packages = [ + "aws", + "aws/awserr", + "aws/awsutil", + "aws/client", + "aws/client/metadata", + "aws/corehandlers", + "aws/credentials", + "aws/credentials/ec2rolecreds", + "aws/credentials/endpointcreds", + "aws/credentials/stscreds", + "aws/defaults", + "aws/ec2metadata", + "aws/endpoints", + "aws/request", + "aws/session", + "aws/signer/v4", + "internal/shareddefaults", + "private/protocol", + "private/protocol/ec2query", + "private/protocol/query", + "private/protocol/query/queryutil", + "private/protocol/rest", + "private/protocol/restxml", + "private/protocol/xml/xmlutil", + "service/cloudwatch", + "service/ec2", + "service/ec2/ec2iface", + "service/s3", + "service/sts" + ] revision = "decd990ddc5dcdf2f73309cbcab90d06b996ca28" version = "v1.12.67" @@ -112,7 +142,13 @@ [[projects]] branch = "master" name = "github.com/go-macaron/session" - packages = [".","memcache","mysql","postgres","redis"] + packages = [ + ".", + "memcache", + "mysql", + "postgres", + "redis" + ] revision = "b8e286a0dba8f4999042d6b258daf51b31d08938" [[projects]] @@ -145,7 +181,13 @@ [[projects]] branch = "master" name = "github.com/golang/protobuf" - packages = ["proto","ptypes","ptypes/any","ptypes/duration","ptypes/timestamp"] + packages = [ + "proto", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/timestamp" + ] revision = "c65a0412e71e8b9b3bfd22925720d23c0f054237" [[projects]] @@ -214,7 +256,10 @@ [[projects]] name = "github.com/klauspost/compress" - packages = ["flate","gzip"] + packages = [ + "flate", + "gzip" + ] revision = "6c8db69c4b49dd4df1fff66996cf556176d0b9bf" version = "v1.2.1" @@ -245,7 +290,10 @@ [[projects]] branch = "master" name = "github.com/lib/pq" - packages = [".","oid"] + packages = [ + ".", + "oid" + ] revision = "61fe37aa2ee24fabcdbe5c4ac1d4ac566f88f345" [[projects]] @@ -280,7 +328,11 @@ [[projects]] name = "github.com/opentracing/opentracing-go" - packages = [".","ext","log"] + packages = [ + ".", + "ext", + "log" + ] revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" version = "v1.0.2" @@ -292,7 +344,12 @@ [[projects]] name = "github.com/prometheus/client_golang" - packages = ["api","api/prometheus/v1","prometheus","prometheus/promhttp"] + packages = [ + "api", + "api/prometheus/v1", + "prometheus", + "prometheus/promhttp" + ] revision = "967789050ba94deca04a5e84cce8ad472ce313c1" version = "v0.9.0-pre1" @@ -305,13 +362,22 @@ [[projects]] branch = "master" name = "github.com/prometheus/common" - packages = ["expfmt","internal/bitbucket.org/ww/goautoneg","model"] + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model" + ] revision = "89604d197083d4781071d3c65855d24ecfb0a563" [[projects]] branch = "master" name = "github.com/prometheus/procfs" - packages = [".","internal/util","nfsd","xfs"] + packages = [ + ".", + "internal/util", + "nfsd", + "xfs" + ] revision = "85fadb6e89903ef7cca6f6a804474cd5ea85b6e1" [[projects]] @@ -328,19 +394,41 @@ [[projects]] name = "github.com/smartystreets/assertions" - packages = [".","internal/go-render/render","internal/oglematchers"] + packages = [ + ".", + "internal/go-render/render", + "internal/oglematchers" + ] revision = "0b37b35ec7434b77e77a4bb29b79677cced992ea" version = "1.8.1" [[projects]] name = "github.com/smartystreets/goconvey" - packages = ["convey","convey/gotest","convey/reporting"] + packages = [ + "convey", + "convey/gotest", + "convey/reporting" + ] revision = "9e8dc3f972df6c8fcc0375ef492c24d0bb204857" version = "1.6.3" [[projects]] name = "github.com/uber/jaeger-client-go" - packages = [".","config","internal/baggage","internal/baggage/remote","internal/spanlog","log","rpcmetrics","thrift-gen/agent","thrift-gen/baggage","thrift-gen/jaeger","thrift-gen/sampling","thrift-gen/zipkincore","utils"] + packages = [ + ".", + "config", + "internal/baggage", + "internal/baggage/remote", + "internal/spanlog", + "log", + "rpcmetrics", + "thrift-gen/agent", + "thrift-gen/baggage", + "thrift-gen/jaeger", + "thrift-gen/sampling", + "thrift-gen/zipkincore", + "utils" + ] revision = "3ac96c6e679cb60a74589b0d0aa7c70a906183f7" version = "v2.11.2" @@ -352,7 +440,10 @@ [[projects]] name = "github.com/yudai/gojsondiff" - packages = [".","formatter"] + packages = [ + ".", + "formatter" + ] revision = "7b1b7adf999dab73a6eb02669c3d82dbb27a3dd6" version = "1.0.0" @@ -371,13 +462,28 @@ [[projects]] branch = "master" name = "golang.org/x/net" - packages = ["context","context/ctxhttp","http2","http2/hpack","idna","internal/timeseries","lex/httplex","trace"] + packages = [ + "context", + "context/ctxhttp", + "http2", + "http2/hpack", + "idna", + "internal/timeseries", + "lex/httplex", + "trace" + ] revision = "5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec" [[projects]] branch = "master" name = "golang.org/x/oauth2" - packages = [".","google","internal","jws","jwt"] + packages = [ + ".", + "google", + "internal", + "jws", + "jwt" + ] revision = "b28fcf2b08a19742b43084fb40ab78ac6c3d8067" [[projects]] @@ -395,12 +501,39 @@ [[projects]] branch = "master" name = "golang.org/x/text" - packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"] + packages = [ + "collate", + "collate/build", + "internal/colltab", + "internal/gen", + "internal/tag", + "internal/triegen", + "internal/ucd", + "language", + "secure/bidirule", + "transform", + "unicode/bidi", + "unicode/cldr", + "unicode/norm", + "unicode/rangetable" + ] revision = "e19ae1496984b1c655b8044a65c0300a3c878dd3" [[projects]] name = "google.golang.org/appengine" - packages = [".","cloudsql","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/modules","internal/remote_api","internal/urlfetch","urlfetch"] + packages = [ + ".", + "cloudsql", + "internal", + "internal/app_identity", + "internal/base", + "internal/datastore", + "internal/log", + "internal/modules", + "internal/remote_api", + "internal/urlfetch", + "urlfetch" + ] revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" version = "v1.0.0" @@ -412,7 +545,32 @@ [[projects]] name = "google.golang.org/grpc" - packages = [".","balancer","balancer/base","balancer/roundrobin","codes","connectivity","credentials","encoding","grpclb/grpc_lb_v1/messages","grpclog","health","health/grpc_health_v1","internal","keepalive","metadata","naming","peer","resolver","resolver/dns","resolver/passthrough","stats","status","tap","transport"] + packages = [ + ".", + "balancer", + "balancer/base", + "balancer/roundrobin", + "codes", + "connectivity", + "credentials", + "encoding", + "grpclb/grpc_lb_v1/messages", + "grpclog", + "health", + "health/grpc_health_v1", + "internal", + "keepalive", + "metadata", + "naming", + "peer", + "resolver", + "resolver/dns", + "resolver/passthrough", + "stats", + "status", + "tap", + "transport" + ] revision = "6b51017f791ae1cfbec89c52efdf444b13b550ef" version = "v1.9.2" @@ -467,6 +625,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "6dc0af6501d9038e9803db1dc8b2876a86524920418dc0159bb3a23e2fc3e487" + inputs-digest = "98e8d8f5fb21fe448aeb3db41c9fed85fe3bf80400e553211cf39a9c05720e01" solver-name = "gps-cdcl" solver-version = 1 diff --git a/vendor/cloud.google.com/go/CONTRIBUTING.md b/vendor/cloud.google.com/go/CONTRIBUTING.md deleted file mode 100644 index 95c94a48b42..00000000000 --- a/vendor/cloud.google.com/go/CONTRIBUTING.md +++ /dev/null @@ -1,152 +0,0 @@ -# Contributing - -1. Sign one of the contributor license agreements below. -1. `go get golang.org/x/review/git-codereview` to install the code reviewing tool. - 1. You will need to ensure that your `GOBIN` directory (by default - `$GOPATH/bin`) is in your `PATH` so that git can find the command. - 1. If you would like, you may want to set up aliases for git-codereview, - such that `git codereview change` becomes `git change`. See the - [godoc](https://godoc.org/golang.org/x/review/git-codereview) for details. - 1. Should you run into issues with the git-codereview tool, please note - that all error messages will assume that you have set up these - aliases. -1. Get the cloud package by running `go get -d cloud.google.com/go`. - 1. If you have already checked out the source, make sure that the remote git - origin is https://code.googlesource.com/gocloud: - - git remote set-url origin https://code.googlesource.com/gocloud -1. Make sure your auth is configured correctly by visiting - https://code.googlesource.com, clicking "Generate Password", and following - the directions. -1. Make changes and create a change by running `git codereview change `, -provide a commit message, and use `git codereview mail` to create a Gerrit CL. -1. Keep amending to the change with `git codereview change` and mail as your receive -feedback. Each new mailed amendment will create a new patch set for your change in Gerrit. - -## Integration Tests - -In addition to the unit tests, you may run the integration test suite. - -To run the integrations tests, creating and configuration of a project in the -Google Developers Console is required. - -After creating a project, you must [create a service account](https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount). -Ensure the project-level **Owner** -[IAM role](console.cloud.google.com/iam-admin/iam/project) role is added to the -service account. Alternatively, the account can be granted all of the following roles: -- **Editor** -- **Logs Configuration Writer** -- **PubSub Admin** - -Once you create a project, set the following environment variables to be able to -run the against the actual APIs. - -- **GCLOUD_TESTS_GOLANG_PROJECT_ID**: Developers Console project's ID (e.g. bamboo-shift-455) -- **GCLOUD_TESTS_GOLANG_KEY**: The path to the JSON key file. -- **GCLOUD_TESTS_API_KEY**: Your API key. - -Firestore requires a different project and key: - -- **GCLOUD_TESTS_GOLANG_FIRESTORE_PROJECT_ID**: Developers Console project's ID - supporting Firestore -- **GCLOUD_TESTS_GOLANG_FIRESTORE_KEY**: The path to the JSON key file. - -Install the [gcloud command-line tool][gcloudcli] to your machine and use it -to create some resources used in integration tests. - -From the project's root directory: - -``` sh -# Set the default project in your env. -$ gcloud config set project $GCLOUD_TESTS_GOLANG_PROJECT_ID - -# Authenticate the gcloud tool with your account. -$ gcloud auth login - -# Create the indexes used in the datastore integration tests. -$ gcloud preview datastore create-indexes datastore/testdata/index.yaml - -# Create a Google Cloud storage bucket with the same name as your test project, -# and with the Stackdriver Logging service account as owner, for the sink -# integration tests in logging. -$ gsutil mb gs://$GCLOUD_TESTS_GOLANG_PROJECT_ID -$ gsutil acl ch -g cloud-logs@google.com:O gs://$GCLOUD_TESTS_GOLANG_PROJECT_ID - -# Create a PubSub topic for integration tests of storage notifications. -$ gcloud beta pubsub topics create go-storage-notification-test - -# Create a Spanner instance for the spanner integration tests. -$ gcloud beta spanner instances create go-integration-test --config regional-us-central1 --nodes 1 --description 'Instance for go client test' -# NOTE: Spanner instances are priced by the node-hour, so you may want to delete -# the instance after testing with 'gcloud beta spanner instances delete'. - - -``` - -Once you've set the environment variables, you can run the integration tests by -running: - -``` sh -$ go test -v cloud.google.com/go/... -``` - -## Contributor License Agreements - -Before we can accept your pull requests you'll need to sign a Contributor -License Agreement (CLA): - -- **If you are an individual writing original source code** and **you own the -intellectual property**, then you'll need to sign an [individual CLA][indvcla]. -- **If you work for a company that wants to allow you to contribute your -work**, then you'll need to sign a [corporate CLA][corpcla]. - -You can sign these electronically (just scroll to the bottom). After that, -we'll be able to accept your pull requests. - -## Contributor Code of Conduct - -As contributors and maintainers of this project, -and in the interest of fostering an open and welcoming community, -we pledge to respect all people who contribute through reporting issues, -posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. - -We are committed to making participation in this project -a harassment-free experience for everyone, -regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, -body size, race, ethnicity, age, religion, or nationality. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing other's private information, -such as physical or electronic -addresses, without explicit permission -* Other unethical or unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct. -By adopting this Code of Conduct, -project maintainers commit themselves to fairly and consistently -applying these principles to every aspect of managing this project. -Project maintainers who do not follow or enforce the Code of Conduct -may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior -may be reported by opening an issue -or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, -available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) - -[gcloudcli]: https://developers.google.com/cloud/sdk/gcloud/ -[indvcla]: https://developers.google.com/open-source/cla/individual -[corpcla]: https://developers.google.com/open-source/cla/corporate diff --git a/vendor/cloud.google.com/go/MIGRATION.md b/vendor/cloud.google.com/go/MIGRATION.md deleted file mode 100644 index 791210de197..00000000000 --- a/vendor/cloud.google.com/go/MIGRATION.md +++ /dev/null @@ -1,54 +0,0 @@ -# Code Changes - -## v0.10.0 - -- pubsub: Replace - - ``` - sub.ModifyPushConfig(ctx, pubsub.PushConfig{Endpoint: "https://example.com/push"}) - ``` - - with - - ``` - sub.Update(ctx, pubsub.SubscriptionConfigToUpdate{ - PushConfig: &pubsub.PushConfig{Endpoint: "https://example.com/push"}, - }) - ``` - -- trace: traceGRPCServerInterceptor will be provided from *trace.Client. -Given an initialized `*trace.Client` named `tc`, instead of - - ``` - s := grpc.NewServer(grpc.UnaryInterceptor(trace.GRPCServerInterceptor(tc))) - ``` - - write - - ``` - s := grpc.NewServer(grpc.UnaryInterceptor(tc.GRPCServerInterceptor())) - ``` - -- trace trace.GRPCClientInterceptor will also provided from *trace.Client. -Instead of - - ``` - conn, err := grpc.Dial(srv.Addr, grpc.WithUnaryInterceptor(trace.GRPCClientInterceptor())) - ``` - - write - - ``` - conn, err := grpc.Dial(srv.Addr, grpc.WithUnaryInterceptor(tc.GRPCClientInterceptor())) - ``` - -- trace: We removed the deprecated `trace.EnableGRPCTracing`. Use the gRPC -interceptor as a dial option as shown below when initializing Cloud package -clients: - - ``` - c, err := pubsub.NewClient(ctx, "project-id", option.WithGRPCDialOption(grpc.WithUnaryInterceptor(tc.GRPCClientInterceptor()))) - if err != nil { - ... - } - ``` diff --git a/vendor/cloud.google.com/go/README.md b/vendor/cloud.google.com/go/README.md deleted file mode 100644 index ada5f57a4d9..00000000000 --- a/vendor/cloud.google.com/go/README.md +++ /dev/null @@ -1,546 +0,0 @@ -# Google Cloud Client Libraries for Go - -[![GoDoc](https://godoc.org/cloud.google.com/go?status.svg)](https://godoc.org/cloud.google.com/go) - -Go packages for [Google Cloud Platform](https://cloud.google.com) services. - -``` go -import "cloud.google.com/go" -``` - -To install the packages on your system, - -``` -$ go get -u cloud.google.com/go/... -``` - -**NOTE:** Some of these packages are under development, and may occasionally -make backwards-incompatible changes. - -**NOTE:** Github repo is a mirror of [https://code.googlesource.com/gocloud](https://code.googlesource.com/gocloud). - - * [News](#news) - * [Supported APIs](#supported-apis) - * [Go Versions Supported](#go-versions-supported) - * [Authorization](#authorization) - * [Cloud Datastore](#cloud-datastore-) - * [Cloud Storage](#cloud-storage-) - * [Cloud Pub/Sub](#cloud-pub-sub-) - * [Cloud BigQuery](#cloud-bigquery-) - * [Stackdriver Logging](#stackdriver-logging-) - * [Cloud Spanner](#cloud-spanner-) - - -## News - -_January 18, 2018_ - -*v0.18.0* - -- bigquery: - - Marked stable. - - Schema inference of nullable fields supported. - - Added TimePartitioning to QueryConfig. - -- firestore: Data provided to DocumentRef.Set with a Merge option can contain - Delete sentinels. - -- logging: Clients can accept parent resources other than projects. - -- pubsub: - - pubsub/pstest: A lighweight fake for pubsub. Experimental; feedback welcome. - - Support updating more subscription metadata: AckDeadline, - RetainAckedMessages and RetentionDuration. - -- oslogin/apiv1beta: New client for the Cloud OS Login API. - -- rpcreplay: A package for recording and replaying gRPC traffic. - -- spanner: - - Add a ReadWithOptions that supports a row limit, as well as an index. - - Support query plan and execution statistics. - - Added [OpenCensus](http://opencensus.io) support. - -- storage: Clarify checksum validation for gzipped files (it is not validated - when the file is served uncompressed). - - -_December 11, 2017_ - -*v0.17.0* - -- firestore BREAKING CHANGES: - - Remove UpdateMap and UpdateStruct; rename UpdatePaths to Update. - Change - `docref.UpdateMap(ctx, map[string]interface{}{"a.b", 1})` - to - `docref.Update(ctx, []firestore.Update{{Path: "a.b", Value: 1}})` - - Change - `docref.UpdateStruct(ctx, []string{"Field"}, aStruct)` - to - `docref.Update(ctx, []firestore.Update{{Path: "Field", Value: aStruct.Field}})` - - Rename MergePaths to Merge; require args to be FieldPaths - - A value stored as an integer can be read into a floating-point field, and vice versa. -- bigtable/cmd/cbt: - - Support deleting a column. - - Add regex option for row read. -- spanner: Mark stable. -- storage: - - Add Reader.ContentEncoding method. - - Fix handling of SignedURL headers. -- bigquery: - - If Uploader.Put is called with no rows, it returns nil without making a - call. - - Schema inference supports the "nullable" option in struct tags for - non-required fields. - - TimePartitioning supports "Field". - - -_October 30, 2017_ - -*v0.16.0* - -- Other bigquery changes: - - `JobIterator.Next` returns `*Job`; removed `JobInfo` (BREAKING CHANGE). - - UseStandardSQL is deprecated; set UseLegacySQL to true if you need - Legacy SQL. - - Uploader.Put will generate a random insert ID if you do not provide one. - - Support time partitioning for load jobs. - - Support dry-run queries. - - A `Job` remembers its last retrieved status. - - Support retrieving job configuration. - - Support labels for jobs and tables. - - Support dataset access lists. - - Improve support for external data sources, including data from Bigtable and - Google Sheets, and tables with external data. - - Support updating a table's view configuration. - - Fix uploading civil times with nanoseconds. - -- storage: - - Support PubSub notifications. - - Support Requester Pays buckets. - -- profiler: Support goroutine and mutex profile types. - - -_October 3, 2017_ - -*v0.15.0* - -- firestore: beta release. See the - [announcement](https://firebase.googleblog.com/2017/10/introducing-cloud-firestore.html). - -- errorreporting: The existing package has been redesigned. - -- errors: This package has been removed. Use errorreporting. - - -[Older news](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/old-news.md) - -## Supported APIs - -Google API | Status | Package ----------------------------------|--------------|----------------------------------------------------------- -[BigQuery][cloud-bigquery] | stable | [`cloud.google.com/go/bigquery`][cloud-bigquery-ref] -[Bigtable][cloud-bigtable] | beta | [`cloud.google.com/go/bigtable`][cloud-bigtable-ref] -[Container][cloud-container] | alpha | [`cloud.google.com/go/container/apiv1`][cloud-container-ref] -[Data Loss Prevention][cloud-dlp]| alpha | [`cloud.google.com/go/dlp/apiv2beta1`][cloud-dlp-ref] -[Datastore][cloud-datastore] | stable | [`cloud.google.com/go/datastore`][cloud-datastore-ref] -[Debugger][cloud-debugger] | alpha | [`cloud.google.com/go/debugger/apiv2`][cloud-debugger-ref] -[ErrorReporting][cloud-errors] | alpha | [`cloud.google.com/go/errorreporting`][cloud-errors-ref] -[Firestore][cloud-firestore] | beta | [`cloud.google.com/go/firestore`][cloud-firestore-ref] -[Language][cloud-language] | stable | [`cloud.google.com/go/language/apiv1`][cloud-language-ref] -[Logging][cloud-logging] | stable | [`cloud.google.com/go/logging`][cloud-logging-ref] -[Monitoring][cloud-monitoring] | beta | [`cloud.google.com/go/monitoring/apiv3`][cloud-monitoring-ref] -[OS Login][cloud-oslogin] | alpha | [`cloud.google.com/compute/docs/oslogin/rest`][cloud-oslogin-ref] -[Pub/Sub][cloud-pubsub] | beta | [`cloud.google.com/go/pubsub`][cloud-pubsub-ref] -[Spanner][cloud-spanner] | stable | [`cloud.google.com/go/spanner`][cloud-spanner-ref] -[Speech][cloud-speech] | stable | [`cloud.google.com/go/speech/apiv1`][cloud-speech-ref] -[Storage][cloud-storage] | stable | [`cloud.google.com/go/storage`][cloud-storage-ref] -[Translation][cloud-translation] | stable | [`cloud.google.com/go/translate`][cloud-translation-ref] -[Video Intelligence][cloud-video]| beta | [`cloud.google.com/go/videointelligence/apiv1beta1`][cloud-video-ref] -[Vision][cloud-vision] | stable | [`cloud.google.com/go/vision/apiv1`][cloud-vision-ref] - - -> **Alpha status**: the API is still being actively developed. As a -> result, it might change in backward-incompatible ways and is not recommended -> for production use. -> -> **Beta status**: the API is largely complete, but still has outstanding -> features and bugs to be addressed. There may be minor backwards-incompatible -> changes where necessary. -> -> **Stable status**: the API is mature and ready for production use. We will -> continue addressing bugs and feature requests. - -Documentation and examples are available at -https://godoc.org/cloud.google.com/go - -Visit or join the -[google-api-go-announce group](https://groups.google.com/forum/#!forum/google-api-go-announce) -for updates on these packages. - -## Go Versions Supported - -We support the two most recent major versions of Go. If Google App Engine uses -an older version, we support that as well. You can see which versions are -currently supported by looking at the lines following `go:` in -[`.travis.yml`](.travis.yml). - -## Authorization - -By default, each API will use [Google Application Default Credentials][default-creds] -for authorization credentials used in calling the API endpoints. This will allow your -application to run in many environments without requiring explicit configuration. - -[snip]:# (auth) -```go -client, err := storage.NewClient(ctx) -``` - -To authorize using a -[JSON key file](https://cloud.google.com/iam/docs/managing-service-account-keys), -pass -[`option.WithServiceAccountFile`](https://godoc.org/google.golang.org/api/option#WithServiceAccountFile) -to the `NewClient` function of the desired package. For example: - -[snip]:# (auth-JSON) -```go -client, err := storage.NewClient(ctx, option.WithServiceAccountFile("path/to/keyfile.json")) -``` - -You can exert more control over authorization by using the -[`golang.org/x/oauth2`](https://godoc.org/golang.org/x/oauth2) package to -create an `oauth2.TokenSource`. Then pass -[`option.WithTokenSource`](https://godoc.org/google.golang.org/api/option#WithTokenSource) -to the `NewClient` function: -[snip]:# (auth-ts) -```go -tokenSource := ... -client, err := storage.NewClient(ctx, option.WithTokenSource(tokenSource)) -``` - -## Cloud Datastore [![GoDoc](https://godoc.org/cloud.google.com/go/datastore?status.svg)](https://godoc.org/cloud.google.com/go/datastore) - -- [About Cloud Datastore][cloud-datastore] -- [Activating the API for your project][cloud-datastore-activation] -- [API documentation][cloud-datastore-docs] -- [Go client documentation](https://godoc.org/cloud.google.com/go/datastore) -- [Complete sample program](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/datastore/tasks) - -### Example Usage - -First create a `datastore.Client` to use throughout your application: - -[snip]:# (datastore-1) -```go -client, err := datastore.NewClient(ctx, "my-project-id") -if err != nil { - log.Fatal(err) -} -``` - -Then use that client to interact with the API: - -[snip]:# (datastore-2) -```go -type Post struct { - Title string - Body string `datastore:",noindex"` - PublishedAt time.Time -} -keys := []*datastore.Key{ - datastore.NameKey("Post", "post1", nil), - datastore.NameKey("Post", "post2", nil), -} -posts := []*Post{ - {Title: "Post 1", Body: "...", PublishedAt: time.Now()}, - {Title: "Post 2", Body: "...", PublishedAt: time.Now()}, -} -if _, err := client.PutMulti(ctx, keys, posts); err != nil { - log.Fatal(err) -} -``` - -## Cloud Storage [![GoDoc](https://godoc.org/cloud.google.com/go/storage?status.svg)](https://godoc.org/cloud.google.com/go/storage) - -- [About Cloud Storage][cloud-storage] -- [API documentation][cloud-storage-docs] -- [Go client documentation](https://godoc.org/cloud.google.com/go/storage) -- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/storage) - -### Example Usage - -First create a `storage.Client` to use throughout your application: - -[snip]:# (storage-1) -```go -client, err := storage.NewClient(ctx) -if err != nil { - log.Fatal(err) -} -``` - -[snip]:# (storage-2) -```go -// Read the object1 from bucket. -rc, err := client.Bucket("bucket").Object("object1").NewReader(ctx) -if err != nil { - log.Fatal(err) -} -defer rc.Close() -body, err := ioutil.ReadAll(rc) -if err != nil { - log.Fatal(err) -} -``` - -## Cloud Pub/Sub [![GoDoc](https://godoc.org/cloud.google.com/go/pubsub?status.svg)](https://godoc.org/cloud.google.com/go/pubsub) - -- [About Cloud Pubsub][cloud-pubsub] -- [API documentation][cloud-pubsub-docs] -- [Go client documentation](https://godoc.org/cloud.google.com/go/pubsub) -- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/pubsub) - -### Example Usage - -First create a `pubsub.Client` to use throughout your application: - -[snip]:# (pubsub-1) -```go -client, err := pubsub.NewClient(ctx, "project-id") -if err != nil { - log.Fatal(err) -} -``` - -Then use the client to publish and subscribe: - -[snip]:# (pubsub-2) -```go -// Publish "hello world" on topic1. -topic := client.Topic("topic1") -res := topic.Publish(ctx, &pubsub.Message{ - Data: []byte("hello world"), -}) -// The publish happens asynchronously. -// Later, you can get the result from res: -... -msgID, err := res.Get(ctx) -if err != nil { - log.Fatal(err) -} - -// Use a callback to receive messages via subscription1. -sub := client.Subscription("subscription1") -err = sub.Receive(ctx, func(ctx context.Context, m *pubsub.Message) { - fmt.Println(m.Data) - m.Ack() // Acknowledge that we've consumed the message. -}) -if err != nil { - log.Println(err) -} -``` - -## Cloud BigQuery [![GoDoc](https://godoc.org/cloud.google.com/go/bigquery?status.svg)](https://godoc.org/cloud.google.com/go/bigquery) - -- [About Cloud BigQuery][cloud-bigquery] -- [API documentation][cloud-bigquery-docs] -- [Go client documentation][cloud-bigquery-ref] -- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/bigquery) - -### Example Usage - -First create a `bigquery.Client` to use throughout your application: -[snip]:# (bq-1) -```go -c, err := bigquery.NewClient(ctx, "my-project-ID") -if err != nil { - // TODO: Handle error. -} -``` - -Then use that client to interact with the API: -[snip]:# (bq-2) -```go -// Construct a query. -q := c.Query(` - SELECT year, SUM(number) - FROM [bigquery-public-data:usa_names.usa_1910_2013] - WHERE name = "William" - GROUP BY year - ORDER BY year -`) -// Execute the query. -it, err := q.Read(ctx) -if err != nil { - // TODO: Handle error. -} -// Iterate through the results. -for { - var values []bigquery.Value - err := it.Next(&values) - if err == iterator.Done { - break - } - if err != nil { - // TODO: Handle error. - } - fmt.Println(values) -} -``` - - -## Stackdriver Logging [![GoDoc](https://godoc.org/cloud.google.com/go/logging?status.svg)](https://godoc.org/cloud.google.com/go/logging) - -- [About Stackdriver Logging][cloud-logging] -- [API documentation][cloud-logging-docs] -- [Go client documentation][cloud-logging-ref] -- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/logging) - -### Example Usage - -First create a `logging.Client` to use throughout your application: -[snip]:# (logging-1) -```go -ctx := context.Background() -client, err := logging.NewClient(ctx, "my-project") -if err != nil { - // TODO: Handle error. -} -``` - -Usually, you'll want to add log entries to a buffer to be periodically flushed -(automatically and asynchronously) to the Stackdriver Logging service. -[snip]:# (logging-2) -```go -logger := client.Logger("my-log") -logger.Log(logging.Entry{Payload: "something happened!"}) -``` - -Close your client before your program exits, to flush any buffered log entries. -[snip]:# (logging-3) -```go -err = client.Close() -if err != nil { - // TODO: Handle error. -} -``` - -## Cloud Spanner [![GoDoc](https://godoc.org/cloud.google.com/go/spanner?status.svg)](https://godoc.org/cloud.google.com/go/spanner) - -- [About Cloud Spanner][cloud-spanner] -- [API documentation][cloud-spanner-docs] -- [Go client documentation](https://godoc.org/cloud.google.com/go/spanner) - -### Example Usage - -First create a `spanner.Client` to use throughout your application: - -[snip]:# (spanner-1) -```go -client, err := spanner.NewClient(ctx, "projects/P/instances/I/databases/D") -if err != nil { - log.Fatal(err) -} -``` - -[snip]:# (spanner-2) -```go -// Simple Reads And Writes -_, err = client.Apply(ctx, []*spanner.Mutation{ - spanner.Insert("Users", - []string{"name", "email"}, - []interface{}{"alice", "a@example.com"})}) -if err != nil { - log.Fatal(err) -} -row, err := client.Single().ReadRow(ctx, "Users", - spanner.Key{"alice"}, []string{"email"}) -if err != nil { - log.Fatal(err) -} -``` - - -## Contributing - -Contributions are welcome. Please, see the -[CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/CONTRIBUTING.md) -document for details. We're using Gerrit for our code reviews. Please don't open pull -requests against this repo, new pull requests will be automatically closed. - -Please note that this project is released with a Contributor Code of Conduct. -By participating in this project you agree to abide by its terms. -See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/CONTRIBUTING.md#contributor-code-of-conduct) -for more information. - -[cloud-datastore]: https://cloud.google.com/datastore/ -[cloud-datastore-ref]: https://godoc.org/cloud.google.com/go/datastore -[cloud-datastore-docs]: https://cloud.google.com/datastore/docs -[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate - -[cloud-firestore]: https://cloud.google.com/firestore/ -[cloud-firestore-ref]: https://godoc.org/cloud.google.com/go/firestore -[cloud-firestore-docs]: https://cloud.google.com/firestore/docs -[cloud-firestore-activation]: https://cloud.google.com/firestore/docs/activate - -[cloud-pubsub]: https://cloud.google.com/pubsub/ -[cloud-pubsub-ref]: https://godoc.org/cloud.google.com/go/pubsub -[cloud-pubsub-docs]: https://cloud.google.com/pubsub/docs - -[cloud-storage]: https://cloud.google.com/storage/ -[cloud-storage-ref]: https://godoc.org/cloud.google.com/go/storage -[cloud-storage-docs]: https://cloud.google.com/storage/docs -[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets - -[cloud-bigtable]: https://cloud.google.com/bigtable/ -[cloud-bigtable-ref]: https://godoc.org/cloud.google.com/go/bigtable - -[cloud-bigquery]: https://cloud.google.com/bigquery/ -[cloud-bigquery-docs]: https://cloud.google.com/bigquery/docs -[cloud-bigquery-ref]: https://godoc.org/cloud.google.com/go/bigquery - -[cloud-logging]: https://cloud.google.com/logging/ -[cloud-logging-docs]: https://cloud.google.com/logging/docs -[cloud-logging-ref]: https://godoc.org/cloud.google.com/go/logging - -[cloud-monitoring]: https://cloud.google.com/monitoring/ -[cloud-monitoring-ref]: https://godoc.org/cloud.google.com/go/monitoring/apiv3 - -[cloud-vision]: https://cloud.google.com/vision -[cloud-vision-ref]: https://godoc.org/cloud.google.com/go/vision/apiv1 - -[cloud-language]: https://cloud.google.com/natural-language -[cloud-language-ref]: https://godoc.org/cloud.google.com/go/language/apiv1 - -[cloud-oslogin]: https://cloud.google.com/compute/docs/oslogin/rest -[cloud-oslogin-ref]: https://cloud.google.com/compute/docs/oslogin/rest - -[cloud-speech]: https://cloud.google.com/speech -[cloud-speech-ref]: https://godoc.org/cloud.google.com/go/speech/apiv1 - -[cloud-spanner]: https://cloud.google.com/spanner/ -[cloud-spanner-ref]: https://godoc.org/cloud.google.com/go/spanner -[cloud-spanner-docs]: https://cloud.google.com/spanner/docs - -[cloud-translation]: https://cloud.google.com/translation -[cloud-translation-ref]: https://godoc.org/cloud.google.com/go/translation - -[cloud-video]: https://cloud.google.com/video-intelligence/ -[cloud-video-ref]: https://godoc.org/cloud.google.com/go/videointelligence/apiv1beta1 - -[cloud-errors]: https://cloud.google.com/error-reporting/ -[cloud-errors-ref]: https://godoc.org/cloud.google.com/go/errorreporting - -[cloud-container]: https://cloud.google.com/containers/ -[cloud-container-ref]: https://godoc.org/cloud.google.com/go/container/apiv1 - -[cloud-debugger]: https://cloud.google.com/debugger/ -[cloud-debugger-ref]: https://godoc.org/cloud.google.com/go/debugger/apiv2 - -[cloud-dlp]: https://cloud.google.com/dlp/ -[cloud-dlp-ref]: https://godoc.org/cloud.google.com/go/dlp/apiv2beta1 - -[default-creds]: https://developers.google.com/identity/protocols/application-default-credentials diff --git a/vendor/cloud.google.com/go/cloud.go b/vendor/cloud.google.com/go/cloud.go deleted file mode 100644 index 6ba428dc639..00000000000 --- a/vendor/cloud.google.com/go/cloud.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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. - -// Package cloud is the root of the packages used to access Google Cloud -// Services. See https://godoc.org/cloud.google.com/go for a full list -// of sub-packages. -// -// This package documents how to authorize and authenticate the sub packages. -package cloud // import "cloud.google.com/go" diff --git a/vendor/cloud.google.com/go/keys.tar.enc b/vendor/cloud.google.com/go/keys.tar.enc deleted file mode 100644 index c54408c93a2..00000000000 Binary files a/vendor/cloud.google.com/go/keys.tar.enc and /dev/null differ diff --git a/vendor/cloud.google.com/go/old-news.md b/vendor/cloud.google.com/go/old-news.md deleted file mode 100644 index 0c8a224d0b4..00000000000 --- a/vendor/cloud.google.com/go/old-news.md +++ /dev/null @@ -1,557 +0,0 @@ -_September 28, 2017_ - -*v0.14.0* - -- bigquery BREAKING CHANGES: - - Standard SQL is the default for queries and views. - - `Table.Create` takes `TableMetadata` as a second argument, instead of - options. - - `Dataset.Create` takes `DatasetMetadata` as a second argument. - - `DatasetMetadata` field `ID` renamed to `FullID` - - `TableMetadata` field `ID` renamed to `FullID` - -- Other bigquery changes: - - The client will append a random suffix to a provided job ID if you set - `AddJobIDSuffix` to true in a job config. - - Listing jobs is supported. - - Better retry logic. - -- vision, language, speech: clients are now stable - -- monitoring: client is now beta - -- profiler: - - Rename InstanceName to Instance, ZoneName to Zone - - Auto-detect service name and version on AppEngine. - -_September 8, 2017_ - -*v0.13.0* - -- bigquery: UseLegacySQL options for CreateTable and QueryConfig. Use these - options to continue using Legacy SQL after the client switches its default - to Standard SQL. - -- bigquery: Support for updating dataset labels. - -- bigquery: Set DatasetIterator.ProjectID to list datasets in a project other - than the client's. DatasetsInProject is no longer needed and is deprecated. - -- bigtable: Fail ListInstances when any zones fail. - -- spanner: support decoding of slices of basic types (e.g. []string, []int64, - etc.) - -- logging/logadmin: UpdateSink no longer creates a sink if it is missing - (actually a change to the underlying service, not the client) - -- profiler: Service and ServiceVersion replace Target in Config. - -_August 22, 2017_ - -*v0.12.0* - -- pubsub: Subscription.Receive now uses streaming pull. - -- pubsub: add Client.TopicInProject to access topics in a different project - than the client. - -- errors: renamed errorreporting. The errors package will be removed shortly. - -- datastore: improved retry behavior. - -- bigquery: support updates to dataset metadata, with etags. - -- bigquery: add etag support to Table.Update (BREAKING: etag argument added). - -- bigquery: generate all job IDs on the client. - -- storage: support bucket lifecycle configurations. - - -_July 31, 2017_ - -*v0.11.0* - -- Clients for spanner, pubsub and video are now in beta. - -- New client for DLP. - -- spanner: performance and testing improvements. - -- storage: requester-pays buckets are supported. - -- storage, profiler, bigtable, bigquery: bug fixes and other minor improvements. - -- pubsub: bug fixes and other minor improvements - -_June 17, 2017_ - - -*v0.10.0* - -- pubsub: Subscription.ModifyPushConfig replaced with Subscription.Update. - -- pubsub: Subscription.Receive now runs concurrently for higher throughput. - -- vision: cloud.google.com/go/vision is deprecated. Use -cloud.google.com/go/vision/apiv1 instead. - -- translation: now stable. - -- trace: several changes to the surface. See the link below. - -[Code changes required from v0.9.0.](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/MIGRATION.md) - - -_March 17, 2017_ - -Breaking Pubsub changes. -* Publish is now asynchronous -([announcement](https://groups.google.com/d/topic/google-api-go-announce/aaqRDIQ3rvU/discussion)). -* Subscription.Pull replaced by Subscription.Receive, which takes a callback ([announcement](https://groups.google.com/d/topic/google-api-go-announce/8pt6oetAdKc/discussion)). -* Message.Done replaced with Message.Ack and Message.Nack. - -_February 14, 2017_ - -Release of a client library for Spanner. See -the -[blog post](https://cloudplatform.googleblog.com/2017/02/introducing-Cloud-Spanner-a-global-database-service-for-mission-critical-applications.html). - -Note that although the Spanner service is beta, the Go client library is alpha. - -_December 12, 2016_ - -Beta release of BigQuery, DataStore, Logging and Storage. See the -[blog post](https://cloudplatform.googleblog.com/2016/12/announcing-new-google-cloud-client.html). - -Also, BigQuery now supports structs. Read a row directly into a struct with -`RowIterator.Next`, and upload a row directly from a struct with `Uploader.Put`. -You can also use field tags. See the [package documentation][cloud-bigquery-ref] -for details. - -_December 5, 2016_ - -More changes to BigQuery: - -* The `ValueList` type was removed. It is no longer necessary. Instead of - ```go - var v ValueList - ... it.Next(&v) .. - ``` - use - - ```go - var v []Value - ... it.Next(&v) ... - ``` - -* Previously, repeatedly calling `RowIterator.Next` on the same `[]Value` or - `ValueList` would append to the slice. Now each call resets the size to zero first. - -* Schema inference will infer the SQL type BYTES for a struct field of - type []byte. Previously it inferred STRING. - -* The types `uint`, `uint64` and `uintptr` are no longer supported in schema - inference. BigQuery's integer type is INT64, and those types may hold values - that are not correctly represented in a 64-bit signed integer. - -* The SQL types DATE, TIME and DATETIME are now supported. They correspond to - the `Date`, `Time` and `DateTime` types in the new `cloud.google.com/go/civil` - package. - -_November 17, 2016_ - -Change to BigQuery: values from INTEGER columns will now be returned as int64, -not int. This will avoid errors arising from large values on 32-bit systems. - -_November 8, 2016_ - -New datastore feature: datastore now encodes your nested Go structs as Entity values, -instead of a flattened list of the embedded struct's fields. -This means that you may now have twice-nested slices, eg. -```go -type State struct { - Cities []struct{ - Populations []int - } -} -``` - -See [the announcement](https://groups.google.com/forum/#!topic/google-api-go-announce/79jtrdeuJAg) for -more details. - -_November 8, 2016_ - -Breaking changes to datastore: contexts no longer hold namespaces; instead you -must set a key's namespace explicitly. Also, key functions have been changed -and renamed. - -* The WithNamespace function has been removed. To specify a namespace in a Query, use the Query.Namespace method: - ```go - q := datastore.NewQuery("Kind").Namespace("ns") - ``` - -* All the fields of Key are exported. That means you can construct any Key with a struct literal: - ```go - k := &Key{Kind: "Kind", ID: 37, Namespace: "ns"} - ``` - -* As a result of the above, the Key methods Kind, ID, d.Name, Parent, SetParent and Namespace have been removed. - -* `NewIncompleteKey` has been removed, replaced by `IncompleteKey`. Replace - ```go - NewIncompleteKey(ctx, kind, parent) - ``` - with - ```go - IncompleteKey(kind, parent) - ``` - and if you do use namespaces, make sure you set the namespace on the returned key. - -* `NewKey` has been removed, replaced by `NameKey` and `IDKey`. Replace - ```go - NewKey(ctx, kind, name, 0, parent) - NewKey(ctx, kind, "", id, parent) - ``` - with - ```go - NameKey(kind, name, parent) - IDKey(kind, id, parent) - ``` - and if you do use namespaces, make sure you set the namespace on the returned key. - -* The `Done` variable has been removed. Replace `datastore.Done` with `iterator.Done`, from the package `google.golang.org/api/iterator`. - -* The `Client.Close` method will have a return type of error. It will return the result of closing the underlying gRPC connection. - -See [the announcement](https://groups.google.com/forum/#!topic/google-api-go-announce/hqXtM_4Ix-0) for -more details. - -_October 27, 2016_ - -Breaking change to bigquery: `NewGCSReference` is now a function, -not a method on `Client`. - -New bigquery feature: `Table.LoaderFrom` now accepts a `ReaderSource`, enabling -loading data into a table from a file or any `io.Reader`. - -_October 21, 2016_ - -Breaking change to pubsub: removed `pubsub.Done`. - -Use `iterator.Done` instead, where `iterator` is the package -`google.golang.org/api/iterator`. - -_October 19, 2016_ - -Breaking changes to cloud.google.com/go/bigquery: - -* Client.Table and Client.OpenTable have been removed. - Replace - ```go - client.OpenTable("project", "dataset", "table") - ``` - with - ```go - client.DatasetInProject("project", "dataset").Table("table") - ``` - -* Client.CreateTable has been removed. - Replace - ```go - client.CreateTable(ctx, "project", "dataset", "table") - ``` - with - ```go - client.DatasetInProject("project", "dataset").Table("table").Create(ctx) - ``` - -* Dataset.ListTables have been replaced with Dataset.Tables. - Replace - ```go - tables, err := ds.ListTables(ctx) - ``` - with - ```go - it := ds.Tables(ctx) - for { - table, err := it.Next() - if err == iterator.Done { - break - } - if err != nil { - // TODO: Handle error. - } - // TODO: use table. - } - ``` - -* Client.Read has been replaced with Job.Read, Table.Read and Query.Read. - Replace - ```go - it, err := client.Read(ctx, job) - ``` - with - ```go - it, err := job.Read(ctx) - ``` - and similarly for reading from tables or queries. - -* The iterator returned from the Read methods is now named RowIterator. Its - behavior is closer to the other iterators in these libraries. It no longer - supports the Schema method; see the next item. - Replace - ```go - for it.Next(ctx) { - var vals ValueList - if err := it.Get(&vals); err != nil { - // TODO: Handle error. - } - // TODO: use vals. - } - if err := it.Err(); err != nil { - // TODO: Handle error. - } - ``` - with - ``` - for { - var vals ValueList - err := it.Next(&vals) - if err == iterator.Done { - break - } - if err != nil { - // TODO: Handle error. - } - // TODO: use vals. - } - ``` - Instead of the `RecordsPerRequest(n)` option, write - ```go - it.PageInfo().MaxSize = n - ``` - Instead of the `StartIndex(i)` option, write - ```go - it.StartIndex = i - ``` - -* ValueLoader.Load now takes a Schema in addition to a slice of Values. - Replace - ```go - func (vl *myValueLoader) Load(v []bigquery.Value) - ``` - with - ```go - func (vl *myValueLoader) Load(v []bigquery.Value, s bigquery.Schema) - ``` - - -* Table.Patch is replace by Table.Update. - Replace - ```go - p := table.Patch() - p.Description("new description") - metadata, err := p.Apply(ctx) - ``` - with - ```go - metadata, err := table.Update(ctx, bigquery.TableMetadataToUpdate{ - Description: "new description", - }) - ``` - -* Client.Copy is replaced by separate methods for each of its four functions. - All options have been replaced by struct fields. - - * To load data from Google Cloud Storage into a table, use Table.LoaderFrom. - - Replace - ```go - client.Copy(ctx, table, gcsRef) - ``` - with - ```go - table.LoaderFrom(gcsRef).Run(ctx) - ``` - Instead of passing options to Copy, set fields on the Loader: - ```go - loader := table.LoaderFrom(gcsRef) - loader.WriteDisposition = bigquery.WriteTruncate - ``` - - * To extract data from a table into Google Cloud Storage, use - Table.ExtractorTo. Set fields on the returned Extractor instead of - passing options. - - Replace - ```go - client.Copy(ctx, gcsRef, table) - ``` - with - ```go - table.ExtractorTo(gcsRef).Run(ctx) - ``` - - * To copy data into a table from one or more other tables, use - Table.CopierFrom. Set fields on the returned Copier instead of passing options. - - Replace - ```go - client.Copy(ctx, dstTable, srcTable) - ``` - with - ```go - dst.Table.CopierFrom(srcTable).Run(ctx) - ``` - - * To start a query job, create a Query and call its Run method. Set fields - on the query instead of passing options. - - Replace - ```go - client.Copy(ctx, table, query) - ``` - with - ```go - query.Run(ctx) - ``` - -* Table.NewUploader has been renamed to Table.Uploader. Instead of options, - configure an Uploader by setting its fields. - Replace - ```go - u := table.NewUploader(bigquery.UploadIgnoreUnknownValues()) - ``` - with - ```go - u := table.NewUploader(bigquery.UploadIgnoreUnknownValues()) - u.IgnoreUnknownValues = true - ``` - -_October 10, 2016_ - -Breaking changes to cloud.google.com/go/storage: - -* AdminClient replaced by methods on Client. - Replace - ```go - adminClient.CreateBucket(ctx, bucketName, attrs) - ``` - with - ```go - client.Bucket(bucketName).Create(ctx, projectID, attrs) - ``` - -* BucketHandle.List replaced by BucketHandle.Objects. - Replace - ```go - for query != nil { - objs, err := bucket.List(d.ctx, query) - if err != nil { ... } - query = objs.Next - for _, obj := range objs.Results { - fmt.Println(obj) - } - } - ``` - with - ```go - iter := bucket.Objects(d.ctx, query) - for { - obj, err := iter.Next() - if err == iterator.Done { - break - } - if err != nil { ... } - fmt.Println(obj) - } - ``` - (The `iterator` package is at `google.golang.org/api/iterator`.) - - Replace `Query.Cursor` with `ObjectIterator.PageInfo().Token`. - - Replace `Query.MaxResults` with `ObjectIterator.PageInfo().MaxSize`. - - -* ObjectHandle.CopyTo replaced by ObjectHandle.CopierFrom. - Replace - ```go - attrs, err := src.CopyTo(ctx, dst, nil) - ``` - with - ```go - attrs, err := dst.CopierFrom(src).Run(ctx) - ``` - - Replace - ```go - attrs, err := src.CopyTo(ctx, dst, &storage.ObjectAttrs{ContextType: "text/html"}) - ``` - with - ```go - c := dst.CopierFrom(src) - c.ContextType = "text/html" - attrs, err := c.Run(ctx) - ``` - -* ObjectHandle.ComposeFrom replaced by ObjectHandle.ComposerFrom. - Replace - ```go - attrs, err := dst.ComposeFrom(ctx, []*storage.ObjectHandle{src1, src2}, nil) - ``` - with - ```go - attrs, err := dst.ComposerFrom(src1, src2).Run(ctx) - ``` - -* ObjectHandle.Update's ObjectAttrs argument replaced by ObjectAttrsToUpdate. - Replace - ```go - attrs, err := obj.Update(ctx, &storage.ObjectAttrs{ContextType: "text/html"}) - ``` - with - ```go - attrs, err := obj.Update(ctx, storage.ObjectAttrsToUpdate{ContextType: "text/html"}) - ``` - -* ObjectHandle.WithConditions replaced by ObjectHandle.If. - Replace - ```go - obj.WithConditions(storage.Generation(gen), storage.IfMetaGenerationMatch(mgen)) - ``` - with - ```go - obj.Generation(gen).If(storage.Conditions{MetagenerationMatch: mgen}) - ``` - - Replace - ```go - obj.WithConditions(storage.IfGenerationMatch(0)) - ``` - with - ```go - obj.If(storage.Conditions{DoesNotExist: true}) - ``` - -* `storage.Done` replaced by `iterator.Done` (from package `google.golang.org/api/iterator`). - -_October 6, 2016_ - -Package preview/logging deleted. Use logging instead. - -_September 27, 2016_ - -Logging client replaced with preview version (see below). - -_September 8, 2016_ - -* New clients for some of Google's Machine Learning APIs: Vision, Speech, and -Natural Language. - -* Preview version of a new [Stackdriver Logging][cloud-logging] client in -[`cloud.google.com/go/preview/logging`](https://godoc.org/cloud.google.com/go/preview/logging). -This client uses gRPC as its transport layer, and supports log reading, sinks -and metrics. It will replace the current client at `cloud.google.com/go/logging` shortly. - diff --git a/vendor/cloud.google.com/go/regen-gapic.sh b/vendor/cloud.google.com/go/regen-gapic.sh deleted file mode 100755 index 158b1b0dbfd..00000000000 --- a/vendor/cloud.google.com/go/regen-gapic.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -# This script generates all GAPIC clients in this repo. -# One-time setup: -# cd path/to/googleapis # https://github.com/googleapis/googleapis -# virtualenv env -# . env/bin/activate -# pip install googleapis-artman -# deactivate -# -# Regenerate: -# cd path/to/googleapis -# . env/bin/activate -# $GOPATH/src/cloud.google.com/go/regen-gapic.sh -# deactivate -# -# Being in googleapis directory is important; -# that's where we find YAML files and where artman puts the "artman-genfiles" directory. -# -# NOTE: This script does not generate the "raw" gRPC client found in google.golang.org/genproto. -# To do that, use the regen.sh script in the genproto repo instead. - -set -ex - -APIS=( -google/cloud/bigquery/datatransfer/artman_bigquerydatatransfer.yaml -google/cloud/dataproc/artman_dataproc_v1.yaml -google/cloud/language/artman_language_v1.yaml -google/cloud/language/artman_language_v1beta2.yaml -google/cloud/oslogin/artman_oslogin_v1beta.yaml -google/cloud/speech/artman_speech_v1.yaml -google/cloud/speech/artman_speech_v1beta1.yaml -google/cloud/videointelligence/artman_videointelligence_v1beta1.yaml -google/cloud/videointelligence/artman_videointelligence_v1beta2.yaml -google/cloud/vision/artman_vision_v1.yaml -google/cloud/vision/artman_vision_v1p1beta1.yaml -google/container/artman_container.yaml -google/devtools/artman_clouddebugger.yaml -google/devtools/clouderrorreporting/artman_errorreporting.yaml -google/devtools/cloudtrace/artman_cloudtrace_v1.yaml -google/devtools/cloudtrace/artman_cloudtrace_v2.yaml -google/firestore/artman_firestore.yaml -google/logging/artman_logging.yaml -google/longrunning/artman_longrunning.yaml -google/monitoring/artman_monitoring.yaml -google/privacy/dlp/artman_dlp.yaml -google/pubsub/artman_pubsub.yaml -google/spanner/admin/database/artman_spanner_admin_database.yaml -google/spanner/admin/instance/artman_spanner_admin_instance.yaml -google/spanner/artman_spanner.yaml -) - -for api in "${APIS[@]}"; do - rm -rf artman-genfiles/* - artman2 --config "$api" generate go_gapic - cp -r artman-genfiles/gapi-*/cloud.google.com/go/* $GOPATH/src/cloud.google.com/go/ -done - -go list cloud.google.com/go/... | grep apiv | xargs go test - -go test -short cloud.google.com/go/... - -echo "googleapis version: $(git rev-parse HEAD)" diff --git a/vendor/cloud.google.com/go/run-tests.sh b/vendor/cloud.google.com/go/run-tests.sh deleted file mode 100755 index f47ff50a5e9..00000000000 --- a/vendor/cloud.google.com/go/run-tests.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -# Selectively run tests for this repo, based on what has changed -# in a commit. Runs short tests for the whole repo, and full tests -# for changed directories. - -set -e - -prefix=cloud.google.com/go - -dryrun=false -if [[ $1 == "-n" ]]; then - dryrun=true - shift -fi - -if [[ $1 == "" ]]; then - echo >&2 "usage: $0 [-n] COMMIT" - exit 1 -fi - -# Files or directories that cause all tests to run if modified. -declare -A run_all -run_all=([.travis.yml]=1 [run-tests.sh]=1) - -function run { - if $dryrun; then - echo $* - else - (set -x; $*) - fi -} - - -# Find all the packages that have changed in this commit. -declare -A changed_packages - -for f in $(git diff-tree --no-commit-id --name-only -r $1); do - if [[ ${run_all[$f]} == 1 ]]; then - # This change requires a full test. Do it and exit. - run go test -race -v $prefix/... - exit - fi - # Map, e.g., "spanner/client.go" to "$prefix/spanner". - d=$(dirname $f) - if [[ $d == "." ]]; then - pkg=$prefix - else - pkg=$prefix/$d - fi - changed_packages[$pkg]=1 -done - -echo "changed packages: ${!changed_packages[*]}" - - -# Reports whether its argument, a package name, depends (recursively) -# on a changed package. -function depends_on_changed_package { - # According to go list, a package does not depend on itself, so - # we test that separately. - if [[ ${changed_packages[$1]} == 1 ]]; then - return 0 - fi - for dep in $(go list -f '{{range .Deps}}{{.}} {{end}}' $1); do - if [[ ${changed_packages[$dep]} == 1 ]]; then - return 0 - fi - done - return 1 -} - -# Collect the packages into two separate lists. (It is faster go test a list of -# packages than to individually go test each one.) - -shorts= -fulls= -for pkg in $(go list $prefix/...); do # for each package in the repo - if depends_on_changed_package $pkg; then # if it depends on a changed package - fulls="$fulls $pkg" # run the full test - else # otherwise - shorts="$shorts $pkg" # run the short test - fi -done -run go test -race -v -short $shorts -if [[ $fulls != "" ]]; then - run go test -race -v $fulls -fi diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore deleted file mode 100644 index 0cd3800377d..00000000000 --- a/vendor/github.com/BurntSushi/toml/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index 8b8afc4f0e0..00000000000 --- a/vendor/github.com/BurntSushi/toml/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 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 deleted file mode 100644 index 6efcfd0ce55..00000000000 --- a/vendor/github.com/BurntSushi/toml/COMPATIBLE +++ /dev/null @@ -1,3 +0,0 @@ -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md) - diff --git a/vendor/github.com/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile deleted file mode 100644 index 3600848d331..00000000000 --- a/vendor/github.com/BurntSushi/toml/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 7c1b37ecc7a..00000000000 --- a/vendor/github.com/BurntSushi/toml/README.md +++ /dev/null @@ -1,218 +0,0 @@ -## 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/toml-lang/toml - -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) - -Documentation: https://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://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/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/cmd/toml-test-decoder/COPYING b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING new file mode 100644 index 00000000000..5a8e332545f --- /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-encoder/COPYING b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING new file mode 100644 index 00000000000..5a8e332545f --- /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/tomlv/COPYING b/vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING new file mode 100644 index 00000000000..5a8e332545f --- /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/decode_test.go b/vendor/github.com/BurntSushi/toml/decode_test.go deleted file mode 100644 index 0c36b33e061..00000000000 --- a/vendor/github.com/BurntSushi/toml/decode_test.go +++ /dev/null @@ -1,1447 +0,0 @@ -package toml - -import ( - "fmt" - "log" - "math" - "reflect" - "strings" - "testing" - "time" -) - -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 - type cat struct{ Name string } - - for _, test := range []struct { - label string - input string - decodeInto interface{} - wantDecoded interface{} - }{ - { - label: "embedded struct", - input: `Name = "milton"`, - decodeInto: &struct{ Dog }{}, - wantDecoded: &struct{ Dog }{Dog{"milton"}}, - }, - { - label: "embedded non-nil pointer to struct", - input: `Name = "milton"`, - decodeInto: &struct{ *Dog }{}, - wantDecoded: &struct{ *Dog }{&Dog{"milton"}}, - }, - { - label: "embedded nil pointer to struct", - input: ``, - decodeInto: &struct{ *Dog }{}, - wantDecoded: &struct{ *Dog }{nil}, - }, - { - label: "unexported embedded struct", - input: `Name = "socks"`, - decodeInto: &struct{ cat }{}, - wantDecoded: &struct{ cat }{cat{"socks"}}, - }, - { - label: "embedded int", - input: `Age = -5`, - decodeInto: &struct{ Age }{}, - wantDecoded: &struct{ Age }{-5}, - }, - } { - _, 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", - test.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) - } -} - -func TestTableNesting(t *testing.T) { - for _, tt := range []struct { - t string - want []string - }{ - {"[a.b.c]", []string{"a", "b", "c"}}, - {`[a."b.c"]`, []string{"a", "b.c"}}, - {`[a.'b.c']`, []string{"a", "b.c"}}, - {`[a.' b ']`, []string{"a", " b "}}, - {"[ d.e.f ]", []string{"d", "e", "f"}}, - {"[ g . h . i ]", []string{"g", "h", "i"}}, - {`[ j . "ʞ" . 'l' ]`, []string{"j", "ʞ", "l"}}, - } { - var m map[string]interface{} - if _, err := Decode(tt.t, &m); err != nil { - t.Errorf("Decode(%q): got error: %s", tt.t, err) - continue - } - if keys := extractNestedKeys(m); !reflect.DeepEqual(keys, tt.want) { - t.Errorf("Decode(%q): got nested keys %#v; want %#v", - tt.t, keys, tt.want) - } - } -} - -func extractNestedKeys(v map[string]interface{}) []string { - var result []string - for { - if len(v) != 1 { - return result - } - for k, m := range v { - result = append(result, k) - var ok bool - v, ok = m.(map[string]interface{}) - if !ok { - return result - } - } - - } -} - -// 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 TestDecodeDatetime(t *testing.T) { - const noTimestamp = "2006-01-02T15:04:05" - for _, tt := range []struct { - s string - t string - format string - }{ - {"1979-05-27T07:32:00Z", "1979-05-27T07:32:00Z", time.RFC3339}, - {"1979-05-27T00:32:00-07:00", "1979-05-27T00:32:00-07:00", time.RFC3339}, - { - "1979-05-27T00:32:00.999999-07:00", - "1979-05-27T00:32:00.999999-07:00", - time.RFC3339, - }, - {"1979-05-27T07:32:00", "1979-05-27T07:32:00", noTimestamp}, - { - "1979-05-27T00:32:00.999999", - "1979-05-27T00:32:00.999999", - noTimestamp, - }, - {"1979-05-27", "1979-05-27T00:00:00", noTimestamp}, - } { - var x struct{ D time.Time } - input := "d = " + tt.s - if _, err := Decode(input, &x); err != nil { - t.Errorf("Decode(%q): got error: %s", input, err) - continue - } - want, err := time.ParseInLocation(tt.format, tt.t, time.Local) - if err != nil { - panic(err) - } - if !x.D.Equal(want) { - t.Errorf("Decode(%q): got %s; want %s", input, x.D, want) - } - } -} - -func TestDecodeBadDatetime(t *testing.T) { - var x struct{ T time.Time } - for _, s := range []string{ - "123", - "2006-01-50T00:00:00Z", - "2006-01-30T00:00", - "2006-01-30T", - } { - input := "T = " + s - if _, err := Decode(input, &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 TestDecodeInts(t *testing.T) { - for _, tt := range []struct { - s string - want int64 - }{ - {"0", 0}, - {"+99", 99}, - {"-10", -10}, - {"1_234_567", 1234567}, - {"1_2_3_4", 1234}, - {"-9_223_372_036_854_775_808", math.MinInt64}, - {"9_223_372_036_854_775_807", math.MaxInt64}, - } { - var x struct{ N int64 } - input := "n = " + tt.s - if _, err := Decode(input, &x); err != nil { - t.Errorf("Decode(%q): got error: %s", input, err) - continue - } - if x.N != tt.want { - t.Errorf("Decode(%q): got %d; want %d", input, x.N, tt.want) - } - } -} - -func TestDecodeFloats(t *testing.T) { - for _, tt := range []struct { - s string - want float64 - }{ - {"+1.0", 1}, - {"3.1415", 3.1415}, - {"-0.01", -0.01}, - {"5e+22", 5e22}, - {"1e6", 1e6}, - {"-2E-2", -2e-2}, - {"6.626e-34", 6.626e-34}, - {"9_224_617.445_991_228_313", 9224617.445991228313}, - {"9_876.54_32e1_0", 9876.5432e10}, - } { - var x struct{ N float64 } - input := "n = " + tt.s - if _, err := Decode(input, &x); err != nil { - t.Errorf("Decode(%q): got error: %s", input, err) - continue - } - if x.N != tt.want { - t.Errorf("Decode(%q): got %f; want %f", input, x.N, tt.want) - } - } -} - -func TestDecodeMalformedNumbers(t *testing.T) { - for _, tt := range []struct { - s string - want string - }{ - {"++99", "expected a digit"}, - {"0..1", "must be followed by one or more digits"}, - {"0.1.2", "Invalid float value"}, - {"1e2.3", "Invalid float value"}, - {"1e2e3", "Invalid float value"}, - {"_123", "expected value"}, - {"123_", "surrounded by digits"}, - {"1._23", "surrounded by digits"}, - {"1e__23", "surrounded by digits"}, - {"123.", "must be followed by one or more digits"}, - {"1.e2", "must be followed by one or more digits"}, - } { - var x struct{ N interface{} } - input := "n = " + tt.s - _, err := Decode(input, &x) - if err == nil { - t.Errorf("Decode(%q): got nil, want error containing %q", - input, tt.want) - continue - } - if !strings.Contains(err.Error(), tt.want) { - t.Errorf("Decode(%q): got %q, want error containing %q", - input, err, tt.want) - } - } -} - -func TestDecodeBadValues(t *testing.T) { - for _, tt := range []struct { - v interface{} - want string - }{ - {3, "non-pointer int"}, - {(*int)(nil), "nil"}, - } { - _, err := Decode(`x = 3`, tt.v) - if err == nil { - t.Errorf("Decode(%v): got nil; want error containing %q", - tt.v, tt.want) - continue - } - if !strings.Contains(err.Error(), tt.want) { - t.Errorf("Decode(%v): got %q; want error containing %q", - tt.v, err, tt.want) - } - } -} - -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 { - t.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 { - t.Fatal(err) - } - -} - -func TestDecodeInlineTable(t *testing.T) { - input := ` -[CookieJar] -Types = {Chocolate = "yummy", Oatmeal = "best ever"} - -[Seasons] -Locations = {NY = {Temp = "not cold", Rating = 4}, MI = {Temp = "freezing", Rating = 9}} -` - type cookieJar struct { - Types map[string]string - } - type properties struct { - Temp string - Rating int - } - type seasons struct { - Locations map[string]properties - } - type wrapper struct { - CookieJar cookieJar - Seasons seasons - } - var got wrapper - - meta, err := Decode(input, &got) - if err != nil { - t.Fatal(err) - } - want := wrapper{ - CookieJar: cookieJar{ - Types: map[string]string{ - "Chocolate": "yummy", - "Oatmeal": "best ever", - }, - }, - Seasons: seasons{ - Locations: map[string]properties{ - "NY": { - Temp: "not cold", - Rating: 4, - }, - "MI": { - Temp: "freezing", - Rating: 9, - }, - }, - }, - } - if !reflect.DeepEqual(got, want) { - t.Fatalf("after decode, got:\n\n%#v\n\nwant:\n\n%#v", got, want) - } - if len(meta.keys) != 12 { - t.Errorf("after decode, got %d meta keys; want 12", len(meta.keys)) - } - if len(meta.types) != 12 { - t.Errorf("after decode, got %d meta types; want 12", len(meta.types)) - } -} - -func TestDecodeInlineTableArray(t *testing.T) { - type point struct { - X, Y, Z int - } - var got struct { - Points []point - } - // Example inline table array from the spec. - const in = ` -points = [ { x = 1, y = 2, z = 3 }, - { x = 7, y = 8, z = 9 }, - { x = 2, y = 4, z = 8 } ] - -` - if _, err := Decode(in, &got); err != nil { - t.Fatal(err) - } - want := []point{ - {X: 1, Y: 2, Z: 3}, - {X: 7, Y: 8, Z: 9}, - {X: 2, Y: 4, Z: 8}, - } - if !reflect.DeepEqual(got.Points, want) { - t.Errorf("got %#v; want %#v", got.Points, want) - } -} - -func TestDecodeMalformedInlineTable(t *testing.T) { - for _, tt := range []struct { - s string - want string - }{ - {"{,}", "unexpected comma"}, - {"{x = 3 y = 4}", "expected a comma or an inline table terminator"}, - {"{x=3,,y=4}", "unexpected comma"}, - {"{x=3,\ny=4}", "newlines not allowed"}, - {"{x=3\n,y=4}", "newlines not allowed"}, - } { - var x struct{ A map[string]int } - input := "a = " + tt.s - _, err := Decode(input, &x) - if err == nil { - t.Errorf("Decode(%q): got nil, want error containing %q", - input, tt.want) - continue - } - if !strings.Contains(err.Error(), tt.want) { - t.Errorf("Decode(%q): got %q, want error containing %q", - input, err, tt.want) - } - } -} - -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 TestDecodeErrors(t *testing.T) { - for _, s := range []string{ - `x="`, - `x='`, - `x='''`, - - // Cases found by fuzzing in - // https://github.com/BurntSushi/toml/issues/155. - `""�`, // used to panic with index out of range - `e="""`, // used to hang - } { - var x struct{} - _, err := Decode(s, &x) - if err == nil { - t.Errorf("Decode(%q): got nil error", s) - } - } -} - -// Test for https://github.com/BurntSushi/toml/pull/166. -func TestDecodeBoolArray(t *testing.T) { - for _, tt := range []struct { - s string - got interface{} - want interface{} - }{ - { - "a = [true, false]", - &struct{ A []bool }{}, - &struct{ A []bool }{[]bool{true, false}}, - }, - { - "a = {a = true, b = false}", - &struct{ A map[string]bool }{}, - &struct{ A map[string]bool }{map[string]bool{"a": true, "b": false}}, - }, - } { - if _, err := Decode(tt.s, tt.got); err != nil { - t.Errorf("Decode(%q): %s", tt.s, err) - continue - } - if !reflect.DeepEqual(tt.got, tt.want) { - t.Errorf("Decode(%q): got %#v; want %#v", tt.s, tt.got, 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 preferred 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 preferred 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/encode_test.go b/vendor/github.com/BurntSushi/toml/encode_test.go deleted file mode 100644 index 673b7b0093c..00000000000 --- a/vendor/github.com/BurntSushi/toml/encode_test.go +++ /dev/null @@ -1,615 +0,0 @@ -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 { - t.Logf("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 TestEncodeAnonymousStruct(t *testing.T) { - type Inner struct{ N int } - type Outer0 struct{ Inner } - type Outer1 struct { - Inner `toml:"inner"` - } - - v0 := Outer0{Inner{3}} - expected := "N = 3\n" - encodeExpected(t, "embedded anonymous untagged struct", v0, expected, nil) - - v1 := Outer1{Inner{3}} - expected = "[inner]\n N = 3\n" - encodeExpected(t, "embedded anonymous tagged struct", v1, expected, nil) -} - -func TestEncodeAnonymousStructPointerField(t *testing.T) { - type Inner struct{ N int } - type Outer0 struct{ *Inner } - type Outer1 struct { - *Inner `toml:"inner"` - } - - v0 := Outer0{} - expected := "" - encodeExpected(t, "nil anonymous untagged struct pointer field", v0, expected, nil) - - v0 = Outer0{&Inner{3}} - expected = "N = 3\n" - encodeExpected(t, "non-nil anonymous untagged struct pointer field", v0, expected, nil) - - v1 := Outer1{} - expected = "" - encodeExpected(t, "nil anonymous tagged struct pointer field", v1, expected, nil) - - v1 = Outer1{&Inner{3}} - expected = "[inner]\n N = 3\n" - encodeExpected(t, "non-nil anonymous tagged struct pointer field", v1, 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/session.vim b/vendor/github.com/BurntSushi/toml/session.vim deleted file mode 100644 index 562164be060..00000000000 --- a/vendor/github.com/BurntSushi/toml/session.vim +++ /dev/null @@ -1 +0,0 @@ -au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/Unknwon/com/.gitignore b/vendor/github.com/Unknwon/com/.gitignore deleted file mode 100644 index 0da157fe9ce..00000000000 --- a/vendor/github.com/Unknwon/com/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test -.idea - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.iml diff --git a/vendor/github.com/Unknwon/com/README.md b/vendor/github.com/Unknwon/com/README.md deleted file mode 100644 index 8d821abd65e..00000000000 --- a/vendor/github.com/Unknwon/com/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Common Functions -================ - -[![Build Status](https://travis-ci.org/Unknwon/com.svg)](https://travis-ci.org/Unknwon/com) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/Unknwon/com) - -This is an open source project for commonly used functions for the Go programming language. - -This package need >= **go 1.2** - -Code Convention: based on [Go Code Convention](https://github.com/Unknwon/go-code-convention). - -## Contribute - -Your contribute is welcome, but you have to check following steps after you added some functions and commit them: - -1. Make sure you wrote user-friendly comments for **all functions** . -2. Make sure you wrote test cases with any possible condition for **all functions** in file `*_test.go`. -3. Make sure you wrote benchmarks for **all functions** in file `*_test.go`. -4. Make sure you wrote useful examples for **all functions** in file `example_test.go`. -5. Make sure you ran `go test` and got **PASS** . diff --git a/vendor/github.com/apache/thrift/.clang-format b/vendor/github.com/apache/thrift/.clang-format deleted file mode 100644 index a62eef8576c..00000000000 --- a/vendor/github.com/apache/thrift/.clang-format +++ /dev/null @@ -1,56 +0,0 @@ ---- -Language: Cpp -# BasedOnStyle: LLVM -AccessModifierOffset: -2 -ConstructorInitializerIndentWidth: 2 -AlignEscapedNewlinesLeft: false -AlignTrailingComments: true -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortBlocksOnASingleLine: false -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AllowShortFunctionsOnASingleLine: Inline -AlwaysBreakTemplateDeclarations: true -AlwaysBreakBeforeMultilineStrings: true -BreakBeforeBinaryOperators: true -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: false -BinPackParameters: false -ColumnLimit: 100 -ConstructorInitializerAllOnOneLineOrOnePerLine: true -DerivePointerAlignment: false -IndentCaseLabels: false -IndentWrappedFunctionNames: false -IndentFunctionDeclarationAfterType: false -MaxEmptyLinesToKeep: 1 -KeepEmptyLinesAtTheStartOfBlocks: true -NamespaceIndentation: None -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: true -PenaltyBreakBeforeFirstCallParameter: 190 -PenaltyBreakComment: 300 -PenaltyBreakString: 10000 -PenaltyBreakFirstLessLess: 120 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 1200 -PointerAlignment: Left -SpacesBeforeTrailingComments: 1 -Cpp11BracedListStyle: true -Standard: Auto -IndentWidth: 2 -TabWidth: 4 -UseTab: Never -BreakBeforeBraces: Attach -SpacesInParentheses: false -SpacesInAngles: false -SpaceInEmptyParentheses: false -SpacesInCStyleCastParentheses: false -SpacesInContainerLiterals: true -SpaceBeforeAssignmentOperators: true -ContinuationIndentWidth: 4 -CommentPragmas: '^ IWYU pragma:' -ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] -SpaceBeforeParens: ControlStatements -DisableFormat: false -... - diff --git a/vendor/github.com/apache/thrift/.dockerignore b/vendor/github.com/apache/thrift/.dockerignore deleted file mode 100644 index 2d2ecd68da8..00000000000 --- a/vendor/github.com/apache/thrift/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -.git/ diff --git a/vendor/github.com/apache/thrift/.gitattributes b/vendor/github.com/apache/thrift/.gitattributes deleted file mode 100644 index 176a458f94e..00000000000 --- a/vendor/github.com/apache/thrift/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto diff --git a/vendor/github.com/apache/thrift/.gitignore b/vendor/github.com/apache/thrift/.gitignore deleted file mode 100644 index 140c93b003f..00000000000 --- a/vendor/github.com/apache/thrift/.gitignore +++ /dev/null @@ -1,326 +0,0 @@ -# generic ignores -*.la -*.lo -*.o -*.deps -*.dirstamp -*.libs -*.log -*.trs -*.suo -*.pyc -*.cache -*.user -*.ipch -*.sdf -*.jar -*.exe -*.dll -*_ReSharper* -*.opensdf -*.swp -*.hi -*~ - -.*project -junit*.properties -.idea -gen-* -Makefile -Makefile.in -aclocal.m4 -acinclude.m4 -autom4te.cache -cmake-* -node_modules -compile -test-driver -erl_crash.dump - -.sonar -.DS_Store -.svn -.vagrant - -/contrib/.vagrant/ -/aclocal/libtool.m4 -/aclocal/lt*.m4 -/autoscan.log -/autoscan-*.log -/cmake_* -/compiler/cpp/compiler.VC.db -/compiler/cpp/compiler.VC.VC.opendb -/compiler/cpp/test/plugin/t_cpp_generator.cc -/compiler/cpp/src/thrift/plugin/plugin_constants.cpp -/compiler/cpp/src/thrift/plugin/plugin_constants.h -/compiler/cpp/src/thrift/plugin/plugin_types.cpp -/compiler/cpp/src/thrift/plugin/plugin_types.h -/compiler/cpp/test/*test -/compiler/cpp/test/thrift-gen-* -/compiler/cpp/src/thrift/thrift-bootstrap -/compiler/cpp/src/thrift/plugin/gen.stamp -/compiler/cpp/Debug -/compiler/cpp/Release -/compiler/cpp/src/thrift/libparse.a -/compiler/cpp/src/thrift/thriftl.cc -/compiler/cpp/src/thrift/thrifty.cc -/compiler/cpp/src/thrift/thrifty.hh -/compiler/cpp/src/thrift/windows/version.h -/compiler/cpp/thrift -/compiler/cpp/thriftl.cc -/compiler/cpp/thrifty.cc -/compiler/cpp/lex.yythriftl.cc -/compiler/cpp/thrifty.h -/compiler/cpp/thrifty.hh -/compiler/cpp/src/thrift/version.h -/config.* -/configure -/configure.lineno -/configure.scan -/contrib/fb303/config.cache -/contrib/fb303/config.log -/contrib/fb303/config.status -/contrib/fb303/configure -/contrib/fb303/cpp/libfb303.a -/contrib/fb303/java/build/ -/contrib/fb303/py/build/ -/contrib/fb303/py/fb303/FacebookService-remote -/contrib/fb303/py/fb303/FacebookService.py -/contrib/fb303/py/fb303/__init__.py -/contrib/fb303/py/fb303/constants.py -/contrib/fb303/py/fb303/ttypes.py -/depcomp -/install-sh -/lib/cpp/Debug/ -/lib/cpp/Debug-mt/ -/lib/cpp/Release/ -/lib/cpp/Release-mt/ -/lib/cpp/src/thrift/qt/moc_TQTcpServer.cpp -/lib/cpp/src/thrift/qt/moc__TQTcpServer.cpp -/lib/cpp/src/thrift/config.h -/lib/cpp/src/thrift/stamp-h2 -/lib/cpp/test/Benchmark -/lib/cpp/test/AllProtocolsTest -/lib/cpp/test/DebugProtoTest -/lib/cpp/test/DenseProtoTest -/lib/cpp/test/EnumTest -/lib/cpp/test/JSONProtoTest -/lib/cpp/test/OptionalRequiredTest -/lib/cpp/test/SecurityTest -/lib/cpp/test/SpecializationTest -/lib/cpp/test/ReflectionTest -/lib/cpp/test/RecursiveTest -/lib/cpp/test/TFDTransportTest -/lib/cpp/test/TFileTransportTest -/lib/cpp/test/TInterruptTest -/lib/cpp/test/TNonblockingServerTest -/lib/cpp/test/TPipedTransportTest -/lib/cpp/test/TServerIntegrationTest -/lib/cpp/test/TSocketInterruptTest -/lib/cpp/test/TransportTest -/lib/cpp/test/UnitTests -/lib/cpp/test/ZlibTest -/lib/cpp/test/OpenSSLManualInitTest -/lib/cpp/test/concurrency_test -/lib/cpp/test/link_test -/lib/cpp/test/processor_test -/lib/cpp/test/tests.xml -/lib/cpp/concurrency_test -/lib/cpp/*.pc -/lib/cpp/x64/Debug/ -/lib/cpp/x64/Debug-mt/ -/lib/cpp/x64/Release -/lib/cpp/x64/Release-mt -/lib/c_glib/*.gcda -/lib/c_glib/*.gcno -/lib/c_glib/*.loT -/lib/c_glib/src/thrift/config.h -/lib/c_glib/src/thrift/stamp-h3 -/lib/c_glib/test/*.gcno -/lib/c_glib/test/testwrapper.sh -/lib/c_glib/test/testwrapper-test* -/lib/c_glib/test/testapplicationexception -/lib/c_glib/test/testbinaryprotocol -/lib/c_glib/test/testcompactprotocol -/lib/c_glib/test/testbufferedtransport -/lib/c_glib/test/testcontainertest -/lib/c_glib/test/testdebugproto -/lib/c_glib/test/testfdtransport -/lib/c_glib/test/testframedtransport -/lib/c_glib/test/testmemorybuffer -/lib/c_glib/test/testoptionalrequired -/lib/c_glib/test/testsimpleserver -/lib/c_glib/test/teststruct -/lib/c_glib/test/testthrifttest -/lib/c_glib/test/testthrifttestclient -/lib/c_glib/test/testtransportsocket -/lib/c_glib/test/testserialization -/lib/c_glib/thriftc.pc -/lib/c_glib/thrift_c_glib.pc -/lib/csharp/**/bin/ -/lib/csharp/**/obj/ -/lib/csharp/src/packages -/lib/d/test/*.pem -/lib/d/libthriftd*.a -/lib/d/test/async_test -/lib/d/test/client_pool_test -/lib/d/test/serialization_benchmark -/lib/d/test/stress_test_server -/lib/d/test/thrift_test_client -/lib/d/test/thrift_test_server -/lib/d/test/transport_test -/lib/d/unittest/ -/lib/dart/coverage -/lib/dart/**/.packages -/lib/dart/**/packages -/lib/dart/**/.pub/ -/lib/dart/**/pubspec.lock -/lib/delphi/src/*.dcu -/lib/delphi/test/*.identcache -/lib/delphi/test/*.local -/lib/delphi/test/*.dcu -/lib/delphi/test/*.2007 -/lib/delphi/test/*.dproj -/lib/delphi/test/*.dproj -/lib/delphi/test/codegen/*.bat -/lib/delphi/test/skip/*.local -/lib/delphi/test/skip/*.identcache -/lib/delphi/test/skip/*.identcache -/lib/delphi/test/skip/*.dproj -/lib/delphi/test/skip/*.dproj -/lib/delphi/test/skip/*.2007 -/lib/delphi/test/serializer/*.identcache -/lib/delphi/test/serializer/*.dproj -/lib/delphi/test/serializer/*.local -/lib/delphi/test/serializer/*.2007 -/lib/delphi/test/serializer/*.dcu -/lib/delphi/test/multiplexed/*.dproj -/lib/delphi/test/multiplexed/*.2007 -/lib/delphi/test/multiplexed/*.local -/lib/delphi/test/multiplexed/*.identcache -/lib/delphi/test/multiplexed/*.dcu -/lib/delphi/test/typeregistry/*.2007 -/lib/delphi/test/typeregistry/*.dproj -/lib/delphi/test/typeregistry/*.identcache -/lib/delphi/test/typeregistry/*.local -/lib/delphi/test/typeregistry/*.dcu -/lib/erl/.generated -/lib/erl/.eunit -/lib/erl/ebin -/lib/erl/deps/ -/lib/erl/src/thrift.app.src -/lib/erl/test/*.hrl -/lib/erl/test/*.beam -/lib/haxe/test/bin -/lib/hs/dist -/lib/java/build -/lib/js/test/build -/lib/nodejs/coverage -/lib/nodejs/node_modules/ -/lib/perl/MANIFEST -/lib/perl/MYMETA.json -/lib/perl/MYMETA.yml -/lib/perl/Makefile-perl.mk -/lib/perl/blib -/lib/perl/pm_to_blib -/lib/py/build -/lib/py/thrift.egg-info/ -/lib/rb/Gemfile.lock -/lib/rb/debug_proto_test -/lib/rb/.config -/lib/rb/ext/conftest.dSYM/ -/lib/rb/ext/mkmf.log -/lib/rb/ext/thrift_native.bundle -/lib/rb/ext/thrift_native.so -/lib/rb/test/ -/lib/rb/thrift-*.gem -/lib/php/src/ext/thrift_protocol/Makefile.* -/lib/php/src/ext/thrift_protocol/build/ -/lib/php/src/ext/thrift_protocol/config.* -/lib/php/src/ext/thrift_protocol/configure -/lib/php/src/ext/thrift_protocol/configure.in -/lib/php/src/ext/thrift_protocol/install-sh -/lib/php/src/ext/thrift_protocol/libtool -/lib/php/src/ext/thrift_protocol/ltmain.sh -/lib/php/src/ext/thrift_protocol/missing -/lib/php/src/ext/thrift_protocol/mkinstalldirs -/lib/php/src/ext/thrift_protocol/modules/ -/lib/php/src/ext/thrift_protocol/php_thrift_protocol.lo -/lib/php/src/ext/thrift_protocol/run-tests.php -/lib/php/src/ext/thrift_protocol/thrift_protocol.la -/lib/php/src/ext/thrift_protocol/tmp-php.ini -/lib/php/src/packages/ -/lib/php/test/TEST-*.xml -/lib/php/test/packages/ -/lib/py/dist/ -/lib/erl/logs/ -/lib/go/test/gopath/ -/lib/go/test/ThriftTest.thrift -/libtool -/ltmain.sh -/missing -/node_modules/ -/stamp-h1 -/test/features/results.json -/test/results.json -/test/c_glib/test_client -/test/c_glib/test_server -/test/cpp/StressTest -/test/cpp/StressTestNonBlocking -/test/cpp/TestClient -/test/cpp/TestServer -/test/dart/**/.packages -/test/dart/**/packages -/test/dart/**/.pub/ -/test/dart/**/pubspec.lock -/test/log/ -/test/test.log -/test/erl/.generated -/test/erl/ebin -/test/go/bin/ -/test/go/ThriftTest.thrift -/test/go/gopath -/test/go/pkg/ -/test/go/src/code.google.com/ -/test/go/src/github.com/golang/ -/test/go/src/gen/ -/test/go/src/thrift -/test/haxe/bin -/test/hs/TestClient -/test/hs/TestServer -/test/py.twisted/_trial_temp/ -/test/rb/Gemfile.lock -/tutorial/cpp/TutorialClient -/tutorial/cpp/TutorialServer -/tutorial/c_glib/tutorial_client -/tutorial/c_glib/tutorial_server -/tutorial/csharp/CsharpServer/obj -/tutorial/csharp/CsharpServer/bin -/tutorial/csharp/CsharpClient/obj -/tutorial/csharp/CsharpClient/bin -/tutorial/d/async_client -/tutorial/d/client -/tutorial/d/server -/tutorial/dart/**/.packages -/tutorial/dart/**/packages -/tutorial/dart/**/.pub/ -/tutorial/dart/**/pubspec.lock -/tutorial/delphi/*.dsk -/tutorial/delphi/*.local -/tutorial/delphi/*.tvsconfig -/tutorial/delphi/DelphiClient/dcu -/tutorial/delphi/DelphiServer/dcu -/tutorial/delphi/DelphiClient/*.local -/tutorial/delphi/DelphiClient/*.identcache -/tutorial/delphi/DelphiServer/*.identcache -/tutorial/delphi/DelphiServer/*.local -/tutorial/go/go-tutorial -/tutorial/go/calculator-remote -/tutorial/go/src/shared -/tutorial/go/src/tutorial -/tutorial/go/src/git.apache.org -/tutorial/haxe/bin -/tutorial/hs/dist/ -/tutorial/java/build/ -/tutorial/js/build/ -/ylwrap diff --git a/vendor/github.com/apache/thrift/CHANGES b/vendor/github.com/apache/thrift/CHANGES deleted file mode 100644 index 7b674d6f658..00000000000 --- a/vendor/github.com/apache/thrift/CHANGES +++ /dev/null @@ -1,2366 +0,0 @@ -Apache Thrift Changelog - -Thrift 0.10.0 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1840] - Thrift Generated Code Causes Global Variable Leaks - * [THRIFT-1828] - moc_TQTcpServer.cpp was removed from source tree but is in thrift-0.9.0.tar.gz - * [THRIFT-1790] - cocoa: Duplicate interface definition error - * [THRIFT-1776] - TPipeServer should implement "listen", so that TServerEventHandler preServe will work right - * [THRIFT-1351] - Compiler does not care about binary strings - * [THRIFT-1229] - Python fastbinary.c can not handle unicode as generated python code - * [THRIFT-749] - C++ TBufferedTransports do not flush their buffers on delete - * [THRIFT-747] - C++ TSocket->close calls shutdown breaking forked parent process - * [THRIFT-732] - server exits abnormally when client calls send_xxx function without calling recv_xxx function - * [THRIFT-3942] - TSSLSocket does not honor send and receive timeouts - * [THRIFT-3941] - WinXP version of thrift_poll() relies on undefined behavior by passing a destructed variable to select() - * [THRIFT-3940] - Visual Studio project file for compiler is broken - * [THRIFT-3943] - Coverity Scan identified some high severity defects - * [THRIFT-3929] - PHP "nsglobal" Option Results in Syntax Error in Generated Code (Trailing Backslash) - * [THRIFT-3936] - Cannot compile 0.10.0 development tip with VS2013 and earlier (snprintf, uint32_t) - * [THRIFT-3935] - Incorrect skipping of map and set - * [THRIFT-3920] - Ruby: Ensuring that HTTP failures will clear the http transport outbuf var - * [THRIFT-3919] - C# TTLSServerSocket does not use clientTimeout - * [THRIFT-3917] - Check backports.ssl_match_hostname module version - * [THRIFT-3909] - Fix c_glib static lib CMake build - * [THRIFT-3904] - Typo in node tutorial leads to wrong transport being used - * [THRIFT-3848] - As an implementer of a perl socket server, I do not want to have to remember to ignore SIGCHLD for it to work properly - * [THRIFT-3844] - thrift_protocol cannot compile in 7.0.7 - * [THRIFT-3843] - integer issues with Haxe PHP targets cause ZigZag encoding to fail - * [THRIFT-3842] - Dart generates incorrect code for a const struct - * [THRIFT-3841] - dart compact protocol incorrectly serializes/deserialized doubles - * [THRIFT-3708] - NameError: global name 'TProtocol' is not defined - * [THRIFT-3704] - "TConnectedClient died: Could not refill buffer" message shown when using HTTP Server - * [THRIFT-3678] - Fix javadoc errors on JDK 8 - * [THRIFT-3014] - AppVeyor support - * [THRIFT-2994] - Node.js TJSONProtocol cannot be used for object serialization. - * [THRIFT-2974] - writeToParcel throws NPE for optional enum fields - * [THRIFT-2948] - Python TJSONProtocol doesn't handle structs with binary fields containing invalid unicode. - * [THRIFT-2845] - ChildService.Plo: No such file or directory - * [THRIFT-3276] - Binary data does not decode correctly using the TJSONProtocol when the base64 encoded data is padded. - * [THRIFT-3253] - Using latest version of D gives deprecation notices - * [THRIFT-2883] - TTwisted.py, during ConnectionLost processing: exceptions.RuntimeError: dictionary changed size during iteration - * [THRIFT-2019] - Writing on a disconnected socket on Mac causes SIG PIPE - * [THRIFT-2020] - Thrift library has some empty files that haven't really been deleted - * [THRIFT-2049] - Go compiler doesn't build on native Windows - * [THRIFT-2024] - TServer.cpp warns on 64-bit platforms about truncating an rlim_t into an int - * [THRIFT-2023] - gettimeofday implementation on Windows errors when no time zone is passed in. - * [THRIFT-2022] - CoB and dense code generation still uses TR1 bind, even though that doesn't work with clang - * [THRIFT-2027] - Minor 64-bit and NOMINMAX issues in C++ library - * [THRIFT-2156] - TServerSocket::listen() is throwing exceptions with misleading information - * [THRIFT-2154] - Missing #deepCopy should return T - * [THRIFT-3157] - TBase signature should be TBase, F extends TFieldIdEnum> - * [THRIFT-3156] - Node TLS: server executes processing logic two full times - * [THRIFT-3154] - tutorial/py.tornado throw EOF exception - * [THRIFT-3063] - C++ build -Wunused-parameter warnings on processor_test, TransportTest - * [THRIFT-3056] - Add string/collection length limits for Python protocol readers - * [THRIFT-3237] - Fix TNamedPipeServer::createNamedPipe memory leak - * [THRIFT-3233] - Fix C++ ThreadManager::Impl::removeWorker worker join - * [THRIFT-3232] - Cannot deserialize json messages created with fieldNamesAsString - * [THRIFT-3206] - Fix Visual Studio build failure due 'pthread_self': identifier not found - * [THRIFT-3200] - JS and nodejs do not encode JSON protocol binary fields as base64 - * [THRIFT-3199] - Exception field has basic metadata - * [THRIFT-3182] - TFramedTransport is in an invalid state after frame size exception - * [THRIFT-2536] - new TSocket, uninitialised value reported by valgrind - * [THRIFT-2527] - Apache Thrift IDL Compiler code generated for Node.js should be jshint clean - * [THRIFT-2519] - "processor" class is not being generated - * [THRIFT-2431] - TFileTransportTest fails with "check delta < XXX failed" - * [THRIFT-2708] - Erlang library does not support "oneway" message type - * [THRIFT-3377] - Deep copy is actually shallow when using typedef members - * [THRIFT-3376] - C# and Python JSON protocol double values lose precision - * [THRIFT-3373] - Various fixes for cross test servers and clients - * [THRIFT-3370] - errno extern variable redefined. Not compiling for Android - * [THRIFT-3379] - Potential out of range panic in Go JSON protocols - * [THRIFT-3371] - Abstract namespace Unix domain sockets broken in C++ - * [THRIFT-3380] - nodejs: 0.9.2 -> 0.9.3 upgrade breaks Protocol and Transport requires - * [THRIFT-3367] - Fix bad links to coding_standards.md #634 - * [THRIFT-3401] - Nested collections emit Objective-C code that cannot compile - * [THRIFT-3403] - JSON String reader doesn't recognize UTF-16 surrogate pairs - * [THRIFT-3362] - make check fails for C++ at the SecurityTest - * [THRIFT-3395] - Cocoa compiler produces corrupt code when boxing enums inside map. - * [THRIFT-3394] - compiler generates uncompilable code - * [THRIFT-3388] - hash doesn't work on set/list - * [THRIFT-3391] - Wrong bool formatting in test server - * [THRIFT-3390] - TTornado server doesn't handle closed connections properly - * [THRIFT-3382] - TBase class for C++ Library - * [THRIFT-3392] - Java TZlibTransport does not close its wrapper streams upon close() - * [THRIFT-3383] - i64 related warnings - * [THRIFT-3386] - misc. warnings with make check - * [THRIFT-3385] - warning: format ‘%lu’ expects ‘long unsigned int’, but has type ‘std::basic_string::size_type {aka unsigned int} - * [THRIFT-3355] - npm WARN package.json thrift@1.0.0-dev No license field. - * [THRIFT-3360] - Improve cross test servers and clients further - * [THRIFT-3359] - Binary field incompatibilities - * [THRIFT-3354] - Fix word-extraction substr bug in initialism code - * [THRIFT-3350] - Python JSON protocol does not encode binary as Base64 - * [THRIFT-3577] - assertion failed at line 512 of testcontainertest.c - * [THRIFT-3576] - Boost test --log_format arg does not accept lowercase - * [THRIFT-3575] - Go compiler tries to use unexported library methods when using read_write_private - * [THRIFT-3574] - Cocoa generator makes uncompilable imports - * [THRIFT-3570] - Remove duplicate instances that are added by upstream - * [THRIFT-3571] - Make feature test result browsable - * [THRIFT-3569] - c_glib protocols do not check number of bytes read by transport - * [THRIFT-3568] - THeader server crashes on readSlow - * [THRIFT-3567] - GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed - * [THRIFT-3566] - C++/Qt: TQTcpServerTest::test_communicate() is never executed - * [THRIFT-3564] - C++/Qt: potential core dump in TQTcpServer in case an exception occurs in TAsyncProcessor::process() - * [THRIFT-3558] - typos in c_glib tests - * [THRIFT-3559] - Fix awkward extra semi-colons with Cocoa container literals - * [THRIFT-3555] - 'configure' script does not honor --with-openssl= for libcrypto for BN_init - * [THRIFT-3554] - Constant decls may lead to "Error: internal error: prepare_member_name_mapping() already active for different struct" - * [THRIFT-3552] - glib_c Memory Leak - * [THRIFT-3551] - Thrift perl library missing package declaration - * [THRIFT-3549] - Exceptions are not properly stringified in Perl library - * [THRIFT-3546] - NodeJS code should not be namespaced (and is currently not strict-mode compliant) - * [THRIFT-3545] - Container type literals do not compile - * [THRIFT-3538] - Remove UnboundMethodType in TProtocolDecorator - * [THRIFT-3536] - Error 'char' does not contain a definition for 'IsLowSurrogate' for WP7 target - * [THRIFT-3534] - Link error when building with Qt5 - * [THRIFT-3533] - Can not send nil pointer as service method argument - * [THRIFT-3507] - THttpClient does not use proxy from http_proxy, https_proxy environment variables - * [THRIFT-3502] - C++ TServerSocket passes small buffer to getsockname - * [THRIFT-3501] - Forward slash in comment causes compiler error - * [THRIFT-3498] - C++ library assumes optional function pthread_attr_setschedpolicy is available - * [THRIFT-3497] - Build fails with "invalid use of incomplete type" - * [THRIFT-3496] - C++: Cob style client fails when sending a consecutive request - * [THRIFT-3493] - libthrift does not compile on windows using visual studio - * [THRIFT-3488] - warning: unused variable 'program' - * [THRIFT-3489] - warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] - * [THRIFT-3487] - Full support for newer Delphi versions - * [THRIFT-3528] - Fix warnings in thrift.ll - * [THRIFT-3527] - -gen py:dynamic,utf8strings ignores utf8strings option - * [THRIFT-3526] - Code generated by py:utf8strings does not work for Python3 - * [THRIFT-3524] - dcc32 warning "W1000 Symbol 'IsLowSurrogate' is deprecated: 'Use TCharHelper'" in Thrift.Protocol.JSON.pas - * [THRIFT-3525] - py:dynamic fails to handle binary list/set/map element - * [THRIFT-3521] - TSimpleJSONProtocolTest is not deterministic (fails when run on JDK 8) - * [THRIFT-3520] - Dart TSocket onError stream should be typed as Object - * [THRIFT-3519] - fastbinary does not work with -gen py:utf8strings - * [THRIFT-3518] - TConcurrentClientSyncInfo files were missing for Visual Studio - * [THRIFT-3512] - c_glib: Build fails due to missing features.h - * [THRIFT-3483] - Incorrect empty binary handling introduced by THRIFT-3359 - * [THRIFT-3479] - Oneway calls should not return exceptions to clients - * [THRIFT-3478] - Restore dropped method to THsHaServer.java - * [THRIFT-3477] - Parser fails on enum item that starts with 'E' letter and continues with number - * [THRIFT-3476] - Missing include in ./src/thrift/protocol/TJSONProtocol.cpp - * [THRIFT-3474] - Docker: thrift-compiler - * [THRIFT-3473] - When "optional' is used with a struct member, C++ server seems to not return it correctly - * [THRIFT-3468] - Dart TSocketTransport onError handler is too restrictive - * [THRIFT-3451] - thrift_protocol PHP extension missing config.m4 file - * [THRIFT-3456] - rounding issue in static assert - * [THRIFT-3455] - struct write method's return value is incorrect - * [THRIFT-3454] - Python Tornado tutorial is broken - * [THRIFT-3463] - Java can't be disabled in CMake build - * [THRIFT-3450] - NPE when using SSL - * [THRIFT-3449] - TBaseAsyncProcessor fb.responseReady() never called for oneway functions - * [THRIFT-3471] - Dart generator does not handle uppercase argument names - * [THRIFT-3470] - Sporadic timeouts with pipes - * [THRIFT-3465] - Go Code With Complex Const Initializer Compilation Depends On Struct Order - * [THRIFT-3464] - Fix several defects in c_glib code generator - * [THRIFT-3462] - Cocoa generates Incorrect #import header names - * [THRIFT-3453] - remove rat_exclude - * [THRIFT-3418] - Use of ciphers in ssl.wrap_socket() breaks python 2.6 compatibility - * [THRIFT-3417] - "namespace xsd" is not really working - * [THRIFT-3413] - Thrift code generation bug in Go when extending service - * [THRIFT-3420] - C++: TSSLSockets are not interruptable - * [THRIFT-3415] - include unistd.h conditionally - * [THRIFT-3414] - #include in THeaderTransport.h breaks windows build - * [THRIFT-3411] - Go generates remotes with wrong package qualifiers when including - * [THRIFT-3430] - Go THttpClient does not read HTTP response body to completion when closing - * [THRIFT-3423] - First call to thrift_transport:read_exact fails to dispatch correct function - * [THRIFT-3422] - Go TServerSocket doesn't close on Interrupt - * [THRIFT-3421] - rebar as dependency instead of bundling (was: rebar fails if PWD contains Unicode) - * [THRIFT-3428] - Go test fails when running make check - * [THRIFT-3445] - Throwable messages are hidden from JVM stack trace output - * [THRIFT-3443] - Thrift include can generate uncompilable code - * [THRIFT-3444] - Large 64 bit Integer does not preserve value through Node.js JSONProtocol - * [THRIFT-3436] - misc. cross test issues with UTF-8 path names - * [THRIFT-3435] - Put generated Java code for fullcamel tests in a separate package/namespace - * [THRIFT-3433] - Doubles aren't interpreted correctly - * [THRIFT-3437] - Mingw-w64 build fail - * [THRIFT-3434] - Dart generator produces empty name in pubspec.yaml for includes without namespaces - * [THRIFT-3408] - JSON generator emits incorrect types - * [THRIFT-3406] - Cocoa client should not schedule streams on main runloop - * [THRIFT-3404] - JSON String reader doesn't recognize UTF-16 surrogate pair - * [THRIFT-3636] - Double precision is not fully preserved in C++ TJSONProtocol - * [THRIFT-3632] - c_glib testserialization fails with glib assertion - * [THRIFT-3619] - Using Thrift 0.9.3 with googletest on Linux gcc 4.9 / C++11 - * [THRIFT-3617] - CMake does not build gv/xml generators - * [THRIFT-3615] - Fix Python SSL client resource leak on connection failure - * [THRIFT-3616] - lib/py/test/test_sslsocket.py is flaky - * [THRIFT-3643] - Perl SSL server crushes if a client disconnect without handshake - * [THRIFT-3639] - C# Thrift library forces TLS 1.0, thwarting TLS 1.2 usage - * [THRIFT-3633] - Travis "C C++ - GCC" build was using clang - * [THRIFT-3634] - Fix Python TSocket resource leak on connection failure - * [THRIFT-3630] - Debian/Ubuntu install docs need an update - * [THRIFT-3629] - Parser sets exitcode on errors, but generator does not - * [THRIFT-3608] - lib/cpp/test/SecurityTest is flaky in jenkins Thrift-precommit build. - * [THRIFT-3601] - Better conformance to PEP8 for generated code - * [THRIFT-3599] - Validate client IP address against cert's SubjectAltName - * [THRIFT-3598] - TBufferedTransport doesn't instantiate client connection - * [THRIFT-3597] - `make check` hangs in go tests - * [THRIFT-3589] - Dart generator uses wrong name in constructor for uppercase arguments with defaults - * [THRIFT-3588] - Using TypeScript with --noImplicitAny fails - * [THRIFT-3584] - boolean false value cannot be transferred - * [THRIFT-3578] - Make THeaderTransport detect TCompact framed and unframed - * [THRIFT-3323] - Python library does not handle escaped forward slash ("/") in JSON - * [THRIFT-3322] - CMake generated "make check" failes on python_test - * [THRIFT-3321] - Thrift can't be added as a subdirectory of another CMake-based project - * [THRIFT-3314] - Dots in file names of includes causes dots in javascript variable names - * [THRIFT-3307] - Segfault in Ruby serializer - * [THRIFT-3309] - Missing TConstant.php in /lib/php/Makefile.am - * [THRIFT-3810] - unresolved external symbol public: virtual void __cdecl apache::thrift::server::TServerFramework::serve(void) - * [THRIFT-3736] - C++ library build fails if OpenSSL does not surrpot SSLv3 - * [THRIFT-3878] - Compile error in TSSLSocket.cpp with new OpenSSL [CRYPTO_num_locks] - * [THRIFT-3949] - missing make dist entry for compiler/cpp/test - * [THRIFT-449] - The wire format of the JSON Protocol may not always be valid JSON if it contains non-UTF8 encoded strings - * [THRIFT-162] - Thrift structures are unhashable, preventing them from being used as set elements - * [THRIFT-3961] - TConnectedClient does not terminate the connection to the client if an exception while processing the received message occures. - * [THRIFT-3881] - Travis CI builds are failing due to docker failures (three retries, and gives up) - * [THRIFT-3937] - Cannot compile 0.10.0 development tip with gcc-4.6.x - * [THRIFT-3964] - Unsupported mechanism type ????? due to dependency on default OS-dependent charset - * [THRIFT-3038] - Use of volatile in cpp library - * [THRIFT-3301] - Java generated code uses imports that can lead to class name collisions with IDL defined types - * [THRIFT-3348] - PHP TCompactProtocol bool&int64 readvalue bug - * [THRIFT-3955] - TThreadedServer Memory Leak - * [THRIFT-3829] - Thrift does not install Python Libraries if Twisted is not installed - * [THRIFT-3932] - C++ ThreadManager has a rare termination race - * [THRIFT-3828] - cmake fails when Boost_INCLUDE_DIRS (and other variables passed to include_directories()) is empty - * [THRIFT-3958] - CMake WITH_MT option for windows static runtime linking does not support the cmake build type RelWithDebInfo - * [THRIFT-3957] - TConnectedClient does not disconnect from clients when their timeout is reached. - * [THRIFT-3953] - TSSLSocket::close should handle exceptions from waitForEvent because it is called by the destructor. - * [THRIFT-3977] - PHP extension creates undefined values when deserializing sets - * [THRIFT-3947] - sockaddr type isn't always large enough for the return of getsockname - * [THRIFT-2755] - ThreadSanitizer reports data race in ThreadManager::Impl::addWorker - * [THRIFT-3948] - errno is not the correct method of getting the error in windows - * [THRIFT-4008] - broken ci due to upstream dependency versioning break - * [THRIFT-3999] - Fix Debian & Ubuntu package dependencies - * [THRIFT-3886] - PHP cross test client returns 0 even when failing - * [THRIFT-3997] - building thrift libs does not support new openssl - -## Documentation - * [THRIFT-3867] - Specify BinaryProtocol and CompactProtocol - -## Epic - * [THRIFT-3049] - As an iOS developer, I want a generator and library that produces Swift code - * [THRIFT-2336] - UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - -## Improvement - * [THRIFT-1867] - Python client/server should support client-side certificates. - * [THRIFT-1313] - c_glib compact support - * [THRIFT-1385] - make install doesn't install java library in the setted folder - * [THRIFT-1437] - Update RPM spec - * [THRIFT-847] - Test Framework harmonization across all languages - * [THRIFT-819] - add Enumeration for protocol, transport and server types - * [THRIFT-3927] - Emit an error instead of throw an error in the async callback - * [THRIFT-3931] - TSimpleServer: If process request encounter UNKNOWN_METHOD, don't close transport. - * [THRIFT-3934] - Automatically resolve OpenSSL binary version on Windows CI - * [THRIFT-3918] - Run subset of make cross - * [THRIFT-3908] - Remove redundant dependencies from Dockerfile - * [THRIFT-3907] - Skip Docker image build on CI when unchanged - * [THRIFT-3868] - Java struct equals should do identity check before field comparison - * [THRIFT-3849] - Port Go serializer and deserializer to dart - * [THRIFT-2989] - Complete CMake build for Apache Thrift - * [THRIFT-2980] - ThriftMemoryBuffer doesn't have a constructor option to take an existing buffer - * [THRIFT-2856] - refactor erlang basic transports and unify interfaces - * [THRIFT-2877] - Optimize generated hashCode - * [THRIFT-2869] - JSON: run schema validation from tests - * [THRIFT-3112] - [Java] AsyncMethodCallback should be typed in generated AsyncIface - * [THRIFT-3263] - PHP jsonSerialize() should cast scalar types - * [THRIFT-2905] - Cocoa compiler should have option to produce "modern" Objective-C - * [THRIFT-2821] - Enable the use of custom HTTP-Header in the Transport - * [THRIFT-2093] - added the ability to set compression level in C++ zlib transport - * [THRIFT-2089] - Compiler ignores duplicate typenames - * [THRIFT-2056] - Moved all #include config.h statements to #include - * [THRIFT-2031] - Make SO_KEEPALIVE configurable for C++ lib - * [THRIFT-2021] - Improve large binary protocol string performance - * [THRIFT-2028] - Cleanup threading headers / libraries - * [THRIFT-2014] - Change C++ lib includes to use style throughout - * [THRIFT-2312] - travis.yml: build everything - * [THRIFT-1915] - Multiplexing Services - * [THRIFT-1736] - Visual Studio top level project files within msvc - * [THRIFT-1735] - integrate tutorial into regular build - * [THRIFT-1533] - Make TTransport should be Closeable - * [THRIFT-35] - Move language tests into their appropriate library directory - * [THRIFT-1079] - Support i64 in AS3 - * [THRIFT-1108] - SSL support for the Ruby library - * [THRIFT-3856] - update debian package deependencies - * [THRIFT-3833] - haxe http server implementation (by embeding into php web server) - * [THRIFT-3839] - Performance issue with big message deserialization using php extension - * [THRIFT-3820] - Erlang: Detect OTP >= 18 to use new time correction - * [THRIFT-3816] - Reduce docker build duration on Travis-CI - * [THRIFT-3815] - Put appveyor dependency versions to one place - * [THRIFT-3788] - Compatibility improvements and Win64 support - * [THRIFT-3792] - Timeouts for anonymous pipes should be configurable - * [THRIFT-3794] - Split Delphi application, protocol and transport exception subtypes into separate exceptions - * [THRIFT-3774] - The generated code should have exception_names meta info - * [THRIFT-3762] - Fix build warnings for deprecated Thrift "byte" fields - * [THRIFT-3756] - Improve requiredness documentation - * [THRIFT-3761] - Add debian package for Python3 - * [THRIFT-3742] - haxe php cli support - * [THRIFT-3733] - Socket timeout improvements - * [THRIFT-3728] - http transport for thrift-lua - * [THRIFT-3905] - Dart compiler does not initialize bool, int, and double properties - * [THRIFT-3911] - Loosen Ruby dev dependency version requirements - * [THRIFT-3906] - Run C# tests with make check - * [THRIFT-3900] - Add Python SSL flags - * [THRIFT-3897] - Provide meaningful exception type based on WebExceptionStatus in case of timeout - * [THRIFT-3808] - Missing `DOUBLE` in thrift type enumeration - * [THRIFT-3803] - Remove "file" attribute from XML generator - * [THRIFT-3660] - Add V4 mapped address to test client cert's altname - * [THRIFT-3661] - Use https to download meck in erlang test build - * [THRIFT-3659] - Check configure result of CMake on CI - * [THRIFT-3667] - Add TLS SNI support to clients - * [THRIFT-3651] - Make backports.match_hostname and ipaddress optional - * [THRIFT-3666] - Build D tutorial as part of Autotools build - * [THRIFT-3665] - Add D libevent and OpenSSL to docker images - * [THRIFT-3664] - Remove md5.c - * [THRIFT-3662] - Add Haskell to debian docker image - * [THRIFT-3711] - Add D to cross language test - * [THRIFT-3691] - Run flake8 Python style check on Travis-CI - * [THRIFT-3692] - (Re)enable Appveyor C++ and Python build - * [THRIFT-3677] - Improve CMake Java build - * [THRIFT-3679] - Add stdout log to testBinary in Java test server - * [THRIFT-3718] - Reduce size of docker image for build environment - * [THRIFT-3698] - [Travis-CI] Introduce retry to apt commands - * [THRIFT-3127] - switch -recurse to --recurse and reserve -r - * [THRIFT-3087] - Pass on errors like "connection closed" - * [THRIFT-3240] - Thrift Python client should support subjectAltName and wildcard certs in TSSLSocket - * [THRIFT-3213] - make cross should indicate when it skips a known failing test - * [THRIFT-3208] - Fix Visual Studio solution build failure due to missing source - * [THRIFT-3186] - Add TServerHTTP to Go library - * [THRIFT-2342] - Add __FILE__ and __LINE__ to Thrift C++ excpetions - * [THRIFT-3372] - Add dart generator to Visual Studio project - * [THRIFT-3366] - ThriftTest to implement standard return values - * [THRIFT-3402] - Provide a perl Unix Socket implementation - * [THRIFT-3361] - Improve C# library - * [THRIFT-3393] - Introduce i8 to provide consistent set of Thrift IDL integer types - * [THRIFT-3339] - Support for database/sql - * [THRIFT-3565] - C++: T[Async]Processor::getEventHandler() should be declared as const member functions - * [THRIFT-3563] - C++/Qt: removed usage of macro QT_PREPEND_NAMESPACE as it isn't consequently used for all references to Qt types. - * [THRIFT-3562] - Removed unused TAsyncProcessor::getAsyncServer() - * [THRIFT-3561] - C++/Qt: make use of Q_DISABLE_COPY() to get rid of copy ctor and assignment operator - * [THRIFT-3556] - c_glib file descriptor transport - * [THRIFT-3544] - Make cross test fail when server process died unexpectedly - * [THRIFT-3540] - Make python tutorial more in line with PEP8 - * [THRIFT-3535] - Dart generator argument to produce a file structure usable in parent library - * [THRIFT-3505] - Enhance Python TSSLSocket - * [THRIFT-3506] - Eliminate old style classes from library code - * [THRIFT-3503] - Enable py:utf8string by default - * [THRIFT-3499] - Add package_prefix to python generator - * [THRIFT-3495] - Minor enhancements and fixes for cross test - * [THRIFT-3486] - Java generated `getFieldValue` is incompatible with `setFieldValue` for binary values. - * [THRIFT-3484] - Consolidate temporary buffers in Java's TCompactProtocol - * [THRIFT-3516] - Add feature test for THeader TBinaryProtocol interop - * [THRIFT-3515] - Python 2.6 compatibility and test on CI - * [THRIFT-3514] - PHP 7 compatible version of binary protocol - * [THRIFT-3469] - Docker: Debian support - * [THRIFT-3416] - Retire old "xxx_namespace" declarations from the IDL - * [THRIFT-3426] - Align autogen comment in XSD - * [THRIFT-3424] - Add CMake android build option - * [THRIFT-3439] - Run make cross using Python3 when available - * [THRIFT-3440] - Python make check takes too much time - * [THRIFT-3441] - Stabilize Travis-CI builds - * [THRIFT-3431] - Avoid "schemes" HashMap lookups during struct reads/writes - * [THRIFT-3432] - Add a TByteBuffer transport to the Java library - * [THRIFT-3438] - Enable py:new_style by default - * [THRIFT-3405] - Go THttpClient misuses http.Client objects - * [THRIFT-3614] - Improve logging of test_sslsocket.py - * [THRIFT-3647] - Fix php extension build warnings - * [THRIFT-3642] - Speed up cross test runner - * [THRIFT-3637] - Implement compact protocol for dart - * [THRIFT-3613] - Port Python C extension to Python 3 - * [THRIFT-3612] - Add Python C extension for compact protocol - * [THRIFT-3611] - Add --regex filter to cross test runner - * [THRIFT-3631] - JSON protocol implementation for Lua - * [THRIFT-3609] - Remove or replace TestPortFixture.h - * [THRIFT-3605] - Have the compiler complain about invalid arguments and options - * [THRIFT-3596] - Better conformance to PEP8 - * [THRIFT-3585] - Compact protocol implementation for Lua - * [THRIFT-3582] - Erlang libraries should have service metadata - * [THRIFT-3579] - Introduce retry to make cross - * [THRIFT-3306] - Java: TBinaryProtocol: Use 1 temp buffer instead of allocating 8 - * [THRIFT-3910] - Do not invoke pip as part of build process - * [THRIFT-1857] - Python 3.X Support - * [THRIFT-1944] - Binding to zero port - * [THRIFT-3954] - Enable the usage of structs called "Object" in Java - * [THRIFT-3981] - Enable analyzer strong mode in Dart library - * [THRIFT-3998] - Document ability to add custom tags to thrift structs - * [THRIFT-4006] - Add a removeEventListener method on TSocket - -## New Feature - * [THRIFT-640] - Support deprecation - * [THRIFT-948] - SSL socket support for PHP - * [THRIFT-764] - add Support for Vala language - * [THRIFT-3046] - Allow PSR4 class loading for generated classes (PHP) - * [THRIFT-2113] - Erlang SSL Socket Support - * [THRIFT-1482] - Unix domain socket support under PHP - * [THRIFT-519] - Support collections of types without having to explicitly define it - * [THRIFT-468] - Rack Middleware Application for Rails - * [THRIFT-1708] - Add event handlers for processor events - * [THRIFT-3834] - Erlang namespacing and exception metadata - * [THRIFT-2510] - Implement TNonblockingServer's ability to listen on unix domain sockets - * [THRIFT-3397] - Implement TProcessorFactory in C# to enable per-client processors - * [THRIFT-3523] - XML Generator - * [THRIFT-3510] - Add HttpTaskAsyncHandler implementation - * [THRIFT-3318] - PHP: SimpleJSONProtocol Implementation - * [THRIFT-3299] - Dart language bindings in Thrift - * [THRIFT-2835] - Add possibility to distribute generators separately from thrift core, and load them dynamically - * [THRIFT-184] - Add OSGi Manifest headers to the libthrift java library to be able to use Thrift in the OSGi runtime - * [THRIFT-141] - If a required field is not present on serialization, throw an exception - * [THRIFT-1891] - Add Windows ALPC transport which is right counterpart of Unix domain sockets - -## Question - * [THRIFT-1808] - The Thrift struct should be considered self-contained? - * [THRIFT-2895] - Tutorial cpp - * [THRIFT-3860] - Elephant-bird application Test fails for Thrift - * [THRIFT-3811] - HTTPS Support for C++ applications - * [THRIFT-3509] - "make check" error - -## Story - * [THRIFT-3452] - .travis.yml: Migrating from legacy to container-based infrastructure - -## Sub-task - * [THRIFT-1811] - ruby tutorial as part of the regular build - * [THRIFT-2779] - PHP TJSONProtocol encode unicode into UCS-4LE which can't be parsed by other language bindings - * [THRIFT-2110] - Erlang: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-3852] - A Travis-CI job fails with "write error" - * [THRIFT-3740] - Fix haxelib.json classpath - * [THRIFT-3653] - incorrect union serialization - * [THRIFT-3652] - incorrect serialization of optionals - * [THRIFT-3655] - incorrect union serialization - * [THRIFT-3654] - incorrect serialization of optionals - * [THRIFT-3656] - incorrect serialization of optionals - * [THRIFT-3699] - Fix integer limit symbol includes in Python C extension - * [THRIFT-3693] - Fix include issue in C++ TSSLSocketInterruptTest on Windows - * [THRIFT-3694] - [Windows] Disable tests of a few servers that are not supported - * [THRIFT-3696] - Install pip to CentOS Docker images to fix Python builds - * [THRIFT-3638] - Fix haxelib.json - * [THRIFT-3251] - Add http transport for server to Go lib - * [THRIFT-2424] - Recursive Types - * [THRIFT-2423] - THeader - * [THRIFT-2413] - Python: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2409] - Java: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2412] - D: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2411] - C++: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2410] - JavaMe: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2668] - TestSuite: detailed result on passed tests by feature - * [THRIFT-2659] - python Test Server fails when throwing TException - * [THRIFT-3398] - Add CMake build for Haskell library and tests - * [THRIFT-3396] - DART: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-3364] - Fix ruby binary field encoding in TJSONProtocol - * [THRIFT-3381] - Fix for misc. codegen issues with THRIFT-2905 - * [THRIFT-3573] - No rule to make target `../../../test/c_glib/src/.deps/testthrifttest-thrift_test_handler.Po'. - * [THRIFT-3572] - "Unable to determine the behavior of a signed right shift" - * [THRIFT-3542] - Add length limit support to Java test server - * [THRIFT-3537] - Remove the (now obsolete) csharp:asyncctp flag - * [THRIFT-3532] - Add configurable string and container read size limit to Python protocols - * [THRIFT-3531] - Create cross lang feature test for string and container read length limit - * [THRIFT-3482] - Haskell JSON protocol does not encode binary field as Base64 - * [THRIFT-3425] - Minor fixes + simplification for CentOS Dockerfile - * [THRIFT-3442] - Run CMake tests on Appveyor - * [THRIFT-3409] - NodeJS binary field issues - * [THRIFT-3621] - Fix lib/cpp/test/SecurityTest.cpp to use ephemeral ports - * [THRIFT-3628] - Fix lib/cpp/test/TServerIntegrationTest.cpp to use ephemeral ports - * [THRIFT-3625] - Kill unused #include "TestPortFixture.h" in lib/cpp/test/TServerTransportTest.cpp. - * [THRIFT-3646] - Fix Python extension build warnings - * [THRIFT-3626] - Fix lib/cpp/test/TSocketInterruptTest.cpp to use ephemeral ports. - * [THRIFT-3624] - Fix lib/cpp/test/TServerSocketTest.cpp to use ephemeral ports - * [THRIFT-3623] - Fix Fix cpp/lib/test/TSSLSocketInterruptTest.cpp to use ephemeral ports - * [THRIFT-3592] - Add basic test client - * [THRIFT-3980] - add TExtendedBinaryProtocol.java - -## Task - * [THRIFT-1801] - Sync up TApplicationException codes across languages and thrift implementations - * [THRIFT-1259] - Automate versioning - -## Test - * [THRIFT-3400] - Add Erlang to cross test - * [THRIFT-3504] - Fix FastbinaryTest.py - -## Wish - * [THRIFT-3923] - Maybe remove Aereo from the "Powered by" list - * [THRIFT-2149] - Add an option to disable the generation of default operators - - - -Thrift 0.9.3 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-2441] - Cannot shutdown TThreadedServer when clients are still connected - * [THRIFT-2465] - TBinaryProtocolT breaks if copied/moved - * [THRIFT-2474] - thrift.h causes a compile failure - * [THRIFT-2540] - Running configure from outside the source directory fails - * [THRIFT-2598] - Add check for minimum Go version to configure.ac - * [THRIFT-2647] - compiler-hs: don't decapitalize field names, do decapitalize argument bindings - * [THRIFT-2773] - Generated Java code for 'oneway' methods is incorrect. - * [THRIFT-2789] - TNonblockingServer leaks socket FD's under load - * [THRIFT-2682] - TThreadedServer leaks per-thread memory - * [THRIFT-2674] - JavaScript: declare Accept: and Content-Type: in request - * [THRIFT-3078] - TNonblockingServerSocket's logger is not named after TNonblockingServerSocket - * [THRIFT-3077] - C++ TFileTransport ignores return code from ftruncate - * [THRIFT-3067] - C++ cppcheck performance related warnings - * [THRIFT-3066] - C++ TDenseProtocol assert modifies instead of checks - * [THRIFT-3071] - bootstrap.sh on Ubuntu 12.04 (Precise) automake error - * [THRIFT-3069] - C++ TServerSocket leaks socket on fcntl get or set flags error - * [THRIFT-3079] - TNonblockingServerSocket's logger is not named after TNonblockingServerSocket - * [THRIFT-3080] - C++ TNonblockingServer connection leak while accept huge number connections. - * [THRIFT-3086] - C++ Valgrind Error Cleanup - * [THRIFT-3085] - thrift_reconnecting_client never try to reconnect - * [THRIFT-3123] - Missing include in compiler/cpp/src/main.h breaks build in some environments - * [THRIFT-3125] - Fix the list of exported headers in automake input - * [THRIFT-3126] - PHP JSON serializer converts empty or int-indexed maps to lists - * [THRIFT-3132] - Properly format date in Java @Generated annotations - * [THRIFT-3137] - Travis build hangs after failure - * [THRIFT-3138] - "make check" parallel execution is underministic - * [THRIFT-3139] - JS library test is flaky - * [THRIFT-3140] - ConcurrentModificationException is thrown by JavaScript test server - * [THRIFT-3124] - Some signed/unsigned warnings while building compiler - * [THRIFT-3128] - Go generated code produces name collisions between services - * [THRIFT-3146] - Graphviz generates function name collisions between services - * [THRIFT-3147] - Segfault while receiving data - * [THRIFT-3148] - Markdown links to coding_standards are dead - * [THRIFT-3090] - cmake build is broken on MacOSX - * [THRIFT-3097] - cmake targets unconditionally depend on optional libraries - * [THRIFT-3094] - master as of 2015-APR-13 fails -DBOOST_THREADS cmake build - * [THRIFT-3099] - cmake build is broken on FreeBSD - * [THRIFT-3089] - Assigning default ENUM values results in non-compilable java code if java namespace is not defined - * [THRIFT-3093] - mingw compile fixes for c++ library 0.9.2 - * [THRIFT-3098] - Thrift does not pretty print binary typedefs the way it does binary fields - * [THRIFT-3091] - c_glib service method should return result from handler method - * [THRIFT-3088] - TThreadPoolServer with Sasl auth may leak CLOSE_WAIT socket - * [THRIFT-3109] - Cross test log file cannot be browsed when served in HTTP server - * [THRIFT-3113] - m4 C++11 macro issue - * [THRIFT-3105] - C++ libthriftnb library on Windows build failure - * [THRIFT-3115] - Uncompileable code due to name collision with predefined used types - * [THRIFT-3117] - Java TSSLTransportFactory can't load certificates within JAR archive - * [THRIFT-3102] - could not make check for Go Library - * [THRIFT-3120] - Minor spelling errors and an outdated URL - * [THRIFT-3121] - Librt does not exist on OS X - * [THRIFT-3152] - Compiler error on Mac OSX (missing #include ) - * [THRIFT-3162] - make fails for dmd 2.067 - * [THRIFT-3164] - Thrift C++ library SSL socket by default allows for unsecure SSLv3 negotiation - * [THRIFT-3168] - Fix Maven POM - * [THRIFT-3170] - Initialism code in the Go compiler causes chaos - * [THRIFT-3169] - Do not export thrift.TestStruct and thrift.TestEnum in thrift Go library - * [THRIFT-3191] - Perl compiler does not add support for unexpected exception handling - * [THRIFT-3178] - glib C does not compile - * [THRIFT-3189] - Perl ServerSocket should allow a specific interface to be listened to - * [THRIFT-3252] - Missing TConcurrentClientSyncInfo.h in cpp Makefile, so doesn't install - * [THRIFT-3255] - Thrift generator doesn't exclude 'package' keyword for thrift property names breaking java builds - * [THRIFT-3260] - multiple warnings in c_glib tutorial - * [THRIFT-3256] - Some D test timings are too aggressive for slow machines - * [THRIFT-3257] - warning: extra tokens at end of #endif directive - * [THRIFT-3184] - Thrift Go leaves file descriptors open - * [THRIFT-3203] - DOAP - please fix "Ocaml" => "OCaml" - * [THRIFT-3210] - (uncompileable) code generated for server events while are events not enabled - * [THRIFT-3215] - TJSONProtocol '(c++) uses "throw new" to throw exceptions instead of "throw" - * [THRIFT-3202] - Allow HSHAServer to configure min and max worker threads separately. - * [THRIFT-3205] - TCompactProtocol return a wrong error when the io.EOF happens - * [THRIFT-3209] - LGPL mentioned in license file - * [THRIFT-3197] - keepAliveTime is hard coded as 60 sec in TThreadPoolServer - * [THRIFT-3196] - Misspelling in lua TBinaryProtocol (stirctWrite => strictWrite) - * [THRIFT-3198] - Allow construction of TTransportFactory with a specified maxLength - * [THRIFT-3192] - Go import paths changed in 1.4, and expired June 1 - * [THRIFT-3271] - Could not find or load main class configtest_ax_javac_and_java on some non-english systems - * [THRIFT-3273] - c_glib: Generated code tries to convert between function and void pointers - * [THRIFT-3264] - Fix Erlang 16 namespaced types - * [THRIFT-3270] - reusing TNonblockingServer::TConnection cause dirty TSocket - * [THRIFT-3267] - c_glib: "Critical" failure during unit tests - * [THRIFT-3277] - THttpClient leaks connections if it's used for multiple requests - * [THRIFT-3278] - NodeJS: Fix exception stack traces and names - * [THRIFT-3279] - Fix a bug in retry_max_delay (NodeJS) - * [THRIFT-3280] - Initialize retry variables on construction - * [THRIFT-3283] - c_glib: Tutorial server always exits with warning - * [THRIFT-3284] - c_glib: Empty service produces unused-variable warning - * [THRIFT-1925] - c_glib generated code does not compile - * [THRIFT-1849] - after transport->open() opens isOpen returns true and next open() goes thru when it shall not - * [THRIFT-1866] - java compiler generates non-compiling code with const's defined in a thrift when name includes non-identifier chars - * [THRIFT-1938] - FunctionRunner.h -- uses wrong path for Thread.h when installed - * [THRIFT-1844] - Password string not cleared - * [THRIFT-2004] - Thrift::Union violates :== method contract and crashes - * [THRIFT-2073] - Thrift C++ THttpClient error: cannot refill buffer - * [THRIFT-2127] - Autoconf scripting does not properly account for cross-compile - * [THRIFT-2180] - Integer types issues in Cocoa lib on ARM64 - * [THRIFT-2189] - Go needs "isset" to fully support "union" type (and optionals) - * [THRIFT-2192] - autotools on Redhat based systems - * [THRIFT-2546] - cross language tests fails at 'TestMultiException' when using nodejs server - * [THRIFT-2547] - nodejs servers and clients fails to connect with cpp using compact protocol - * [THRIFT-2548] - Nodejs servers and clients does not work properly with -ssl - * [THRIFT-1471] - toString() does not print ByteBuffer values when nested in a List - * [THRIFT-1201] - getaddrinfo resource leak - * [THRIFT-615] - TThreadPoolServer doesn't call task_done after pulling tasks from it's clients queue - * [THRIFT-162] - Thrift structures are unhashable, preventing them from being used as set elements - * [THRIFT-810] - Crashed client on TSocket::close under loads - * [THRIFT-557] - charset problem with file Autogenerated by Thrift - * [THRIFT-233] - IDL doesn't support negative hex literals - * [THRIFT-1649] - contrib/zeromq does not build in 0.8.0 - * [THRIFT-1642] - Miscalculation lead to throw unexpected "TTransportException::TIMED_OUT"(or called "EAGAIN (timed out)") exception - * [THRIFT-1587] - TSocket::setRecvTimeout error - * [THRIFT-1248] - pointer subtraction in TMemoryBuffer relies on undefined behavior - * [THRIFT-1774] - Sasl Transport client would hang when trying to connect non-sasl transport server - * [THRIFT-1754] - RangeError in buffer handling - * [THRIFT-1618] - static structMap in FieldMetaData is not thread safe and can lead to deadlocks - * [THRIFT-2335] - thrift incompatibility with py:tornado as server, java as client - * [THRIFT-2803] - TCP_DEFER_ACCEPT not supported with domain sockets - * [THRIFT-2799] - Build Problem(s): ld: library not found for -l:libboost_unit_test_framework.a - * [THRIFT-2801] - C++ test suite compilation warnings - * [THRIFT-2802] - C++ tutorial compilation warnings - * [THRIFT-2795] - thrift_binary_protocol.c: 'dereferencing type-punned pointer will break strict-aliasing rules' - * [THRIFT-2817] - TSimpleJSONProtocol reads beyond end of message - * [THRIFT-2826] - html:standalone sometimes ignored - * [THRIFT-2829] - Support haxelib installation via github - * [THRIFT-2828] - slightly wrong help screen indent - * [THRIFT-2831] - Removes dead code in web_server.js introduced in THRIFT-2819 - * [THRIFT-2823] - All JS-tests are failing when run with grunt test - * [THRIFT-2827] - Thrift 0.9.2 fails to compile on Yosemite due to tr1/functional include in ProcessorTest.cpp - * [THRIFT-2843] - Automake configure.ac has possible typo related to Java - * [THRIFT-2813] - multiple haxe library fixes/improvements - * [THRIFT-2825] - Supplying unicode to python Thrift client can cause next request arguments to get overwritten - * [THRIFT-2840] - Cabal file points to LICENSE file outside the path of the Haskell project. - * [THRIFT-2818] - Trailing commas in array - * [THRIFT-2830] - Clean up ant warnings in tutorial dir - * [THRIFT-2842] - Erlang thrift client has infinite timeout - * [THRIFT-2810] - Do not leave the underlying ServerSocket open if construction of TServerSocket fails - * [THRIFT-2812] - Go server adding redundant buffering layer - * [THRIFT-2839] - TFramedTransport read bug - * [THRIFT-2844] - Nodejs support broken when running under Browserify - * [THRIFT-2814] - args/result classes not found when no namespace is set - * [THRIFT-2847] - function IfValue() is a duplicate of System.StrUtils.IfThen - * [THRIFT-2848] - certain Delphi tests do not build if TypeRegistry is used - * [THRIFT-2854] - Go Struct writer and reader looses important error information - * [THRIFT-2858] - Enable header field case insensitive match in THttpServer - * [THRIFT-2857] - C# generator creates uncompilable code for struct constants - * [THRIFT-2860] - Delphi server closes connection on unexpected exceptions - * [THRIFT-2868] - Enhance error handling in the Go client - * [THRIFT-2879] - TMemoryBuffer: using lua string in wrong way - * [THRIFT-2851] - Remove strange public Peek() from Go transports - * [THRIFT-2852] - Better Open/IsOpen/Close behavior for StreamTransport. - * [THRIFT-2871] - Missing semicolon in thrift.js - * [THRIFT-2872] - ThreadManager deadlock for task expiration - * [THRIFT-2881] - Handle errors from Accept() correctly - * [THRIFT-2849] - Spell errors reported by codespell tool - * [THRIFT-2870] - C++ TJSONProtocol using locale dependent formatting - * [THRIFT-2882] - Lua Generator: using string.len funtion to get struct(map,list,set) size - * [THRIFT-2864] - JSON generator missing from Visual Studio build project - * [THRIFT-2878] - Go validation support of required fields - * [THRIFT-2873] - TPipe and TPipeServer don't compile on Windows with UNICODE enabled - * [THRIFT-2888] - import of is missing in JSON generator - * [THRIFT-2900] - Python THttpClient does not reset socket timeout on exception - * [THRIFT-2907] - 'ntohll' macro redefined - * [THRIFT-2884] - Map does not serialize correctly for JSON protocol in Go library - * [THRIFT-2887] - --with-openssl configure flag is ignored - * [THRIFT-2894] - PHP json serializer skips maps with int/bool keys - * [THRIFT-2904] - json_protocol_test.go fails - * [THRIFT-2906] - library not found for -l:libboost_unit_test_framework.a - * [THRIFT-2890] - binary data may lose bytes with JSON transport under specific circumstances - * [THRIFT-2891] - binary data may cause a failure with JSON transport under specific circumstances - * [THRIFT-2901] - Fix for generated TypeScript functions + indentation of JavaScript maps - * [THRIFT-2916] - make check fails for D language - * [THRIFT-2918] - Race condition in Python TProcessPoolServer test - * [THRIFT-2920] - Erlang Thrift test uses wrong IDL file - * [THRIFT-2922] - $TRIAL is used with Python tests but not tested accordingly - * [THRIFT-2912] - Autotool build for C++ Qt library is invalid - * [THRIFT-2914] - explicit dependency to Lua5.2 fails on some systems - * [THRIFT-2910] - libevent is not really optional - * [THRIFT-2911] - fix c++ version zeromq transport, the old version cannot work - * [THRIFT-2915] - Lua generator missing from Visual Studio build project - * [THRIFT-2917] - "make clean" breaks test/c_glib - * [THRIFT-2919] - Haxe test server timeout too large - * [THRIFT-2923] - JavaScript client assumes a message being written - * [THRIFT-2924] - TNonblockingServer crashes when user-provided event_base is used - * [THRIFT-2925] - CMake build does not work with OpenSSL nor anything installed in non-system location - * [THRIFT-2931] - Access to undeclared static property: Thrift\Protocol\TProtocol::$TBINARYPROTOCOLACCELERATED - * [THRIFT-2893] - CMake build fails with boost thread or std thread - * [THRIFT-2902] - Generated c_glib code does not compile with clang - * [THRIFT-2903] - Qt4 library built with CMake does not work - * [THRIFT-2942] - CSharp generate invalid code for property named read or write - * [THRIFT-2932] - Node.js Thrift connection libraries throw Exceptions into event emitter - * [THRIFT-2933] - v0.9.2: doubles encoded in node with compact protocol cannot be decoded by python - * [THRIFT-2934] - createServer signature mismatch - * [THRIFT-2981] - IDL with no namespace produces unparsable PHP - * [THRIFT-2999] - Addition of .gitattributes text auto in THRIFT-2724 causes modified files on checkout - * [THRIFT-2949] - typo in compiler/cpp/README.md - * [THRIFT-2957] - warning: source file %s is in a subdirectory, but option 'subdir-objects' is disabled - * [THRIFT-2953] - TNamedPipeServerTransport is not Stop()able - * [THRIFT-2962] - Docker Thrift env for development and testing - * [THRIFT-2971] - C++ test and tutorial parallel build is unstable - * [THRIFT-2972] - Missing backslash in lib/cpp/test/Makefile.am - * [THRIFT-2951] - Fix Erlang name conflict test - * [THRIFT-2955] - Using list of typedefs does not compile on Go - * [THRIFT-2960] - namespace regression for Ruby - * [THRIFT-2959] - nodejs: fix binary unit tests - * [THRIFT-2966] - nodejs: Fix bad references to TProtocolException and TProtocolExceptionType - * [THRIFT-2970] - grunt-jsdoc fails due to dependency issues - * [THRIFT-3001] - C# Equals fails for binary fields (byte[]) - * [THRIFT-3003] - Missing LICENSE file prevents package from being installed - * [THRIFT-3008] - Node.js server does not fully support exception - * [THRIFT-3007] - Travis build is broken because of directory conflict - * [THRIFT-3009] - TSSLSocket does not use the correct hostname (breaks certificate checks) - * [THRIFT-3011] - C# test server testException() not implemented according to specs - * [THRIFT-3012] - Timing problems in NamedPipe implementation due to unnecessary open/close - * [THRIFT-3019] - Golang generator missing docstring for structs - * [THRIFT-3021] - Service remote tool does not import stub package with package prefix - * [THRIFT-3026] - TMultiplexedProcessor does not have a constructor - * [THRIFT-3028] - Regression caused by THRIFT-2180 - * [THRIFT-3017] - order of map key/value types incorrect for one CTOR - * [THRIFT-3020] - Cannot compile thrift as C++03 - * [THRIFT-3024] - User-Agent "BattleNet" used in some Thrift library files - * [THRIFT-3047] - Uneven calls to indent_up and indent_down in Cocoa generator - * [THRIFT-3048] - NodeJS decoding of I64 is inconsistent across protocols - * [THRIFT-3043] - go compiler generator uses non C++98 code - * [THRIFT-3044] - Docker README.md paths to Dockerfiles are incorrect - * [THRIFT-3040] - bower.json wrong "main" path - * [THRIFT-3051] - Go Thrift generator creates bad go code - * [THRIFT-3057] - Java compiler build is broken - * [THRIFT-3061] - C++ TSSLSocket shutdown delay/vulnerability - * [THRIFT-3062] - C++ TServerSocket invalid port number (over 999999) causes stack corruption - * [THRIFT-3065] - Update libthrift dependencies (slf4j, httpcore, httpclient) - * [THRIFT-3244] - TypeScript: fix namespace of included types - * [THRIFT-3246] - Reduce the number of trivial warnings in Windows C++ CMake builds - * [THRIFT-3224] - Fix TNamedPipeServer unpredictable behavior on accept - * [THRIFT-3230] - Python compiler generates wrong code if there is function throwing a typedef of exception with another namespace - * [THRIFT-3236] - MaxSkipDepth never checked - * [THRIFT-3239] - Limit recursion depth - * [THRIFT-3241] - fatal error: runtime: cannot map pages in arena address space - * [THRIFT-3242] - OSGi Import-Package directive is missing the Apache HTTP packages - * [THRIFT-3234] - Limit recursion depth - * [THRIFT-3222] - TypeScript: Generated Enums are quoted - * [THRIFT-3229] - unexpected Timeout exception when desired bytes are only partially available - * [THRIFT-3231] - CPP: Limit recursion depth to 64 - * [THRIFT-3235] - Limit recursion depth - * [THRIFT-3175] - fastbinary.c python deserialize can cause huge allocations from garbage - * [THRIFT-3176] - Union incorrectly implements == - * [THRIFT-3177] - Fails to run rake test - * [THRIFT-3180] - lua plugin: framed transport do not work - * [THRIFT-3179] - lua plugin cant connect to remote server because function l_socket_create_and_connect always bind socket to localhost - * [THRIFT-3248] - TypeScript: additional comma in method signature without parameters - * [THRIFT-3302] - Go JSON protocol should encode Thrift byte type as signed integer string - * [THRIFT-3297] - c_glib: an abstract base class is not generated - * [THRIFT-3294] - TZlibTransport for Java does not write data correctly - * [THRIFT-3296] - Go cross test does not conform to spec - * [THRIFT-3295] - C# library does not build on Mono 4.0.2.5 or later - * [THRIFT-3293] - JavaScript: null values turn into empty structs in constructor - * [THRIFT-3310] - lib/erl/README.md has incorrect formatting - * [THRIFT-3319] - CSharp tutorial will not build using the *.sln - * [THRIFT-3335] - Ruby server does not handle processor exception - * [THRIFT-3338] - Stray underscore in generated go when service name starts with "New" - * [THRIFT-3324] - Update Go Docs for pulling all packages - * [THRIFT-3345] - Clients blocked indefinitely when a java.lang.Error is thrown - * [THRIFT-3332] - make dist fails on clean build - * [THRIFT-3326] - Tests do not compile under *BSD - * [THRIFT-3334] - Markdown notation of protocol spec is malformed - * [THRIFT-3331] - warning: ‘etype’ may be used uninitialized in this function - * [THRIFT-3349] - Python server does not handle processor exception - * [THRIFT-3343] - Fix haskell README - * [THRIFT-3340] - Python: enable json tests again - * [THRIFT-3311] - Top level README.md has incorrect formmating - * [THRIFT-2936] - Minor memory leak in SSL - * [THRIFT-3290] - Using from in variable names causes the generated Python code to have errors - * [THRIFT-3225] - Fix TPipeServer unpredictable behavior on interrupt() - * [THRIFT-3354] - Fix word-extraction substr bug in initialism code - * [THRIFT-2006] - TBinaryProtocol message header call name length is not validated and can be used to core the server - * [THRIFT-3329] - C++ library unit tests don't compile against the new boost-1.59 unit test framework - * [THRIFT-2630] - windows7 64bit pc. ipv4 and ipv6 pc.can't use - * [THRIFT-3336] - Thrift generated streaming operators added in 0.9.2 cannot be overridden - * [THRIFT-2681] - Core of unwind_cleanup - * [THRIFT-3317] - cpp namespace org.apache issue appears in 0.9 - -## Documentation - * [THRIFT-3286] - Apache Ant is a necessary dependency - -## Improvement - * [THRIFT-227] - Byte[] in collections aren't pretty printed like regular binary fields - * [THRIFT-2744] - Vagrantfile for Centos 6.5 - * [THRIFT-2644] - Haxe support - * [THRIFT-2756] - register Media Type @ IANA - * [THRIFT-3076] - Compatibility with Haxe 3.2.0 - * [THRIFT-3081] - C++ Consolidate client processing loops in TServers - * [THRIFT-3083] - C++ Consolidate server processing loops in TSimpleServer, TThreadedServer, TThreadPoolServer - * [THRIFT-3084] - C++ add concurrent client limit to threaded servers - * [THRIFT-3074] - Add compiler/cpp/lex.yythriftl.cc to gitignore. - * [THRIFT-3134] - Remove use of deprecated "phantom.args" - * [THRIFT-3133] - Allow "make cross" and "make precross" to run without building all languages - * [THRIFT-3142] - Make JavaScript use downloaded libraries - * [THRIFT-3141] - Improve logging of JavaScript test - * [THRIFT-3144] - Proposal: make String representation of enums in generated go code less verbose - * [THRIFT-3130] - Remove the last vestiges of THRIFT_OVERLOAD_IF from THRIFT-1316 - * [THRIFT-3131] - Consolidate suggested import path for go thrift library to git.apache.org in docs and code - * [THRIFT-3092] - Generated Haskell types should derive Generic - * [THRIFT-3110] - Print error log after cross test failures on Travis - * [THRIFT-3114] - Using local temp variables to not pollute the global table - * [THRIFT-3106] - CMake summary should give more information why a library is set to off - * [THRIFT-3119] - Java's TThreadedSelectorServer has indistinguishable log messages in run() - * [THRIFT-3122] - Javascript struct constructor should properly initialize struct and container members from plain js arguments - * [THRIFT-3151] - Fix links to git-wip* - should be git.apache.org - * [THRIFT-3167] - Windows build from source instructions need to be revised - * [THRIFT-3155] - move contrib/mingw32-toolchain.cmake to build/cmake/ - * [THRIFT-3160] - Make generated go enums implement TextMarshaller and TextUnmarshaller interfaces - * [THRIFT-3150] - Add an option to thrift go generator to make Read and Write methods private - * [THRIFT-3149] - Make ReadFieldN methods in generated Go code private - * [THRIFT-3172] - Add tutorial to Thrift web site - * [THRIFT-3214] - Add Erlang option for using maps instead of dicts - * [THRIFT-3201] - Capture github test artifacts for failed builds - * [THRIFT-3266] - c_glib: Multiple compiler warnings building unit tests - * [THRIFT-3285] - c_glib: Build library with all warnings enabled, no warnings generated - * [THRIFT-1954] - Allow for a separate connection timeout value - * [THRIFT-2098] - Add support for Qt5+ - * [THRIFT-2199] - Remove Dense protocol (was: move to Contrib) - * [THRIFT-406] - C++ Test suite cleanup - * [THRIFT-902] - socket and connect timeout in TSocket should be distinguished - * [THRIFT-388] - Use a separate wire format for async calls - * [THRIFT-727] - support native C++ language specific exception message - * [THRIFT-1784] - pep-3110 compliance for exception handling - * [THRIFT-1025] - C++ ServerSocket should inherit from Socket with the necessary Ctor to listen on connections from a specific host - * [THRIFT-2269] - Can deploy libthrift-source.jar to maven center repository - * [THRIFT-2804] - Pull an interface out of TBaseAsyncProcessor - * [THRIFT-2806] - more whitespace fixups - * [THRIFT-2811] - Make remote socket address accessible - * [THRIFT-2809] - .gitignore update for compiler's visual project - * [THRIFT-2846] - Expose ciphers parameter from ssl.wrap_socket() - * [THRIFT-2859] - JSON generator: output complete descriptors - * [THRIFT-2861] - add buffered transport - * [THRIFT-2865] - Test case for Go: SeqId out of sequence - * [THRIFT-2866] - Go generator source code is hard to read and maintain - * [THRIFT-2880] - Read the network address from the listener if available. - * [THRIFT-2875] - Typo in TDenseProtocol.h comment - * [THRIFT-2874] - TBinaryProtocol member variable "string_buf_" is never used. - * [THRIFT-2855] - Move contributing.md to the root of the repository - * [THRIFT-2862] - Enable RTTI and/or build macros for generated code - * [THRIFT-2876] - Add test for THRIFT-2526 Assignment operators and copy constructors in c++ don't copy the __isset struct - * [THRIFT-2897] - Generate -isEqual: and -hash methods - * [THRIFT-2909] - Improve travis build - * [THRIFT-2921] - Make Erlang impl ready for OTP 18 release (dict/0 and set/0 are deprecated) - * [THRIFT-2928] - Rename the erlang test_server module - * [THRIFT-2940] - Allow installing Thrift from git as NPM module by providing package.json in top level directory - * [THRIFT-2937] - Allow setting a maximum frame size in TFramedTransport - * [THRIFT-2976] - nodejs: xhr and websocket support for browserify - * [THRIFT-2996] - Test for Haxe 3.1.3 or better - * [THRIFT-2969] - nodejs: DRY up library tests - * [THRIFT-2973] - Update Haxe lib readme regarding Haxe 3.1.3 - * [THRIFT-2952] - Improve handling of Server.Stop() - * [THRIFT-2964] - nodejs: move protocols and transports into separate files - * [THRIFT-2963] - nodejs - add test coverage - * [THRIFT-3006] - Attach 'omitempty' json tag for optional fields in Go - * [THRIFT-3027] - Go compiler does not ensure common initialisms have consistent case - * [THRIFT-3030] - TThreadedServer: Property for number of clientThreads - * [THRIFT-3023] - Go compiler is a little overly conservative with names of attributes - * [THRIFT-3018] - Compact protocol for Delphi - * [THRIFT-3025] - Change pure Int constants into @enums (where possible) - * [THRIFT-3031] - migrate "shouldStop" flag to TServer - * [THRIFT-3022] - Compact protocol for Haxe - * [THRIFT-3041] - Generate asynchronous clients for Cocoa - * [THRIFT-3053] - Perl SSL Socket Support (Encryption) - * [THRIFT-3247] - Generate a C++ thread-safe client - * [THRIFT-3217] - Provide a little endian variant of the binary protocol in C++ - * [THRIFT-3223] - TypeScript: Add initial support for Enum Maps - * [THRIFT-3220] - Option to suppress @Generated Annotation entirely - * [THRIFT-3300] - Reimplement TZlibTransport in Java using streams - * [THRIFT-3288] - c_glib: Build unit tests with all warnings enabled, no warnings generated - * [THRIFT-3347] - Improve cross test servers and clients - * [THRIFT-3342] - Improve ruby cross test client and server compatibility - * [THRIFT-2296] - Add C++ Base class for service - * [THRIFT-3337] - Add testBool method to cross tests - * [THRIFT-3303] - Disable concurrent cabal jobs on Travis to avoid GHC crash - * [THRIFT-2623] - Docker container for Thrift - * [THRIFT-3298] - thrift endian converters may conflict with other libraries - * [THRIFT-1559] - Provide memory pool for TBinaryProtocol to eliminate memory fragmentation - * [THRIFT-424] - Steal ProtocolBuffers' VarInt implementation for C++ - -## New Feature - * [THRIFT-3070] - Add ability to set the LocalCertificateSelectionCallback - * [THRIFT-1909] - Java: Add compiler flag to use the "option pattern" for optional fields - * [THRIFT-2099] - Stop TThreadPoolServer with alive connections. - * [THRIFT-123] - implement TZlibTransport in Java - * [THRIFT-2368] - New option: reuse-objects for Java generator - * [THRIFT-2836] - Optionally generate C++11 MoveConstructible types - * [THRIFT-2824] - Flag to disable html escaping doctext - * [THRIFT-2819] - Add WebsSocket client to node.js - * [THRIFT-3050] - Client certificate authentication for non-http TLS in C# - * [THRIFT-3292] - Implement TZlibTransport in Go - -## Question - * [THRIFT-2583] - Thrift on xPC target (SpeedGoat) - * [THRIFT-2592] - thrift server using c_glib - * [THRIFT-2832] - c_glib: Handle string lists correctly - * [THRIFT-3136] - thrift installation problem on mac - * [THRIFT-3346] - c_glib: Tutorials example crashes saying Calculator.ping implementation returned FALSE but did not set an error - -## Sub-task - * [THRIFT-2578] - Moving 'make cross' from test.sh to test.py - * [THRIFT-2734] - Go coding standards - * [THRIFT-2748] - Add Vagrantfile for Centos 6.5 - * [THRIFT-2753] - Misc. Haxe improvements - * [THRIFT-2640] - Compact Protocol in Cocoa - * [THRIFT-3262] - warning: overflow in implicit constant conversion in DenseProtoTest.cpp - * [THRIFT-3194] - Can't build with go enabled. gomock SCC path incorrect. - * [THRIFT-3275] - c_glib tutorial warnings in generated code - * [THRIFT-1125] - Multiplexing support for the Ruby Library - * [THRIFT-2807] - PHP Code Style - * [THRIFT-2841] - Add comprehensive integration tests for the whole Go stack - * [THRIFT-2815] - Haxe: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-2886] - Integrate binary type in standard Thrift cross test - * [THRIFT-2946] - Enhance usability of cross test framework - * [THRIFT-2967] - Add .editorconfig to root - * [THRIFT-3033] - Perl: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-3174] - Initialism code in the Go compiler doesn't check first word - * [THRIFT-3193] - Option to supress date value in @Generated annotation - * [THRIFT-3305] - Missing dist files for 0.9.3 release candidate - * [THRIFT-3341] - Add testBool methods - * [THRIFT-3308] - Fix broken test cases for 0.9.3 release candidate - -## Task - * [THRIFT-2834] - Remove semi-colons from python code generator - * [THRIFT-2853] - Adjust comments not applying anymore after THRIFT-2852 - -## Test - * [THRIFT-3211] - Add make cross support for php TCompactProtocol - -## Wish - * [THRIFT-2838] - TNonblockingServer can bind to port 0 (i.e., get an OS-assigned port) but there is no way to get the port number - - - -Thrift 0.9.2 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-2793] - Go compiler produces uncompilable code - * [THRIFT-1481] - Unix domain sockets in C++ do not support the abstract namespace - * [THRIFT-1455] - TBinaryProtocolT::writeString casts from size_t to uint32_t, which is not safe on 64-bit platforms - * [THRIFT-1579] - PHP Extention - function thrift_protocol_read_binary not working from TBinarySerializer::deserialize - * [THRIFT-1584] - Error: could not SetMinThreads in ThreadPool on single-core machines - * [THRIFT-1614] - Thrift build from svn repo sources fails with automake-1.12 - * [THRIFT-1047] - rb_thrift_memory_buffer_write treats arg as string without check, segfaults if you pass non-string - * [THRIFT-1639] - Java/Python: Serialization/Deserialization of double type using CompactProtocol - * [THRIFT-1647] - NodeJS BufferedTransport does not work beyond the hello-world example - * [THRIFT-2130] - Thrift's D library/test: parts of "make check" code do not compile with recent dmd-2.062 through dmd-2.064alpha - * [THRIFT-2140] - Error compiling cpp tutorials - * [THRIFT-2139] - MSVC 2012 Error - Cannot compile due to BoostThreadFactory - * [THRIFT-2138] - pkgconfig file created with wrong include path - * [THRIFT-2160] - Warning in thrift.h when compiling with -Wunused and NDEBUG - * [THRIFT-2158] - Compact, JSON, and SimpleJSON protocols are not working correctly - * [THRIFT-2167] - nodejs lib throws error if options argument isn't passed - * [THRIFT-2288] - Go impl of Thrift JSON protocol wrongly writes/expects true/false for bools - * [THRIFT-2147] - Thrift IDL grammar allows for dotted identifier names - * [THRIFT-2145] - Rack and Thin are not just development dependencies - * [THRIFT-2267] - Should be able to choose socket family in Python TSocket - * [THRIFT-2276] - java path in spec file needs updating - * [THRIFT-2281] - Generated send/recv code ignores errors returned by the underlying protocol - * [THRIFT-2280] - TJSONProtocol.Flush() does not really flush the transport - * [THRIFT-2274] - TNonblockingServer and TThreadedSelectorServer do not close their channel selectors on exit and leak file descriptors - * [THRIFT-2265] - php library doesn't build - * [THRIFT-2232] - IsSet* broken in Go - * [THRIFT-2246] - Unset enum value is printed by ToString() - * [THRIFT-2240] - thrift.vim (contrib) does not correctly handle 'union' - * [THRIFT-2243] - TNonblockingServer in thrift crashes when TFramedTransport opens - * [THRIFT-2230] - Cannot Build on RHEL/Centos/Amazon Linux 6.x - * [THRIFT-2247] - Go generator doesn't deal well with map keys of type binary - * [THRIFT-2253] - Python Tornado TTornadoServer base class change - * [THRIFT-2261] - java: error: unmappable character for encoding ASCII - * [THRIFT-2259] - C#: unexpected null logDelegate() pointer causes AV in TServer.serve() - * [THRIFT-2225] - SSLContext destroy before cleanupOpenSSL - * [THRIFT-2224] - TSSLSocket.h and TSSLServerSocket.h should use the platfromsocket too - * [THRIFT-2229] - thrift failed to build on OSX 10.9 GM - * [THRIFT-2227] - Thrift compiler generates spurious warnings with Xlint - * [THRIFT-2219] - Thrift gem fails to build on OS X Mavericks with 1.9.3 rubies - * [THRIFT-2226] - TServerSocket - keepAlive wrong initialization order - * [THRIFT-2285] - TJsonProtocol implementation for Java doesn't allow a slash (/) to be escaped (\/) - * [THRIFT-2216] - Extraneous semicolon in TProtocolUtil.h makes clang mad - * [THRIFT-2215] - Generated HTML/Graphviz lists referenced enum identifiers as UNKNOWN. - * [THRIFT-2211] - Exception constructor does not contain namespace prefix. - * [THRIFT-2210] - lib/java TSimpleJSONProtocol can emit invalid JSON - * [THRIFT-2209] - Ruby generator -- please namespace classes - * [THRIFT-2202] - Delphi TServerImpl.DefaultLogDelegate may stop the server with I/O-Error 105 - * [THRIFT-2201] - Ternary operator returns different types (build error for some compilers) - * [THRIFT-2200] - nested structs cause generate_fingerprint() to slow down at excessive CPU load - * [THRIFT-2197] - fix jar output directory in rpm spec file - * [THRIFT-2196] - Fix invalid dependency in Makefile.am - * [THRIFT-2194] - Node: Not actually prepending residual data in TFramedTransport.receiver - * [THRIFT-2193] - Java code generator emits spurious semicolon when deep copying binary data - * [THRIFT-2191] - Fix charp JSONProtocol.ReadJSONDouble (specify InvariantCulture) - * [THRIFT-2214] - System header sys/param.h is included inside the Thrift namespace - * [THRIFT-2178] - Thrift generator returns error exit code on --version - * [THRIFT-2171] - NodeJS implementation has extremely low test coverage - * [THRIFT-2183] - gem install fails on zsh - * [THRIFT-2182] - segfault in regression tests (GC bug in rb_thrift_memory_buffer_write) - * [THRIFT-2181] - oneway calls don't work in NodeJS - * [THRIFT-2169] - JavaME Thrift Library causes "java.io.IOException: No Response Entries Available" after using the Thrift client for some time - * [THRIFT-2168] - Node.js appears broken (at least, examples don't work as intended) - * [THRIFT-2293] - TSSLTransportFactory.createSSLContext() leaves files open - * [THRIFT-2279] - TSerializer only returns the first 1024 bytes serialized - * [THRIFT-2278] - Buffered transport doesn't support writes > buffer size - * [THRIFT-2275] - Fix memory leak in golang compact_protocol. - * [THRIFT-2282] - Incorect code generated for some typedefs - * [THRIFT-2009] - Go redeclaration error - * [THRIFT-1964] - 'Isset' causes problems with C#/.NET serializers - * [THRIFT-2026] - Fix TCompactProtocol 64 bit builds - * [THRIFT-2108] - Fix TAsyncClientManager timeout race - * [THRIFT-2068] - Multiple calls from same connection are not processed in node - * [THRIFT-1750] - Make compiler build cleanly under visual studio 10 - * [THRIFT-1755] - Comment parsing bug - * [THRIFT-1771] - "make check" fails on x64 for libboost_unit_test_framework.a - * [THRIFT-1841] - NodeJS Thrift incorrectly parses non-UTF8-string types - * [THRIFT-1908] - Using php thrift_protocol accelerated transfer causes core dump - * [THRIFT-1892] - Socket timeouts are declared in milli-seconds, but are actually set in micro-seconds - * [THRIFT-2303] - TBufferredTransport not properly closing underlying transport - * [THRIFT-2313] - nodejs server crash after processing the first request when using MultiplexedProcessor/FramedBuffer/BinaryProtocol - * [THRIFT-2311] - Go: invalid code generated when exception name is a go keyword - * [THRIFT-2308] - node: TJSONProtocol parse error when reading from buffered message - * [THRIFT-2316] - ccp: TFileTransportTest - * [THRIFT-2352] - msvc failed to compile thrift tests - * [THRIFT-2337] - Golang does not report TIMED_OUT exceptions - * [THRIFT-2340] - Generated server implementation does not send response type EXCEPTION on the Thrift.TApplicationExceptionType.UNKNOWN_METHOD exception - * [THRIFT-2354] - Connection errors can lead to case_clause exceptions - * [THRIFT-2339] - Uncaught exception in thrift c# driver - * [THRIFT-2356] - c++ thrift client not working with ssl (SSL_connect hangs) - * [THRIFT-2331] - Missing call to ReadStructBegin() in TApplicationException.Read() - * [THRIFT-2323] - Uncompileable Delphi code generated for typedef'd structs - * [THRIFT-2322] - Correctly show the number of times ExecutorService (java) has rejected the client. - * [THRIFT-2389] - namespaces handled wrongly in acrionscript 3.0 implementation - * [THRIFT-2388] - GoLang - Fix data races in simple_server and server_socket - * [THRIFT-2386] - Thrift refuses to link yylex - * [THRIFT-2375] - Excessive
's in generated HTML - * [THRIFT-2373] - warning CS0414 in THttpClient.cs: private field 'Thrift.Transport.THttpClient.connection' assigned but never used - * [THRIFT-2372] - thrift/json_protocol.go:160: function ends without a return statement - * [THRIFT-2371] - ruby bundler version fails on ~1.3.1, remove and take latest avail - * [THRIFT-2370] - Compiler SEGFAULTs generating HTML documentation for complex strucre - * [THRIFT-2384] - Binary map keys produce uncompilable code in go - * [THRIFT-2380] - unreachable code (CID 1174546, CID 1174679) - * [THRIFT-2378] - service method arguments of binary type lead to uncompileable Go code - * [THRIFT-2363] - Issue with character encoding of Success returned from Login using Thrift Proxy and NodeJS - * [THRIFT-2359] - TBufferedTransport doesn't clear it's buffer on a failed flush call - * [THRIFT-2428] - Python 3 setup.py support - * [THRIFT-2367] - Build failure: stdlib and boost both define uint64_t - * [THRIFT-2365] - C# decodes too many binary bytes from JSON - * [THRIFT-2402] - byte count of FrameBuffer in AWAITING_CLOSE state is not subtracted from readBufferBytesAllocated - * [THRIFT-2396] - Build Error on MacOSX - * [THRIFT-2395] - thrift Ruby gem requires development dependency 'thin' regardless of environment - * [THRIFT-2414] - c_glib fix several bug. - * [THRIFT-2420] - Go argument parser for methods without arguments does not skip fields - * [THRIFT-2439] - Bug in TProtocolDecorator Class causes parsing errors - * [THRIFT-2419] - golang - Fix fmt.Errorf in generated code - * [THRIFT-2418] - Go handler function panics on internal error - * [THRIFT-2405] - Node.js Multiplexer tests fail (silently) - * [THRIFT-2581] - TFDTransport destructor should not throw - * [THRIFT-2575] - Thrift includes siginfo_t within apache::thrift::protocol namespace - * [THRIFT-2577] - TFileTransport missuse of closesocket on windows platform - * [THRIFT-2576] - Implement Thrift.Protocol.prototype.skip method in JavaScript library - * [THRIFT-2588] - Thrift compiler is not buildable in Visual Studio 2010 - * [THRIFT-2594] - JS Compiler: Single quotes are not being escaped in constants. - * [THRIFT-2591] - TFramedTransport does not handle payloads split across packets correctly - * [THRIFT-2599] - Uncompileable Delphi code due to naming conflicts with IDL - * [THRIFT-2590] - C++ Visual Studio solution doesn't include Multiplexing support - * [THRIFT-2595] - Node.js: Fix global leaks and copy-paste errors - * [THRIFT-2565] - autoconf fails to find mingw-g++ cross compiler on travis CI - * [THRIFT-2555] - excessive "unused field" comments - * [THRIFT-2554] - double initialization in generated Read() method - * [THRIFT-2551] - OutOfMemoryError "unable to create new native thread" kills serve thread - * [THRIFT-2543] - Generated enum type in haskell should be qualified - * [THRIFT-2560] - Thrift compiler generator tries to concat ints with strings using + - * [THRIFT-2559] - Centos 6.5 unable to "make" with Thrift 0.9.1 - * [THRIFT-2526] - Assignment operators and copy constructors in c++ don't copy the __isset struct - * [THRIFT-2454] - c_glib: There is no gethostbyname_r() in some OS. - * [THRIFT-2451] - Do not use pointers for optional fields with defaults. Do not write such fields if its value set to default. Also, do not use pointers for any optional fields mapped to go map or slice. generate Get accessors - * [THRIFT-2450] - include HowToContribute in the src repo - * [THRIFT-2448] - thrift/test/test.sh has incorrect Node.js test path - * [THRIFT-2460] - unopened socket fd must be less than zero. - * [THRIFT-2459] - --version should not exit 1 - * [THRIFT-2468] - Timestamp handling - * [THRIFT-2467] - Unable to build contrib/fb303 on OSX 10.9.2 - * [THRIFT-2466] - Improper error handling for SSL/TLS connections that don't complete a handshake - * [THRIFT-2463] - test/py/RunClientServer.py fails sometimes - * [THRIFT-2458] - Generated golang server code for "oneway" methods is incorrect - * [THRIFT-2456] - THttpClient fails when using async support outside Silverlight - * [THRIFT-2524] - Visual Studio project is missing TThreadedServer files - * [THRIFT-2523] - Visual Studio project is missing OverlappedSubmissionThread files - * [THRIFT-2520] - cpp:cob_style generates incorrect .tcc file - * [THRIFT-2508] - Uncompileable C# code due to language keywords in IDL - * [THRIFT-2506] - Update TProtocolException error codes to be used consistently throughout the library - * [THRIFT-2505] - go: struct should always be a pointer to avoid copying of potentially size-unbounded structs - * [THRIFT-2515] - TLS Method error during make - * [THRIFT-2503] - C++: Fix name collision when a struct has a member named "val" - * [THRIFT-2477] - thrift --help text with misplaced comma - * [THRIFT-2492] - test/cpp does not compile on mac - * [THRIFT-2500] - sending random data crashes thrift(golang) service - * [THRIFT-2475] - c_glib: buffered_transport_write function return always TRUE. - * [THRIFT-2495] - JavaScript/Node string constants lack proper escaping - * [THRIFT-2491] - unable to import generated ThriftTest service - * [THRIFT-2490] - c_glib: if fail to read a exception from server, client may be occurred double free - * [THRIFT-2470] - THttpHandler swallows exceptions from processor - * [THRIFT-2533] - Boost version in requirements should be updated - * [THRIFT-2532] - Java version in installation requirements should be updated - * [THRIFT-2529] - TBufferedTransport split Tcp data bug in nodeJs - * [THRIFT-2537] - Path for "go get" does not work (pull request 115) - * [THRIFT-2443] - Node fails cross lang tests - * [THRIFT-2437] - Author fields in Python setup.py must be strings not lists. - * [THRIFT-2435] - Java compiler doesn't like struct member names that are identical to an existing enum or struct type - * [THRIFT-2434] - Missing namespace import for php TMultiplexedProcessor implementation - * [THRIFT-2432] - Flaky parallel build - * [THRIFT-2430] - Crash during TThreadPoolServer shutdown - * [THRIFT-667] - Period should not be allowed in identifier names - * [THRIFT-1212] - Members capital case conflict - * [THRIFT-2584] - Error handler not listened on javascript client - * [THRIFT-2294] - Incorrect Makefile generation - * [THRIFT-2601] - Fix vagrant to work again for builds again - * [THRIFT-2092] - TNonblocking server should release handler as soon as connection closes - * [THRIFT-2557] - CS0542 member names cannot be the same as their enclosing type - * [THRIFT-2605] - TSocket warning on gcc 4.8.3 - * [THRIFT-2607] - ThreadManager.cpp warning on clang++ 3.4 - * [THRIFT-1998] - TCompactProtocol.tcc - one more warning on Visual 2010 - * [THRIFT-2610] - MSVC warning in TSocket.cpp - * [THRIFT-2614] - TNonblockingServer.cpp warnings on MSVC - * [THRIFT-2608] - TNonblockingServer.cpp warnings on clang 3.4 - * [THRIFT-2606] - ThreadManager.h warning in clang++ 3.4 - * [THRIFT-2609] - TFileTransport.h unused field warning (clang 3.4) - * [THRIFT-2416] - Cannot use TCompactProtocol with MSVC - * [THRIFT-1803] - Ruby Thrift 0.9.0 tries to encode UUID to UTF8 and crashes - * [THRIFT-2385] - Problem with gethostbyname2 during make check - * [THRIFT-2262] - thrift server 'MutateRow' operation gives no indication of success / failure - * [THRIFT-2048] - Prefer boolean context to nullptr_t conversion - * [THRIFT-2528] - Thrift Erlang Library: Multiple thrift applications in one bundle - * [THRIFT-1999] - warning on gcc 4.7 while compiling BoostMutex.cpp - * [THRIFT-2104] - Structs lose binary data when transferred from server to client in Java - * [THRIFT-2184] - undefined method rspec_verify for Thrift::MemoryBufferTransport - * [THRIFT-2351] - PHP TCompactProtocol has fails to decode messages - * [THRIFT-2016] - Resource Leak in thrift struct under compiler/cpp/src/parse/t_function.h - * [THRIFT-2273] - Please delete old releases from mirroring system - * [THRIFT-2270] - Faulty library version numbering at build or documentation - * [THRIFT-2203] - Tests keeping failing on Jenkins and Travis CI - * [THRIFT-2399] - thrift.el: recognize "//"-style comments in emacs thrift-mode - * [THRIFT-2582] - "FileTransport error" exception is raised when trying to use Java's TFileTransport - * [THRIFT-1682] - Multiple thread calling a Service function unsafely causes message corruption and terminates with Broken Pipe - * [THRIFT-2357] - recurse option has no effect when generating php - * [THRIFT-2248] - Go generator doesn't deal well with map keys of type binary - * [THRIFT-2426] - clarify IP rights and contributions from fbthrift - * [THRIFT-2041] - TNonblocking server compilation on windows (ARITHMETIC_RIGHT_SHIFT) - * [THRIFT-2400] - thrift.el: recognize "//"-style comments in emacs thrift-mode - * [THRIFT-1717] - Fix deb build in jenkins - * [THRIFT-2266] - ThreadManager.h:24:10: fatal error: 'tr1/functional' file not found on Mac 10.9 (Mavericks) - * [THRIFT-1300] - Test failures with parallel builds (make -j) - * [THRIFT-2487] - Tutorial requires two IDL files but only one is linked from the Thrift web site - * [THRIFT-2329] - missing release tags within git - * [THRIFT-2306] - concurent client calls with nodejs - * [THRIFT-2222] - ruby gem cannot be compiled on OS X mavericks - * [THRIFT-2381] - code which generated by thrift2/hbase.thrift compile error - * [THRIFT-2390] - no close event when connection lost - * [THRIFT-2146] - Unable to pass multiple "--gen" options to the thrift compiler - * [THRIFT-2438] - Unexpected readFieldEnd call causes JSON Parsing errors - * [THRIFT-2498] - Error message "Invalid method name" while trying to call HBase Thrift API - * [THRIFT-841] - Build cruft - * [THRIFT-2570] - Wrong URL given in http://thrift.apache.org/developers - * [THRIFT-2604] - Fix debian packaging - * [THRIFT-2618] - Unignore /aclocal files required for build - * [THRIFT-2562] - ./configure create MakeFile in lib/d with errors - * [THRIFT-2593] - Unable to build thrift on ubuntu-12.04 (Precise) - * [THRIFT-2461] - Can't install thrift-0.8.0 on OS X 10.9.2 - * [THRIFT-2602] - Fix missing dist files - * [THRIFT-2620] - Fix python packaging - * [THRIFT-2545] - Test CPP fails to build (possibly typo) - -## Documentation - * [THRIFT-2155] - Adding one liner guide to rename the version.h.in and rename thrifty.cc.h - * [THRIFT-1991] - Add exceptions to examples - * [THRIFT-2334] - add a tutorial for node JS - * [THRIFT-2392] - Actionscript tutorial - * [THRIFT-2383] - contrib: sample for connecting Thrift with Rebus - * [THRIFT-2382] - contrib: sample for connecting Thrift with STOMP - -## Improvement - * [THRIFT-1457] - Capacity of TframedTransport write buffer is never reset - * [THRIFT-1135] - Node.js tutorial - * [THRIFT-1371] - Socket timeouts (SO_RCVTIMEO and SO_SNDTIMEO) not supported on Solaris - * [THRIFT-2142] - Minor tweaks to thrift.el for better emacs package compatibility - * [THRIFT-2268] - Modify TSaslTransport to ignore TCP health checks from loadbalancers - * [THRIFT-2264] - GitHub page incorrectly states that Thrift is still incubating - * [THRIFT-2263] - Always generate good hashCode for Java - * [THRIFT-2233] - Java compiler should defensively copy its binary inputs - * [THRIFT-2239] - Address FindBugs errors - * [THRIFT-2249] - Add SMP Build option to thrift.spec (and three config defines) - * [THRIFT-2254] - Exceptions generated by Go compiler should implement error interface - * [THRIFT-2260] - Thrift imposes unneeded dependency on commons-lang3 - * [THRIFT-2258] - Add TLS v1.1/1.2 support to TSSLSocket.cpp - * [THRIFT-2205] - Node.js Test Server to support test.js JavaScript Browser test and sundry fixes - * [THRIFT-2204] - SSL client for the cocoa client - * [THRIFT-2172] - Java compiler allocates optionals array for every struct with an optional field - * [THRIFT-2185] - use cabal instead of runhaskell in haskell library - * [THRIFT-1926] - PHP Constant Generation Refactoring - * [THRIFT-2029] - Port C++ tests to Windows - * [THRIFT-2054] - TSimpleFileTransport - Java Lib has no straight forward TTransport based file transport - * [THRIFT-2040] - "uninitialized variable" warnings on MSVC/windows - * [THRIFT-2034] - Give developers' C++ code direct access to socket FDs on server side - * [THRIFT-2095] - Use print function for Python 3 compatiblity - * [THRIFT-1868] - Make the TPC backlog configurable in the Java servers - * [THRIFT-1813] - Add @Generated annotation to generated classes - * [THRIFT-1815] - Code generators line buffer output - * [THRIFT-2305] - TFramedTransport empty constructor should probably be private - * [THRIFT-2304] - Move client assignments from construtor in method - * [THRIFT-2309] - Ruby (gem) & PHP RPM subpackages - * [THRIFT-2318] - perl: dependency Class::Accessor not checked - * [THRIFT-2317] - exclude tutorial from build - * [THRIFT-2320] - Program level doctext does not get attached by parser - * [THRIFT-2349] - Golang - improve tutorial - * [THRIFT-2348] - PHP Generator: add array typehint to functions - * [THRIFT-2344] - configure.ac: compiler-only option - * [THRIFT-2343] - Golang - Return a single error for all exceptions instead of multiple return values - * [THRIFT-2341] - Enable generation of Delphi XMLDoc comments (a.k.a. "Help Insight") - * [THRIFT-2355] - Add SSL and Web Socket Support to Node and JavaScript - * [THRIFT-2350] - Add async calls to normal JavaScript - * [THRIFT-2330] - Generate PHPDoc comments - * [THRIFT-2332] - RPMBUILD: run bootstrap (if needed) - * [THRIFT-2391] - simple socket transport for actionscript 3.0 - * [THRIFT-2376] - nodejs: allow Promise style calls for client and server - * [THRIFT-2369] - Add ssl support for nodejs implementation - * [THRIFT-2401] - Haskell tutorial compiles - * [THRIFT-2417] - C# Union classes are not partial - * [THRIFT-2415] - Named pipes server performance & message mode - * [THRIFT-2404] - emit warning on (typically inefficient) list - * [THRIFT-2398] - Improve Node Server Library - * [THRIFT-2397] - Add CORS and CSP support for JavaScript and Node.js libraries - * [THRIFT-2407] - use markdown (rename README => README.md) - * [THRIFT-2300] - D configure info output should follow same format as other languages - * [THRIFT-2579] - Windows CE support - * [THRIFT-2574] - Compiler option to generate namespace directories for Ruby - * [THRIFT-2571] - Simplify cross compilation using CMake - * [THRIFT-2569] - Introduce file to specify third party library locations on Windows - * [THRIFT-2568] - Implement own certificate handler - * [THRIFT-2552] - eliminate warning from configure.ac - * [THRIFT-2549] - Generate json tag for struct members. use go.tag annotation to override the default generated tag. - * [THRIFT-2544] - Add support for socket transport for c# library when using Windows Phone projects - * [THRIFT-2453] - haskell tutorial: fix up division by 0 example - * [THRIFT-2449] - Enhance typedef structure to distinguish between forwards and real typedefs - * [THRIFT-2446] - There is no way to handle server stream errors - * [THRIFT-2455] - Allow client certificates to be used with THttpClient - * [THRIFT-2511] - Node.js needs the compact protocol - * [THRIFT-2493] - Node.js lib needs HTTP client - * [THRIFT-2502] - Optimize go implementations of binary and compact protocols for speed - * [THRIFT-2494] - Add enum toString helper function in c_glib - * [THRIFT-2471] - Make cpp.ref annotation language agnostic - * [THRIFT-2497] - server and client for test/go, also several fixes and improvements - * [THRIFT-2535] - TJSONProtocol when serialized yields TField ids rather than names - * [THRIFT-2220] - Add a new struct structv? - * [THRIFT-1352] - Thrift server - * [THRIFT-989] - Push boost m4 macros upstream - * [THRIFT-1349] - Remove unnecessary print outs - * [THRIFT-2496] - server and client for test/go, also several fixes and improvements - * [THRIFT-1114] - Maven publish shouldn't require passwords hardcoded in settings.xml - * [THRIFT-2043] - visual 2010 warnings - unreachable code - * [THRIFT-1683] - Implement alternatives to Javascript Client side Transport protocol, just as NPAPI and WebSocket. - * [THRIFT-1746] - provide a SPDX file - * [THRIFT-1772] - Serialization does not check types of embedded structures. - * [THRIFT-2387] - nodejs: external imports should be centralized in index.js - * [THRIFT-2037] - More general macro THRIFT_UNUSED_VARIABLE - -## New Feature - * [THRIFT-1012] - Transport for DataInput DataOutput interface - * [THRIFT-2256] - Using c++11/c++0x std library replace boost library - * [THRIFT-2250] - JSON and MemoryBuffer for JavaME - * [THRIFT-2114] - Python Service Remote SSL Option - * [THRIFT-1719] - SASL client support for Python - * [THRIFT-1894] - Thrift multi-threaded async Java Server using Java 7 AsynchronousChannelGroup - * [THRIFT-1893] - HTTP/JSON server/client for node js - * [THRIFT-2347] - C# TLS Transport based on THRIFT-181 - * [THRIFT-2377] - Allow addition of custom HTTP Headers to an HTTP Transport - * [THRIFT-2408] - Named Pipe Transport Option for C# - * [THRIFT-2572] - Add string/collection length limit checks (from C++) to java protocol readers - * [THRIFT-2469] - "java:fullcamel" option to automatically camel-case underscored attribute names - * [THRIFT-795] - Importing service functions (simulation multiple inheritance) - * [THRIFT-2164] - Add a Get/Post Http Server to Node along with examples - * [THRIFT-2255] - add Parent Class for generated Struct class - -## Question - * [THRIFT-2539] - Tsocket.cpp addrinfo ai_flags = AI_ADDRCONFIG - * [THRIFT-2440] - how to connect as3 to java by thrift , - * [THRIFT-2379] - Memmory leaking while using multithreading in C++ server. - * [THRIFT-2277] - Thrift: installing fb303 error - * [THRIFT-2567] - Csharp slow ? - * [THRIFT-2573] - thrift 0.9.2 release - -## Sub-task - * [THRIFT-981] - cocoa: add version Info to the library - * [THRIFT-2132] - Go: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-2299] - TJsonProtocol implementation for Ruby does not allow for both possible slash (solidus) encodings - * [THRIFT-2298] - TJsonProtocol implementation for C# does not allow for both possible slash (solidus) encodings - * [THRIFT-2297] - TJsonProtocol implementation for Delphi does not allow for both possible slash (solidus) encodings - * [THRIFT-2271] - JavaScript: Support for Multiplexing Services - * [THRIFT-2251] - go test for compact protocol is not running - * [THRIFT-2195] - Delphi: Add event handlers for server and processing events - * [THRIFT-2176] - TSimpleJSONProtocol.ReadFieldBegin() does not return field type and ID - * [THRIFT-2175] - Wrong field type set for binary - * [THRIFT-2174] - Deserializing JSON fails in specific cases - * [THRIFT-2053] - NodeJS: Support for Multiplexing Services - * [THRIFT-1914] - Python: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-1810] - add ruby to test/test.sh - * [THRIFT-2310] - PHP: Client-side support for Multiplexing Services - * [THRIFT-2346] - C#: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2345] - Delphi: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol - * [THRIFT-2338] - First doctext wrongly interpreted as program doctext in some cases - * [THRIFT-2325] - SSL test certificates - * [THRIFT-2358] - C++: add compact protocol to cross language test suite - * [THRIFT-2425] - PHP: Server-side support for Multiplexing Services - * [THRIFT-2421] - Tree/Recursive struct support in thrift - * [THRIFT-2290] - Update Go tutorial to align with THRIFT-2232 - * [THRIFT-2558] - CSharp compiler generator tries to concat ints with strings using + - * [THRIFT-2507] - Additional LUA TProtocolException error code needed? - * [THRIFT-2499] - Compiler: allow annotations without "= value" - * [THRIFT-2534] - Cross language test results should recorded to a status.md or status.html file automatically - * [THRIFT-66] - Java: Allow multiplexing multiple services over a single TCP connection - * [THRIFT-1681] - Add Lua Support - * [THRIFT-1727] - Ruby-1.9: data loss: "binary" fields are re-encoded - * [THRIFT-1726] - Ruby-1.9: "binary" fields are represented by string whose encoding is "UTF-8" - * [THRIFT-988] - perl: add version Info to the library via configure - * [THRIFT-334] - Compact Protocol for PHP - * [THRIFT-2444] - pull request 88: thrift: clean up enum value assignment - -## Task - * [THRIFT-2223] - Spam links on wiki - * [THRIFT-2566] - Please create a DOAP file for your TLP - * [THRIFT-2237] - Update archive to contain all versions - * [THRIFT-962] - Tutorial page on our website is really unhelpful - -## Test - * [THRIFT-2327] - nodejs: nodejs test suite should be bundled with the library - * [THRIFT-2445] - THRIFT-2384 (code generation for go maps with binary keys) should be tested - * [THRIFT-2501] - C# The test parameters from the TestServer and TestClient are different from the http://thrift.apache.org/test/ - -## Wish - * [THRIFT-2190] - Add the JavaScript thrift.js lib to the Bower registry - * [THRIFT-2076] - boost::optional instead of __isset - - - -Thrift 0.9.1 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1440] - debian packaging: minor-ish policy problems - * [THRIFT-1402] - Generated Y_types.js does not require() X_types.js when an include in the IDL file was used - * [THRIFT-1551] - 2 thrift file define only struct (no service), one include another, the gen nodejs file didn't have "requires" at the top - * [THRIFT-1264] - TSocketClient is queried by run loop after deallocation in Cocoa - * [THRIFT-1600] - Thrift Go Compiler and Library out of date with Go 1 Release. - * [THRIFT-1603] - Thrift IDL allows for multiple exceptions, args or struct member names to be the same - * [THRIFT-1062] - Problems with python tutorials - * [THRIFT-864] - default value fails if identifier is a struct - * [THRIFT-930] - Ruby and Haskell bindings don't properly support DESTDIR (makes packaging painful) - * [THRIFT-820] - The readLength attribute of TBinaryProtocol is used as an instance variable and is decremented on each call of checkReadLength - * [THRIFT-1640] - None of the tutorials linked on the website contain content - * [THRIFT-1637] - NPM registry does not include version 0.8 - * [THRIFT-1648] - NodeJS clients always receive 0 for 'double' values. - * [THRIFT-1660] - Python Thrift library can be installed with pip but not easy_install - * [THRIFT-1657] - Chrome browser sending OPTIONS method before POST in xmlHttpRequest - * [THRIFT-2118] - Certificate error handling still incorrect - * [THRIFT-2137] - Ruby test lib fails jenkins build #864 - * [THRIFT-2136] - Vagrant build not compiling java, ruby, php, go libs due to missing dependencies - * [THRIFT-2135] - GO lib leaves behind test files that are auto generated - * [THRIFT-2134] - mingw-cross-compile script failing with strip errors - * [THRIFT-2133] - java TestTBinaryProtocol.java test failing - * [THRIFT-2126] - lib/cpp/src/thrift/concurrency/STD* files missing from DIST - * [THRIFT-2125] - debian missing from DIST - * [THRIFT-2124] - .o, .so, .la, .deps, .libs, gen-* files left tutorials, test and lib/cpp when making DIST - * [THRIFT-2123] - GO lib missing files in DIST build - * [THRIFT-2121] - Compilation bug for Node.js - * [THRIFT-2129] - php ext missing from dist - * [THRIFT-2128] - lib GO tests fail with funct ends without a return statement - * [THRIFT-2286] - Failed to compile Thrift0.9.1 with boost1.55 by VS2010 if select Debug-mt&x64 mode. - * [THRIFT-1973] - TCompactProtocol in C# lib does not serialize and deserialize negative int32 and int64 number correctly - * [THRIFT-1992] - casts in TCompactProtocol.tcc causing "dereferencing type-punned pointer will break strict-aliasing rules" warnings from gcc - * [THRIFT-1930] - C# generates unsigned byte for Thrift "byte" type - * [THRIFT-1929] - Update website to use Mirrors for downloads - * [THRIFT-1928] - Race may still exist in TFileTransport::flush() - * [THRIFT-1934] - Tabs in Example section on main page are not working - * [THRIFT-1933] - Delphi generator crashes when a typedef references another typedef from an included file - * [THRIFT-1942] - Binary accelerated cpp extension does not use Thrift namespaces for Exceptions - * [THRIFT-1959] - C#: Add Union TMemoryBuffer support - * [THRIFT-1958] - C#: Use static Object.Equals instead of .Equals() calls in equals - * [THRIFT-1957] - NodeJS TFramedTransport and TBufferedTransport read bytes as unsigned - * [THRIFT-1955] - Union Type writer generated in C# does not WriteStructBegin - * [THRIFT-1952] - Travis CI - * [THRIFT-1949] - WP7 build broken - * [THRIFT-1943] - docstrings for enum values are ignored - * [THRIFT-2070] - Improper `HexChar' and 'HexVal' implementation in TJSONProtocol.cs - * [THRIFT-2017] - Resource Leak in thrift struct under compiler/cpp/src/parse/t_program.h - * [THRIFT-2032] - C# client leaks sockets/handles - * [THRIFT-1996] - JavaME Constants generation is broken / inconsistent with regular Java generation - * [THRIFT-2002] - Haskell: Test use Data.Maybe instead of Maybe - * [THRIFT-2051] - Vagrant fails to build erlang - * [THRIFT-2050] - Vagrant C# lib compile fails with TException missing - * [THRIFT-1978] - Ruby: Thrift should allow for the SSL verify mode to be set - * [THRIFT-1984] - namespace collision in python bindings - * [THRIFT-1988] - When trying to build a debian package it fails as the file NEWS doesn't exist - * [THRIFT-1975] - TBinaryProtocol CheckLength can't be used for a client - * [THRIFT-1995] - '.' allowed at end of identifier generates non-compilable code - * [THRIFT-2112] - Error in Go generator when using typedefs in map keys - * [THRIFT-2088] - Typos in Thrift compiler help text - * [THRIFT-2080] - C# multiplex processor does not catch IOException - * [THRIFT-2082] - Executing "gmake clean" is broken - * [THRIFT-2102] - constants are not referencing to correct type when included from another thrift file - * [THRIFT-2100] - typedefs are not correctly referenced when including from other thrift files - * [THRIFT-2066] - 'make install' does not install two headers required for C++ bindings - * [THRIFT-2065] - Not valid constants filename in Java - * [THRIFT-2047] - Thrift.Protocol.TCompactProtocol, intToZigZag data lost (TCompactProtocol.cs) - * [THRIFT-2036] - Thrift gem warns about class variable access from top level - * [THRIFT-2057] - Vagrant fails on php tests - * [THRIFT-2105] - Generated code for default values of collections ignores t_field::T_REQUIRED - * [THRIFT-2091] - Unnecessary 'friend' declaration causes warning in TWinsockSingleton - * [THRIFT-2090] - Go generator, fix including of other thrift files - * [THRIFT-2106] - Fix support for namespaces in GO generator - * [THRIFT-1783] - C# doesn't handle required fields correctly - * [THRIFT-1782] - async only defined in silverlight - * [THRIFT-1779] - Missing process_XXXX method in generated TProcessor implementation for all 'oneway' service functions - * [THRIFT-1692] - SO_REUSEADDR allows for socket hijacking on Windows - * [THRIFT-1720] - JRuby times out on successful connection - * [THRIFT-1713] - Named and Anonymous Pipe transport (Delphi) - * [THRIFT-1699] - Native Union#read has extra read_field_end call - * [THRIFT-1749] - Python TSSLSocket error handling obscures actual error - * [THRIFT-1748] - Guard and RWGuard macros defined in global namespace - * [THRIFT-1734] - Front webpage is still advertising v0.8 as current release - * [THRIFT-1729] - C glib refactor left empty folders in svn - * [THRIFT-1767] - unions can't have required fields (Delphi) - * [THRIFT-1765] - Incorrect error message printed for null or negative keys - * [THRIFT-1778] - Configure requires manual intervention due to tar failure - * [THRIFT-1777] - TPipeServer is UNSTOPPABLE - * [THRIFT-1753] - Multiple C++ Windows, OSX, and iOS portability issues - * [THRIFT-1756] - 'make -j 8' fails with "unterminated #ifdef" error - * [THRIFT-1773] - Python library should run on python 2.4 - * [THRIFT-1769] - unions can't have required fields (C++) - * [THRIFT-1768] - unions can't have required fields (Compiler) - * [THRIFT-1666] - htonll usage in TBinaryProtocol.tcc generates warning with MSVC2010 - * [THRIFT-1919] - libthrift depends on httpcore-4.1.3 (directly) and httpcore-4.1.4 (transitively) - * [THRIFT-1864] - implement event handler for non-blocking server - * [THRIFT-1859] - Generated error c++ code with -out and include_prefix param - * [THRIFT-1869] - TThreadPoolServer (java) dies when threadpool is consumed - * [THRIFT-1842] - Memory leak with Pipes - * [THRIFT-1838] - Can't build compiler on OS X because of missing thrifty.h - * [THRIFT-1846] - Restore socket.h header to support builds with Android NDK - * [THRIFT-1850] - make check hangs on TSocket tests in TransportTest.cpp - * [THRIFT-1873] - Binary protocol factory ignores struct read/write flags - * [THRIFT-1872] - issues with TBufferedTransport buffer - * [THRIFT-1904] - Incorrect code is generated for typedefs which use included types - * [THRIFT-1903] - PHP namespaces cause binary protocols to not be used - * [THRIFT-1895] - Delphi: reserved variable name "result" not detected properly - * [THRIFT-1881] - TNonblockingServer does not release open connections or threads on shutdown - * [THRIFT-1888] - Java Thrift client can't connect to Python Thrift server on same host - * [THRIFT-1831] - Bug in list deserializer - * [THRIFT-1824] - many compile warning, becase Thread.h includes config.h - * [THRIFT-1823] - Missing parenthesis breaks "IS_..." macro in generated code - * [THRIFT-1806] - Python generation always truncates __init__.py files - * [THRIFT-1795] - Race condition in TThreadedServerPool java implementation - * [THRIFT-1794] - C# asyncctp broken - * [THRIFT-1804] - Binary+compact protocol single byte error in Ruby library (ARM architecture): caused by different char signedness - * [THRIFT-1800] - Documentation text not always escaped correctly when rendered to HTML - * [THRIFT-1788] - C#: Constants static constructor does not compile - * [THRIFT-1816] - Need "require" included thrift files in "xxx_types.js" - * [THRIFT-1907] - Compiling namespace and sub-namespace directives for unrecognized generators should only be a warning - * [THRIFT-1913] - skipping unknown fields in java unions - * [THRIFT-2553] - C++ linker error - transport/TSocket - * [THRIFT-274] - Towards a working release/versioning process - -## Documentation - * [THRIFT-1971] - [Graphviz] Adds tutorial/general description documentation - * [THRIFT-2001] - http://thrift.apache.org/ Example "C++ Server" tab is broken - -## Improvement - * [THRIFT-1574] - Apache project branding requirements: DOAP file [PATCH] - * [THRIFT-1347] - Unify the exceptions returned in generated Go code - * [THRIFT-1353] - Switch to performance branch, get rid of BinaryParser - * [THRIFT-1629] - Ruby 1.9 Compatibility during Thrift configure, make, install - * [THRIFT-991] - Refactor Haskell code and generator - * [THRIFT-990] - Sanify gettimeofday usage codebase-wide - * [THRIFT-791] - Let C++ TSimpleServer be driven by an external main loop - * [THRIFT-2117] - Cocoa TBinaryProtocol strictWrite should be set to true by default - * [THRIFT-2014] - Change C++ lib includes to use style throughout - * [THRIFT-1972] - Add support for async processors - * [THRIFT-1970] - [Graphviz] Adds option to render exceptions relationships - * [THRIFT-1966] - Support different files for SSL certificates and keys - * [THRIFT-1965] - Adds Graphviz (graph description language) generator - * [THRIFT-1956] - Switch to Apache Commons Lang 3 - * [THRIFT-1962] - Multiplex processor should send any TApplicationException back to client - * [THRIFT-1960] - main() declares 22 unused gen bools - * [THRIFT-1951] - libthrift.jar has source files in it - * [THRIFT-1997] - Add accept backlog configuration method to TServerSocket - * [THRIFT-2003] - Deprecate senum - * [THRIFT-2052] - Vagrant machine image defaults to only 384MB of RAM - * [THRIFT-1980] - Modernize Go tooling, fix go client libary. - * [THRIFT-1977] - C# compiler should generate constant files prefixed with thrift file name - * [THRIFT-1985] - add a Vagrantfile to build and test Apache Thrift fully reproducable - * [THRIFT-1994] - Deprecate slist - * [THRIFT-1993] - Factory to create instances from known (generated) interface types with Delphi - * [THRIFT-2081] - Specified timeout should be used in TSocket.Open() - * [THRIFT-2084] - Delphi: Ability to create entity Thrift-generated instances based on TypeInfo - * [THRIFT-2083] - Improve the go lib: buffered Transport, save memory allocation, handle concurrent request - * [THRIFT-2109] - Secure connections should be supported in Go - * [THRIFT-2107] - minor Go generator fixes - * [THRIFT-1695] - allow warning-free compilation in VS 2012 and GNU 4.6 - * [THRIFT-1735] - integrate tutorial into regular build - * [THRIFT-1716] - max allowed connections should be PIPE_UNLIMITED_INSTANCES - * [THRIFT-1715] - Allow excluding python parts when building contrib/fb303 - * [THRIFT-1733] - Fix RPM build issues on RHEL6/OL6 systems - * [THRIFT-1728] - Upgradation of httpcomponents - * [THRIFT-1876] - Use enum names instead of casted integers in assignments - * [THRIFT-1874] - timeout for the server-side end of a named pipe - * [THRIFT-1897] - Support validation of required fields - * [THRIFT-1896] - Add TBase protocol for Cocoa - * [THRIFT-1880] - Make named pipes server work asynchronously (overlapped) to allow for clean server stops - * [THRIFT-1878] - Add the possibility to send custom headers - * [THRIFT-1882] - Use single include - * [THRIFT-1793] - C#: Use static read instead of instance read - * [THRIFT-1799] - Option to generate HTML in "standalone mode" - * [THRIFT-1815] - Code generators line buffer output - * [THRIFT-1890] - C++: Make named pipes server work asynchronously - * [THRIFT-474] - Generating Ruby on Rails friendly code - -## New Feature - * [THRIFT-801] - Provide an interactive shell (irb) when generating ruby bindings - * [THRIFT-2292] - Android Library Project - * [THRIFT-2012] - Modernizing Go - * [THRIFT-1969] - C#: Tests not properly linked from the solution - * [THRIFT-1785] - C#: Add TMemoryBuffer serializer/deserializer - * [THRIFT-1780] - Add option to generate nullable values - * [THRIFT-1786] - C# Union Typing - * [THRIFT-591] - Make the C++ runtime library be compatible with Windows and Visual Studio - * [THRIFT-514] - Add option to configure compiler output directory - -## Question - * [THRIFT-1764] - how to get the context of client when on a rpc call in server side? - * [THRIFT-1791] - thrift's namespace directive when generating haskell code - -## Sub-task - * [THRIFT-1594] - Java test clients should have a return codes that reflect whether it succeeds or not. - * [THRIFT-1595] - Java test server should follow the documented behavior as of THRIFT-1590 - * [THRIFT-986] - st: add version Info to the library - * [THRIFT-985] - php: add version Info to the library - * [THRIFT-984] - ocaml: add version Info to the library - * [THRIFT-1924] - Delphi: Inconsistency in serialization of optional fields - * [THRIFT-1922] - C#: Inconsistency in serialization of optional fields - * [THRIFT-1961] - C# tests should be in lib/csharp/test/... - * [THRIFT-1822] - PHP unit test does not work - * [THRIFT-1902] - C++: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-1901] - C#: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-1899] - Delphi: Support for Multiplexing Services on any Transport, Protocol and Server - * [THRIFT-563] - Support for Multiplexing Services on any Transport, Protocol and Server - - - -Thrift 0.9 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1438] - lib/cpp/src/windows/config.h should read version from configure.ac rather than a #define - * [THRIFT-1446] - Compile error with Delphi 2009 in constant initializer - * [THRIFT-1450] - Problems building thrift 0.8.0 for Python and Ruby - * [THRIFT-1449] - Ruby client does not work on solaris (?) - * [THRIFT-1447] - NullpointerException in ProcessFunction.class :in "oneway" method - * [THRIFT-1433] - TServerSocket fix for MSVC - * [THRIFT-1429] - The nonblocking servers is supposed to use TransportFactory to read the data - * [THRIFT-1427] - PHP library uses non-multibyte safe functions with mbstring function overloading - * [THRIFT-1421] - Debian Packages can not be built - * [THRIFT-1394] - Treatment of optional fields is not consistent between C++ and Java - * [THRIFT-1511] - Server with oneway support ( JAVA ) - * [THRIFT-1496] - PHP compiler not namespacing enums - * [THRIFT-1495] - PHP TestClient fatals on missing class - * [THRIFT-1508] - TServerSocket does not allow for the user to specify the IP address to bind to - * [THRIFT-1504] - Cocoa Generator should use local file imports for base Thrift headers - * [THRIFT-1512] - Thrift socket support for Windows XP - * [THRIFT-1502] - TSimpleServer::serve(): Do not print out error message if server was stopped. - * [THRIFT-1501] - PHP old namespaces not generated for enums - * [THRIFT-1483] - java compiler does not generate type parameters for services in extended clauses - * [THRIFT-1479] - Compiled PHP process functions missing writeMessageEnd() - * [THRIFT-1492] - enabling c_glib render thrift unusable (even for C++ code) - * [THRIFT-1491] - Uninitialize processorFactory_ member in TServer.h - * [THRIFT-1475] - Incomplete records generation for Erlang - * [THRIFT-1486] - Javascript manual testserver not returning content types - * [THRIFT-1488] - src/concurrency/Thread.h:91:58: error: invalid conversion from 'pthread_t {aka _opaque_pthread_t*}' to 'apache::thrift::concurrency::Thread::id_t {aka long long unsigned int}' [-fpermissive] - * [THRIFT-1490] - Windows-specific header files - fixes & tweaks - * [THRIFT-1526] - Union TupleSchemeFactory returns StandardSchemes - * [THRIFT-1527] - Generated implementation of tupleReadStruct in unions return null when the setfield is unrecognized - * [THRIFT-1524] - TNonBlockingServer does not compile in Visual Studio 2010 - * [THRIFT-1529] - TupleProtocol can unintentionally include an extra byte in bit vectors when number of optional fields is an integral of 8 - * [THRIFT-1473] - JSON context stack may be left in an incorrect state when an exception is thrown during read or write operations - * [THRIFT-1456] - System.Net.HttpWebRequest' does not contain a definition for 'Proxy' - * [THRIFT-1468] - Memory leak in TSaslServerTransport - * [THRIFT-1461] - Recent TNonblockingServer changes broke --enable-boostthreads=yes, Windows - * [THRIFT-1460] - why not add unicode strings support to python directly? - * [THRIFT-1464] - AbstractNonblockingServer.FrameBuffer TNonblockingTransport accessor changed from public to private - * [THRIFT-1467] - Possible AV with empty strings when using JSON protocol - * [THRIFT-1523] - clientTimeout not worked as expected in TServerSocket created by TSSLTransportFactory - * [THRIFT-1537] - TFramedTransport issues - * [THRIFT-1519] - Thirft Build Failure referencing rb_intern2 symbol - * [THRIFT-1518] - Generated C++ code only sends the first optional field in the write() function for a struct. - * [THRIFT-1515] - NameError: global name 'TApplicationException' is not defined - * [THRIFT-1554] - Inherited service methods are not resolved in derived service implementations - * [THRIFT-1553] - thrift nodejs service side can't read map structure, key as enum, value as Object - * [THRIFT-1575] - Typo in server/TThreadPoolServer.h - * [THRIFT-1327] - Fix Spec Suite under Ruby-1.8.7 (works for MRI Ruby-1.9.2) - * [THRIFT-1326] - on some platforms, #include is necessary to be included in Thrift.h - * [THRIFT-1159] - THttpClient->Flush() issue (connection thru proxy) - * [THRIFT-1277] - Node.js serializes false booleans as null - * [THRIFT-1224] - Cannot insert UTF-8 text - * [THRIFT-1267] - Node.js can't throw exceptions. - * [THRIFT-1338] - Do not use an unpatched autoconf 2.65 to generate release tarball - * [THRIFT-1128] - MAC OS X: thrift.h incompatibility with Thrift.h - * [THRIFT-1631] - Fix C++ server constructor typos - * [THRIFT-1602] - PHP C Extension is not Compatible with PHP 5.4 - * [THRIFT-1610] - IWebProxy not available on WP7 platform - * [THRIFT-1606] - Race condition in BoostThreadFactory.cpp - * [THRIFT-1604] - Python exception handeling for changes from PEP 3110 - * [THRIFT-1607] - Incorrect file modes for several source files - * [THRIFT-1583] - c_glib leaks memory - * [THRIFT-1582] - Bad includes of nested thrift files in c_glib - * [THRIFT-1578] - C_GLib generated code does not compile - * [THRIFT-1597] - TJSONProtocol.php is missing from Makefile.am - * [THRIFT-1591] - Enable TCP_NODELAY for ruby gem - * [THRIFT-1624] - Isset Generated differently on different platforms - * [THRIFT-1622] - Incorrect size returned on read - * [THRIFT-1621] - Memory leaks - * [THRIFT-1612] - Base64 encoding is broken - * [THRIFT-1627] - compiler built using compilers.vcxproj cannot be used to build some test .thrift files - * [THRIFT-1571] - Update Ruby HTTP transport for recent Ruby versions - * [THRIFT-1023] - Thrift encoding (UTF-8) issue with Ruby 1.9.2 - * [THRIFT-1090] - Document the generation of a file called "Constants.java" - * [THRIFT-1082] - Thrift::FramedTransport sometimes calls close() on an undefined value - * [THRIFT-956] - Python module's version meta-data should be updated - * [THRIFT-973] - Cocoa library won't compile using clang - * [THRIFT-1632] - ruby: data corruption in thrift_native implementation of MemoryBufferTransport - * [THRIFT-1665] - TBinaryProtocol: exceeded message length raises generic TException - * [THRIFT-1664] - Reference to non-existing variable in build script - * [THRIFT-1663] - Java Thrift server is not throwing exceptions - * [THRIFT-1662] - "removeObject:" should be "removeObserver:" in [-TSocketServer dealloc]? - * [THRIFT-1643] - Denial of Service attack in TBinaryProtocol.readString - * [THRIFT-1674] - Update Thrift D library to be compatible with 2.060 - * [THRIFT-1673] - Ruby compile flags for extension for multi arch builds (os x) - * [THRIFT-1655] - Configure still trying to use thrift_generators in output - * [THRIFT-1654] - c_glib thrift_socket_read() returns corrupted data - * [THRIFT-1653] - TThreadedSelectorServer leaks CLOSE_WAIT sockets - * [THRIFT-1658] - Java thrift server is not throwing TApplicationException - * [THRIFT-1656] - Setting proper headers in THttpServer.cpp so that "Cross-Origin Resource Sharing" on js client can work. - * [THRIFT-1652] - TSaslTransport does not log the error when kerberos auth fails - * [THRIFT-2272] - CLONE - Denial of Service attack in TBinaryProtocol.readString - * [THRIFT-2086] - Invalid generated code for Node.JS when using namespaces - * [THRIFT-1686] - t_php_generator.cc uses "and" instead of "&&", and causes compiler errors with Visual Studio - * [THRIFT-1693] - libthrift has dependency on two different versions of httpcore - * [THRIFT-1689] - don't exit(-1) in TNonblockingServer - * [THRIFT-1679] - NodeJS: protocol readString() should treat string as utf8, not binary - * [THRIFT-1721] - Dist broken due to 0.8.0 to 0.9.0 changes - * [THRIFT-1710] - Minor issues in test case code - * [THRIFT-1709] - Warning "Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first" in TBinaryProtocol.cs at ReadInt64() - * [THRIFT-1707] - [ruby] Adjust server_spec.rb for RSpec 2.11.x and Ruby 1.9.3 - * [THRIFT-1671] - Cocoa code generator does not put keywords into generated method calls - * [THRIFT-1670] - Incompatibilities between different versions of a Thrift interface - * [THRIFT-1669] - NameError: global name 'TApplicationException' is not defined - * [THRIFT-1668] - Compile error in contrib/fb303, thrift/TDispatchProcessor.h: No such file or directory - * [THRIFT-1845] - Fix compiler warning caused by implicit string conversion with Xcode 4.6 - * [THRIFT-304] - Building the Python library requires development headers - * [THRIFT-369] - sets and maps break equality - * [THRIFT-556] - Ruby compiler does not correctly referred to top-level modules when a submodule masks the top-level name - * [THRIFT-481] - indentation of ruby classes is off by a few - -## Improvement - * [THRIFT-1498] - Allow TThreadedPoolServer.Args to pass a ExecutorService - * [THRIFT-1444] - FunctionRunner - add syntactic sugar to create shared_ptrs - * [THRIFT-1443] - define a TProcessor helper class to implement process() - * [THRIFT-1441] - Generate constructor with parameters for exception class to let it update message property automatically. - * [THRIFT-1520] - Embed version number in erlang .app file - * [THRIFT-1480] - python: remove tabs, adjust whitespace and address PEP8 warnings - * [THRIFT-1485] - Performance: pass large and/or refcounted arguments as "const" - * [THRIFT-1484] - Introduce phpunit test suite - * [THRIFT-1532] - The type specifications in the generated Erlang code should include "undefined" where it's used as a default value - * [THRIFT-1534] - Required fields in the Delphi code generator. - * [THRIFT-1469] - Java isset space optimization - * [THRIFT-1465] - Visibility of methods in generated java code - * [THRIFT-1453] - Don't change types of arguments when serializing with thrift php extension - * [THRIFT-1452] - generate a swap() method for all generated structs - * [THRIFT-1451] - FramedTransport: Prevent infinite loop when writing - * [THRIFT-1521] - Two patches for more Performance - * [THRIFT-1555] - Delphi version of the tutorial code - * [THRIFT-1535] - Why thrift don't use wrapped class for optional fields ? - * [THRIFT-1204] - Ruby autogenerated files should require 'thrift' gem - * [THRIFT-1344] - Using the httpc module directly rather than the deprecated http layer - * [THRIFT-1343] - no_auto_import min/2 to avoid compile warning - * [THRIFT-1340] - Add support of ARC to Objective-C - * [THRIFT-1611] - Improved code generation for typedefs - * [THRIFT-1593] - Pass on errors like "connection closed" to the handler module - * [THRIFT-1615] - PHP Namespace - * [THRIFT-1567] - Thrift/cpp: Allow alternate classes to be used for - * [THRIFT-1072] - Missing - (id) initWithSharedProcessor in TSharedProcessorFactory.h - * [THRIFT-1650] - [ruby] Update clean items and svn:ignore entries for OS X artifacts - * [THRIFT-1661] - [PATCH] Add --with-qt4 configure option - * [THRIFT-1675] - Do we have any plan to support scala? - * [THRIFT-1645] - Replace Object#tee with more conventional Object#tap in specs - * [THRIFT-1644] - Upgrade RSpec to 2.10.x and refactor specs as needed - * [THRIFT-1672] - MonoTouch (and Mono for Android) compatibility - * [THRIFT-1702] - a thrift manual - * [THRIFT-1694] - Re-Enable serialization for WP7 Silverlight - * [THRIFT-1691] - Serializer/deserializer support for Delphi - * [THRIFT-1688] - Update IDL page markup - * [THRIFT-1725] - Tutorial web pages for Delphi and C# - * [THRIFT-1714] - [ruby] Explicitly add CWD to Ruby test_suites.rb - * [THRIFT-317] - Issues with Java struct validation - * [THRIFT-164] - Build web tutorial on Incubator web site - * [THRIFT-541] - Cocoa code generator doesn't put keywords before all arguments. - * [THRIFT-681] - The HTML generator does not handle JavaDoc style comments very well - -## New Feature - * [THRIFT-1500] - D programming language support - * [THRIFT-1510] - There should be an implementation of the JsonProtocol for ruby - * [THRIFT-1115] - python TBase class for dynamic (de)serialization, and __slots__ option for memory savings - * [THRIFT-1953] - support for asp.net mvc 3 - -## Question - * [THRIFT-1235] - How could I use THttpServerTransportFactory withTNonBlockingServer - * [THRIFT-1368] - TNonblockingServer usage - * [THRIFT-1061] - Read an invalid frame size of 0. Are you using TFramedTransport on the client side? - * [THRIFT-491] - Ripping raw pthreads out of TFileTransport and associated test issues - -## Sub-task - * [THRIFT-1596] - Delphi: Test clients should have a return codes that reflect whether they succeeded or not - * [THRIFT-982] - javame: add version Info to the library - * [THRIFT-1722] - C# WP7 Assembly addition beaks mono build - * [THRIFT-336] - Compact Protocol in C# - -## Test - * [THRIFT-1613] - Add code back into empty source file ToStringTest.java - * [THRIFT-1718] - Incorrect check in TFileTransportTest - -## Wish - * [THRIFT-1463] - Decouple Thrift IDL from generators - * [THRIFT-1466] - Proper Documentation for Thrift C Glib - * [THRIFT-1539] - Build and distribute the fb303 python libraries along with thrift - * [THRIFT-1685] - Please add "aereo.com" to "Powered by Apache Thrift" list in about page - * [THRIFT-330] - TProcessor - additional method to called when connection is broken - - - -Thrift 0.8 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1436] - pip install thrift fails on Windows with "Unable to find vcvarsall.bat" - * [THRIFT-1432] - Javascript struct constants declared in the same file as their struct definition will cause an error - * [THRIFT-1428] - shared.thrft does not include namespace for php, so thrift compiler generate incorrect name - * [THRIFT-1426] - Dist package missing files for release 0.8 - * [THRIFT-1425] - The Node package is incompatible with latest node (0.6) & npm (1.0.27) - * [THRIFT-1416] - Python Unit test is broken on ci - * [THRIFT-1419] - AbstractNonBlockingServer does not catch errors when invoking the processor - * [THRIFT-1424] - Ruby specs fail when run with rake - * [THRIFT-1420] - Nonblocking and HsHa server should make sure to close all their socket connections when the selector exits - * [THRIFT-1413] - Generated code does not read MapEnd / ListEnd / SetEnd - * [THRIFT-1409] - Name conflict check does not work properly for exception object(Delphi). - * [THRIFT-1408] - Delphi Test Server: Exception test case fails due to naming conflict with e.message - * [THRIFT-1407] - Typo in Python socket server causes Thrift to fail when we enable a global socket timout - * [THRIFT-1397] - CI server fails during build due to unused parameters in delphi generator - * [THRIFT-1404] - Delphi compiler generates struct reader code with problem. - * [THRIFT-1400] - Ruby native extension aborts with __stack_chk_fail in OSX - * [THRIFT-1399] - One of the TServerImpl.Create CTORs lacks implementation - * [THRIFT-1390] - Debian packages build fix for Squeeze (build from the official 0.7.0 tarball) - * [THRIFT-1393] - TTransportException's thrown from THttpClient contain superfluous slashes in the Exception message - * [THRIFT-1392] - Enabling both namespaces and autoloading in generated PHP code won't work. - * [THRIFT-1406] - Build error after applying THRIFT-1395 - * [THRIFT-1405] - Delphi compiler does not generates container serializer properly. - * [THRIFT-1411] - java generator does not provide type parameter for TBaseProcessor - * [THRIFT-1473] - JSON context stack may be left in an incorrect state when an exception is thrown during read or write operations - * [THRIFT-1331] - Ruby library deserializes an empty map to nil - * [THRIFT-1330] - PHP Namespaces no longer generated - * [THRIFT-1328] - TBaseHelper.toString(...) appends ByteBuffer data outside of valid buffer range - * [THRIFT-1322] - OCaml lib fail to compile: Thrift.ml line 305, int vs int32 mismatch - * [THRIFT-1143] - Build doesn't detect correct architecture type on 64bit osx - * [THRIFT-1205] - port server unduly fragile with arbitrary input - * [THRIFT-1279] - type set is handled incorrectly when writing object - * [THRIFT-1298] - Standard scheme doesn't read or write metadata along with field values - * [THRIFT-1265] - C++ container deserialize - * [THRIFT-1263] - publish ruby client to rubygems - * [THRIFT-1384] - Java help menu missing newline near javame flag - * [THRIFT-1382] - Bundle install doesnot work because thrift crashes - * [THRIFT-1381] - Thrift C++ libs have incorrectly versioned names - * [THRIFT-1350] - Go library code does not build as of r60 (most recent release) - * [THRIFT-1365] - TupleProtocol#writeBitSet unintentionally writes a variable length byte array - * [THRIFT-1359] - --gen-cob cpp:cob_style does not compile anymore - * [THRIFT-1319] - Mismatch between how a union reads and writes a container - * [THRIFT-1309] - libfb303-0.7.0.jar missing in maven repository - * [THRIFT-1238] - Thrift JS client cannot read map of structures - * [THRIFT-1254] - Code can't be compiled against a regular JRE: Object.clone() override has a different return type - * [THRIFT-1367] - Mac OSX build fails with "no such file to load -- spec/rake/spectask" - * [THRIFT-1355] - Running make in lib/rb doesn't build the native extensions - * [THRIFT-1370] - Debian packaging should Build-Depend on libglib2.0-dev - * [THRIFT-1342] - Compilation problem on Windows of fastbinary.c - * [THRIFT-1341] - TProtocol.h endian detection wrong with boost - * [THRIFT-1583] - c_glib leaks memory - * [THRIFT-1582] - Bad includes of nested thrift files in c_glib - * [THRIFT-1578] - C_GLib generated code does not compile - * [THRIFT-1027] - 'make -j 16' fails with "unterminated #ifdef" error - * [THRIFT-1121] - Java server performance regression in 0.6 - * [THRIFT-857] - tests run by "make install" fail if generators are disabled - * [THRIFT-380] - Use setuptools for python build - -## Dependency upgrade - * [THRIFT-1257] - thrift's dependency scope on javax.servlet:servlet-api should be 'provided' - -## Improvement - * [THRIFT-1445] - minor C++ generator variable cleanup - * [THRIFT-1435] - make TException.Message property conformant to the usual expectations - * [THRIFT-1431] - Rename 'sys' module to 'util' - * [THRIFT-1396] - Dephi generator has dependacy on boost 1.42 later. - * [THRIFT-1395] - Patch to prevent warnings for integer types in some cases - * [THRIFT-1275] - thrift: always prefix namespaces with " ::" - * [THRIFT-1274] - thrift: fail compilation if an unexpected token is - * [THRIFT-1271] - thrift: fix missing namespace in generated local - * [THRIFT-1270] - thrift: add --allow-neg-keys argument to allow - * [THRIFT-1345] - Allow building without tests - * [THRIFT-1286] - Modernize the Thrift Ruby Library Dev Environment - * [THRIFT-1284] - thrift: fix processor inheritance - * [THRIFT-1283] - thrift: wrap t_cpp_generator::generate_process_function() to 80 - * [THRIFT-1282] - Upgrade httpclient to 4.1.2 (from 4.0.1) - * [THRIFT-1281] - add @generated to the docblock - * [THRIFT-1280] - Thrift: Improve Monitor exception-free interfaces - * [THRIFT-1278] - javadoc warnings - compilation - * [THRIFT-1227] - Erlang implementation of thrift JSON protocol - * [THRIFT-1295] - Duplicate include in TSocket.cpp - * [THRIFT-1294] - thrift: fix log message typos in TSimpleServer - * [THRIFT-1293] - thrift: improve handling of exceptions thrown by - * [THRIFT-1292] - thrift: silence log spew from TThreadedServer - * [THRIFT-1288] - Allow typedefed exceptions in throws clauses - * [THRIFT-1290] - thrift: TNonblockingServer: clean up state in the - * [THRIFT-1287] - thrift: start refactoring some of the C++ processor - * [THRIFT-1289] - thrift: implement TNonblockingServer::stop() - * [THRIFT-1305] - thrift: make TConnection a private inner class of - * [THRIFT-1304] - TNonblockingServer: pass in the connection context to - * [THRIFT-1302] - thrift: raise an exception if send() times out in - * [THRIFT-1301] - thrift: consolidate common code in TNonblockingServer - * [THRIFT-1377] - abort PHP deserialization on unknown field type - * [THRIFT-1379] - fix uninitialized enum values in thrift C++ objects - * [THRIFT-1376] - Make port specification option in thrift remote - * [THRIFT-1375] - fixed a hex char conversion bug in TJSONProtocol - * [THRIFT-1373] - Fix user-defined exception generation in thrift (python) - * [THRIFT-1361] - Optional replacement of pthread by boost::thread - * [THRIFT-1320] - Consistency of configure generated config.h - * [THRIFT-1317] - Remove copy constructibility from - * [THRIFT-1316] - thrift: update server classes to accept - * [THRIFT-1315] - thrift: generate server interface factory classes - * [THRIFT-1314] - thrift: add TProcessorFactory - * [THRIFT-1335] - Add accept timeout to TServerSocket - * [THRIFT-1334] - Add more info to IllegalStateException - * [THRIFT-1333] - Make RWGuard not copyable - * [THRIFT-1332] - TSSLTransportParameters class uses hard coded value keyManagerType: SunX509 - * [THRIFT-1251] - Generated java code should indicate which fields are required and which are optional - * [THRIFT-1387] - Build MSVC libraries with Boost Threads instead of Pthreads - * [THRIFT-1339] - Extend Tuple Protocol to TUnions - * [THRIFT-1031] - Patch to compile Thrift for vc++ 9.0 and 10.0 - * [THRIFT-1130] - Add the ability to specify symbolic default value for optional boolean - * [THRIFT-1123] - Patch to compile Thrift server and client for vc++ 9.0 and 10.0 - * [THRIFT-386] - Make it possible to build the Python library without the extension - -## New Feature - * [THRIFT-1401] - JSON-protocol for Delphi XE Libraries - * [THRIFT-1167] - Java nonblocking server with more than one thread for select and handling IO - * [THRIFT-1366] - Delphi generator, lirbrary and unit test. - * [THRIFT-1354] - Add rake task to build just the gem file - * [THRIFT-769] - Pluggable Serializers - -## Sub-task - * [THRIFT-1415] - delphi: add version Info to the library - * [THRIFT-1391] - Improved Delphi XE test cases - - - -Thrift 0.7 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1140] - Framed Transport Client using C (Glib) Library hangs when connecting to Ruby Server - * [THRIFT-1154] - HttpClient does not specify the connection close parameter - * [THRIFT-1153] - HttpClient does not specify the connection close parameter - * [THRIFT-1149] - Nonblocking server fails when client connection is reset - * [THRIFT-1146] - Android Incompatibility : in Android < 2.3 java.io.IOException doesn't support for Throwable parameter in constructor - * [THRIFT-1133] - Java and JavaScript tutorial is broken since we have Java maven deployment - * [THRIFT-1132] - Deserialization error in TApplicationException C# - * [THRIFT-1131] - C# JSON Protocol is unable to decode escaped characters in string - * [THRIFT-1208] - python TCompactProtocol.py writeBool and readBool not follow the compact-proto-spec-2.txt spec for CONTAINER_WRITE, CONTAINER_READ - * [THRIFT-1200] - JS compiler generates code that clobbers existing namespaces - * [THRIFT-1183] - Pure-ruby CompactProtocol raises ArgumentError when deserializing under Ruby 1.9 - * [THRIFT-1182] - Native deserializer segfaults on incorrect list element type - * [THRIFT-1181] - AS3 compiler generates incorrect code for setting default values in constructor - * [THRIFT-1234] - thrift --help is missing doc on py:utf8strings - * [THRIFT-1180] - AS3 compiler generates uncompilable code for binary types. - * [THRIFT-1194] - Java lib does not install artifacts to local dir correctly - * [THRIFT-1193] - Potential infinite loop in nonblocking_server - * [THRIFT-1192] - Typo: TProtocol.h tests for HAVE_SYS_PARAM_H_ - * [THRIFT-1190] - readBufferBytesAllocated in TNonblockingServer.java should be AtomicLong to fix FD leakage and general server malfunction - * [THRIFT-1187] - nonblocking_server shutdown race under Ruby 1.9 - * [THRIFT-1178] - Java: TBase signature should be T extends TBase - * [THRIFT-1164] - Segmentation fault on NULL pointer in t_js_generator::generate_const - * [THRIFT-1171] - Perl write/readDouble assumes little-endian platform - * [THRIFT-1222] - Unhandled exception for TEvhttpServer request - * [THRIFT-1220] - TProcessor::process never returns false - * [THRIFT-1285] - Stable 0.7.0 Windows compiler exe available on the webside is not the good one - * [THRIFT-1218] - c_glib uses wrong name in pkg-config - * [THRIFT-1215] - Undefined property Thirft in lib/js/thrift.js - * [THRIFT-1211] - When using THttpClient, non 200 responses leave the connection open - * [THRIFT-1228] - The php accelerator module calls flush incorrectly - * [THRIFT-1308] - libfb303-0.7.0.jar missing in maven repository - * [THRIFT-1255] - Mismatch of method name between JavaME's lib and generated code (compareTo/compareObjects) - * [THRIFT-1253] - Code generated for maps is not compiling - * [THRIFT-1252] - Segfault in Ruby deserializer - * [THRIFT-1094] - bug in TCompactProto python readMessageEnd method and updated test cases - * [THRIFT-1093] - several bugs in python TCompactProtocol - * [THRIFT-1092] - generated validate() method has wrong indentation - * [THRIFT-1011] - Error generating package imports when using classes from other packages - * [THRIFT-1050] - Declaring an argument named "manager" to a service method produces code that fails compile due to name conflicts with protected ivars in TAsyncClient - * [THRIFT-1074] - .keystore and .truststore are missing from the 0.6.0 distribution - * [THRIFT-1067] - Tons of bugs in php implementation - * [THRIFT-1065] - Unexpected exceptions not proper handled on JS - * [THRIFT-1076] - Erlang Thrift socket server has a bug that causes java thrift client of framed binary client to throw "out of sequence" exception - * [THRIFT-1057] - casts in TBinaryProtocol.tcc causing "dereferencing type-punned pointer will break strict-aliasing rules" warnings from gcc - * [THRIFT-1055] - csharp TServerSocket and TSocket do not disable Nagle via Socket.NoDelay = true like cpp and java do - * [THRIFT-1054] - explicit call to PKG_PROG_PKG_CONFIG is missing and first use of PKG_CHECK_MODULES may not happen, causes mono detection to fail - * [THRIFT-1117] - JavaScript Unit Test does not work anymore because libthrift*.jar where moved by Maven Deployment - * [THRIFT-1111] - The HTML generator does not distinguish between string and binary types - * [THRIFT-1032] - "make dist" fails due to c_glib problem - * [THRIFT-1036] - Auto-generated C++ code fails to compile with "-Werror -Wextra -Wall" g++ compiler flags - * [THRIFT-1041] - TDeserializer holds onto a reference of the array it reads after it is done deserializing - * [THRIFT-1106] - C++ code TAsyncProtocolProcessor.h & TAsyncBufferProcessor.h dont have virtual functions but no virtual destructor. Causes warnings on -Wall - * [THRIFT-1105] - OCaml generator does not prefix methods of included structs with their type - * [THRIFT-1104] - INSTALLDIRS should be included in configure script - * [THRIFT-1102] - typo in configure.ac: "==" operator in 'test' (instead of"'=") - * [THRIFT-1101] - bytebuffer length calculation in TBinaryProtocol writeBinary - * [THRIFT-1098] - Undefined properties in TBinaryProtocolFactory - * [THRIFT-1081] - PHP tests broken and somewhat incomplete - * [THRIFT-1080] - erlang test's 'make' fails on Mac OSX - * [THRIFT-1078] - ThriftTest.thrift generates invalid PHP library - * [THRIFT-1120] - proto.WriteListEnd being called in the wrong place - * [THRIFT-1119] - TJSONProtocol fails to UTF8 decode strings - * [THRIFT-867] - PHP accelerator module's output transport is incompatible with TFramedTransport - * [THRIFT-826] - PHP TSocket Write Timeout - * [THRIFT-835] - Bad AS3 syntax in constructors that set default values - * [THRIFT-788] - thrift_protocol.so: multiget/multiget_slice does not handle more than 17 keys correctly - * [THRIFT-125] - OCaml libraries don't compile with 32-bit ocaml - * [THRIFT-342] - PHP: can't have sets of complex types - * [THRIFT-731] - configure doesn't check for ant >= 1.7 - * [THRIFT-690] - Update TApplicationException codes - * [THRIFT-638] - BufferedTransport + C extensions block until recv timeout is reached on last fread call - -## Dependency upgrade - * [THRIFT-1177] - Update thrift to reflect changes in Go's networking libraries - -## Improvement - * [THRIFT-1155] - Remove log4j dependency from java client - * [THRIFT-1151] - Produce more informative runtime error in case of schema and data mismatch during serialization - * [THRIFT-1207] - Support DESTDIR on "make install" of ruby libs - * [THRIFT-1199] - Union structs should have generated methods to test whether a specific field is currently set - * [THRIFT-1233] - Remove unused include in generated C++ code - * [THRIFT-1189] - Ruby deserializer speed improvements - * [THRIFT-1170] - Thrift Generated Code and Java 5 - * [THRIFT-1174] - Publish as3 client implementation via Maven for use by flex-mojos users - * [THRIFT-1225] - TCompactProtocol for PHP - * [THRIFT-1221] - Remove SimpleCallback.h - * [THRIFT-1217] - Use evutil_socketpair instead of pipe (Windows port) - * [THRIFT-1216] - build Java Library behind a proxy - * [THRIFT-1231] - Remove bogus include - * [THRIFT-1213] - Membuffer should provide a way to get back the buffer - * [THRIFT-1237] - Java fb303 missing some methods - * [THRIFT-1063] - Fix Erlang Tutorial Files - * [THRIFT-1053] - Make remote client's IP address available for all socket related transports - * [THRIFT-1109] - Deploy fb303 along side libthrift to maven repo - * [THRIFT-1107] - improvement for compiler-generated python for 'None' object comparisons - * [THRIFT-1069] - Add command line option to prevent thrift from inserting gen-* directories - * [THRIFT-1049] - Allow for TServerSocket python library to bind to a specific host - * [THRIFT-1126] - Extending struct_info for erlang bindings - * [THRIFT-1100] - python TSSLSocket improvements, including certificate validation - * [THRIFT-994] - Don't try to invoke phpize if we don't have it - * [THRIFT-993] - Some improvements in C++ stubs for oneway operations - * [THRIFT-997] - Using valueOf for base types in getFieldValue - * [THRIFT-418] - Don't do runtime sorting of struct fields - * [THRIFT-151] - TSSLServerSocket and TSSLSocket implementation - * [THRIFT-27] - Generated erlang types don't contain default values for records - * [THRIFT-113] - to-string methods should omit optional null fields from output - * [THRIFT-363] - Maven Deploy - * [THRIFT-447] - Make an abstract base Client class so we can generate less code - * [THRIFT-627] - should c++ have setters for optional fields? - -## New Feature - * [THRIFT-1236] - Erlang Reconnecting Thrift Client - * [THRIFT-1021] - Framed transport support for OCaml - * [THRIFT-1068] - Python SSL Socket Support - * [THRIFT-1103] - TZlibTransport for python, a zlib compressed transport - * [THRIFT-1083] - Preforking python process pool server - * [THRIFT-999] - Add TForkingServer - -## Sub-task - * [THRIFT-1152] - Attributes from private to protected - * [THRIFT-1038] - Generated Java code for structures containing binary fields (or collections thereof) are not serializable (in the Java sense) even though they implement java.io.Serializable - -## Task - * [THRIFT-892] - Refactor erlang build system with rebar - -## Wish - * [THRIFT-625] - Add support for 'Go' - - - -Thrift 0.6.1 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1133] - Java and JavaScript tutorial is broken since we have Java maven deployment - * [THRIFT-1131] - C# JSON Protocol is unable to decode escaped characters in string - * [THRIFT-1074] - .keystore and .truststore are missing from the 0.6.0 distribution - -## Improvement - * [THRIFT-1109] - Deploy fb303 along side libthrift to maven repo - * [THRIFT-363] - Maven Deploy - -## Question - * [THRIFT-1206] - did the THRIFT 0.6.1 merge THRIFT-563 ? - -## Sub-task - * [THRIFT-1163] - How can i use multi service in one program? - -## Task - * [THRIFT-1112] - Apply THRIFT-363 to 0.6 branch - * [THRIFT-1113] - Apply THRIFT-1074 to 0.6 branch - - - -Thrift 0.6 --------------------------------------------------------------------------------- -## Bug - * [THRIFT-1020] - OCaml compiler generates invalid OCaml - * [THRIFT-1015] - TUnion does not handle ByteBuffer in toString - * [THRIFT-1013] - generated java code may have name clashes with thrift library - * [THRIFT-1009] - TUnion does not correctly deep copy a ByteBuffer - * [THRIFT-1032] - "make dist" fails due to c_glib problem - * [THRIFT-868] - Referencing constant values doesn't work with with typedef types - * [THRIFT-971] - java module can't be compiled without ivy and network connection - * [THRIFT-970] - Under heavy load, THttpClient may fail with "too many open files" - * [THRIFT-969] - Java Tutorial broken, move CalculatorHandler to a separate file - * [THRIFT-807] - JavaScript: Initialization of Base Types with 0 instead of null - * [THRIFT-955] - Thrift compiler for Windows uses lowercase names and directories which is inconsistent with compiling on other platforms - * [THRIFT-992] - Naming convention in C# constructor is not consistent with other fields causes compile errors - * [THRIFT-1008] - byte[] accessors throw NPE on unset field - * [THRIFT-1006] - Impossible to correctly qualify an enum constant in an external thrift file - * [THRIFT-950] - Haskell bindings treat 'byte' as unsigned 8-bit int (Data.Word.Word8), java/cpp as signed (byte/int8_t). - * [THRIFT-975] - lib/c_glib/README is missing => breaks make dist - * [THRIFT-944] - Support all version-4s of base - * [THRIFT-939] - optional binary fields throw NPE on default byte[] getters - * [THRIFT-935] - PHP Extension aborts the build if php-config is not installed - * [THRIFT-933] - Haskell's Thrift.cabal has warnings - * [THRIFT-932] - Haskell tests need to be run through 'make check' (and probably 'cabal check') too - * [THRIFT-904] - C# TSocket should disable nagle and linger - * [THRIFT-941] - Make PHP C Extension use the defined Protocol writeMessageBegin function - * [THRIFT-940] - 'make check' fails if boost is not in the std include and link paths - * [THRIFT-924] - Fix generated php structure constants - * [THRIFT-979] - ruby bindings used to work on jruby - * [THRIFT-977] - Hex Conversion Bug in C++ TJSONProtocol - * [THRIFT-347] - PHP TSocket Timeout Issues - * [THRIFT-517] - TExceptions thrown by server result in cryptic error message on client - Tried to read 4 bytes, but only got 0 bytes - -## Improvement - * [THRIFT-1024] - Add Python Twisted example to the Tutorial - * [THRIFT-958] - Change accessmodifer on trans_ field in the FrameBuffer class to public. - * [THRIFT-957] - THsHaServer: Change access modifier of the invoker field. - * [THRIFT-1002] - CodeStyle: t_c_glib_generator.cc - * [THRIFT-1005] - Give unions byte[] signature methods to go along with their ByteBuffer counterparts - * [THRIFT-951] - Add a new isServing() method to TServer - * [THRIFT-943] - Silly readme typo fix. - * [THRIFT-961] - JavaScript TestSuite using ant/ivy and Java's ServerTestBase Handler - * [THRIFT-960] - add TestServer, TestNonblockingServer and TestClient again - * [THRIFT-949] - Modify the TEnum interface so it defines a method similar to findByValue - * [THRIFT-946] - Augment FieldValueMetaData so it differentiates 'string' and 'binary' fields. - * [THRIFT-903] - custom ThreadFactory in THsHaServer - * [THRIFT-913] - Test Case for Url encoded strings + simple enhancement to lib/js/test/RunTestServer.sh - * [THRIFT-926] - Miscellaneous C++ improvements - * [THRIFT-929] - Improvements to the C++ test suite - * [THRIFT-893] - add JavaScript to the tutorial examples - * [THRIFT-1003] - Polishing c_glib code - * [THRIFT-71] - Debian packaging for thrift - -## New Feature - * [THRIFT-1033] - Node.js language target - * [THRIFT-947] - Provide a helper method to determine the TProtocol used to serialize some data. - * [THRIFT-928] - Make more statistics available in C++ servers - * [THRIFT-922] - Templatized [de]serialization code for C++ - * [THRIFT-923] - Event-driven client and server support for C++ - * [THRIFT-925] - Provide name<->value map for enums in C++ - * [THRIFT-927] - Add option to modify the PHP include path - * [THRIFT-377] - TFileTransport port in Java - * [THRIFT-106] - TSSLServerSocket - * [THRIFT-582] - C implementation of Thrift - * [THRIFT-745] - Make it easier to instantiate servers - -## Sub-task - * [THRIFT-1038] - Generated Java code for structures containing binary fields (or collections thereof) are not serializable (in the Java sense) even though they implement java.io.Serializable - -## Task - * [THRIFT-862] - Async client issues / improvements - -## Test - * [THRIFT-581] - Add a testsuite for txThrift (Twisted) - - - -Thrift 0.5.0 - Incubating --------------------------------------------------------------------------------- -THRIFT-505 Build Make configure give a summary of the enabled components (David Reiss) -THRIFT-506 Build Allow Thrift to be built without the C++ library (David Reiss) -THRIFT-844 Build Build Requirements state autoconf 2.59+ is required, but 2.60+ is needed (Harlan Lieberman-Berg) -THRIFT-850 Build Perl runtime requires Bit::Vector which may not be installed by default, but configure does not fail (Michael Lum) -THRIFT-854 Build Provide configure option and make rules to build/install php extension (Anthony Molinaro) -THRIFT-858 Build Have bootstrap.sh check for a suitable autoconf version before running (David Reiss) -THRIFT-871 Build Thrift compiler for WIndows (binary distribution) (David Reiss) -THRIFT-323 C# TJSONProtocol (Roger Meier) -THRIFT-634 C# C# Compiler Generates Incorrect Code For Fields which begin with an uppercase letter (Jon S Akhtar) -THRIFT-881 C# add csharp to the tutorial (Roger Meier) -THRIFT-856 C++ Building cpp library fails on OS X with malloc and free not being declared in scope (James Clarke) -THRIFT-865 C++ C++ compiler build depends on libfl even when flex/lex not detected (David Reiss) -THRIFT-900 C++ Unix domain socket (Roger Meier) -THRIFT-920 C++ C++ Test and Tutorial does not compile anymore due to the change within Enum handling (Roger Meier) -THRIFT-567 C++ Can't immediately stop a TSimpleServer thread that is idle (Rush Manbert) -THRIFT-756 C++ Exposing TSocket(int) constructor to public (Rajat Goel) -THRIFT-798 C++ TNonblockingServer leaks resources when destroyed (David Reiss) -THRIFT-812 C++, Python Demo of Thrift over ZeroMQ (David Reiss) -THRIFT-629 Cocoa Unused Field In TSocketServer Appears To Break iPhone Build (Jon S Akhtar) -THRIFT-838 Cocoa Generated Cocoa classes have useless @dynamic declarations (Kevin Ballard) -THRIFT-805 Cocoa Don't generate process_XXXX methods for oneway methods (Brad Taylor) -THRIFT-507 Compiler Remove the compiler's dependency on Boost (David Reiss) -THRIFT-895 Compiler (General) Thrift compiler does not allow two different enumerations to have the same key name for one of the enum values (David Reiss) -THRIFT-852 Compiler (General) Missing newline causes many compiler warnings (Anthony Molinaro) -THRIFT-877 Compiler (General) smalltalk namespace doesn't work (Bruce Lowekamp) -THRIFT-897 Compiler (General) Don't allow unqualified constant access to enum values (Bryan Duxbury) -THRIFT-9 Compiler (General) Add a default namespace declaration for all languages (David Reiss) -THRIFT-599 Erlang Don't use unnecessary processes in the Erlang transports and clients (David Reiss) -THRIFT-646 Erlang Erlang library is missing install target (David Reiss) -THRIFT-698 Erlang Generated module list should contain atoms, not strings (Anthony Molinaro) -THRIFT-866 Erlang term() in spec definitions seems to not work in erlang R12 (Anthony Molinaro) -THRIFT-886 Erlang Dialyzer warning (Anthony Molinaro) -THRIFT-785 Erlang Framed transport server problems (Anthony Molinaro) -THRIFT-884 HTML HTML Generator: add Key attribute to the Data Types Tables (Roger Meier) -THRIFT-652 Haskell Generated field name for strut is not capitalized correctly (Christian Lavoie) -THRIFT-743 Haskell compile error with GHC 6.12.1 (Christian Lavoie) -THRIFT-901 Haskell Allow the bindings to compile without -fglasgow-exts and with -Wall -Werror (Christian Lavoie) -THRIFT-905 Haskell Make haskell thrift bindings use automake to compile and install (Christian Lavoie) -THRIFT-906 Haskell Improve type mappings (Christian Lavoie) -THRIFT-914 Haskell Make haskell bindings 'easily' compilable (Christian Lavoie) -THRIFT-918 Haskell Make haskell tests run again (Christian Lavoie) -THRIFT-919 Haskell Update Haskell bindings README (Christian Lavoie) -THRIFT-787 Haskell Enums are not read correctly (Christian Lavoie) -THRIFT-250 Java ExecutorService as a constructor parameter for TServer (Ed Ceaser) -THRIFT-693 Java Thrift compiler generated java code that throws compiler warnings about deprecated methods. (Bryan Duxbury) -THRIFT-843 Java TNonblockingSocket connects without a timeout (Bryan Duxbury) -THRIFT-845 Java async client does not respect timeout (Ning Liang) -THRIFT-870 Java Java constants don't get Javadoc comments (Bryan Duxbury) -THRIFT-873 Java Java tests fail due to Too many open files (Todd Lipcon) -THRIFT-876 Java Add SASL support (Aaron T. Myers) -THRIFT-879 Java Remove @Override from TUnion.clear (Dave Engberg) -THRIFT-882 Java deep copy of binary fields does not copy ByteBuffer characteristics (arrayOffset, position) (Bryan Duxbury) -THRIFT-888 Java async client should also have nonblocking connect (Eric Jensen) -THRIFT-890 Java Java tutorial doesn't work (Todd Lipcon) -THRIFT-894 Java Make default accessors for binary fields return byte[]; provide new accessors to get ByteBuffer version (Bryan Duxbury) -THRIFT-896 Java TNonblockingSocket.isOpen() returns true even after close() (Eric Jensen) -THRIFT-907 Java libfb303 doesn't compile in 0.4.0 (Todd Lipcon) -THRIFT-912 Java Improvements and bug fixes to SASL implementation (Todd Lipcon) -THRIFT-917 Java THsHaServer should not accept an ExecutorService without catching RejectedExecutionException (Ed Ceaser) -THRIFT-931 Java Use log4j for Java tests (Todd Lipcon) -THRIFT-880 JavaME JavaME code generator and runtime library (Dave Engberg) -THRIFT-846 JavaScript JavaScript Test Framwork: extended Testcases (Roger Meier) -THRIFT-885 JavaScript Url encoded strings never get decoded? How do we fix this? (T Jake Luciani) -THRIFT-911 JavaScript (JavaScript compiler) Const structs, maps, sets, and lists generate a trailing comma (T Jake Luciani) -THRIFT-860 OCaml copy method and reset method (Lev Walkin) -THRIFT-682 PHP PHP extension doesn't compile on Mac OS X (Bryan Duxbury) -THRIFT-851 PHP php extension fails to compile on centos 5.x (Todd Lipcon) -THRIFT-840 Perl Perl protocol handler could be more robust against unrecognised types (Conrad Hughes) -THRIFT-758 Perl incorrect deference in exception handling (Yann Kerherve) -THRIFT-257 Python Support validation of required fields (Esteve Fernandez) -THRIFT-335 Python Compact Protocol for Python (David Reiss) -THRIFT-596 Python Make Python's TBufferedTransport use a configurable input buffer (David Reiss) -THRIFT-597 Python Python THttpServer performance improvements (David Reiss) -THRIFT-598 Python Allow Python's threading servers to use daemon threads (David Reiss) -THRIFT-666 Python Allow the handler to override HTTP responses in THttpServer (David Reiss) -THRIFT-673 Python Generated Python code has whitespace issues (Ian Eure) -THRIFT-721 Python THttpClient ignores url parameters (Thomas Kho) -THRIFT-824 Python TApplicationException.__str__() refers to class constants as globals (Peter Schuller) -THRIFT-855 Python Include optimized compiled python objects in install (Anthony Molinaro) -THRIFT-859 Python Allow py:twisted to be generated in different namespace than py (Bruce Lowekamp) -THRIFT-869 Python TSocket.py on Mac (and FreeBSD) doesn't handle ECONNRESET from recv() (Steven Knight) -THRIFT-875 Python Include python setup.cfg in dist (Anthony Molinaro) -THRIFT-610 Ruby binary_protocol.rb segfaults [line 86] (Unassigned) -THRIFT-899 Ruby Ruby read timeouts can sometimes be 2x what they should be (Ryan King) -THRIFT-909 Ruby allow block argument to struct constructor (Michael Stockton) -THRIFT-456 Test Suite Bad IP address string in test/cpp/src/main.cpp (Rush Manbert) - - -Thrift 0.4.0 - Incubating --------------------------------------------------------------------------------- -THRIFT-650 Build Make Check fails on Centos/OSX with 0.2.0 tarball (Anthony Molinaro) -THRIFT-770 Build Get 'make dist' to work without first compiling source code (Anthony Molinaro) -THRIFT-160 C# Created THttpTransport for the C# library based on WebHttpRequest (Michael Greene) -THRIFT-834 C# THttpClient resends contents of message after transport errors (Anatoly Fayngelerin) -THRIFT-247 C++ THttpServer Transport (Unassigned) -THRIFT-676 C++ Change C++ code generator so that generated classes can be wrapped with SWIG (Unassigned) -THRIFT-570 Compiler Thrift compiler does not error when duplicate method names are present (Bruce Simpson) -THRIFT-808 Compiler Segfault when constant declaration references a struct field that doesn't exist (Bryan Duxbury) -THRIFT-646 Erlang Erlang library is missing install target (Anthony Molinaro) -THRIFT-544 General multiple enums with the same key generate invalid code (Ben Taitelbaum) -THRIFT-434 General ruby compiler should warn when a reserved word is used (Michael Stockton) -THRIFT-799 General Files missing proper Apache license header (Bryan Duxbury) -THRIFT-832 HTML HTML generator shows unspecified struct fields as 'required' (Bryan Duxbury) -THRIFT-226 Java Collections with binary keys or values break equals() (Bryan Duxbury) -THRIFT-484 Java Ability to use a slice of a buffer instead of a direct byte[] for binary fields (Bryan Duxbury) -THRIFT-714 Java maxWorkerThreads parameter to THsHaServer has no effect (Bryan Duxbury) -THRIFT-751 Java Add clear() method to TBase (Bryan Duxbury) -THRIFT-765 Java Improved string encoding and decoding performance (Bryan Duxbury) -THRIFT-768 Java Async client for Java (Bryan Duxbury) -THRIFT-774 Java TDeserializer should provide a partialDeserialize method for primitive types (Piotr Kozikowski) -THRIFT-783 Java .equals java method is broken on structs containing binary-type fields (Unassigned) -THRIFT-804 Java CompareTo is broken for unions set to map, set, or list (Bryan Duxbury) -THRIFT-814 Java Include a TServlet in the standard Thrift distribution (Mathias Herberts) -THRIFT-818 Java Async client doesn't send method args (Bryan Duxbury) -THRIFT-830 Java Switch binary field implementation from byte[] to ByteBuffer (Bryan Duxbury) -THRIFT-831 Java FramedTransport implementation that reuses its buffers (Bryan Duxbury) -THRIFT-833 Java build.xml in lib/java is missing a classpathref attribute for the javadoc task (Bryan Duxbury) -THRIFT-836 Java Race condition causes CancelledKeyException in TAsyncClientManager (Bryan Duxbury) -THRIFT-842 Java Upgrade to current version of commons-lang (2.5 instead of 2.4) and/or change dependency in ivy.xml to not be exact (Bryan Duxbury) -THRIFT-815 JavaScript Deserialization of lists is critically broken. (T Jake Luciani) -THRIFT-827 OCaml OCaml generator to take default values into account (Lev Walkin) -THRIFT-647 PHP PHP library is missing install target (Anthony Molinaro) -THRIFT-682 PHP PHP extension doesn't compile on Mac OS X (Bryan Duxbury) -THRIFT-718 PHP Thrift PHP library includes closing tags and extraneous whitespace (Nicholas Telford) -THRIFT-778 PHP PHP socket listening server (Nick Jones) -THRIFT-780 PHP PHP extension sometimes causes an abort with two exceptions at the same time (David Reiss) -THRIFT-837 PHP PHP accelerator bug for writes > 8k (Thomas Kho) -THRIFT-782 Perl Perl code for writing containers doesn't count length of write*Begin or write*End (Conrad Hughes) -THRIFT-395 Python Python library + compiler does not support unicode strings (Unassigned) -THRIFT-133 Ruby 'namespace ruby' should error out, or be an alias to 'namespace rb' (Bryan Duxbury) -THRIFT-664 Ruby Ruby extension fails to build with Ruby 1.9.1 (Rajesh Malepati) -THRIFT-699 Ruby Excise unused "native protocol method table" stuff from thrift_native (Bryan Duxbury) -THRIFT-767 Ruby ruby compiler does not keep comments for enum values (Bryan Duxbury) -THRIFT-811 Ruby http_client_transport.rb: allow custom http headers (Tony Kamenick) -THRIFT-459 Ruby Ruby installation always tries to write to /Library/Ruby/site (Matthieu Imbert) - - -Thrift 0.1.0 - Incubating (not released) --------------------------------------------------------------------------------- -Compatibility Breaking Changes: - C++: - * It's quite possible that regenerating code and rebuilding will be - required. Make sure your headers match your libs! - - Java: - - Python: - - Ruby: - * Generated files now have underscored names [THRIFT-421] - * The library has been rearranged to be more Ruby-like [THRIFT-276] - - Erlang: - * Generated code will have to be regenerated, and the new code will - have to be deployed atomically with the new library code [THRIFT-136] - -New Features and Bug Fixes: - C++: - * Support for TCompactProtocol [THRIFT-333] - - Java: - * Support for TCompactProtocol [THRIFT-110] - - Python: - * Support for Twisted [THRIFT-148] - - Ruby: - * Support for TCompactProtocol [THRIFT-332] - diff --git a/vendor/github.com/apache/thrift/CMakeLists.txt b/vendor/github.com/apache/thrift/CMakeLists.txt deleted file mode 100644 index 93ed8d2ac58..00000000000 --- a/vendor/github.com/apache/thrift/CMakeLists.txt +++ /dev/null @@ -1,117 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -cmake_minimum_required(VERSION 2.8.12) - -project("Apache Thrift") - -set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake") - -# TODO: add `git rev-parse --short HEAD` -# Read the version information from the Autoconf file -file (STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGURE_AC REGEX "AC_INIT\\(.*\\)" ) - -# The following variable is used in the version.h.in file -string(REGEX REPLACE "AC_INIT\\(\\[.*\\], \\[([0-9]+\\.[0-9]+\\.[0-9]+(-dev)?)\\]\\)" "\\1" PACKAGE_VERSION ${CONFIGURE_AC}) -message(STATUS "Parsed Thrift package version: ${PACKAGE_VERSION}") - -# These are internal to CMake -string(REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+)(-dev)?" "\\1" thrift_VERSION ${PACKAGE_VERSION}) -string(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" thrift_VERSION_MAJOR ${thrift_VERSION}) -string(REGEX REPLACE "[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" thrift_VERSION_MINOR ${thrift_VERSION}) -string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" thrift_VERSION_PATCH ${thrift_VERSION}) -message(STATUS "Parsed Thrift version: ${thrift_VERSION} (${thrift_VERSION_MAJOR}.${thrift_VERSION_MINOR}.${thrift_VERSION_PATCH})") - -# Some default settings -include(DefineCMakeDefaults) - -# Build time options are defined here -include(DefineOptions) -include(DefineInstallationPaths) - -# Based on the options set some platform specifics -include(DefinePlatformSpecifc) - -# Generate the config.h file -include(ConfigureChecks) - -# Package it -include(CPackConfig) - - -find_package(Threads) - -include(CTest) -if(BUILD_TESTING) - message(STATUS "Building with unittests") - - enable_testing() - # Define "make check" as alias for "make test" - add_custom_target(check COMMAND ctest) -else () - message(STATUS "Building without tests") -endif () - -if(BUILD_COMPILER) - if(NOT EXISTS ${THRIFT_COMPILER}) - set(THRIFT_COMPILER $) - endif() - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/compiler/cpp) -elseif(EXISTS ${THRIFT_COMPILER}) - add_executable(thrift-compiler IMPORTED) - set_property(TARGET thrift-compiler PROPERTY IMPORTED_LOCATION ${THRIFT_COMPILER}) -endif() - -if(BUILD_CPP) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp) - if(BUILD_TUTORIALS) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tutorial/cpp) - endif() - if(BUILD_TESTING) - if(WITH_LIBEVENT AND WITH_ZLIB AND WITH_OPENSSL) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/cpp) - else() - message(WARNING "libevent and/or ZLIB and/or OpenSSL not found or disabled; will not build some tests") - endif() - endif() -endif() - -if(BUILD_C_GLIB) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/c_glib) -endif() - -if(BUILD_JAVA) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/java) -endif() - -if(BUILD_PYTHON) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/py) - if(BUILD_TESTING) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/py) - endif() -endif() - -if(BUILD_HASKELL) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/hs) - if(BUILD_TESTING) - add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/hs) - endif() -endif() - -PRINT_CONFIG_SUMMARY() diff --git a/vendor/github.com/apache/thrift/CONTRIBUTING.md b/vendor/github.com/apache/thrift/CONTRIBUTING.md deleted file mode 100644 index 316da9a00de..00000000000 --- a/vendor/github.com/apache/thrift/CONTRIBUTING.md +++ /dev/null @@ -1,49 +0,0 @@ -## How to contribute - 1. Help to review and verify existing patches - 1. Make sure your issue is not all ready in the [Jira issue tracker](http://issues.apache.org/jira/browse/THRIFT) - 1. If not, create a ticket describing the change you're proposing in the [Jira issue tracker](http://issues.apache.org/jira/browse/THRIFT) - 1. Contribute your patch using one of the two methods below - -### Contributing via a patch - -1. Check out the latest version of the source code - - * git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift - -1. Modify the source to include the improvement/bugfix - - * Remember to provide *tests* for all submited changes - * When bugfixing: add test that will isolate bug *before* applying change that fixes it - * Verify that you follow [Thrift Coding Standards](/docs/coding_standards) (you can run 'make style', which ensures proper format for some languages) - -1. Create a patch from project root directory (e.g. you@dev:~/thrift $ ): - - * git diff > ../thrift-XXX-my-new-feature.patch - -1. Attach the newly generated patch to the issue -1. Wait for other contributors or committers to review your new addition -1. Wait for a committer to commit your patch - -### Contributing via GitHub pull requests - -1. Create a fork for http://github.com/apache/thrift -1. Create a branch for your changes(best practice is issue as branch name, e.g. THRIFT-9999) -1. Modify the source to include the improvement/bugfix - - * Remember to provide *tests* for all submited changes - * When bugfixing: add test that will isolate bug *before* applying change that fixes it - * Verify that you follow [Thrift Coding Standards](/docs/coding_standards) (you can run 'make style', which ensures proper format for some languages) - * Verify that your change works on other platforms by adding a GitHub service hook to [Travis CI](http://docs.travis-ci.com/user/getting-started/#Step-one%3A-Sign-in) and [AppVeyor](http://www.appveyor.com/docs) - -1. Commit and push changes to your branch (please use issue name and description as commit title, e.g. THRIFT-9999 make it perfect) -1. Issue a pull request with the jira ticket number you are working on in it's name -1. Wait for other contributors or committers to review your new addition -1. Wait for a committer to commit your patch - -### More info - - Plenty of information on why and how to contribute is available on the Apache Software Foundation (ASF) web site. In particular, we recommend the following: - - * [Contributors Tech Guide](http://www.apache.org/dev/contributors) - * [Get involved!](http://www.apache.org/foundation/getinvolved.html) - * [Legal aspects on Submission of Contributions (Patches)](http://www.apache.org/licenses/LICENSE-2.0.html#contributions) diff --git a/vendor/github.com/apache/thrift/Dockerfile b/vendor/github.com/apache/thrift/Dockerfile deleted file mode 100644 index 0d7ad2175e3..00000000000 --- a/vendor/github.com/apache/thrift/Dockerfile +++ /dev/null @@ -1,61 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -# Goal: provide a thrift-compiler Docker image -# -# Usage: -# docker run -v "${PWD}:/data" thrift/thrift-compiler -gen cpp -o /data/ /data/test/ThriftTest.thrift -# -# further details on docker for thrift is here build/docker/ -# -# TODO: push to apache/thrift-compiler instead of thrift/thrift-compiler - -FROM debian:jessie -MAINTAINER Apache Thrift - -ENV DEBIAN_FRONTEND noninteractive - -ADD . /thrift - -RUN buildDeps=" \ - flex \ - bison \ - g++ \ - make \ - cmake \ - curl \ - "; \ - apt-get update && apt-get install -y --no-install-recommends $buildDeps \ - && mkdir /tmp/cmake-build && cd /tmp/cmake-build \ - && cmake \ - -DBUILD_COMPILER=ON \ - -DBUILD_LIBRARIES=OFF \ - -DBUILD_TESTING=OFF \ - -DBUILD_EXAMPLES=OFF \ - /thrift \ - && cmake --build . --config Release \ - && make install \ - && curl -k -sSL "https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz" -o /tmp/go.tar.gz \ - && tar xzf /tmp/go.tar.gz -C /tmp \ - && cp /tmp/go/bin/gofmt /usr/bin/gofmt \ - && apt-get purge -y --auto-remove $buildDeps \ - && apt-get clean \ - && rm -rf /tmp/* \ - && rm -rf /var/lib/apt/lists/* - -ENTRYPOINT ["thrift"] diff --git a/vendor/github.com/apache/thrift/Makefile.am b/vendor/github.com/apache/thrift/Makefile.am deleted file mode 100755 index ed58265acef..00000000000 --- a/vendor/github.com/apache/thrift/Makefile.am +++ /dev/null @@ -1,131 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -ACLOCAL_AMFLAGS = -I ./aclocal - -if WITH_PLUGIN -# To enable bootstrap, build order is lib/cpp -> compiler -> others -SUBDIRS = lib/cpp compiler/cpp lib -if WITH_TESTS -SUBDIRS += lib/cpp/test -endif -else -SUBDIRS = compiler/cpp lib -endif - -if WITH_TESTS -SUBDIRS += test -endif - -if WITH_TUTORIAL -SUBDIRS += tutorial -endif - -dist-hook: - find $(distdir) -type f \( -iname ".DS_Store" -or -iname "._*" -or -iname ".gitignore" \) | xargs rm -rf - find $(distdir) -type d \( -iname ".deps" -or -iname ".libs" \) | xargs rm -rf - find $(distdir) -type d \( -iname ".svn" -or -iname ".git" \) | xargs rm -rf - -print-version: - @echo $(VERSION) - -.PHONY: precross cross -precross-%: all - $(MAKE) -C $* precross -precross: all precross-test precross-lib - -empty := -space := $(empty) $(empty) -comma := , - -CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_CSHARP@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@ -CROSS_LANGS_COMMA_SEPARATED = $(subst $(space),$(comma),$(CROSS_LANGS)) - -if WITH_PY3 -CROSS_PY=$(PYTHON3) -else -CROSS_PY=$(PYTHON) -endif - -if WITH_PYTHON -crossfeature: precross - $(CROSS_PY) test/test.py --retry-count 3 --features .* --skip-known-failures --server $(CROSS_LANGS_COMMA_SEPARATED) -else -# feature test needs python build -crossfeature: -endif - -cross-%: precross crossfeature - $(CROSS_PY) test/test.py --retry-count 3 --skip-known-failures --server $(CROSS_LANGS_COMMA_SEPARATED) --client $(CROSS_LANGS_COMMA_SEPARATED) --regex "$*" - -cross: cross-.* - -TIMES = 1 2 3 -fail: precross - $(CROSS_PY) test/test.py || true - $(CROSS_PY) test/test.py --update-expected-failures=overwrite - $(foreach var,$(TIMES),test/test.py -s || true;test/test.py --update-expected-failures=merge;) - -codespell_skip_files = \ - *.jar \ - *.class \ - *.so \ - *.a \ - *.la \ - *.o \ - *.p12 \ - *OCamlMakefile \ - .keystore \ - .truststore \ - CHANGES \ - config.sub \ - configure \ - depcomp \ - libtool.m4 \ - output.* \ - rebar \ - thrift - -skipped_files = $(subst $(space),$(comma),$(codespell_skip_files)) - -style-local: - codespell --write-changes --skip=$(skipped_files) --disable-colors - -EXTRA_DIST = \ - .clang-format \ - .editorconfig \ - .travis.yml \ - appveyor.yml \ - bower.json \ - build \ - CMakeLists.txt \ - composer.json \ - contrib \ - CONTRIBUTING.md \ - debian \ - doc \ - doap.rdf \ - package.json \ - sonar-project.properties \ - Dockerfile \ - LICENSE \ - CHANGES \ - NOTICE \ - README.md \ - Thrift.podspec diff --git a/vendor/github.com/apache/thrift/README.md b/vendor/github.com/apache/thrift/README.md deleted file mode 100644 index 07cd32f0982..00000000000 --- a/vendor/github.com/apache/thrift/README.md +++ /dev/null @@ -1,166 +0,0 @@ -Apache Thrift -============= - -+[![Build Status](https://travis-ci.org/apache/thrift.svg?branch=master)](https://travis-ci.org/apache/thrift) -- +[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/e2qks7enyp9gw7ma?svg=true)](https://ci.appveyor.com/project/apache/thrift) - - -Introduction -============ - -Thrift is a lightweight, language-independent software stack with an -associated code generation mechanism for RPC. Thrift provides clean -abstractions for data transport, data serialization, and application -level processing. The code generation system takes a simple definition -language as its input and generates code across programming languages that -uses the abstracted stack to build interoperable RPC clients and servers. - -Thrift is specifically designed to support non-atomic version changes -across client and server code. - -For more details on Thrift's design and implementation, take a gander at -the Thrift whitepaper included in this distribution or at the README.md files -in your particular subdirectory of interest. - -Hierarchy -========= - -thrift/ - - compiler/ - - Contains the Thrift compiler, implemented in C++. - - lib/ - - Contains the Thrift software library implementation, subdivided by - language of implementation. - - cpp/ - go/ - java/ - php/ - py/ - rb/ - - test/ - - Contains sample Thrift files and test code across the target programming - languages. - - tutorial/ - - Contains a basic tutorial that will teach you how to develop software - using Thrift. - -Requirements -============ - -See http://thrift.apache.org/docs/install for an up-to-date list of build requirements. - -Resources -========= - -More information about Thrift can be obtained on the Thrift webpage at: - - http://thrift.apache.org - -Acknowledgments -=============== - -Thrift was inspired by pillar, a lightweight RPC tool written by Adam D'Angelo, -and also by Google's protocol buffers. - -Installation -============ - -If you are building from the first time out of the source repository, you will -need to generate the configure scripts. (This is not necessary if you -downloaded a tarball.) From the top directory, do: - - ./bootstrap.sh - -Once the configure scripts are generated, thrift can be configured. -From the top directory, do: - - ./configure - -You may need to specify the location of the boost files explicitly. -If you installed boost in /usr/local, you would run configure as follows: - - ./configure --with-boost=/usr/local - -Note that by default the thrift C++ library is typically built with debugging -symbols included. If you want to customize these options you should use the -CXXFLAGS option in configure, as such: - - ./configure CXXFLAGS='-g -O2' - ./configure CFLAGS='-g -O2' - ./configure CPPFLAGS='-DDEBUG_MY_FEATURE' - -To enable gcov required options -fprofile-arcs -ftest-coverage enable them: - - ./configure --enable-coverage - -Run ./configure --help to see other configuration options - -Please be aware that the Python library will ignore the --prefix option -and just install wherever Python's distutils puts it (usually along -the lines of /usr/lib/pythonX.Y/site-packages/). If you need to control -where the Python modules are installed, set the PY_PREFIX variable. -(DESTDIR is respected for Python and C++.) - -Make thrift: - - make - -From the top directory, become superuser and do: - - make install - -Note that some language packages must be installed manually using build tools -better suited to those languages (at the time of this writing, this applies -to Java, Ruby, PHP). - -Look for the README.md file in the lib// folder for more details on the -installation of each language library package. - -Testing -======= - -There are a large number of client library tests that can all be run -from the top-level directory. - - make -k check - -This will make all of the libraries (as necessary), and run through -the unit tests defined in each of the client libraries. If a single -language fails, the make check will continue on and provide a synopsis -at the end. - -To run the cross-language test suite, please run: - - make cross - -This will run a set of tests that use different language clients and -servers. - -License -======= - -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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/apache/thrift/Thrift.podspec b/vendor/github.com/apache/thrift/Thrift.podspec deleted file mode 100644 index 2ead0e93df3..00000000000 --- a/vendor/github.com/apache/thrift/Thrift.podspec +++ /dev/null @@ -1,18 +0,0 @@ -Pod::Spec.new do |s| - s.name = "Thrift" - s.version = "0.10.0" - s.summary = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC." - s.description = <<-DESC -The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. - DESC - s.homepage = "http://thrift.apache.org" - s.license = { :type => 'Apache License, Version 2.0', :url => 'https://raw.github.com/apache/thrift/thrift-0.9.0/LICENSE' } - s.author = { "The Apache Software Foundation" => "apache@apache.org" } - s.requires_arc = true - s.ios.deployment_target = '7.0' - s.osx.deployment_target = '10.8' - s.ios.framework = 'CFNetwork' - s.osx.framework = 'CoreServices' - s.source = { :git => "https://github.com/apache/thrift.git", :tag => "thrift-0.10.0" } - s.source_files = 'lib/cocoa/src/**/*.{h,m,swift}' -end \ No newline at end of file diff --git a/vendor/github.com/apache/thrift/bootstrap.sh b/vendor/github.com/apache/thrift/bootstrap.sh deleted file mode 100755 index 52ecda47b3a..00000000000 --- a/vendor/github.com/apache/thrift/bootstrap.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -./cleanup.sh -if test -d lib/php/src/ext/thrift_protocol ; then - if phpize -v >/dev/null 2>/dev/null ; then - (cd lib/php/src/ext/thrift_protocol && phpize) - fi -fi - -set -e - -# libtoolize is called "glibtoolize" on OSX. -if libtoolize --version 1 >/dev/null 2>/dev/null; then - LIBTOOLIZE=libtoolize -elif glibtoolize --version 1 >/dev/null 2>/dev/null; then - LIBTOOLIZE=glibtoolize -else - echo >&2 "Couldn't find libtoolize!" - exit 1 -fi - -# we require automake 1.13 or later -# check must happen externally due to use of newer macro -AUTOMAKE_VERSION=`automake --version | grep automake | egrep -o '([0-9]{1,}\.)+[0-9]{1,}'` -if [ "$AUTOMAKE_VERSION" \< "1.13" ]; then - echo >&2 "automake version $AUTOMAKE_VERSION is too old (need 1.13 or later)" - exit 1 -fi - -autoscan -$LIBTOOLIZE --copy --automake -aclocal -I ./aclocal -autoheader -autoconf -automake --copy --add-missing --foreign diff --git a/vendor/github.com/apache/thrift/bower.json b/vendor/github.com/apache/thrift/bower.json deleted file mode 100644 index 9ec59fcb5dc..00000000000 --- a/vendor/github.com/apache/thrift/bower.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "thrift", - "version": "0.10.0", - "homepage": "https://git-wip-us.apache.org/repos/asf/thrift.git", - "authors": [ - "Apache Thrift " - ], - "description": "Apache Thrift", - "main": "lib/js/src/thrift.js", - "keywords": [ - "thrift" - ], - "license": "Apache v2", - "ignore": [ - ] -} diff --git a/vendor/github.com/apache/thrift/cleanup.sh b/vendor/github.com/apache/thrift/cleanup.sh deleted file mode 100755 index f110721ac9f..00000000000 --- a/vendor/github.com/apache/thrift/cleanup.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -topsrcdir="`dirname $0`" -cd "$topsrcdir" - -make -k clean >/dev/null 2>&1 -make -k distclean >/dev/null 2>&1 -find . -name Makefile.in -exec rm -f {} \; -rm -rf \ -AUTHORS \ -ChangeLog \ -INSTALL \ -Makefile \ -Makefile.in \ -Makefile.orig \ -aclocal/libtool.m4 \ -aclocal/ltoptions.m4 \ -aclocal/ltsugar.m4 \ -aclocal/ltversion.m4 \ -aclocal/lt~obsolete.m4 \ -aclocal.m4 \ -autom4te.cache \ -autoscan.log \ -config.guess \ -config.h \ -config.hin \ -config.hin~ \ -config.log \ -config.status \ -config.status.lineno \ -config.sub \ -configure \ -configure.lineno \ -configure.scan \ -depcomp \ -.deps \ -install-sh \ -.libs \ -libtool \ -ltmain.sh \ -missing \ -ylwrap \ -if/gen-* \ -test/gen-* \ -lib/php/src/ext/thrift_protocol/.deps \ -lib/php/src/ext/thrift_protocol/Makefile \ -lib/php/src/ext/thrift_protocol/Makefile.fragments \ -lib/php/src/ext/thrift_protocol/Makefile.global \ -lib/php/src/ext/thrift_protocol/Makefile.objects \ -lib/php/src/ext/thrift_protocol/acinclude.m4 \ -lib/php/src/ext/thrift_protocol/aclocal.m4 \ -lib/php/src/ext/thrift_protocol/autom4te.cache \ -lib/php/src/ext/thrift_protocol/build \ -lib/php/src/ext/thrift_protocol/config.guess \ -lib/php/src/ext/thrift_protocol/config.h \ -lib/php/src/ext/thrift_protocol/config.h.in \ -lib/php/src/ext/thrift_protocol/config.log \ -lib/php/src/ext/thrift_protocol/config.nice \ -lib/php/src/ext/thrift_protocol/config.status \ -lib/php/src/ext/thrift_protocol/config.sub \ -lib/php/src/ext/thrift_protocol/configure \ -lib/php/src/ext/thrift_protocol/configure.in \ -lib/php/src/ext/thrift_protocol/include \ -lib/php/src/ext/thrift_protocol/install-sh \ -lib/php/src/ext/thrift_protocol/libtool \ -lib/php/src/ext/thrift_protocol/ltmain.sh \ -lib/php/src/ext/thrift_protocol/missing \ -lib/php/src/ext/thrift_protocol/mkinstalldirs \ -lib/php/src/ext/thrift_protocol/modules \ -lib/php/src/ext/thrift_protocol/run-tests.php diff --git a/vendor/github.com/apache/thrift/composer.json b/vendor/github.com/apache/thrift/composer.json deleted file mode 100644 index d937bc7ac21..00000000000 --- a/vendor/github.com/apache/thrift/composer.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "apache/thrift", - "description": "Apache Thrift RPC system", - "homepage": "http://thrift.apache.org/", - "type": "library", - "license": "Apache-2.0", - "authors": [ - { - "name": "Apache Thrift Developers", - "email": "dev@thrift.apache.org", - "homepage": "http://thrift.apache.org" - } - ], - "support": { - "email": "dev@thrift.apache.org", - "issues": "https://issues.apache.org/jira/browse/THRIFT" - }, - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-0": {"Thrift": "lib/php/lib/"} - }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "0.10.0" - } - } -} diff --git a/vendor/github.com/apache/thrift/configure.ac b/vendor/github.com/apache/thrift/configure.ac deleted file mode 100755 index 0972abfc9d9..00000000000 --- a/vendor/github.com/apache/thrift/configure.ac +++ /dev/null @@ -1,959 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -AC_PREREQ(2.65) -AC_CONFIG_MACRO_DIR([./aclocal]) - -AC_INIT([thrift], [0.10.0]) - -AC_CONFIG_AUX_DIR([.]) - -AM_INIT_AUTOMAKE([1.13 subdir-objects tar-ustar]) -PKG_PROG_PKG_CONFIG - -AC_ARG_VAR([PY_PREFIX], [Prefix for installing Python modules. - (Normal --prefix is ignored for Python because - Python has different conventions.) - Default = "/usr"]) -AS_IF([test "x$PY_PREFIX" = x], [PY_PREFIX="/usr"]) - -AC_ARG_VAR([JAVA_PREFIX], [Prefix for installing the Java lib jar. - Default = "/usr/local/lib"]) -AS_IF([test "x$JAVA_PREFIX" != x], [JAVA_PREFIX="$JAVA_PREFIX/usr/local/lib"], - [test "x$PREFIX" != x], [JAVA_PREFIX="$PREFIX/usr/local/lib"], - [JAVA_PREFIX="/usr/local/lib"]) - -AC_ARG_VAR([RUBY_PREFIX], [Prefix for installing Ruby modules. - (Normal --prefix is ignored for Ruby because - Ruby has different conventions.) - Default = none, let ruby setup decide]) - -AC_ARG_VAR([PHP_PREFIX], [Prefix for installing PHP modules. - (Normal --prefix is ignored for PHP because - PHP has different conventions.) - Default = "/usr/lib/php"]) -AS_IF([test "x$PHP_PREFIX" = x], [PHP_PREFIX="/usr/lib/php"]) - -AC_ARG_VAR([PHP_CONFIG_PREFIX], - [Prefix for installing PHP extension module .ini file. - (Normal --prefix is ignored for PHP because PHP has - different conventions.) - Default = "/etc/php.d"]) -AS_IF([test "x$PHP_CONFIG_PREFIX" = x], [PHP_CONFIG_PREFIX="/etc/php.d"]) - -AC_ARG_VAR([INSTALLDIRS], [When installing Perl modules, specifies which - of the sets of installation directories - to choose: perl, site or vendor. - Default = "vendor"]) -AS_IF([test "x$INSTALLDIRS" = x], [INSTALLDIRS="vendor"]) - -AC_ARG_VAR([PERL_PREFIX], [Prefix for installing Perl modules. - (Normal --prefix is ignored for Perl because - Perl has different conventions.) - Ignored, when INSTALLDIRS set to site or vendor. - Default = "/usr/local/lib"]) -AS_IF([test "x$PERL_PREFIX" = x], [PERL_PREFIX="/usr/local"]) - -AC_ARG_VAR([CABAL_CONFIGURE_FLAGS], - [Extra flags to pass to cabal: "cabal Setup.lhs configure $CABAL_CONFIGURE_FLAGS". - (Typically used to set --user or force --global.)]) - -AC_SUBST(CABAL_CONFIGURE_FLAGS) - -AC_ARG_VAR([D_IMPORT_PREFIX], [Prefix for installing D modules. - [INCLUDEDIR/d2]]) -AS_IF([test "x$D_IMPORT_PREFIX" = x], [D_IMPORT_PREFIX="${includedir}/d2"]) - -AC_ARG_VAR([DMD_LIBEVENT_FLAGS], [DMD flags for linking libevent (auto-detected if not set).]) -AC_ARG_VAR([DMD_OPENSSL_FLAGS], [DMD flags for linking OpenSSL (auto-detected if not set).]) - -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXX -AC_PROG_INSTALL -AC_PROG_LIBTOOL -AC_PROG_MAKE_SET -AC_PROG_BISON(2.5) -AC_PROG_YACC -AC_PROG_LEX -AM_PROG_LEX -AC_PROG_LN_S -AC_PROG_MKDIR_P -AC_PROG_AWK -AC_PROG_RANLIB - -AC_LANG([C++]) -AX_CXX_COMPILE_STDCXX_11([noext], [optional]) - -AM_EXTRA_RECURSIVE_TARGETS([style]) -AC_SUBST(CPPSTYLE_CMD, 'find . -type f \( -iname "*.h" -or -iname "*.cpp" -or -iname "*.cc" -or -iname "*.tcc" \) -printf "Reformatting: %h/%f\n" -exec clang-format -i {} \;') - -AC_ARG_ENABLE([libs], - AS_HELP_STRING([--enable-libs], [build the Apache Thrift libraries [default=yes]]), - [], enable_libs=yes -) -have_libs=yes -if test "$enable_libs" = "no"; then - have_libs="no" - with_cpp="no" - with_c_glib="no" - with_java="no" - with_csharp="no" - with_python="no" - with_ruby="no" - with_haskell="no" - with_haxe="no" - with_perl="no" - with_php="no" - with_php_extension="no" - with_dart="no" - with_erlang="no" - with_go="no" - with_d="no" - with_nodejs="no" - with_lua="no" -fi - - -AX_THRIFT_LIB(cpp, [C++], yes) -have_cpp=no -if test "$with_cpp" = "yes"; then - AX_BOOST_BASE([1.53.0]) - if test "x$succeeded" = "xyes" ; then - AC_SUBST([BOOST_LIB_DIR], [$(echo "$BOOST_LDFLAGS" | sed -e 's/^\-L//')]) - AC_SUBST([BOOST_CHRONO_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_chrono.a")]) - AC_SUBST([BOOST_FILESYSTEM_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_filesystem.a")]) - AC_SUBST([BOOST_SYSTEM_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_system.a")]) - AC_SUBST([BOOST_TEST_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_unit_test_framework.a")]) - AC_SUBST([BOOST_THREAD_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_thread.a")]) - have_cpp="yes" - fi - - AX_CHECK_OPENSSL() - - AX_LIB_EVENT([1.0]) - have_libevent=$success - - AX_LIB_ZLIB([1.2.3]) - have_zlib=$success - - AX_THRIFT_LIB(qt4, [Qt], yes) - have_qt=no - if test "$with_qt4" = "yes"; then - PKG_CHECK_MODULES([QT], [QtCore >= 4.3, QtNetwork >= 4.3], have_qt=yes, have_qt=no) - fi - if test "$have_qt" = "yes"; then - AC_PATH_PROGS([QT_MOC], [moc-qt4 moc], "fail") - if test "$QT_MOC" = "fail"; then - have_qt=no - fi - fi - - AX_THRIFT_LIB(qt5, [Qt5], yes) - have_qt5=no - qt_reduce_reloc="" - if test "$with_qt5" = "yes"; then - PKG_CHECK_MODULES([QT5], [Qt5Core >= 5.0, Qt5Network >= 5.0], - [have_qt5=yes;qt_reduce_reloc=`$PKG_CONFIG --variable=qt_config Qt5Core | grep "reduce_relocations"`], - [have_qt5=no]) - fi - if test "$have_qt5" = "yes"; then - AC_PATH_PROGS([QT5_MOC], [moc-qt5 moc], "fail") - if test "$QT5_MOC" = "fail"; then - have_qt5=no - fi - fi -fi -AM_CONDITIONAL([WITH_CPP], [test "$have_cpp" = "yes"]) -AM_CONDITIONAL([AMX_HAVE_LIBEVENT], [test "$have_libevent" = "yes"]) -AM_CONDITIONAL([AMX_HAVE_ZLIB], [test "$have_zlib" = "yes"]) -AM_CONDITIONAL([AMX_HAVE_QT], [test "$have_qt" = "yes"]) -AM_CONDITIONAL([AMX_HAVE_QT5], [test "$have_qt5" = "yes"]) -AM_CONDITIONAL([QT5_REDUCE_RELOCATIONS], [test "x$qt_reduce_reloc" != "x"]) - -AX_THRIFT_LIB(c_glib, [C (GLib)], yes) -if test "$with_c_glib" = "yes"; then - PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.0], have_glib2=yes, have_glib2=no) - PKG_CHECK_MODULES([GOBJECT], [gobject-2.0 >= 2.0], have_gobject2=yes, have_gobject2=no) - if test "$have_glib2" = "yes" -a "$have_gobject2" = "yes" ; then - have_c_glib="yes" - fi -fi -AM_CONDITIONAL(WITH_C_GLIB, [test "$have_glib2" = "yes" -a "$have_gobject2" = "yes"]) - -AX_THRIFT_LIB(csharp, [C#], yes) -if test "$with_csharp" = "yes"; then - PKG_CHECK_MODULES(MONO, mono >= 2.11.0, mono_2_11=yes, mono_2_11=no) - if test "$mono_2_11" == "yes"; then - AC_PATH_PROG([MCS], [mcs]) - if test "x$MCS" != "x"; then - mono_mcs="yes" - fi - fi - PKG_CHECK_MODULES(MONO, mono >= 2.0.0, net_3_5=yes, net_3_5=no) - PKG_CHECK_MODULES(MONO, mono >= 1.2.4, have_mono=yes, have_mono=no) - if test "$have_mono" = "yes" ; then - have_csharp="yes" - fi -fi -AM_CONDITIONAL(WITH_MONO, [test "$have_csharp" = "yes"]) -AM_CONDITIONAL(NET_2_0, [test "$net_3_5" = "no"]) -AM_CONDITIONAL(MONO_MCS, [test "$mono_mcs" = "yes"]) - -AX_THRIFT_LIB(java, [Java], yes) -if test "$with_java" = "yes"; then - AX_JAVAC_AND_JAVA - AC_PATH_PROG([ANT], [ant]) - AX_CHECK_ANT_VERSION($ANT, 1.7) - AC_SUBST(CLASSPATH) - AC_SUBST(ANT_FLAGS) - if test "x$JAVA" != "x" && test "x$JAVAC" != "x" && test "x$ANT" != "x" ; then - have_java="yes" - fi -fi -AM_CONDITIONAL([WITH_JAVA], [test "$have_java" = "yes"]) - -AX_THRIFT_LIB(erlang, [Erlang], yes) -if test "$with_erlang" = "yes"; then - AC_ERLANG_PATH_ERL - AC_ERLANG_PATH_ERLC - AC_PATH_PROG([REBAR], [rebar]) - if test -n "$ERLC" ; then - AC_ERLANG_SUBST_LIB_DIR - # Install into the detected Erlang directory instead of $libdir/erlang/lib - ERLANG_INSTALL_LIB_DIR="$ERLANG_LIB_DIR" - AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) - fi - if test -n "$ERL" -a -n "$ERLC" && test "x$REBAR" != "x" ; then - have_erlang="yes" - - # otp_release is simply a number (like "17") for OTP17+ while "R16..." for OTP16 or less. - # OTP version is currently only used for running tests. - if $ERL -eval 'erlang:display(erlang:system_info(otp_release)),halt().' -noshell | grep "^\"R" >/dev/null; then - erlang_otp16_or_less="yes" - fi - fi -fi -AM_CONDITIONAL(WITH_ERLANG, [test "$have_erlang" = "yes"]) -AM_CONDITIONAL(ERLANG_OTP16, [test "$erlang_otp16_or_less" = "yes"]) - -AX_THRIFT_LIB(nodejs, [Nodejs], yes) -have_nodejs=no -if test "$with_nodejs" = "yes"; then - AC_PATH_PROGS([NODEJS], [nodejs node]) - AC_PATH_PROG([NPM], [npm]) - if test "x$NODEJS" != "x" -a "x$NPM" != "x"; then - have_nodejs="yes" - fi -fi -AM_CONDITIONAL(WITH_NODEJS, [test "$have_nodejs" = "yes"]) -AM_CONDITIONAL(HAVE_NPM, [test "x$NPM" != "x"]) - -AX_THRIFT_LIB(lua, [Lua], yes) -have_lua=no -if test "$with_lua" = "yes"; then - AX_PROG_LUA(5.2,, have_lua="yes", have_lua="no") - if test "$have_lua" = "yes"; then - AX_LUA_HEADERS(, have_lua="no") - AX_LUA_LIBS(, have_lua="no") - fi -fi -AM_CONDITIONAL(WITH_LUA, [test "$have_lua" = "yes"]) - -# Find python regardless of with_python value, because it's needed by make cross -AM_PATH_PYTHON(2.6,, :) -AX_THRIFT_LIB(python, [Python], yes) -if test "$with_python" = "yes"; then - if test -n "$PYTHON"; then - have_python="yes" - fi - AC_PATH_PROG([TRIAL], [trial]) - if test -n "$TRIAL"; then - have_trial="yes" - fi -fi -AM_CONDITIONAL(WITH_PYTHON, [test "$have_python" = "yes"]) -AM_CONDITIONAL(WITH_TWISTED_TEST, [test "$have_trial" = "yes"]) - -# Find "python3" executable. -# It's distro specific and far from ideal but needed to cross test py2-3 at once. -# TODO: find "python2" if it's 3.x -if python --version 2>&1 | grep -q "Python 2"; then - AC_PATH_PROGS([PYTHON3], [python3 python3.5 python35 python3.4 python34]) - if test -n "$PYTHON3"; then - have_py3="yes" - fi -fi -AM_CONDITIONAL(WITH_PY3, [test "$have_py3" = "yes"]) - -AX_THRIFT_LIB(perl, [Perl], yes) -if test "$with_perl" = "yes"; then - AC_PATH_PROG([PERL], [perl]) - if test -n "$PERL" ; then - AC_PROG_PERL_MODULES([Bit::Vector], success="yes", success="no") - have_perl_bit_vector="$success" - AC_PROG_PERL_MODULES([Class::Accessor], success="yes", success="no") - have_perl_class_accessor="$success" - fi - if test -n "$PERL" -a "$have_perl_bit_vector" = "yes" ; then - if test -n "$PERL" -a "$have_perl_class_accessor" = "yes" ; then - have_perl="yes" - fi - fi -fi -AM_CONDITIONAL(WITH_PERL, [test "$have_perl" = "yes"]) - -AX_THRIFT_LIB(php, [PHP], yes) -if test "$with_php" = "yes"; then - AC_PATH_PROG([PHP], [php]) - if test -n "$PHP" ; then - have_php="yes" - fi -fi -AM_CONDITIONAL(WITH_PHP, [test "$have_php" = "yes"]) - -AX_THRIFT_LIB(php_extension, [PHP_EXTENSION], yes) -if test "$with_php_extension" = "yes"; then - if test -f "lib/php/src/ext/thrift_protocol/configure"; then - AC_PATH_PROG([PHP_CONFIG], [php-config]) - if test -n "$PHP_CONFIG" ; then - AC_CONFIG_SUBDIRS([lib/php/src/ext/thrift_protocol]) - have_php_extension="yes" - fi - fi -fi -AM_CONDITIONAL(WITH_PHP_EXTENSION, [test "$have_php_extension" = "yes"]) - -AC_PATH_PROG([PHPUNIT], [phpunit]) -AM_CONDITIONAL(HAVE_PHPUNIT, [test "x$PHPUNIT" != "x"]) - -AX_THRIFT_LIB(dart, [DART], yes) -if test "$with_dart" = "yes"; then - AC_PATH_PROG([DART], [dart]) - AC_PATH_PROG([DARTPUB], [pub]) - if test "x$DART" != "x" -a "x$DARTPUB" != "x"; then - have_dart="yes" - fi -fi -AM_CONDITIONAL(WITH_DART, [test "$have_dart" = "yes"]) - -AX_THRIFT_LIB(ruby, [Ruby], yes) -have_ruby=no -if test "$with_ruby" = "yes"; then - AC_PATH_PROG([RUBY], [ruby]) - AC_PATH_PROG([BUNDLER], [bundle]) - if test "x$RUBY" != "x" -a "x$BUNDLER" != "x"; then - have_ruby="yes" - fi -fi -AM_CONDITIONAL(WITH_RUBY, [test "$have_ruby" = "yes"]) -AM_CONDITIONAL(HAVE_BUNDLER, [test "x$BUNDLER" != "x"]) - -AX_THRIFT_LIB(haskell, [Haskell], yes) -have_haskell=no -RUNHASKELL=true -CABAL=true -if test "$with_haskell" = "yes"; then - AC_PATH_PROG([CABAL], [cabal]) - AC_PATH_PROG([RUNHASKELL], [runhaskell]) - if test "x$CABAL" != "x" -a "x$RUNHASKELL" != "x"; then - have_haskell="yes" - else - RUNHASKELL=true - CABAL=true - fi -fi -AC_SUBST(CABAL) -AC_SUBST(RUNHASKELL) -AM_CONDITIONAL(WITH_HASKELL, [test "$have_haskell" = "yes"]) - -AX_THRIFT_LIB(go, [Go], yes) -if test "$with_go" = "yes"; then - AC_PATH_PROG([GO], [go]) - if [[ -x "$GO" ]] ; then - AS_IF([test -n "$GO"],[ - ax_go_version="1.4" - - AC_MSG_CHECKING([for Go version]) - golang_version=`$GO version 2>&1 | $SED -e 's/\(go \)\(version \)\(go\)\(@<:@0-9@:>@.@<:@0-9@:>@.@<:@0-9@:>@\)\(@<:@\*@:>@*\).*/\4/'` - AC_MSG_RESULT($golang_version) - AC_SUBST([golang_version],[$golang_version]) - AX_COMPARE_VERSION([$ax_go_version],[le],[$golang_version],[ - : - have_go="yes" - ],[ - : - have_go="no" - ]) - ],[ - AC_MSG_WARN([could not find Go ]) - have_go="no" - ]) - fi -fi -AM_CONDITIONAL(WITH_GO, [test "$have_go" = "yes"]) - - -AX_THRIFT_LIB(haxe, [Haxe], yes) -if test "$with_haxe" = "yes"; then - AC_PATH_PROG([HAXE], [haxe]) - if [[ -x "$HAXE" ]] ; then - AX_PROG_HAXE_VERSION( [3.1.3], have_haxe="yes", have_haxe="no") - fi -fi -AM_CONDITIONAL(WITH_HAXE, [test "$have_haxe" = "yes"]) - - -AX_THRIFT_LIB(d, [D], yes) -if test "$with_d" = "yes"; then - AX_DMD - AC_SUBST(DMD) - if test "x$DMD" != "x"; then - have_d="yes" - fi -fi - -# Determine actual name of the generated D library for use in the command line -# when compiling tests. This is needed because the -l syntax doesn't work -# with OPTLINK (Windows). -lib_prefix=lib -lib_suffix=a -case "$host_os" in - cygwin* | mingw* | pw32* | cegcc*) - lib_prefix="" - lib_suffix=lib - ;; -esac -D_LIB_NAME="${lib_prefix}thriftd.${lib_suffix}" -AC_SUBST(D_LIB_NAME) -D_EVENT_LIB_NAME="${lib_prefix}thriftd-event.${lib_suffix}" -AC_SUBST(D_EVENT_LIB_NAME) -D_SSL_LIB_NAME="${lib_prefix}thriftd-ssl.${lib_suffix}" -AC_SUBST(D_SSL_LIB_NAME) - -if test "$have_d" = "yes"; then - AX_CHECK_D_MODULE(deimos.event2.event) - have_deimos_event2=$success - - with_d_event_tests="no" - if test "$have_deimos_event2" = "yes"; then - if test "x$DMD_LIBEVENT_FLAGS" = "x"; then - if test "$dmd_optlink" = "yes"; then - AC_MSG_WARN([D libevent interface found, but cannot auto-detect \ -linker flags for OPTLINK. Please set DMD_LIBEVENT_FLAGS manually.]) - else - AX_LIB_EVENT([2.0]) - if test "$success" = "yes"; then - DMD_LIBEVENT_FLAGS=$(echo "$LIBEVENT_LDFLAGS $LIBEVENT_LIBS" | \ - sed -e 's/^ *//g;s/ *$//g;s/^\(.\)/-L\1/g;s/ */ -L/g') - with_d_event_tests="yes" - else - AC_MSG_WARN([D libevent interface present, but libevent library not found.]) - fi - fi - else - with_d_event_tests="yes" - fi - fi - - AX_CHECK_D_MODULE(deimos.openssl.ssl) - have_deimos_openssl=$success - - with_d_ssl_tests="no" - if test "$have_deimos_openssl" = "yes"; then - if test "x$DMD_OPENSSL_FLAGS" = "x"; then - if test "$dmd_optlink" = "yes"; then - AC_MSG_WARN([D OpenSSL interface found, but cannot auto-detect \ -linker flags for OPTLINK. Please set DMD_OPENSSL_FLAGS manually.]) - else - AX_CHECK_OPENSSL([with_d_ssl_tests="yes"]) - if test "$with_d_ssl_tests" = "yes"; then - DMD_OPENSSL_FLAGS=$(echo "$OPENSSL_LDFLAGS $OPENSSL_LIBS" | \ - sed -e 's/^ *//g;s/ *$//g;s/^\(.\)/-L\1/g;s/ */ -L/g') - else - AC_MSG_WARN([D OpenSSL interface present, but OpenSSL library not found.]) - fi - fi - else - with_d_ssl_tests="yes" - fi - fi -fi - -AM_CONDITIONAL(WITH_D, [test "$have_d" = "yes"]) -AM_CONDITIONAL(DMD_OPTLINK, [test "$dmd_optlink" = "yes"]) -AC_SUBST(DMD_OF_DIRSEP, "$dmd_of_dirsep") -AM_CONDITIONAL(HAVE_DEIMOS_EVENT2, [test "$have_deimos_event2" = "yes"]) -AM_CONDITIONAL(WITH_D_EVENT_TESTS, [test "$with_d_event_tests" = "yes"]) -AC_SUBST(DMD_LIBEVENT_FLAGS) -AM_CONDITIONAL(HAVE_DEIMOS_OPENSSL, [test "$have_deimos_openssl" = "yes"]) -AM_CONDITIONAL(WITH_D_SSL_TESTS, [test "$with_d_ssl_tests" = "yes"]) -AC_SUBST(DMD_OPENSSL_FLAGS) - -AC_ARG_ENABLE([tests], - AS_HELP_STRING([--enable-tests], [build tests [default=yes]]), - [], enable_tests=yes -) -have_tests=yes -if test "$enable_tests" = "no"; then - have_tests="no" -fi -AM_CONDITIONAL(WITH_TESTS, [test "$have_tests" = "yes"]) - -AC_ARG_ENABLE([plugin], - AS_HELP_STRING([--enable-plugin], [build compiler plugin support [default=yes]]), - [], enable_plugin=yes -) -have_plugin=yes -if test "$have_cpp" = "no" ; then - have_plugin="no" -fi -if test "$enable_plugin" = "no"; then - have_plugin="no" -fi -if test "$have_plugin" = "yes" ; then - AC_CONFIG_LINKS([compiler/cpp/test/plugin/t_cpp_generator.cc:compiler/cpp/src/thrift/generate/t_cpp_generator.cc]) -fi -AM_CONDITIONAL(WITH_PLUGIN, [test "$have_plugin" = "yes"]) - -AC_ARG_ENABLE([tutorial], - AS_HELP_STRING([--enable-tutorial], [build tutorial [default=yes]]), - [], enable_tutorial=yes -) -have_tutorial=yes -if test "$enable_tutorial" = "no"; then - have_tutorial="no" -fi -AM_CONDITIONAL(WITH_TUTORIAL, [test "$have_tutorial" = "yes"]) - -AM_CONDITIONAL(MINGW, false) -case "${host_os}" in -*mingw*) - mingw32_support="yes" - AC_CHECK_HEADER(windows.h) - AM_CONDITIONAL(MINGW, true) - ;; -*) - AC_ISC_POSIX - ;; -esac - -AC_C_CONST -AC_C_INLINE -AC_C_VOLATILE - -AC_HEADER_STDBOOL -AC_HEADER_STDC -AC_HEADER_TIME -AC_HEADER_SYS_WAIT -AC_TYPE_SIGNAL -AC_CHECK_HEADERS([arpa/inet.h]) -AC_CHECK_HEADERS([sys/param.h]) -AC_CHECK_HEADERS([fcntl.h]) -AC_CHECK_HEADERS([inttypes.h]) -AC_CHECK_HEADERS([limits.h]) -AC_CHECK_HEADERS([netdb.h]) -AC_CHECK_HEADERS([netinet/in.h]) -AC_CHECK_HEADERS([pthread.h]) -AC_CHECK_HEADERS([stddef.h]) -AC_CHECK_HEADERS([stdlib.h]) -AC_CHECK_HEADERS([sys/socket.h]) -AC_CHECK_HEADERS([sys/time.h]) -AC_CHECK_HEADERS([sys/un.h]) -AC_CHECK_HEADERS([sys/poll.h]) -AC_CHECK_HEADERS([sys/resource.h]) -AC_CHECK_HEADERS([unistd.h]) -AC_CHECK_HEADERS([libintl.h]) -AC_CHECK_HEADERS([malloc.h]) -AC_CHECK_HEADERS([openssl/ssl.h]) -AC_CHECK_HEADERS([openssl/rand.h]) -AC_CHECK_HEADERS([openssl/x509v3.h]) -AC_CHECK_HEADERS([sched.h]) -AC_CHECK_HEADERS([wchar.h]) - -AC_CHECK_LIB(pthread, pthread_create) -dnl NOTE(dreiss): I haven't been able to find any really solid docs -dnl on what librt is and how it fits into various Unix systems. -dnl My best guess is that it is where glibc stashes its implementation -dnl of the POSIX Real-Time Extensions. This seems necessary on Linux, -dnl and we haven't yet found a system where this is a problem. -AC_CHECK_LIB(rt, clock_gettime) -AC_CHECK_LIB(socket, setsockopt) - -AC_TYPE_INT16_T -AC_TYPE_INT32_T -AC_TYPE_INT64_T -AC_TYPE_INT8_T -AC_TYPE_MODE_T -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_TYPE_SSIZE_T -AC_TYPE_UINT16_T -AC_TYPE_UINT32_T -AC_TYPE_UINT64_T -AC_TYPE_UINT8_T -AC_CHECK_TYPES([ptrdiff_t], [], [exit 1]) - -AC_STRUCT_TM - -dnl NOTE(dreiss): AI_ADDRCONFIG is not defined on OpenBSD. -AC_CHECK_DECL([AI_ADDRCONFIG], [], - [AC_DEFINE([AI_ADDRCONFIG], 0, - [Define if the AI_ADDRCONFIG symbol is unavailable])], - [ - #include - #include - #include -]) - -AC_FUNC_ALLOCA -AC_FUNC_FORK -AC_FUNC_MALLOC -AC_FUNC_MEMCMP -AC_FUNC_REALLOC -AC_FUNC_SELECT_ARGTYPES -AC_FUNC_STAT -AC_FUNC_STRERROR_R -AC_FUNC_STRFTIME -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([strtoul]) -AC_CHECK_FUNCS([bzero]) -AC_CHECK_FUNCS([ftruncate]) -AC_CHECK_FUNCS([gethostbyname]) -AC_CHECK_FUNCS([gethostbyname_r]) -AC_CHECK_FUNCS([gettimeofday]) -AC_CHECK_FUNCS([memmove]) -AC_CHECK_FUNCS([memset]) -AC_CHECK_FUNCS([mkdir]) -AC_CHECK_FUNCS([realpath]) -AC_CHECK_FUNCS([select]) -AC_CHECK_FUNCS([setlocale]) -AC_CHECK_FUNCS([socket]) -AC_CHECK_FUNCS([strchr]) -AC_CHECK_FUNCS([strdup]) -AC_CHECK_FUNCS([strerror]) -AC_CHECK_FUNCS([strstr]) -AC_CHECK_FUNCS([strtol]) -AC_CHECK_FUNCS([sqrt]) -dnl The following functions are optional. -AC_CHECK_FUNCS([alarm]) -AC_CHECK_FUNCS([clock_gettime]) -AC_CHECK_FUNCS([sched_get_priority_min]) -AC_CHECK_FUNCS([sched_get_priority_max]) -AC_CHECK_FUNCS([inet_ntoa]) -AC_CHECK_FUNCS([pow]) - -if test "$cross_compiling" = "no" ; then - AX_SIGNED_RIGHT_SHIFT -fi - -dnl autoscan thinks we need this macro because we have a member function -dnl called "error". Invoke the macro but don't run the check so autoscan -dnl thinks we are in the clear. It's highly unlikely that we will ever -dnl actually use the function that this checks for. -if false ; then - AC_FUNC_ERROR_AT_LINE -fi - -# --- Coverage hooks --- - -AC_ARG_ENABLE(coverage, - [ --enable-coverage turn on -fprofile-arcs -ftest-coverage], - [case "${enableval}" in - yes) ENABLE_COVERAGE=1 ;; - no) ENABLE_COVERAGE=0 ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-cov) ;; - esac], - [ENABLE_COVERAGE=2]) - -if test "x[$]ENABLE_COVERAGE" = "x1"; then - AC_MSG_WARN(enable coverage) - GCOV_CFLAGS="`echo \"[$]CFLAGS\" | perl -pe 's/-O\d+//g;'` -fprofile-arcs -ftest-coverage" - GCOV_CXXFLAGS="`echo \"[$]CXXFLAGS\" | perl -pe 's/-O\d+//g;'` -fprofile-arcs -ftest-coverage" - GCOV_LDFLAGS="-XCClinker -fprofile-arcs -XCClinker -ftest-coverage" -fi - -AC_SUBST(ENABLE_COVERAGE) -AC_SUBST(GCOV_CFLAGS) -AC_SUBST(GCOV_CXXFLAGS) -AC_SUBST(GCOV_LDFLAGS) - -AC_ARG_ENABLE(boostthreads, - [ --enable-boostthreads use boost threads, instead of POSIX pthread (experimental) ], - [case "${enableval}" in - yes) ENABLE_BOOSTTHREADS=1 ;; - no) ENABLE_BOOSTTHREADS=0 ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-cov) ;; - esac], - [ENABLE_BOOSTTHREADS=2]) - - -if test "x[$]ENABLE_BOOSTTHREADS" = "x1"; then - AC_MSG_WARN(enable boostthreads) - AC_DEFINE([USE_BOOST_THREAD], [1], [experimental --enable-boostthreads that replaces POSIX pthread by boost::thread]) - LIBS="-lboost_thread $LIBS" -fi - -AM_CONDITIONAL([WITH_BOOSTTHREADS], [test "x[$]ENABLE_BOOSTTHREADS" = "x1"]) - -AC_CONFIG_HEADERS(config.h:config.hin) -AC_CONFIG_HEADERS(lib/cpp/src/thrift/config.h:config.hin) -AC_CONFIG_HEADERS(lib/c_glib/src/thrift/config.h:config.hin) -# gruard against pre defined config.h -AH_TOP([ -#ifndef CONFIG_H -#define CONFIG_H -]) -AH_BOTTOM([ -#endif -]) - - -AC_CONFIG_FILES([ - Makefile - compiler/cpp/Makefile - compiler/cpp/src/Makefile - compiler/cpp/src/thrift/plugin/Makefile - compiler/cpp/test/Makefile - compiler/cpp/src/thrift/version.h - lib/Makefile - lib/cpp/Makefile - lib/cpp/test/Makefile - lib/cpp/thrift-nb.pc - lib/cpp/thrift-z.pc - lib/cpp/thrift-qt.pc - lib/cpp/thrift-qt5.pc - lib/cpp/thrift.pc - lib/c_glib/Makefile - lib/c_glib/thrift_c_glib.pc - lib/c_glib/test/Makefile - lib/csharp/Makefile - lib/csharp/test/Multiplex/Makefile - lib/d/Makefile - lib/d/test/Makefile - lib/erl/Makefile - lib/go/Makefile - lib/go/test/Makefile - lib/haxe/test/Makefile - lib/hs/Makefile - lib/java/Makefile - lib/js/Makefile - lib/js/test/Makefile - lib/json/Makefile - lib/json/test/Makefile - lib/nodejs/Makefile - lib/perl/Makefile - lib/perl/test/Makefile - lib/php/Makefile - lib/php/test/Makefile - lib/dart/Makefile - lib/py/Makefile - lib/rb/Makefile - lib/lua/Makefile - lib/xml/Makefile - lib/xml/test/Makefile - test/Makefile - test/features/Makefile - test/c_glib/Makefile - test/cpp/Makefile - test/csharp/Makefile - test/erl/Makefile - test/go/Makefile - test/haxe/Makefile - test/hs/Makefile - test/lua/Makefile - test/php/Makefile - test/dart/Makefile - test/perl/Makefile - test/py/Makefile - test/py.twisted/Makefile - test/py.tornado/Makefile - test/rb/Makefile - tutorial/Makefile - tutorial/c_glib/Makefile - tutorial/cpp/Makefile - tutorial/d/Makefile - tutorial/go/Makefile - tutorial/haxe/Makefile - tutorial/hs/Makefile - tutorial/java/Makefile - tutorial/js/Makefile - tutorial/nodejs/Makefile - tutorial/dart/Makefile - tutorial/py/Makefile - tutorial/py.twisted/Makefile - tutorial/py.tornado/Makefile - tutorial/rb/Makefile -]) - -if test "$have_cpp" = "yes" ; then MAYBE_CPP="cpp" ; else MAYBE_CPP="" ; fi -AC_SUBST([MAYBE_CPP]) -if test "$have_c_glib" = "yes" ; then MAYBE_C_GLIB="c_glib" ; else MAYBE_C_GLIB="" ; fi -AC_SUBST([MAYBE_C_GLIB]) -if test "$have_d" = "yes" -a "$have_deimos_event2" = "yes" -a "$have_deimos_openssl" = "yes"; then MAYBE_D="d" ; else MAYBE_D="" ; fi -AC_SUBST([MAYBE_D]) -if test "$have_java" = "yes" ; then MAYBE_JAVA="java" ; else MAYBE_JAVA="" ; fi -AC_SUBST([MAYBE_JAVA]) -if test "$have_csharp" = "yes" ; then MAYBE_CSHARP="csharp" ; else MAYBE_CSHARP="" ; fi -AC_SUBST([MAYBE_CSHARP]) -if test "$have_python" = "yes" ; then MAYBE_PYTHON="py" ; else MAYBE_PYTHON="" ; fi -AC_SUBST([MAYBE_PYTHON]) -if test "$have_py3" = "yes" ; then MAYBE_PY3="py3" ; else MAYBE_PY3="" ; fi -AC_SUBST([MAYBE_PY3]) -if test "$have_ruby" = "yes" ; then MAYBE_RUBY="rb" ; else MAYBE_RUBY="" ; fi -AC_SUBST([MAYBE_RUBY]) -if test "$have_haskell" = "yes" ; then MAYBE_HASKELL="hs" ; else MAYBE_HASKELL="" ; fi -AC_SUBST([MAYBE_HASKELL]) -if test "$have_perl" = "yes" ; then MAYBE_PERL="perl" ; else MAYBE_PERL="" ; fi -AC_SUBST([MAYBE_PERL]) -if test "$have_php" = "yes" ; then MAYBE_PHP="php" ; else MAYBE_PHP="" ; fi -AC_SUBST([MAYBE_PHP]) -if test "$have_dart" = "yes" ; then MAYBE_DART="dart" ; else MAYBE_DART="" ; fi -AC_SUBST([MAYBE_DART]) -if test "$have_go" = "yes" ; then MAYBE_GO="go" ; else MAYBE_GO="" ; fi -AC_SUBST([MAYBE_GO]) -if test "$have_nodejs" = "yes" ; then MAYBE_NODEJS="nodejs" ; else MAYBE_NODEJS="" ; fi -AC_SUBST([MAYBE_NODEJS]) -if test "$have_erlang" = "yes" ; then MAYBE_ERLANG="erl" ; else MAYBE_ERLANG="" ; fi -AC_SUBST([MAYBE_ERLANG]) -if test "$have_lua" = "yes" ; then MAYBE_LUA="lua" ; else MAYBE_LUA="" ; fi -AC_SUBST([MAYBE_LUA]) - -AC_OUTPUT - - -echo -echo "$PACKAGE $VERSION" -echo -echo "Building Plugin Support ...... : $have_plugin" -echo "Building C++ Library ......... : $have_cpp" -echo "Building C (GLib) Library .... : $have_c_glib" -echo "Building Java Library ........ : $have_java" -echo "Building C# Library .......... : $have_csharp" -echo "Building Python Library ...... : $have_python" -echo "Building Ruby Library ........ : $have_ruby" -echo "Building Haxe Library ........ : $have_haxe" -echo "Building Haskell Library ..... : $have_haskell" -echo "Building Perl Library ........ : $have_perl" -echo "Building PHP Library ......... : $have_php" -echo "Building Dart Library ........ : $have_dart" -echo "Building Erlang Library ...... : $have_erlang" -echo "Building Go Library .......... : $have_go" -echo "Building D Library ........... : $have_d" -echo "Building NodeJS Library ...... : $have_nodejs" -echo "Building Lua Library ......... : $have_lua" - -if test "$have_cpp" = "yes" ; then - echo - echo "C++ Library:" - echo " Build TZlibTransport ...... : $have_zlib" - echo " Build TNonblockingServer .. : $have_libevent" - echo " Build TQTcpServer (Qt4) .... : $have_qt" - echo " Build TQTcpServer (Qt5) .... : $have_qt5" -fi -if test "$have_java" = "yes" ; then - echo - echo "Java Library:" - echo " Using javac ............... : $JAVAC" - echo " Using java ................ : $JAVA" - echo " Using ant ................. : $ANT" -fi -if test "$have_csharp" = "yes" ; then - echo - echo "C# Library:" - echo " Using .NET 3.5 ............ : $net_3_5" -fi -if test "$have_python" = "yes" ; then - echo - echo "Python Library:" - echo " Using Python .............. : $PYTHON" - if test "$have_py3" = "yes" ; then - echo " Using Python3 ............. : $PYTHON3" - fi - if test "$have_trial" = "yes"; then - echo " Using trial ............... : $TRIAL" - fi -fi -if test "$have_php" = "yes" ; then - echo - echo "PHP Library:" - echo " Using php-config .......... : $PHP_CONFIG" -fi -if test "$have_dart" = "yes" ; then - echo - echo "Dart Library:" - echo " Using Dart ................ : $DART" - echo " Using Pub ................. : $DARTPUB" -fi -if test "$have_ruby" = "yes" ; then - echo - echo "Ruby Library:" - echo " Using Ruby ................ : $RUBY" -fi -if test "$have_haskell" = "yes" ; then - echo - echo "Haskell Library:" - echo " Using Haskell ............. : $RUNHASKELL" - echo " Using Cabal ............... : $CABAL" -fi -if test "$have_haxe" = "yes" ; then - echo - echo "Haxe Library:" - echo " Using Haxe ................ : $HAXE" - echo " Using Haxe version ........ : $HAXE_VERSION" -fi -if test "$have_perl" = "yes" ; then - echo - echo "Perl Library:" - echo " Using Perl ................ : $PERL" -fi -if test "$have_erlang" = "yes" ; then - echo - echo "Erlang Library:" - echo " Using erlc ................ : $ERLC" - echo " Using rebar ............... : $REBAR" -fi -if test "$have_go" = "yes" ; then - echo - echo "Go Library:" - echo " Using Go................... : $GO" - echo " Using Go version........... : $($GO version)" -fi -if test "$have_d" = "yes" ; then - echo - echo "D Library:" - echo " Using D Compiler .......... : $DMD" - echo " Building D libevent tests . : $with_d_event_tests" - echo " Building D SSL tests ...... : $with_d_ssl_tests" -fi -if test "$have_nodejs" = "yes" ; then - echo - echo "NodeJS Library:" - echo " Using NodeJS .............. : $NODEJS" - echo " Using NodeJS version....... : $($NODEJS --version)" -fi -if test "$have_lua" = "yes" ; then - echo - echo "Lua Library:" - echo " Using Lua .............. : $LUA" -fi -echo -echo "If something is missing that you think should be present," -echo "please skim the output of configure to find the missing" -echo "component. Details are present in config.log." diff --git a/vendor/github.com/apache/thrift/contrib/fb303/LICENSE b/vendor/github.com/apache/thrift/contrib/fb303/LICENSE new file mode 100644 index 00000000000..4eacb643179 --- /dev/null +++ b/vendor/github.com/apache/thrift/contrib/fb303/LICENSE @@ -0,0 +1,16 @@ +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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/apache/thrift/debian/copyright b/vendor/github.com/apache/thrift/debian/copyright new file mode 100644 index 00000000000..850643c9aa4 --- /dev/null +++ b/vendor/github.com/apache/thrift/debian/copyright @@ -0,0 +1,129 @@ +This package was debianized by Thrift Developer's . + + +This package and the Debian packaging is licensed under the Apache License, +see `/usr/share/common-licenses/Apache-2.0'. + +The following information was copied from Apache Thrift LICENSE file. + +-------------------------------------------------- +SOFTWARE DISTRIBUTED WITH THRIFT: + +The Apache Thrift software includes a number of subcomponents with +separate copyright notices and license terms. Your use of the source +code for the these subcomponents is subject to the terms and +conditions of the following licenses. + +-------------------------------------------------- +Portions of the following files are licensed under the MIT License: + + lib/erl/src/Makefile.am + +Please see doc/otp-base-license.txt for the full terms of this license. + + +-------------------------------------------------- +The following files contain some portions of code contributed under +the Thrift Software License (see doc/old-thrift-license.txt), and relicensed +under the Apache 2.0 License: + + compiler/cpp/Makefile.am + compiler/cpp/src/generate/t_cocoa_generator.cc + compiler/cpp/src/generate/t_cpp_generator.cc + compiler/cpp/src/generate/t_csharp_generator.cc + compiler/cpp/src/generate/t_erl_generator.cc + compiler/cpp/src/generate/t_hs_generator.cc + compiler/cpp/src/generate/t_java_generator.cc + compiler/cpp/src/generate/t_ocaml_generator.cc + compiler/cpp/src/generate/t_perl_generator.cc + compiler/cpp/src/generate/t_php_generator.cc + compiler/cpp/src/generate/t_py_generator.cc + compiler/cpp/src/generate/t_rb_generator.cc + compiler/cpp/src/generate/t_st_generator.cc + compiler/cpp/src/generate/t_xsd_generator.cc + compiler/cpp/src/main.cc + compiler/cpp/src/parse/t_field.h + compiler/cpp/src/parse/t_program.h + compiler/cpp/src/platform.h + compiler/cpp/src/thriftl.ll + compiler/cpp/src/thrifty.yy + lib/csharp/src/Protocol/TBinaryProtocol.cs + lib/csharp/src/Protocol/TField.cs + lib/csharp/src/Protocol/TList.cs + lib/csharp/src/Protocol/TMap.cs + lib/csharp/src/Protocol/TMessage.cs + lib/csharp/src/Protocol/TMessageType.cs + lib/csharp/src/Protocol/TProtocol.cs + lib/csharp/src/Protocol/TProtocolException.cs + lib/csharp/src/Protocol/TProtocolFactory.cs + lib/csharp/src/Protocol/TProtocolUtil.cs + lib/csharp/src/Protocol/TSet.cs + lib/csharp/src/Protocol/TStruct.cs + lib/csharp/src/Protocol/TType.cs + lib/csharp/src/Server/TServer.cs + lib/csharp/src/Server/TSimpleServer.cs + lib/csharp/src/Server/TThreadPoolServer.cs + lib/csharp/src/TApplicationException.cs + lib/csharp/src/Thrift.csproj + lib/csharp/src/Thrift.sln + lib/csharp/src/TProcessor.cs + lib/csharp/src/Transport/TServerSocket.cs + lib/csharp/src/Transport/TServerTransport.cs + lib/csharp/src/Transport/TSocket.cs + lib/csharp/src/Transport/TStreamTransport.cs + lib/csharp/src/Transport/TTransport.cs + lib/csharp/src/Transport/TTransportException.cs + lib/csharp/src/Transport/TTransportFactory.cs + lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs + lib/csharp/ThriftMSBuildTask/ThriftBuild.cs + lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj + lib/rb/lib/thrift.rb + lib/st/README + lib/st/thrift.st + test/OptionalRequiredTest.cpp + test/OptionalRequiredTest.thrift + test/ThriftTest.thrift + +-------------------------------------------------- +For the aclocal/ax_boost_base.m4 and contrib/fb303/aclocal/ax_boost_base.m4 components: + +# Copyright (c) 2007 Thomas Porschberg +# +# Copying and distribution of this file, with or without +# modification, are permitted in any medium without royalty provided +# the copyright notice and this notice are preserved. + +-------------------------------------------------- +For the compiler/cpp/src/md5.[ch] components: + +/* + Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ + +--------------------------------------------------- +For the lib/rb/setup.rb: Copyright (c) 2000-2005 Minero Aoki, +lib/ocaml/OCamlMakefile and lib/ocaml/README-OCamlMakefile components: + Copyright (C) 1999 - 2007 Markus Mottl + +Licensed under the terms of the GNU Lesser General Public License 2.1 +(see doc/lgpl-2.1.txt for the full terms of this license) diff --git a/vendor/github.com/apache/thrift/doap.rdf b/vendor/github.com/apache/thrift/doap.rdf deleted file mode 100755 index 14a8d6638d5..00000000000 --- a/vendor/github.com/apache/thrift/doap.rdf +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - 2012-04-14 - - Apache Thrift - - - Apache Thrift software provides a framework for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. - Apache Thrift allows you to define data types and service interfaces in a simple definition file. Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages. Instead of writing a load of boilerplate code to serialize and transport your objects and invoke remote methods, you can get right down to business. - - - - ActionScript - C - C# - C++ - Cocoa - D - Delphi - Erlang - Go - Haskell - Java - JavaScript - node.js - OCaml - Perl - PHP - Python - SmallTalk - - - - - - - Apache Thrift - 2015-09-25 - 0.9.3 - - - Apache Thrift - 2014-11-05 - 0.9.2 - - - Apache Thrift - 2013-08-22 - 0.9.1 - - - Apache Thrift - 2012-10-15 - 0.9.0 - - - Apache Thrift - 2011-11-29 - 0.8.0 - - - Apache Thrift - 2011-08-13 - 0.7.0 - - - Apache Thrift - 2011-04-25 - 0.6.1 - - - Apache Thrift - 2011-02-08 - 0.6.0 - - - Apache Thrift (incubating) - 2010-10-07 - 0.5.0 - - - Apache Thrift (incubating) - 2010-08-23 - 0.4.0 - - - Apache Thrift (incubating) - 2010-08-04 - 0.3.0 - - - Apache Thrift (incubating) - 2009-12-11 - 0.2.0 - - - - - - - - - - - Apache Thrift PMC - - - - - diff --git a/vendor/github.com/apache/thrift/lib/Makefile.am b/vendor/github.com/apache/thrift/lib/Makefile.am deleted file mode 100644 index 5f17fca882d..00000000000 --- a/vendor/github.com/apache/thrift/lib/Makefile.am +++ /dev/null @@ -1,109 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -SUBDIRS = json xml -PRECROSS_TARGET = - -if WITH_CPP -# cpp dir is picked directly by plugin build -if !WITH_PLUGIN -SUBDIRS += cpp -endif -endif - -if WITH_C_GLIB -SUBDIRS += c_glib -endif - -if WITH_MONO -SUBDIRS += csharp -endif - -if WITH_JAVA -SUBDIRS += java -PRECROSS_TARGET += precross-java -# JavaScript unit test depends on java -# so test only if java, ant & co is available -SUBDIRS += js -endif - -if WITH_PYTHON -SUBDIRS += py -endif - -if WITH_ERLANG -SUBDIRS += erl -endif - -if WITH_RUBY -SUBDIRS += rb -endif - -if WITH_HASKELL -SUBDIRS += hs -endif - -if WITH_PERL -SUBDIRS += perl -endif - -if WITH_PHP -SUBDIRS += php -endif - -if WITH_DART -SUBDIRS += dart -endif - -if WITH_GO -SUBDIRS += go -endif - -if WITH_D -SUBDIRS += d -PRECROSS_TARGET += precross-d -endif - -if WITH_NODEJS -SUBDIRS += nodejs -PRECROSS_TARGET += precross-nodejs -endif - -if WITH_LUA -SUBDIRS += lua -endif - -# All of the libs that don't use Automake need to go in here -# so they will end up in our release tarballs. -EXTRA_DIST = \ - as3 \ - cocoa \ - d \ - dart \ - delphi \ - haxe \ - javame \ - js \ - ocaml \ - st \ - ts - -precross-%: - $(MAKE) -C $* precross -precross: $(PRECROSS_TARGET) diff --git a/vendor/github.com/apache/thrift/lib/dart/LICENSE_HEADER b/vendor/github.com/apache/thrift/lib/dart/LICENSE_HEADER new file mode 100644 index 00000000000..4eacb643179 --- /dev/null +++ b/vendor/github.com/apache/thrift/lib/dart/LICENSE_HEADER @@ -0,0 +1,16 @@ +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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/apache/thrift/lib/go/Makefile.am b/vendor/github.com/apache/thrift/lib/go/Makefile.am deleted file mode 100644 index ff946ea8d0c..00000000000 --- a/vendor/github.com/apache/thrift/lib/go/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -SUBDIRS = . - -if WITH_TESTS -SUBDIRS += test -endif - -install: - @echo '##############################################################' - @echo '##############################################################' - @echo 'The Go client library should be installed via "go get", please see /lib/go/README.md' - @echo '##############################################################' - @echo '##############################################################' - -check-local: - $(GO) test ./thrift - -all-local: - $(GO) build ./thrift - -EXTRA_DIST = \ - thrift \ - coding_standards.md \ - README.md diff --git a/vendor/github.com/apache/thrift/lib/go/README.md b/vendor/github.com/apache/thrift/lib/go/README.md deleted file mode 100644 index 7440474c325..00000000000 --- a/vendor/github.com/apache/thrift/lib/go/README.md +++ /dev/null @@ -1,81 +0,0 @@ -Thrift Go Software Library - -License -======= - -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. - - -Using Thrift with Go -==================== - -In following Go conventions, we recommend you use the 'go' tool to install -Thrift for go. - - $ go get git.apache.org/thrift.git/lib/go/thrift/... - -Will retrieve and install the most recent version of the package. - - -A note about optional fields -============================ - -The thrift-to-Go compiler tries to represent thrift IDL structs as Go structs. -We must be able to distinguish between optional fields that are set to their -default value and optional values which are actually unset, so the generated -code represents optional fields via pointers. - -This is generally intuitive and works well much of the time, but Go does not -have a syntax for creating a pointer to a constant in a single expression. That -is, given a struct like - - struct SomeIDLType { - OptionalField *int32 - } - -, the following will not compile: - - x := &SomeIDLType{ - OptionalField: &(3), - } - -(Nor is there any other syntax that's built in to the language) - -As such, we provide some helpers that do just this under lib/go/thrift/. E.g., - - x := &SomeIDLType{ - OptionalField: thrift.Int32Ptr(3), - } - -And so on. The code generator also creates analogous helpers for user-defined -typedefs and enums. - -Adding custom tags to generated Thrift structs -============================================== - -You can add tags to the auto-generated thrift structs using the following format: - - struct foo { - 1: required string Bar (go.tag = "some_tag:\"some_tag_value\"") - } - -which will generate: - - type Foo struct { - Bar string `thrift:"bar,1,required" some_tag:"some_tag_value"` - } diff --git a/vendor/github.com/apache/thrift/lib/go/coding_standards.md b/vendor/github.com/apache/thrift/lib/go/coding_standards.md deleted file mode 100644 index fa0390bb577..00000000000 --- a/vendor/github.com/apache/thrift/lib/go/coding_standards.md +++ /dev/null @@ -1 +0,0 @@ -Please follow [General Coding Standards](/doc/coding_standards.md) diff --git a/vendor/github.com/sergi/go-diff/APACHE-LICENSE-2.0 b/vendor/github.com/apache/thrift/lib/hs/LICENSE similarity index 89% rename from vendor/github.com/sergi/go-diff/APACHE-LICENSE-2.0 rename to vendor/github.com/apache/thrift/lib/hs/LICENSE index f433b1a53f5..d6456956733 100644 --- a/vendor/github.com/sergi/go-diff/APACHE-LICENSE-2.0 +++ b/vendor/github.com/apache/thrift/lib/hs/LICENSE @@ -175,3 +175,28 @@ 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/apache/thrift/package.json b/vendor/github.com/apache/thrift/package.json deleted file mode 100644 index edfc3553ed5..00000000000 --- a/vendor/github.com/apache/thrift/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "thrift", - "description": "node.js bindings for the Apache Thrift RPC system", - "homepage": "http://thrift.apache.org/", - "repository": { - "type": "git", - "url": "https://git-wip-us.apache.org/repos/asf/thrift.git" - }, - "version": "0.10.0", - "author": { - "name": "Apache Thrift Developers", - "email": "dev@thrift.apache.org", - "url": "http://thrift.apache.org" - }, - "license": "Apache-2.0", - "licenses": [ - { - "type": "Apache-2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0" - } - ], - "bugs": { - "mail": "dev@thrift.apache.org", - "url": "https://issues.apache.org/jira/browse/THRIFT" - }, - "files": [ - "lib/nodejs/lib/thrift", - "lib/nodejs/README.md" - ], - "directories": { - "lib": "./lib/nodejs/lib/thrift" - }, - "main": "./lib/nodejs/lib/thrift", - "engines": { - "node": ">= 0.2.4" - }, - "dependencies": { - "node-int64": "~0.3.0", - "q": "1.0.x", - "ws": "~0.4.32" - }, - "devDependencies": { - "buffer-equals": "^1.0.3", - "commander": "2.1.x", - "connect": "2.7.x", - "istanbul": "^0.3.5", - "run-browser": "^2.0.1", - "tape": "~3.5.0" - }, - "scripts": { - "cover": "lib/nodejs/test/testAll.sh COVER", - "test": "lib/nodejs/test/testAll.sh" - } -} diff --git a/vendor/github.com/apache/thrift/sonar-project.properties b/vendor/github.com/apache/thrift/sonar-project.properties deleted file mode 100755 index 6e6c5db90d1..00000000000 --- a/vendor/github.com/apache/thrift/sonar-project.properties +++ /dev/null @@ -1,140 +0,0 @@ -# Apache Thrift © The Apache Software Foundation -# http://www.apache.org/licenses/LICENSE-2.0 -# SPDX-License-Identifier: Apache-2.0 - -# File: sonar-project.properties -# Apache Thrift configuration file for Sonar https://analysis.apache.org/ -# Sonar is an open platform to manage code quality http://www.sonarsource.org/ - - -# required metadata -sonar.projectKey=org.apache.thrift -sonar.projectName=Apache Thrift -sonar.projectDescription= -The Apache Thrift software framework, for scalable cross-language services -development, combines a software stack with a code generation engine to build -services that work efficiently and seamlessly between all major languages. - -# Apache Thrift Version -sonar.projectVersion=0.10.0 -# use this to set another version string -# $ sonar-runner -D sonar.projectVersion=`git rev-parse HEAD` -# set projectDate in combination with projectVersion for imports of old releases -#sonar.projectDate=yyyy-MM-dd - -# TODO add website (sonar.projectUrl does not work) -#sonar.XXXX=http//thrift.apache.org - -# Some properties that will be inherited by the modules -sonar.sources=src -sonar.language=java,js,c++,py,c -sonar.sourceEncoding=UTF-8 - -# scm -sonar.scm.url=scm:git:https://git-wip-us.apache.org/repos/asf/thrift - -# cppcheck -q --error-exitcode=0 --xml . 2> cppcheck-result.xml -sonar.cxx.cppcheck.reportPath=cppcheck-result.xml - -# List of the module identifiers -sonar.modules=module1,module3,module4,module5,module6,module7,module8,module9,module10,module11,module12,module14 - - - -# we need sonar-runner 2.1 for this, see http://jira.codehaus.org/browse/SONARPLUGINS-2421 -#sonar.modules=module2 - -# delph plugin is broken -#sonar.modules=module13 - -# phpunit plugin is broken -#sonar.modules=module15 - -module1.sonar.projectName=Apache Thrift - Java Library -module1.sonar.projectBaseDir=lib/java -module1.sonar.sources=src -module1.sonar.tests=test -module1.sonar.binaries=build/libthrift-0.10.0.jar -module1.sonar.libraries=build/lib/*.jar -module1.sonar.language=java - -module2.sonar.projectName=Apache Thrift - Java Tutorial -module2.sonar.projectBaseDir=. -module2.sonar.sources=tutorial/java/src, tutorial/java/gen-java -module2.sonar.binaries=tutorial/java/tutorial.jar -module2.sonar.libraries=lib/java/build/lib/*.jar,lib/java/build/libthrift-1.0.0.jar -module2.sonar.language=java - -module3.sonar.projectName=Apache Thrift - JavaScript Library -module3.sonar.projectBaseDir=lib/js -module3.sonar.sources=. -module3.sonar.exclusions=test/**/* -module3.sonar.language=js - -module4.sonar.projectName=Apache Thrift - JavaScript Tutorial -module4.sonar.projectBaseDir=tutorial/js -module4.sonar.sources=. -module4.sonar.language=web - -module5.sonar.projectName=Apache Thrift - C++ Library -module5.sonar.projectBaseDir=lib/cpp -module5.sonar.sources=src -module5.sonar.tests=test -module5.sonar.language=c++ - -module6.sonar.projectName=Apache Thrift - C++ Tutorial -module6.sonar.projectBaseDir=tutorial/cpp -module6.sonar.sources=. -module6.sonar.exclusions=gen-cpp/**/* -module6.sonar.language=c++ - -module7.sonar.projectName=Apache Thrift - C++ Cross Language Test -module7.sonar.projectBaseDir=test/cpp -module7.sonar.sources=src -module7.sonar.language=c++ - -module8.sonar.projectName=Apache Thrift - Compiler -module8.sonar.projectBaseDir=compiler/cpp -module8.sonar.sources=src -module8.sonar.language=c++ - -module9.sonar.projectName=Apache Thrift - Python Library -module9.sonar.projectBaseDir=lib/py -module9.sonar.sources=src -module9.sonar.language=py - -module10.sonar.projectName=Apache Thrift - Python Tutorial -module10.sonar.projectBaseDir=tutorial/py -module10.sonar.sources=. -module10.sonar.exclusions=gen-py/**/* -module10.sonar.language=py - -module11.sonar.projectName=Apache Thrift - Python Cross Language Test -module11.sonar.projectBaseDir=test/py -module11.sonar.sources=. -module11.sonar.exclusions=gen-*/**/* -module11.sonar.language=py - -module12.sonar.projectName=Apache Thrift - c_glib Library -module12.sonar.projectBaseDir=lib/c_glib -module12.sonar.sources=src -module12.sonar.language=c - -module13.sonar.projectName=Apache Thrift - Delphi Library -module13.sonar.projectBaseDir=lib/delphi -module13.sonar.sources=src -module13.sonar.tests=test -module13.sonar.language=delph - -module14.sonar.projectName=Apache Thrift - Flex (as3) Library -module14.sonar.projectBaseDir=lib/as3 -module14.sonar.sources=src -module14.sonar.language=flex - -module15.sonar.projectName=Apache Thrift - PHP Library -module15.sonar.projectBaseDir=lib/php -module15.sonar.sources=src -module15.sonar.language=php - -# TODO add some more languages here - diff --git a/vendor/github.com/apache/thrift/tutorial/erl/client.sh b/vendor/github.com/apache/thrift/tutorial/erl/client.sh new file mode 120000 index 00000000000..a417e0da984 --- /dev/null +++ b/vendor/github.com/apache/thrift/tutorial/erl/client.sh @@ -0,0 +1 @@ +server.sh \ No newline at end of file diff --git a/vendor/github.com/aws/aws-sdk-go/.gitignore b/vendor/github.com/aws/aws-sdk-go/.gitignore deleted file mode 100644 index fb11ceca011..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -dist -/doc -/doc-staging -.yardoc -Gemfile.lock -awstesting/integration/smoke/**/importmarker__.go -awstesting/integration/smoke/_test/ -/vendor/bin/ -/vendor/pkg/ -/vendor/src/ -/private/model/cli/gen-api/gen-api diff --git a/vendor/github.com/aws/aws-sdk-go/.godoc_config b/vendor/github.com/aws/aws-sdk-go/.godoc_config deleted file mode 100644 index 395878d6cc4..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/.godoc_config +++ /dev/null @@ -1,14 +0,0 @@ -{ - "PkgHandler": { - "Pattern": "/sdk-for-go/api/", - "StripPrefix": "/sdk-for-go/api", - "Include": ["/src/github.com/aws/aws-sdk-go/aws", "/src/github.com/aws/aws-sdk-go/service"], - "Exclude": ["/src/cmd", "/src/github.com/aws/aws-sdk-go/awstesting", "/src/github.com/aws/aws-sdk-go/awsmigrate"], - "IgnoredSuffixes": ["iface"] - }, - "Github": { - "Tag": "master", - "Repo": "/aws/aws-sdk-go", - "UseGithub": true - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go/CHANGELOG.md deleted file mode 100644 index b1a9a579a5d..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/CHANGELOG.md +++ /dev/null @@ -1,2659 +0,0 @@ -Release v1.12.67 (2018-01-22) -=== - -### Service Client Updates -* `service/budgets`: Updates service API and documentation - * Add additional costTypes: IncludeDiscount, UseAmortized, to support finer control for different charges included in a cost budget. - -Release v1.12.66 (2018-01-19) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/glue`: Updates service API and documentation - * New AWS Glue DataCatalog APIs to manage table versions and a new feature to skip archiving of the old table version when updating table. -* `service/transcribe`: Adds new service - -Release v1.12.65 (2018-01-18) -=== - -### Service Client Updates -* `service/sagemaker`: Updates service API and documentation - * CreateTrainingJob and CreateEndpointConfig now supports KMS Key for volume encryption. - -Release v1.12.64 (2018-01-17) -=== - -### Service Client Updates -* `service/autoscaling-plans`: Updates service documentation -* `service/ec2`: Updates service documentation - * Documentation updates for EC2 - -Release v1.12.63 (2018-01-17) -=== - -### Service Client Updates -* `service/application-autoscaling`: Updates service API and documentation -* `service/autoscaling-plans`: Adds new service -* `service/rds`: Updates service API and documentation - * With this release you can now integrate RDS DB instances with CloudWatch Logs. We have added parameters to the operations for creating and modifying DB instances (for example CreateDBInstance) to allow you to take advantage of this capability through the CLI and API. Once you enable this feature, a stream of log events will publish to CloudWatch Logs for each log type you enable. - -Release v1.12.62 (2018-01-15) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lambda`: Updates service API and documentation - * Support for creating Lambda Functions using 'dotnetcore2.0' and 'go1.x'. - -Release v1.12.61 (2018-01-12) -=== - -### Service Client Updates -* `service/glue`: Updates service API and documentation - * Support is added to generate ETL scripts in Scala which can now be run by AWS Glue ETL jobs. In addition, the trigger API now supports firing when any conditions are met (in addition to all conditions). Also, jobs can be triggered based on a "failed" or "stopped" job run (in addition to a "succeeded" job run). - -Release v1.12.60 (2018-01-11) -=== - -### Service Client Updates -* `service/elasticloadbalancing`: Updates service API and documentation -* `service/elasticloadbalancingv2`: Updates service API and documentation -* `service/rds`: Updates service API and documentation - * Read Replicas for Amazon RDS for MySQL, MariaDB, and PostgreSQL now support Multi-AZ deployments.Amazon RDS Read Replicas enable you to create one or more read-only copies of your database instance within the same AWS Region or in a different AWS Region. Updates made to the source database are asynchronously copied to the Read Replicas. In addition to providing scalability for read-heavy workloads, you can choose to promote a Read Replica to become standalone a DB instance when needed.Amazon RDS Multi-AZ Deployments provide enhanced availability for database instances within a single AWS Region. With Multi-AZ, your data is synchronously replicated to a standby in a different Availability Zone (AZ). In case of an infrastructure failure, Amazon RDS performs an automatic failover to the standby, minimizing disruption to your applications.You can now combine Read Replicas with Multi-AZ as part of a disaster recovery strategy for your production databases. A well-designed and tested plan is critical for maintaining business continuity after a disaster. Since Read Replicas can also be created in different regions than the source database, your Read Replica can be promoted to become the new production database in case of a regional disruption.You can also combine Read Replicas with Multi-AZ for your database engine upgrade process. You can create a Read Replica of your production database instance and upgrade it to a new database engine version. When the upgrade is complete, you can stop applications, promote the Read Replica to a standalone database instance and switch over your applications. Since the database instance is already a Multi-AZ deployment, no additional steps are needed.For more information, see the Amazon RDS User Guide. -* `service/ssm`: Updates service documentation - * Updates documentation for the HierarchyLevelLimitExceededException error. - -Release v1.12.59 (2018-01-09) -=== - -### Service Client Updates -* `service/kms`: Updates service documentation - * Documentation updates for AWS KMS - -Release v1.12.58 (2018-01-09) -=== - -### Service Client Updates -* `service/ds`: Updates service API and documentation - * On October 24 we introduced AWS Directory Service for Microsoft Active Directory (Standard Edition), also known as AWS Microsoft AD (Standard Edition), which is a managed Microsoft Active Directory (AD) that is optimized for small and midsize businesses (SMBs). With this SDK release, you can now create an AWS Microsoft AD directory using API. This enables you to run typical SMB workloads using a cost-effective, highly available, and managed Microsoft AD in the AWS Cloud. - -Release v1.12.57 (2018-01-08) -=== - -### Service Client Updates -* `service/codedeploy`: Updates service API and documentation - * The AWS CodeDeploy API was updated to support DeleteGitHubAccountToken, a new method that deletes a GitHub account connection. -* `service/discovery`: Updates service API and documentation - * Documentation updates for AWS Application Discovery Service. -* `service/route53`: Updates service API and documentation - * This release adds an exception to the CreateTrafficPolicyVersion API operation. - -Release v1.12.56 (2018-01-05) -=== - -### Service Client Updates -* `service/inspector`: Updates service API, documentation, and examples - * Added 2 new attributes to the DescribeAssessmentTemplate response, indicating the total number of assessment runs and last assessment run ARN (if present.) -* `service/snowball`: Updates service documentation - * Documentation updates for snowball -* `service/ssm`: Updates service documentation - * Documentation updates for ssm - -Release v1.12.55 (2018-01-02) -=== - -### Service Client Updates -* `service/rds`: Updates service documentation - * Documentation updates for rds - -Release v1.12.54 (2017-12-29) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/workspaces`: Updates service API and documentation - * Modify WorkSpaces have been updated with flexible storage and switching of hardware bundles feature. The following configurations have been added to ModifyWorkSpacesProperties: storage and compute. This update provides the capability to configure the storage of a WorkSpace. It also adds the capability of switching hardware bundle of a WorkSpace by specifying an eligible compute (Value, Standard, Performance, Power). - -Release v1.12.53 (2017-12-22) -=== - -### Service Client Updates -* `service/ec2`: Updates service API - * This release fixes an issue with tags not showing in DescribeAddresses responses. -* `service/ecs`: Updates service API and documentation - * Amazon ECS users can now set a health check initialization wait period of their ECS services, the services that are associated with an Elastic Load Balancer (ELB) will wait for a period of time before the ELB become healthy. You can now configure this in Create and Update Service. -* `service/inspector`: Updates service API and documentation - * PreviewAgents API now returns additional fields within the AgentPreview data type. The API now shows the agent health and availability status for all instances included in the assessment target. This allows users to check the health status of Inspector Agents before running an assessment. In addition, it shows the instance ID, hostname, and IP address of the targeted instances. -* `service/sagemaker`: Updates service API and documentation - * SageMaker Models no longer support SupplementalContainers. API's that have been affected are CreateModel and DescribeModel. - -Release v1.12.52 (2017-12-21) -=== - -### Service Client Updates -* `service/codebuild`: Updates service API and documentation - * Adding support allowing AWS CodeBuild customers to select specific curated image versions. -* `service/ec2`: Updates service API and documentation - * Elastic IP tagging enables you to add key and value metadata to your Elastic IPs so that you can search, filter, and organize them according to your organization's needs. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/kinesisanalytics`: Updates service API and documentation - * Kinesis Analytics now supports AWS Lambda functions as output. - -Release v1.12.51 (2017-12-21) -=== - -### Service Client Updates -* `service/config`: Updates service API -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/iot`: Updates service API and documentation - * This release adds support for code signed Over-the-air update functionality for Amazon FreeRTOS. Users can now create and schedule Over-the-air updates to their Amazon FreeRTOS devices using these new APIs. - -Release v1.12.50 (2017-12-19) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * API Gateway now adds support for calling API with compressed payloads using one of the supported content codings, tagging an API stage for cost allocation, and returning API keys from a custom authorizer for use with a usage plan. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/mediastore-data`: Updates service documentation -* `service/route53`: Updates service API and documentation - * Route 53 added support for a new China (Ningxia) region, cn-northwest-1. You can now specify cn-northwest-1 as the region for latency-based or geoproximity routing. Route 53 also added support for a new EU (Paris) region, eu-west-3. You can now associate VPCs in eu-west-3 with private hosted zones and create alias records that route traffic to resources in eu-west-3. - -Release v1.12.49 (2017-12-19) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/monitoring`: Updates service documentation - * Documentation updates for monitoring - -Release v1.12.48 (2017-12-15) -=== - -### Service Client Updates -* `service/appstream`: Updates service API and documentation - * This API update is to enable customers to add tags to their Amazon AppStream 2.0 resources - -Release v1.12.47 (2017-12-14) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * Adds support for Cognito Authorizer scopes at the API method level. -* `service/email`: Updates service documentation - * Added information about the maximum number of transactions per second for the SendCustomVerificationEmail operation. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.46 (2017-12-12) -=== - -### Service Client Updates -* `service/workmail`: Adds new service - * Today, Amazon WorkMail released an administrative SDK and enabled AWS CloudTrail integration. With the administrative SDK, you can natively integrate WorkMail with your existing services. The SDK enables programmatic user, resource, and group management through API calls. This means your existing IT tools and workflows can now automate WorkMail management, and third party applications can streamline WorkMail migrations and account actions. - -Release v1.12.45 (2017-12-11) -=== - -### Service Client Updates -* `service/cognito-idp`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lex-models`: Updates service API and documentation -* `service/sagemaker`: Updates service API - * CreateModel API Update: The request parameter 'ExecutionRoleArn' has changed from optional to required. - -Release v1.12.44 (2017-12-08) -=== - -### Service Client Updates -* `service/appstream`: Updates service API and documentation - * This API update is to support the feature that allows customers to automatically consume the latest Amazon AppStream 2.0 agent as and when published by AWS. -* `service/ecs`: Updates service documentation - * Documentation updates for Windows containers. -* `service/monitoring`: Updates service API and documentation - * With this launch, you can now create a CloudWatch alarm that alerts you when M out of N datapoints of a metric are breaching your predefined threshold, such as three out of five times in any given five minutes interval or two out of six times in a thirty minutes interval. When M out of N datapoints are not breaching your threshold in an interval, the alarm will be in OK state. Please note that the M datapoints out of N datapoints in an interval can be of any order and does not need to be consecutive. Consequently, you can now get alerted even when the spikes in your metrics are intermittent over an interval. - -Release v1.12.43 (2017-12-07) -=== - -### Service Client Updates -* `service/email`: Updates service API, documentation, and paginators - * Customers can customize the emails that Amazon SES sends when verifying new identities. This feature is helpful for developers whose applications send email through Amazon SES on behalf of their customers. -* `service/es`: Updates service API and documentation - * Added support for encryption of data at rest on Amazon Elasticsearch Service using AWS KMS - -### SDK Bugs -* `models/apis` Fixes removes colliding sagemaker models folders ([#1686](https://github.com/aws/aws-sdk-go/pull/1686)) - * Fixes Release v1.12.42's SageMaker vs sagemaker model folders. -Release v1.12.42 (2017-12-06) -=== - -### Service Client Updates -* `service/clouddirectory`: Updates service API and documentation - * Amazon Cloud Directory makes it easier for you to apply schema changes across your directories with in-place schema upgrades. Your directories now remain available while backward-compatible schema changes are being applied, such as the addition of new fields. You also can view the history of your schema changes in Cloud Directory by using both major and minor version identifiers, which can help you track and audit schema versions across directories. -* `service/elasticbeanstalk`: Updates service documentation - * Documentation updates for AWS Elastic Beanstalk. -* `service/sagemaker`: Adds new service - * Initial waiters for common SageMaker workflows. - -Release v1.12.41 (2017-12-05) -=== - -### Service Client Updates -* `service/iot`: Updates service API and documentation - * Add error action API for RulesEngine. -* `service/servicecatalog`: Updates service API and documentation - * ServiceCatalog has two distinct personas for its use, an "admin" persona (who creates sets of products with different versions and prescribes who has access to them) and an "end-user" persona (who can launch cloud resources based on the configuration data their admins have given them access to). This API update will allow admin users to deactivate/activate product versions, end-user will only be able to access and launch active product versions. -* `service/servicediscovery`: Adds new service - * Amazon Route 53 Auto Naming lets you configure public or private namespaces that your microservice applications run in. When instances of the service become available, you can call the Auto Naming API to register the instance, and Amazon Route 53 automatically creates up to five DNS records and an optional health check. Clients that submit DNS queries for the service receive an answer that contains up to eight healthy records. - -Release v1.12.40 (2017-12-04) -=== - -### Service Client Updates -* `service/budgets`: Updates service API and documentation - * Add additional costTypes to support finer control for different charges included in a cost budget. -* `service/ecs`: Updates service documentation - * Documentation updates for ecs - -Release v1.12.39 (2017-12-01) -=== - -### Service Client Updates -* `service/SageMaker`: Updates service waiters - -Release v1.12.38 (2017-11-30) -=== - -### Service Client Updates -* `service/AWSMoneypenny`: Adds new service -* `service/Cloud9`: Adds new service -* `service/Serverless Registry`: Adds new service -* `service/apigateway`: Updates service API, documentation, and paginators - * Added support Private Integration and VPC Link features in API Gateway. This allows to create an API with the API Gateway private integration, thus providing clients access to HTTP/HTTPS resources in an Amazon VPC from outside of the VPC through a VpcLink resource. -* `service/ec2`: Updates service API and documentation - * Adds the following updates: 1. Spread Placement ensures that instances are placed on distinct hardware in order to reduce correlated failures. 2. Inter-region VPC Peering allows customers to peer VPCs across different AWS regions without requiring additional gateways, VPN connections or physical hardware -* `service/lambda`: Updates service API and documentation - * AWS Lambda now supports the ability to set the concurrency limits for individual functions, and increasing memory to 3008 MB. - -Release v1.12.37 (2017-11-30) -=== - -### Service Client Updates -* `service/Ardi`: Adds new service -* `service/autoscaling`: Updates service API and documentation - * You can now use Auto Scaling with EC2 Launch Templates via the CreateAutoScalingGroup and UpdateAutoScalingGroup APIs. -* `service/ec2`: Updates service API and documentation - * Adds the following updates: 1. T2 Unlimited enables high CPU performance for any period of time whenever required 2. You are now able to create and launch EC2 m5 and h1 instances -* `service/lightsail`: Updates service API and documentation - * This release adds support for load balancer and TLS/SSL certificate management. This set of APIs allows customers to create, manage, and scale secure load balanced applications on Lightsail infrastructure. To provide support for customers who manage their DNS on Lightsail, we've added the ability create an Alias A type record which can point to a load balancer DNS name via the CreateDomainEntry API http://docs.aws.amazon.com/lightsail/2016-11-28/api-reference/API_CreateDomainEntry.html. -* `service/ssm`: Updates service API and documentation - * This release updates AWS Systems Manager APIs to enable executing automations at controlled rate, target resources in a resource groups and execute entire automation at once or single step at a time. It is now also possible to use YAML, in addition to JSON, when creating Systems Manager documents. -* `service/waf`: Updates service API and documentation - * This release adds support for rule group and managed rule group. Rule group is a container of rules that customers can create, put rules in it and associate the rule group to a WebACL. All rules in a rule group will function identically as they would if each rule was individually associated to the WebACL. Managed rule group is a pre-configured rule group composed by our security partners and made available via the AWS Marketplace. Customers can subscribe to these managed rule groups, associate the managed rule group to their WebACL and start using them immediately to protect their resources. -* `service/waf-regional`: Updates service API and documentation - -Release v1.12.36 (2017-11-29) -=== - -### Service Client Updates -* `service/DeepInsight`: Adds new service -* `service/IronmanRuntime`: Adds new service -* `service/Orchestra - Laser`: Adds new service -* `service/SageMaker`: Adds new service -* `service/Shine`: Adds new service -* `service/archived.kinesisvideo`: Adds new service -* `service/data.kinesisvideo`: Adds new service -* `service/dynamodb`: Updates service API and documentation - * Amazon DynamoDB now supports the following features: Global Table and On-Demand Backup. Global Table is a fully-managed, multi-region, multi-master database. DynamoDB customers can now write anywhere and read anywhere with single-digit millisecond latency by performing database operations closest to where end users reside. Global Table also enables customers to disaster-proof their applications, keeping them running and data accessible even in the face of natural disasters or region disruptions. Customers can set up Global Table with just a few clicks in the AWS Management Console-no application rewrites required. On-Demand Backup capability is to protect data from loss due to application errors, and meet customers' archival needs for compliance and regulatory reasons. Customers can backup and restore their DynamoDB table data anytime, with a single-click in the AWS management console or a single API call. Backup and restore actions execute with zero impact on table performance or availability. For more information, see the Amazon DynamoDB Developer Guide. -* `service/ecs`: Updates service API and documentation - * Amazon Elastic Container Service (Amazon ECS) released a new launch type for running containers on a serverless infrastructure. The Fargate launch type allows you to run your containerized applications without the need to provision and manage the backend infrastructure. Just register your task definition and Fargate launches the container for you. -* `service/glacier`: Updates service API and documentation - * This release includes support for Glacier Select, a new feature that allows you to filter and analyze your Glacier archives and store the results in a user-specified S3 location. -* `service/greengrass`: Updates service API and documentation - * Greengrass OTA feature allows updating Greengrass Core and Greengrass OTA Agent. Local Resource Access feature allows Greengrass Lambdas to access local resources such as peripheral devices and volumes. -* `service/iot`: Updates service API and documentation - * This release adds support for a number of new IoT features, including AWS IoT Device Management (Jobs, Fleet Index and Thing Registration), Thing Groups, Policies on Thing Groups, Registry & Job Events, JSON Logs, Fine-Grained Logging Controls, Custom Authorization and AWS Service Authentication Using X.509 Certificates. -* `service/kinesisvideo`: Adds new service - * Announcing Amazon Kinesis Video Streams, a fully managed video ingestion and storage service. Kinesis Video Streams makes it easy to securely stream video from connected devices to AWS for machine learning, analytics, and processing. You can also stream other time-encoded data like RADAR and LIDAR signals using Kinesis Video Streams. -* `service/rekognition`: Updates service API, documentation, and paginators - * This release introduces Amazon Rekognition support for video analysis. -* `service/s3`: Updates service API and documentation - * This release includes support for Glacier Select, a new feature that allows you to filter and analyze your Glacier storage class objects and store the results in a user-specified S3 location. - -Release v1.12.35 (2017-11-29) -=== - -### Service Client Updates -* `service/AmazonMQ`: Adds new service -* `service/GuardDuty`: Adds new service -* `service/apigateway`: Updates service API and documentation - * Changes related to CanaryReleaseDeployment feature. Enables API developer to create a deployment as canary deployment and test API changes with percentage of customers before promoting changes to all customers. -* `service/batch`: Updates service API and documentation - * Add support for Array Jobs which allow users to easily submit many copies of a job with a single API call. This change also enhances the job dependency model to support N_TO_N and sequential dependency chains. The ListJobs and DescribeJobs APIs now have the ability to list or describe the status of entire Array Jobs or individual elements within the array. -* `service/cognito-idp`: Updates service API and documentation -* `service/deepdish`: Adds new service - * AWS AppSync is an enterprise-level, fully managed GraphQL service with real-time data synchronization and offline programming features. -* `service/ec2`: Updates service API and documentation - * Adds the following updates: 1. You are now able to host a service powered by AWS PrivateLink to provide private connectivity to other VPCs. You are now also able to create endpoints to other services powered by PrivateLink including AWS services, Marketplace Seller services or custom services created by yourself or other AWS VPC customers. 2. You are now able to save launch parameters in a single template that can be used with Auto Scaling, Spot Fleet, Spot, and On Demand instances. 3. You are now able to launch Spot instances via the RunInstances API, using a single additional parameter. RunInstances will response synchronously with an instance ID should capacity be available for your Spot request. 4. A simplified Spot pricing model which delivers low, predictable prices that adjust gradually, based on long-term trends in supply and demand. 5. Amazon EC2 Spot can now hibernate Amazon EBS-backed instances in the event of an interruption, so your workloads pick up from where they left off. Spot can fulfill your request by resuming instances from a hibernated state when capacity is available. -* `service/lambda`: Updates service API and documentation - * Lambda aliases can now shift traffic between two function versions, based on preassigned weights. - -Release v1.12.34 (2017-11-27) -=== - -### Service Client Updates -* `service/data.mediastore`: Adds new service -* `service/mediaconvert`: Adds new service - * AWS Elemental MediaConvert is a file-based video conversion service that transforms media into formats required for traditional broadcast and for internet streaming to multi-screen devices. -* `service/medialive`: Adds new service - * AWS Elemental MediaLive is a video service that lets you easily create live outputs for broadcast and streaming delivery. -* `service/mediapackage`: Adds new service - * AWS Elemental MediaPackage is a just-in-time video packaging and origination service that lets you format highly secure and reliable live outputs for a variety of devices. -* `service/mediastore`: Adds new service - * AWS Elemental MediaStore is an AWS storage service optimized for media. It gives you the performance, consistency, and low latency required to deliver live and on-demand video content. AWS Elemental MediaStore acts as the origin store in your video workflow. - -Release v1.12.33 (2017-11-22) -=== - -### Service Client Updates -* `service/acm`: Updates service API and documentation - * AWS Certificate Manager now supports the ability to import domainless certs and additional Key Types as well as an additional validation method for DNS. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.32 (2017-11-22) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * Add support for Access logs and customizable integration timeouts -* `service/cloudformation`: Updates service API and documentation - * 1) Instance-level parameter overrides (CloudFormation-StackSet feature): This feature will allow the customers to override the template parameters on specific stackInstances. Customers will also have ability to update their existing instances with/without parameter-overrides using a new API "UpdateStackInstances" 2) Add support for SSM parameters in CloudFormation - This feature will allow the customers to use Systems Manager parameters in CloudFormation templates. They will be able to see values for these parameters in Describe APIs. -* `service/codebuild`: Updates service API and documentation - * Adding support for accessing Amazon VPC resources from AWS CodeBuild, dependency caching and build badges. -* `service/elasticmapreduce`: Updates service API and documentation - * Enable Kerberos on Amazon EMR. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rekognition`: Updates service API and documentation - * This release includes updates to Amazon Rekognition for the following APIs. The new DetectText API allows you to recognize and extract textual content from images. Face Model Versioning has been added to operations that deal with face detection. -* `service/shield`: Updates service API, documentation, and paginators - * The AWS Shield SDK has been updated in order to support Elastic IP address protections, the addition of AttackProperties objects in DescribeAttack responses, and a new GetSubscriptionState operation. -* `service/storagegateway`: Updates service API and documentation - * AWS Storage Gateway now enables you to get notification when all your files written to your NFS file share have been uploaded to Amazon S3. Storage Gateway also enables guessing of the MIME type for uploaded objects based on file extensions. -* `service/xray`: Updates service API, documentation, and paginators - * Added automatic pagination support for AWS X-Ray APIs in the SDKs that support this feature. - -Release v1.12.31 (2017-11-20) -=== - -### Service Client Updates -* `service/apigateway`: Updates service documentation - * Documentation updates for Apigateway -* `service/codecommit`: Updates service API, documentation, and paginators - * AWS CodeCommit now supports pull requests. You can use pull requests to collaboratively review code changes for minor changes or fixes, major feature additions, or new versions of your released software. -* `service/firehose`: Updates service API and documentation - * This release includes a new Kinesis Firehose feature that supports Splunk as Kinesis Firehose delivery destination. You can now use Kinesis Firehose to ingest real-time data to Splunk in a serverless, reliable, and salable manner. This release also includes a new feature that allows you to configure Lambda buffer size in Kinesis Firehose data transformation feature. You can now customize the data buffer size before invoking Lambda function in Kinesis Firehose for data transformation. This feature allows you to flexibly trade-off processing and delivery latency with cost and efficiency based on your specific use cases and requirements. -* `service/iis`: Adds new service - * The AWS Cost Explorer API gives customers programmatic access to AWS cost and usage information, allowing them to perform adhoc queries and build interactive cost management applications that leverage this dataset. -* `service/kinesis`: Updates service API and documentation - * Customers can now obtain the important characteristics of their stream with DescribeStreamSummary. The response will not include the shard list for the stream but will have the number of open shards, and all the other fields included in the DescribeStream response. -* `service/workdocs`: Updates service API and documentation - * DescribeGroups API and miscellaneous enhancements - -### SDK Bugs -* `aws/client`: Retry delays for throttled exception were not limited to 5 mintues [#1654](https://github.com/aws/aws-sdk-go/pull/1654) - * Fixes [#1653](https://github.com/aws/aws-sdk-go/issues/1653) -Release v1.12.30 (2017-11-17) -=== - -### Service Client Updates -* `service/application-autoscaling`: Updates service API and documentation -* `service/dms`: Updates service API, documentation, and paginators - * Support for migration task assessment. Support for data validation after the migration. -* `service/elasticloadbalancingv2`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service API and documentation - * Amazon RDS now supports importing MySQL databases by using backup files from Amazon S3. -* `service/s3`: Updates service API - * Added ORC to the supported S3 Inventory formats. - -### SDK Bugs -* `private/protocol/restjson`: Define JSONValue marshaling for body and querystring ([#1640](https://github.com/aws/aws-sdk-go/pull/1640)) - * Adds support for APIs which use JSONValue for body and querystring targets. - * Fixes [#1636](https://github.com/aws/aws-sdk-go/issues/1636) -Release v1.12.29 (2017-11-16) -=== - -### Service Client Updates -* `service/application-autoscaling`: Updates service API and documentation -* `service/ec2`: Updates service API - * You are now able to create and launch EC2 x1e smaller instance sizes -* `service/glue`: Updates service API and documentation - * API update for AWS Glue. New crawler configuration attribute enables customers to specify crawler behavior. New XML classifier enables classification of XML data. -* `service/opsworkscm`: Updates service API, documentation, and waiters - * Documentation updates for OpsWorks-cm: a new feature, OpsWorks for Puppet Enterprise, that allows users to create and manage OpsWorks-hosted Puppet Enterprise servers. -* `service/organizations`: Updates service API, documentation, and paginators - * This release adds APIs that you can use to enable and disable integration with AWS services designed to work with AWS Organizations. This integration allows the AWS service to perform operations on your behalf on all of the accounts in your organization. Although you can use these APIs yourself, we recommend that you instead use the commands provided in the other AWS service to enable integration with AWS Organizations. -* `service/route53`: Updates service API and documentation - * You can use Route 53's GetAccountLimit/GetHostedZoneLimit/GetReusableDelegationSetLimit APIs to view your current limits (including custom set limits) on Route 53 resources such as hosted zones and health checks. These APIs also return the number of each resource you're currently using to enable comparison against your current limits. - -Release v1.12.28 (2017-11-15) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * 1. Extended GetDocumentationParts operation to support retrieving documentation parts resources without contents. 2. Added hosted zone ID in the custom domain response. -* `service/email`: Updates service API, documentation, and examples - * SES launches Configuration Set Reputation Metrics and Email Pausing Today, two features that build upon the capabilities of the reputation dashboard. The first is the ability to export reputation metrics for individual configuration sets. The second is the ability to temporarily pause email sending, either at the configuration set level, or across your entire Amazon SES account. -* `service/polly`: Updates service API - * Amazon Polly adds Korean language support with new female voice - "Seoyeon" and new Indian English female voice - "Aditi" -* `service/states`: Updates service API and documentation - * You can now use the UpdateStateMachine API to update your state machine definition and role ARN. Existing executions will continue to use the previous definition and role ARN. You can use the DescribeStateMachineForExecution API to determine which state machine definition and role ARN is associated with an execution - -Release v1.12.27 (2017-11-14) -=== - -### Service Client Updates -* `service/ecs`: Updates service API and documentation - * Added new mode for Task Networking in ECS, called awsvpc mode. Mode configuration parameters to be passed in via awsvpcConfiguration. Updated APIs now use/show this new mode - RegisterTaskDefinition, CreateService, UpdateService, RunTask, StartTask. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lightsail`: Updates service API and documentation - * Lightsail now supports attached block storage, which allows you to scale your applications and protect application data with additional SSD-backed storage disks. This feature allows Lightsail customers to attach secure storage disks to their Lightsail instances and manage their attached disks, including creating and deleting disks, attaching and detaching disks from instances, and backing up disks via snapshot. -* `service/route53`: Updates service API and documentation - * When a Route 53 health check or hosted zone is created by a linked AWS service, the object now includes information about the service that created it. Hosted zones or health checks that are created by a linked service can't be updated or deleted using Route 53. -* `service/ssm`: Updates service API and documentation - * EC2 Systems Manager GetInventory API adds support for aggregation. - -### SDK Enhancements -* `aws/request`: Remove default port from HTTP host header ([#1618](https://github.com/aws/aws-sdk-go/pull/1618)) - * Updates the SDK to automatically remove default ports based on the URL's scheme when setting the HTTP Host header's value. - * Fixes [#1537](https://github.com/aws/aws-sdk-go/issues/1537) - -Release v1.12.26 (2017-11-09) -=== - -### Service Client Updates -* `service/ec2`: Updates service API and documentation - * Introduces the following features: 1. Create a default subnet in an Availability Zone if no default subnet exists. 2. Spot Fleet integrates with Elastic Load Balancing to enable you to attach one or more load balancers to a Spot Fleet request. When you attach the load balancer, it automatically registers the instance in the Spot Fleet to the load balancers which distributes incoming traffic across the instances. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.25 (2017-11-08) -=== - -### Service Client Updates -* `service/application-autoscaling`: Updates service API and documentation -* `service/batch`: Updates service documentation - * Documentation updates for AWS Batch. -* `service/ec2`: Updates service API and documentation - * AWS PrivateLink for Amazon Services - Customers can now privately access Amazon services from their Amazon Virtual Private Cloud (VPC), without using public IPs, and without requiring the traffic to traverse across the Internet. -* `service/elasticache`: Updates service API and documentation - * This release adds online resharding for ElastiCache for Redis offering, providing the ability to add and remove shards from a running cluster. Developers can now dynamically scale-out or scale-in their Redis cluster workloads to adapt to changes in demand. ElastiCache will resize the cluster by adding or removing shards and redistribute hash slots uniformly across the new shard configuration, all while the cluster continues to stay online and serves requests. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.24 (2017-11-07) -=== - -### Service Client Updates -* `service/elasticloadbalancingv2`: Updates service documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service API and documentation - * DescribeOrderableDBInstanceOptions now returns the minimum and maximum allowed values for storage size, total provisioned IOPS, and provisioned IOPS per GiB for a DB instance. -* `service/s3`: Updates service API, documentation, and examples - * This releases adds support for 4 features: 1. Default encryption for S3 Bucket, 2. Encryption status in inventory and Encryption support for inventory. 3. Cross region replication of KMS-encrypted objects, and 4. ownership overwrite for CRR. - -Release v1.12.23 (2017-11-07) -=== - -### Service Client Updates -* `service/api.pricing`: Adds new service -* `service/ec2`: Updates service API - * You are now able to create and launch EC2 C5 instances, the next generation of EC2's compute-optimized instances, in us-east-1, us-west-2 and eu-west-1. C5 instances offer up to 72 vCPUs, 144 GiB of DDR4 instance memory, 25 Gbps in Network bandwidth and improved EBS and Networking bandwidth on smaller instance sizes to deliver improved performance for compute-intensive workloads. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/kms`: Updates service API, documentation, and examples - * Documentation updates for AWS KMS. -* `service/organizations`: Updates service documentation - * This release updates permission statements for several API operations, and corrects some other minor errors. -* `service/states`: Updates service API, documentation, and paginators - * Documentation update. - -Release v1.12.22 (2017-11-03) -=== - -### Service Client Updates -* `service/ecs`: Updates service API and documentation - * Amazon ECS users can now add devices to their containers and enable init process in containers through the use of docker's 'devices' and 'init' features. These fields can be specified under linuxParameters in ContainerDefinition in the Task Definition Template. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.21 (2017-11-02) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * This release supports creating and managing Regional and Edge-Optimized API endpoints. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -### SDK Bugs -* `aws/request`: Fix bug in request presign creating invalide URL ([#1624](https://github.com/aws/aws-sdk-go/pull/1624)) - * Fixes a bug the Request Presign and PresignRequest methods that would allow a invalid expire duration as input. A expire time of 0 would be interpreted by the SDK to generate a normal request signature, not a presigned URL. This caused the returned URL unusable. - * Fixes [#1617](https://github.com/aws/aws-sdk-go/issues/1617) -Release v1.12.20 (2017-11-01) -=== - -### Service Client Updates -* `service/acm`: Updates service documentation - * Documentation updates for ACM -* `service/cloudhsmv2`: Updates service documentation - * Minor documentation update for AWS CloudHSM (cloudhsmv2). -* `service/directconnect`: Updates service API and documentation - * AWS DirectConnect now provides support for Global Access for Virtual Private Cloud (VPC) via a new feature called Direct Connect Gateway. A Direct Connect Gateway will allow you to group multiple Direct Connect Private Virtual Interfaces (DX-VIF) and Private Virtual Gateways (VGW) from different AWS regions (but belonging to the same AWS Account) and pass traffic from any DX-VIF to any VPC in the grouping. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -### SDK Enhancements -* `aws/client`: Adding status code 429 to throttlable status codes in default retryer (#1621) - -Release v1.12.19 (2017-10-26) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.18 (2017-10-26) -=== - -### Service Client Updates -* `service/cloudfront`: Updates service API and documentation - * You can now specify additional options for MinimumProtocolVersion, which controls the SSL/TLS protocol that CloudFront uses to communicate with viewers. The minimum protocol version that you choose also determines the ciphers that CloudFront uses to encrypt the content that it returns to viewers. -* `service/ec2`: Updates service API - * You are now able to create and launch EC2 P3 instance, next generation GPU instances, optimized for machine learning and high performance computing applications. With up to eight NVIDIA Tesla V100 GPUs, P3 instances provide up to one petaflop of mixed-precision, 125 teraflops of single-precision, and 62 teraflops of double-precision floating point performance, as well as a 300 GB/s second-generation NVLink interconnect that enables high-speed, low-latency GPU-to-GPU communication. P3 instances also feature up to 64 vCPUs based on custom Intel Xeon E5 (Broadwell) processors, 488 GB of DRAM, and 25 Gbps of dedicated aggregate network bandwidth using the Elastic Network Adapter (ENA). -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.17 (2017-10-24) -=== - -### Service Client Updates -* `service/config`: Updates service API -* `service/elasticache`: Updates service API, documentation, and examples - * Amazon ElastiCache for Redis today announced support for data encryption both for data in-transit and data at-rest. The new encryption in-transit functionality enables ElastiCache for Redis customers to encrypt data for all communication between clients and Redis engine, and all intra-cluster Redis communication. The encryption at-rest functionality allows customers to encrypt their S3 based backups. Customers can begin using the new functionality by simply enabling this functionality via AWS console, and a small configuration change in their Redis clients. The ElastiCache for Redis service automatically manages life cycle of the certificates required for encryption, including the issuance, renewal and expiration of certificates. Additionally, as part of this launch, customers will gain the ability to start using the Redis AUTH command that provides an added level of authentication. -* `service/glue`: Adds new service - * AWS Glue: Adding a new API, BatchStopJobRun, to stop one or more job runs for a specified Job. -* `service/pinpoint`: Updates service API and documentation - * Added support for APNs VoIP messages. Added support for collapsible IDs, message priority, and TTL for APNs and FCM/GCM. - -Release v1.12.16 (2017-10-23) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/organizations`: Updates service API and documentation - * This release supports integrating other AWS services with AWS Organizations through the use of an IAM service-linked role called AWSServiceRoleForOrganizations. Certain operations automatically create that role if it does not already exist. - -Release v1.12.15 (2017-10-20) -=== - -### Service Client Updates -* `service/ec2`: Updates service API and documentation - * Adding pagination support for DescribeSecurityGroups for EC2 Classic and VPC Security Groups - -Release v1.12.14 (2017-10-19) -=== - -### Service Client Updates -* `service/sqs`: Updates service API and documentation - * Added support for tracking cost allocation by adding, updating, removing, and listing the metadata tags of Amazon SQS queues. -* `service/ssm`: Updates service API and documentation - * EC2 Systems Manager versioning support for Parameter Store. Also support for referencing parameter versions in SSM Documents. - -Release v1.12.13 (2017-10-18) -=== - -### Service Client Updates -* `service/lightsail`: Updates service API and documentation - * This release adds support for Windows Server-based Lightsail instances. The GetInstanceAccessDetails API now returns the password of your Windows Server-based instance when using the default key pair. GetInstanceAccessDetails also returns a PasswordData object for Windows Server instances containing the ciphertext and keyPairName. The Blueprint data type now includes a list of platform values (LINUX_UNIX or WINDOWS). The Bundle data type now includes a list of SupportedPlatforms values (LINUX_UNIX or WINDOWS). - -Release v1.12.12 (2017-10-17) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/es`: Updates service API and documentation - * This release adds support for VPC access to Amazon Elasticsearch Service. - * This release adds support for VPC access to Amazon Elasticsearch Service. - -Release v1.12.11 (2017-10-16) -=== - -### Service Client Updates -* `service/cloudhsm`: Updates service API and documentation - * Documentation updates for AWS CloudHSM Classic. -* `service/ec2`: Updates service API and documentation - * You can now change the tenancy of your VPC from dedicated to default with a single API operation. For more details refer to the documentation for changing VPC tenancy. -* `service/es`: Updates service API and documentation - * AWS Elasticsearch adds support for enabling slow log publishing. Using slow log publishing options customers can configure and enable index/query slow log publishing of their domain to preferred AWS Cloudwatch log group. -* `service/rds`: Updates service API and waiters - * Adds waiters for DBSnapshotAvailable and DBSnapshotDeleted. -* `service/waf`: Updates service API and documentation - * This release adds support for regular expressions as match conditions in rules, and support for geographical location by country of request IP address as a match condition in rules. -* `service/waf-regional`: Updates service API and documentation - -Release v1.12.10 (2017-10-12) -=== - -### Service Client Updates -* `service/codecommit`: Updates service API and documentation - * This release includes the DeleteBranch API and a change to the contents of a Commit object. -* `service/dms`: Updates service API and documentation - * This change includes addition of new optional parameter to an existing API -* `service/elasticbeanstalk`: Updates service API and documentation - * Added the ability to add, delete or update Tags -* `service/polly`: Updates service API - * Amazon Polly exposes two new voices: "Matthew" (US English) and "Takumi" (Japanese) -* `service/rds`: Updates service API and documentation - * You can now call DescribeValidDBInstanceModifications to learn what modifications you can make to your DB instance. You can use this information when you call ModifyDBInstance. - -Release v1.12.9 (2017-10-11) -=== - -### Service Client Updates -* `service/ecr`: Updates service API, documentation, and paginators - * Adds support for new API set used to manage Amazon ECR repository lifecycle policies. Amazon ECR lifecycle policies enable you to specify the lifecycle management of images in a repository. The configuration is a set of one or more rules, where each rule defines an action for Amazon ECR to apply to an image. This allows the automation of cleaning up unused images, for example expiring images based on age or status. A lifecycle policy preview API is provided as well, which allows you to see the impact of a lifecycle policy on an image repository before you execute it -* `service/email`: Updates service API and documentation - * Added content related to email template management and templated email sending operations. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.12.8 (2017-10-10) -=== - -### Service Client Updates -* `service/ec2`: Updates service API and documentation - * This release includes updates to AWS Virtual Private Gateway. -* `service/elasticloadbalancingv2`: Updates service API and documentation -* `service/opsworkscm`: Updates service API and documentation - * Provide engine specific information for node associations. - -Release v1.12.7 (2017-10-06) -=== - -### Service Client Updates -* `service/sqs`: Updates service documentation - * Documentation updates regarding availability of FIFO queues and miscellaneous corrections. - -Release v1.12.6 (2017-10-05) -=== - -### Service Client Updates -* `service/redshift`: Updates service API and documentation - * DescribeEventSubscriptions API supports tag keys and tag values as request parameters. - -Release v1.12.5 (2017-10-04) -=== - -### Service Client Updates -* `service/kinesisanalytics`: Updates service API and documentation - * Kinesis Analytics now supports schema discovery on objects in S3. Additionally, Kinesis Analytics now supports input data preprocessing through Lambda. -* `service/route53domains`: Updates service API and documentation - * Added a new API that checks whether a domain name can be transferred to Amazon Route 53. - -### SDK Bugs -* `service/s3/s3crypto`: Correct PutObjectRequest documentation ([#1568](https://github.com/aws/aws-sdk-go/pull/1568)) - * s3Crypto's PutObjectRequest docstring example was using an incorrect value. Corrected the type used in the example. -Release v1.12.4 (2017-10-03) -=== - -### Service Client Updates -* `service/ec2`: Updates service API, documentation, and waiters - * This release includes service updates to AWS VPN. -* `service/ssm`: Updates service API and documentation - * EC2 Systems Manager support for tagging SSM Documents. Also support for tag-based permissions to restrict access to SSM Documents based on these tags. - -Release v1.12.3 (2017-10-02) -=== - -### Service Client Updates -* `service/cloudhsm`: Updates service documentation and paginators - * Documentation updates for CloudHSM - -Release v1.12.2 (2017-09-29) -=== - -### Service Client Updates -* `service/appstream`: Updates service API and documentation - * Includes APIs for managing and accessing image builders, and deleting images. -* `service/codebuild`: Updates service API and documentation - * Adding support for Building GitHub Pull Requests in AWS CodeBuild -* `service/mturk-requester`: Updates service API and documentation -* `service/organizations`: Updates service API and documentation - * This release flags the HandshakeParty structure's Type and Id fields as 'required'. They effectively were required in the past, as you received an error if you did not include them. This is now reflected at the API definition level. -* `service/route53`: Updates service API and documentation - * This change allows customers to reset elements of health check. - -### SDK Bugs -* `private/protocol/query`: Fix query protocol handling of nested byte slices ([#1557](https://github.com/aws/aws-sdk-go/issues/1557)) - * Fixes the query protocol to correctly marshal nested []byte values of API operations. -* `service/s3`: Fix PutObject and UploadPart API to include ContentMD5 field ([#1559](https://github.com/aws/aws-sdk-go/pull/1559)) - * Fixes the SDK's S3 PutObject and UploadPart API code generation to correctly render the ContentMD5 field into the associated input types for these two API operations. - * Fixes [#1553](https://github.com/aws/aws-sdk-go/pull/1553) -Release v1.12.1 (2017-09-27) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/pinpoint`: Updates service API and documentation - * Added two new push notification channels: Amazon Device Messaging (ADM) and, for push notification support in China, Baidu Cloud Push. Added support for APNs auth via .p8 key file. Added operation for direct message deliveries to user IDs, enabling you to message an individual user on multiple endpoints. - -Release v1.12.0 (2017-09-26) -=== - -### SDK Bugs -* `API Marshaler`: Revert REST JSON and XML protocol marshaler improvements - * Bug [#1550](https://github.com/aws/aws-sdk-go/issues/1550) identified a missed condition in the Amazon Route 53 RESTXML protocol marshaling causing requests to that service to fail. Reverting the marshaler improvements until the bug can be fixed. - -Release v1.11.0 (2017-09-26) -=== - -### Service Client Updates -* `service/cloudformation`: Updates service API and documentation - * You can now prevent a stack from being accidentally deleted by enabling termination protection on the stack. If you attempt to delete a stack with termination protection enabled, the deletion fails and the stack, including its status, remains unchanged. You can enable termination protection on a stack when you create it. Termination protection on stacks is disabled by default. After creation, you can set termination protection on a stack whose status is CREATE_COMPLETE, UPDATE_COMPLETE, or UPDATE_ROLLBACK_COMPLETE. - -### SDK Features -* Add dep Go dependency management metadata files (#1544) - * Adds the Go `dep` dependency management metadata files to the SDK. - * Fixes [#1451](https://github.com/aws/aws-sdk-go/issues/1451) - * Fixes [#634](https://github.com/aws/aws-sdk-go/issues/634) -* `service/dynamodb/expression`: Add expression building utility for DynamoDB ([#1527](https://github.com/aws/aws-sdk-go/pull/1527)) - * Adds a new package, expression, to the SDK providing builder utilities to create DynamoDB expressions safely taking advantage of type safety. -* `API Marshaler`: Add generated marshalers for RESTXML protocol ([#1409](https://github.com/aws/aws-sdk-go/pull/1409)) - * Updates the RESTXML protocol marshaler to use generated code instead of reflection for REST XML based services. -* `API Marshaler`: Add generated marshalers for RESTJSON protocol ([#1547](https://github.com/aws/aws-sdk-go/pull/1547)) - * Updates the RESTJSON protocol marshaler to use generated code instead of reflection for REST JSON based services. - -### SDK Enhancements -* `private/protocol`: Update format of REST JSON and XMl benchmarks ([#1546](https://github.com/aws/aws-sdk-go/pull/1546)) - * Updates the format of the REST JSON and XML benchmarks to be readable. RESTJSON benchmarks were updated to more accurately bench building of the protocol. - -Release v1.10.51 (2017-09-22) -=== - -### Service Client Updates -* `service/config`: Updates service API and documentation -* `service/ecs`: Updates service API and documentation - * Amazon ECS users can now add and drop Linux capabilities to their containers through the use of docker's cap-add and cap-drop features. Customers can specify the capabilities they wish to add or drop for each container in their task definition. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service documentation - * Documentation updates for rds - -Release v1.10.50 (2017-09-21) -=== - -### Service Client Updates -* `service/budgets`: Updates service API - * Including "DuplicateRecordException" in UpdateNotification and UpdateSubscriber. -* `service/ec2`: Updates service API and documentation - * Add EC2 APIs to copy Amazon FPGA Images (AFIs) within the same region and across multiple regions, delete AFIs, and modify AFI attributes. AFI attributes include name, description and granting/denying other AWS accounts to load the AFI. -* `service/logs`: Updates service API and documentation - * Adds support for associating LogGroups with KMS Keys. - -### SDK Bugs -* Fix greengrass service model being duplicated with different casing. ([#1541](https://github.com/aws/aws-sdk-go/pull/1541)) - * Fixes [#1540](https://github.com/aws/aws-sdk-go/issues/1540) - * Fixes [#1539](https://github.com/aws/aws-sdk-go/issues/1539) -Release v1.10.49 (2017-09-20) -=== - -### Service Client Updates -* `service/Greengrass`: Adds new service -* `service/appstream`: Updates service API and documentation - * API updates for supporting On-Demand fleets. -* `service/codepipeline`: Updates service API and documentation - * This change includes a PipelineMetadata object that is part of the output from the GetPipeline API that includes the Pipeline ARN, created, and updated timestamp. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service API and documentation - * Introduces the --option-group-name parameter to the ModifyDBSnapshot CLI command. You can specify this parameter when you upgrade an Oracle DB snapshot. The same option group considerations apply when upgrading a DB snapshot as when upgrading a DB instance. For more information, see http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Oracle.html#USER_UpgradeDBInstance.Oracle.OGPG.OG -* `service/runtime.lex`: Updates service API and documentation - -Release v1.10.48 (2017-09-19) -=== - -### Service Client Updates -* `service/ec2`: Updates service API - * Fixed bug in EC2 clients preventing ElasticGpuSet from being set. - -### SDK Enhancements -* `aws/credentials`: Add EnvProviderName constant. ([#1531](https://github.com/aws/aws-sdk-go/issues/1531)) - * Adds the "EnvConfigCredentials" string literal as EnvProviderName constant. - * Fixes [#1444](https://github.com/aws/aws-sdk-go/issues/1444) - -Release v1.10.47 (2017-09-18) -=== - -### Service Client Updates -* `service/ec2`: Updates service API and documentation - * Amazon EC2 now lets you opt for Spot instances to be stopped in the event of an interruption instead of being terminated. Your Spot request can be fulfilled again by restarting instances from a previously stopped state, subject to availability of capacity at or below your preferred price. When you submit a persistent Spot request, you can choose from "terminate" or "stop" as the instance interruption behavior. Choosing "stop" will shutdown your Spot instances so you can continue from this stopped state later on. This feature is only available for instances with Amazon EBS volume as their root device. -* `service/email`: Updates service API and documentation - * Amazon Simple Email Service (Amazon SES) now lets you customize the domains used for tracking open and click events. Previously, open and click tracking links referred to destinations hosted on domains operated by Amazon SES. With this feature, you can use your own branded domains for capturing open and click events. -* `service/iam`: Updates service API and documentation - * A new API, DeleteServiceLinkedRole, submits a service-linked role deletion request and returns a DeletionTaskId, which you can use to check the status of the deletion. - -Release v1.10.46 (2017-09-15) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * Add a new enum "REQUEST" to '--type ' field in the current create-authorizer API, and make "identitySource" optional. - -Release v1.10.45 (2017-09-14) -=== - -### Service Client Updates -* `service/codebuild`: Updates service API and documentation - * Supporting Parameter Store in environment variables for AWS CodeBuild -* `service/organizations`: Updates service documentation - * Documentation updates for AWS Organizations -* `service/servicecatalog`: Updates service API, documentation, and paginators - * This release of Service Catalog adds API support to copy products. - -Release v1.10.44 (2017-09-13) -=== - -### Service Client Updates -* `service/autoscaling`: Updates service API and documentation - * Customers can create Life Cycle Hooks at the time of creating Auto Scaling Groups through the CreateAutoScalingGroup API -* `service/batch`: Updates service documentation and examples - * Documentation updates for batch -* `service/ec2`: Updates service API - * You are now able to create and launch EC2 x1e.32xlarge instance, a new EC2 instance in the X1 family, in us-east-1, us-west-2, eu-west-1, and ap-northeast-1. x1e.32xlarge offers 128 vCPUs, 3,904 GiB of DDR4 instance memory, high memory bandwidth, large L3 caches, and leading reliability capabilities to boost the performance and reliability of in-memory applications. -* `service/events`: Updates service API and documentation - * Exposes ConcurrentModificationException as one of the valid exceptions for PutPermission and RemovePermission operation. - -### SDK Enhancements -* `service/autoscaling`: Fix documentation for PutScalingPolicy.AutoScalingGroupName [#1522](https://github.com/aws/aws-sdk-go/pull/1522) -* `service/s3/s3manager`: Clarify S3 Upload manager Concurrency config [#1521](https://github.com/aws/aws-sdk-go/pull/1521) - * Fixes [#1458](https://github.com/aws/aws-sdk-go/issues/1458) -* `service/dynamodb/dynamodbattribute`: Add support for time alias. [#1520](https://github.com/aws/aws-sdk-go/pull/1520) - * Related to [#1505](https://github.com/aws/aws-sdk-go/pull/1505) - -Release v1.10.43 (2017-09-12) -=== - -### Service Client Updates -* `service/ec2`: Updates service API - * Fixed bug in EC2 clients preventing HostOfferingSet from being set -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.10.42 (2017-09-12) -=== - -### Service Client Updates -* `service/devicefarm`: Updates service API and documentation - * DeviceFarm has added support for two features - RemoteDebugging and Customer Artifacts. Customers can now do remote Debugging on their Private Devices and can now retrieve custom files generated by their tests on the device and the device host (execution environment) on both public and private devices. - -Release v1.10.41 (2017-09-08) -=== - -### Service Client Updates -* `service/logs`: Updates service API and documentation - * Adds support for the PutResourcePolicy, DescribeResourcePolicy and DeleteResourcePolicy APIs. - -Release v1.10.40 (2017-09-07) -=== - -### Service Client Updates -* `service/application-autoscaling`: Updates service documentation -* `service/ec2`: Updates service API and documentation - * With Tagging support, you can add Key and Value metadata to search, filter and organize your NAT Gateways according to your organization's needs. -* `service/elasticloadbalancingv2`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lex-models`: Updates service API and documentation -* `service/route53`: Updates service API and documentation - * You can configure Amazon Route 53 to log information about the DNS queries that Amazon Route 53 receives for your domains and subdomains. When you configure query logging, Amazon Route 53 starts to send logs to CloudWatch Logs. You can use various tools, including the AWS console, to access the query logs. - -Release v1.10.39 (2017-09-06) -=== - -### Service Client Updates -* `service/budgets`: Updates service API and documentation - * Add an optional "thresholdType" to notifications to support percentage or absolute value thresholds. - -Release v1.10.38 (2017-09-05) -=== - -### Service Client Updates -* `service/codestar`: Updates service API and documentation - * Added support to tag CodeStar projects. Tags can be used to organize and find CodeStar projects on key-value pairs that you can choose. For example, you could add a tag with a key of "Release" and a value of "Beta" to projects your organization is working on for an upcoming beta release. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.10.37 (2017-09-01) -=== - -### Service Client Updates -* `service/MobileHub`: Adds new service -* `service/gamelift`: Updates service API and documentation - * GameLift VPC resources can be peered with any other AWS VPC. R4 memory-optimized instances now available to deploy. -* `service/ssm`: Updates service API and documentation - * Adding KMS encryption support to SSM Inventory Resource Data Sync. Exposes the ClientToken parameter on SSM StartAutomationExecution to provide idempotent execution requests. - -Release v1.10.36 (2017-08-31) -=== - -### Service Client Updates -* `service/codebuild`: Updates service API, documentation, and examples - * The AWS CodeBuild HTTP API now provides the BatchDeleteBuilds operation, which enables you to delete existing builds. -* `service/ec2`: Updates service API and documentation - * Descriptions for Security Group Rules enables customers to be able to define a description for ingress and egress security group rules . The Descriptions for Security Group Rules feature supports one description field per Security Group rule for both ingress and egress rules . Descriptions for Security Group Rules provides a simple way to describe the purpose or function of a Security Group Rule allowing for easier customer identification of configuration elements . Prior to the release of Descriptions for Security Group Rules , customers had to maintain a separate system outside of AWS if they wanted to track Security Group Rule mapping and their purpose for being implemented. If a security group rule has already been created and you would like to update or change your description for that security group rule you can use the UpdateSecurityGroupRuleDescription API. -* `service/elasticloadbalancingv2`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lex-models`: Updates service API and documentation - -### SDK Bugs -* `aws/signer/v4`: Revert [#1491](https://github.com/aws/aws-sdk-go/issues/1491) as change conflicts with an undocumented AWS v4 signature test case. - * Related to: [#1495](https://github.com/aws/aws-sdk-go/issues/1495). -Release v1.10.35 (2017-08-30) -=== - -### Service Client Updates -* `service/application-autoscaling`: Updates service API and documentation -* `service/organizations`: Updates service API and documentation - * The exception ConstraintViolationException now contains a new reason subcode MASTERACCOUNT_MISSING_CONTACT_INFO to make it easier to understand why attempting to remove an account from an Organization can fail. We also improved several other of the text descriptions and examples. - -Release v1.10.34 (2017-08-29) -=== - -### Service Client Updates -* `service/config`: Updates service API and documentation -* `service/ec2`: Updates service API and documentation - * Provides capability to add secondary CIDR blocks to a VPC. - -### SDK Bugs -* `aws/signer/v4`: Fix Signing Unordered Multi Value Query Parameters ([#1491](https://github.com/aws/aws-sdk-go/pull/1491)) - * Removes sorting of query string values when calculating v4 signing as this is not part of the spec. The spec only requires the keys, not values, to be sorted which is achieved by Query.Encode(). -Release v1.10.33 (2017-08-25) -=== - -### Service Client Updates -* `service/cloudformation`: Updates service API and documentation - * Rollback triggers enable you to have AWS CloudFormation monitor the state of your application during stack creation and updating, and to roll back that operation if the application breaches the threshold of any of the alarms you've specified. -* `service/gamelift`: Updates service API - * Update spelling of MatchmakingTicket status values for internal consistency. -* `service/rds`: Updates service API and documentation - * Option group options now contain additional properties that identify requirements for certain options. Check these properties to determine if your DB instance must be in a VPC or have auto minor upgrade turned on before you can use an option. Check to see if you can downgrade the version of an option after you have installed it. - -### SDK Enhancements -* `example/service/ec2`: Add EC2 list instances example ([#1492](https://github.com/aws/aws-sdk-go/pull/1492)) - -Release v1.10.32 (2017-08-25) -=== - -### Service Client Updates -* `service/rekognition`: Updates service API, documentation, and examples - * Update the enum value of LandmarkType and GenderType to be consistent with service response - -Release v1.10.31 (2017-08-23) -=== - -### Service Client Updates -* `service/appstream`: Updates service documentation - * Documentation updates for appstream -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.10.30 (2017-08-22) -=== - -### Service Client Updates -* `service/ssm`: Updates service API and documentation - * Changes to associations in Systems Manager State Manager can now be recorded. Previously, when you edited associations, you could not go back and review older association settings. Now, associations are versioned, and can be named using human-readable strings, allowing you to see a trail of association changes. You can also perform rate-based scheduling, which allows you to schedule associations more granularly. - -Release v1.10.29 (2017-08-21) -=== - -### Service Client Updates -* `service/firehose`: Updates service API, documentation, and paginators - * This change will allow customers to attach a Firehose delivery stream to an existing Kinesis stream directly. You no longer need a forwarder to move data from a Kinesis stream to a Firehose delivery stream. You can now run your streaming applications on your Kinesis stream and easily attach a Firehose delivery stream to it for data delivery to S3, Redshift, or Elasticsearch concurrently. -* `service/route53`: Updates service API and documentation - * Amazon Route 53 now supports CAA resource record type. A CAA record controls which certificate authorities are allowed to issue certificates for the domain or subdomain. - -Release v1.10.28 (2017-08-18) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.10.27 (2017-08-16) -=== - -### Service Client Updates -* `service/gamelift`: Updates service API and documentation - * The Matchmaking Grouping Service is a new feature that groups player match requests for a given game together into game sessions based on developer configured rules. - -### SDK Enhancements -* `aws/arn`: aws/arn: Package for parsing and producing ARNs ([#1463](https://github.com/aws/aws-sdk-go/pull/1463)) - * Adds the `arn` package for AWS ARN parsing and building. Use this package to build AWS ARNs for services such as outlined in the [documentation](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html). - -### SDK Bugs -* `aws/signer/v4`: Correct V4 presign signature to include content sha25 in URL ([#1469](https://github.com/aws/aws-sdk-go/pull/1469)) - * Updates the V4 signer so that when a Presign is generated the `X-Amz-Content-Sha256` header is added to the query string instead of being required to be in the header. This allows you to generate presigned URLs for GET requests, e.g S3.GetObject that do not require additional headers to be set by the downstream users of the presigned URL. - * Related To: [#1467](https://github.com/aws/aws-sdk-go/issues/1467) - -Release v1.10.26 (2017-08-15) -=== - -### Service Client Updates -* `service/ec2`: Updates service API - * Fixed bug in EC2 clients preventing HostReservation from being set -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.10.25 (2017-08-14) -=== - -### Service Client Updates -* `service/AWS Glue`: Adds new service -* `service/batch`: Updates service API and documentation - * This release enhances the DescribeJobs API to include the CloudWatch logStreamName attribute in ContainerDetail and ContainerDetailAttempt -* `service/cloudhsmv2`: Adds new service - * CloudHSM provides hardware security modules for protecting sensitive data and cryptographic keys within an EC2 VPC, and enable the customer to maintain control over key access and use. This is a second-generation of the service that will improve security, lower cost and provide better customer usability. -* `service/elasticfilesystem`: Updates service API, documentation, and paginators - * Customers can create encrypted EFS file systems and specify a KMS master key to encrypt it with. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/mgh`: Adds new service - * AWS Migration Hub provides a single location to track migrations across multiple AWS and partner solutions. Using Migration Hub allows you to choose the AWS and partner migration tools that best fit your needs, while providing visibility into the status of your entire migration portfolio. Migration Hub also provides key metrics and progress for individual applications, regardless of which tools are being used to migrate them. For example, you might use AWS Database Migration Service, AWS Server Migration Service, and partner migration tools to migrate an application comprised of a database, virtualized web servers, and a bare metal server. Using Migration Hub will provide you with a single screen that shows the migration progress of all the resources in the application. This allows you to quickly get progress updates across all of your migrations, easily identify and troubleshoot any issues, and reduce the overall time and effort spent on your migration projects. Migration Hub is available to all AWS customers at no additional charge. You only pay for the cost of the migration tools you use, and any resources being consumed on AWS. -* `service/ssm`: Updates service API and documentation - * Systems Manager Maintenance Windows include the following changes or enhancements: New task options using Systems Manager Automation, AWS Lambda, and AWS Step Functions; enhanced ability to edit the targets of a Maintenance Window, including specifying a target name and description, and ability to edit the owner field; enhanced ability to edits tasks; enhanced support for Run Command parameters; and you can now use a --safe flag when attempting to deregister a target. If this flag is enabled when you attempt to deregister a target, the system returns an error if the target is referenced by any task. Also, Systems Manager now includes Configuration Compliance to scan your fleet of managed instances for patch compliance and configuration inconsistencies. You can collect and aggregate data from multiple AWS accounts and Regions, and then drill down into specific resources that aren't compliant. -* `service/storagegateway`: Updates service API and documentation - * Add optional field ForceDelete to DeleteFileShare api. - -Release v1.10.24 (2017-08-11) -=== - -### Service Client Updates -* `service/codedeploy`: Updates service API and documentation - * Adds support for specifying Application Load Balancers in deployment groups, for both in-place and blue/green deployments. -* `service/cognito-idp`: Updates service API and documentation -* `service/ec2`: Updates service API and documentation - * Provides customers an opportunity to recover an EIP that was released - -Release v1.10.23 (2017-08-10) -=== - -### Service Client Updates -* `service/clouddirectory`: Updates service API and documentation - * Enable BatchDetachPolicy -* `service/codebuild`: Updates service API - * Supporting Bitbucket as source type in AWS CodeBuild. - -Release v1.10.22 (2017-08-09) -=== - -### Service Client Updates -* `service/rds`: Updates service documentation - * Documentation updates for RDS. - -Release v1.10.21 (2017-08-09) -=== - -### Service Client Updates -* `service/elasticbeanstalk`: Updates service API and documentation - * Add support for paginating the result of DescribeEnvironments Include the ARN of described environments in DescribeEnvironments output - -### SDK Enhancements -* `aws`: Add pointer conversion utilities to transform int64 to time.Time [#1433](https://github.com/aws/aws-sdk-go/pull/1433) - * Adds `SecondsTimeValue` and `MillisecondsTimeValue` utilities. - -Release v1.10.20 (2017-08-01) -=== - -### Service Client Updates -* `service/codedeploy`: Updates service API and documentation - * AWS CodeDeploy now supports the use of multiple tag groups in a single deployment group (an intersection of tags) to identify the instances for a deployment. When you create or update a deployment group, use the new ec2TagSet and onPremisesTagSet structures to specify up to three groups of tags. Only instances that are identified by at least one tag in each of the tag groups are included in the deployment group. -* `service/config`: Updates service API and documentation -* `service/ec2`: Updates service waiters - * Ec2 SpotInstanceRequestFulfilled waiter update -* `service/elasticloadbalancingv2`: Updates service waiters -* `service/email`: Updates service API, documentation, paginators, and examples - * This update adds information about publishing email open and click events. This update also adds information about publishing email events to Amazon Simple Notification Service (Amazon SNS). -* `service/pinpoint`: Updates service API and documentation - * This release of the Pinpoint SDK enables App management - create, delete, update operations, Raw Content delivery for APNs and GCM campaign messages and From Address override. - -Release v1.10.19 (2017-08-01) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/inspector`: Updates service API, documentation, and paginators - * Inspector's StopAssessmentRun API has been updated with a new input option - stopAction. This request parameter can be set to either START_EVALUATION or SKIP_EVALUATION. START_EVALUATION (the default value, and the previous behavior) stops the AWS agent data collection and begins the results evaluation for findings generation based on the data collected so far. SKIP_EVALUATION cancels the assessment run immediately, after which no findings are generated. -* `service/ssm`: Updates service API and documentation - * Adds a SendAutomationSignal API to SSM Service. This API is used to send a signal to an automation execution to change the current behavior or status of the execution. - -Release v1.10.18 (2017-07-27) -=== - -### Service Client Updates -* `service/ec2`: Updates service API and documentation - * The CreateDefaultVPC API enables you to create a new default VPC . You no longer need to contact AWS support, if your default VPC has been deleted. -* `service/kinesisanalytics`: Updates service API and documentation - * Added additional exception types and clarified documentation. - -Release v1.10.17 (2017-07-27) -=== - -### Service Client Updates -* `service/dynamodb`: Updates service documentation and examples - * Corrected a typo. -* `service/ec2`: Updates service API and documentation - * Amazon EC2 Elastic GPUs allow you to easily attach low-cost graphics acceleration to current generation EC2 instances. With Amazon EC2 Elastic GPUs, you can configure the right amount of graphics acceleration to your particular workload without being constrained by fixed hardware configurations and limited GPU selection. -* `service/monitoring`: Updates service documentation - * This release adds high resolution features to CloudWatch, with support for Custom Metrics down to 1 second and Alarms down to 10 seconds. - -Release v1.10.16 (2017-07-26) -=== - -### Service Client Updates -* `service/clouddirectory`: Updates service API and documentation - * Cloud Directory adds support for additional batch operations. -* `service/cloudformation`: Updates service API and documentation - * AWS CloudFormation StackSets enables you to manage stacks across multiple accounts and regions. - -### SDK Enhancements -* `aws/signer/v4`: Optimize V4 signer's header duplicate space stripping. [#1417](https://github.com/aws/aws-sdk-go/pull/1417) - -Release v1.10.15 (2017-07-24) -=== - -### Service Client Updates -* `service/appstream`: Updates service API, documentation, and waiters - * Amazon AppStream 2.0 image builders and fleets can now access applications and network resources that rely on Microsoft Active Directory (AD) for authentication and permissions. This new feature allows you to join your streaming instances to your AD, so you can use your existing AD user management tools. -* `service/ec2`: Updates service API and documentation - * Spot Fleet tagging capability allows customers to automatically tag instances launched by Spot Fleet. You can use this feature to label or distinguish instances created by distinct Spot Fleets. Tagging your EC2 instances also enables you to see instance cost allocation by tag in your AWS bill. - -### SDK Bugs -* `aws/signer/v4`: Fix out of bounds panic in stripExcessSpaces [#1412](https://github.com/aws/aws-sdk-go/pull/1412) - * Fixes the out of bands panic in stripExcessSpaces caused by an incorrect calculation of the stripToIdx value. Simplified to code also. - * Fixes [#1411](https://github.com/aws/aws-sdk-go/issues/1411) -Release v1.10.14 (2017-07-20) -=== - -### Service Client Updates -* `service/elasticmapreduce`: Updates service API and documentation - * Amazon EMR now includes the ability to use a custom Amazon Linux AMI and adjustable root volume size when launching a cluster. - -Release v1.10.13 (2017-07-19) -=== - -### Service Client Updates -* `service/budgets`: Updates service API and documentation - * Update budget Management API's to list/create/update RI_UTILIZATION type budget. Update budget Management API's to support DAILY timeUnit for RI_UTILIZATION type budget. - -### SDK Enhancements -* `service/s3`: Use interfaces assertions instead of ValuesAtPath for S3 field lookups. [#1401](https://github.com/aws/aws-sdk-go/pull/1401) - * Improves the performance across the board for all S3 API calls by removing the usage of `ValuesAtPath` being used for every S3 API call. - -### SDK Bugs -* `aws/request`: waiter test bug - * waiters_test.go file would sometimes fail due to travis hiccups. This occurs because a test would sometimes fail the cancel check and succeed the timeout. However, the timeout check should never occur in that test. This fix introduces a new field that dictates how waiters will sleep. -Release v1.10.12 (2017-07-17) -=== - -### Service Client Updates -* `service/cognito-idp`: Updates service API and documentation -* `service/lambda`: Updates service API and documentation - * Lambda@Edge lets you run code closer to your end users without provisioning or managing servers. With Lambda@Edge, your code runs in AWS edge locations, allowing you to respond to your end users at the lowest latency. Your code is triggered by Amazon CloudFront events, such as requests to and from origin servers and viewers, and it is ready to execute at every AWS edge location whenever a request for content is received. You just upload your Node.js code to AWS Lambda and Lambda takes care of everything required to run and scale your code with high availability. You only pay for the compute time you consume - there is no charge when your code is not running. - -Release v1.10.11 (2017-07-14) -=== - -### Service Client Updates -* `service/discovery`: Updates service API and documentation - * Adding feature to the Export API for Discovery Service to allow filters for the export task to allow export based on per agent id. -* `service/ec2`: Updates service API - * New EC2 GPU Graphics instance -* `service/marketplacecommerceanalytics`: Updates service documentation - * Update to Documentation Model For New Report Cadence / Reformat of Docs - -Release v1.10.10 (2017-07-13) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * Adds support for management of gateway responses. -* `service/ec2`: Updates service API and documentation - * X-ENI (or Cross-Account ENI) is a new feature that allows the attachment or association of Elastic Network Interfaces (ENI) between VPCs in different AWS accounts located in the same availability zone. With this new capability, service providers and partners can deliver managed solutions in a variety of new architectural patterns where the provider and consumer of the service are in different AWS accounts. -* `service/lex-models`: Updates service documentation - -Release v1.10.9 (2017-07-12) -=== - -### Service Client Updates -* `service/autoscaling`: Updates service API and documentation - * Auto Scaling now supports a new type of scaling policy called target tracking scaling policies that you can use to set up dynamic scaling for your application. -* `service/swf`: Updates service API, documentation, paginators, and examples - * Added support for attaching control data to Lambda tasks. Control data lets you attach arbitrary strings to your decisions and history events. - -Release v1.10.8 (2017-07-06) -=== - -### Service Client Updates -* `service/ds`: Updates service API, documentation, and paginators - * You can now improve the resilience and performance of your Microsoft AD directory by deploying additional domain controllers. Added UpdateNumberofDomainControllers API that allows you to update the number of domain controllers you want for your directory, and DescribeDomainControllers API that allows you to describe the detailed information of each domain controller of your directory. Also added the 'DesiredNumberOfDomainControllers' field to the DescribeDirectories API output for Microsoft AD. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/kinesis`: Updates service API and documentation - * You can now encrypt your data at rest within an Amazon Kinesis Stream using server-side encryption. Server-side encryption via AWS KMS makes it easy for customers to meet strict data management requirements by encrypting their data at rest within the Amazon Kinesis Streams, a fully managed real-time data processing service. -* `service/kms`: Updates service API and documentation - * This release of AWS Key Management Service introduces the ability to determine whether a key is AWS managed or customer managed. -* `service/ssm`: Updates service API and documentation - * Amazon EC2 Systems Manager now expands Patching support to Amazon Linux, Red Hat and Ubuntu in addition to the already supported Windows Server. - -Release v1.10.7 (2017-07-05) -=== - -### Service Client Updates -* `service/monitoring`: Updates service API and documentation - * We are excited to announce the availability of APIs and CloudFormation support for CloudWatch Dashboards. You can use the new dashboard APIs or CloudFormation templates to dynamically build and maintain dashboards to monitor your infrastructure and applications. There are four new dashboard APIs - PutDashboard, GetDashboard, DeleteDashboards, and ListDashboards APIs. PutDashboard is used to create a new dashboard or modify an existing one whereas GetDashboard is the API to get the details of a specific dashboard. ListDashboards and DeleteDashboards are used to get the names or delete multiple dashboards respectively. Getting started with dashboard APIs is similar to any other AWS APIs. The APIs can be accessed through AWS SDK or through CLI tools. -* `service/route53`: Updates service API and documentation - * Bug fix for InvalidChangeBatch exception. - -### SDK Enhancements -* `service/s3/s3manager`: adding cleanup function to batch objects [#1375](https://github.com/aws/aws-sdk-go/issues/1375) - * This enhancement will add an After field that will be called after each iteration of the batch operation. - -Release v1.10.6 (2017-06-30) -=== - -### Service Client Updates -* `service/marketplacecommerceanalytics`: Updates service documentation - * Documentation updates for AWS Marketplace Commerce Analytics. -* `service/s3`: Updates service API and documentation - * API Update for S3: Adding Object Tagging Header to MultipartUpload Initialization - -Release v1.10.5 (2017-06-29) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/events`: Updates service API and documentation - * CloudWatch Events now allows different AWS accounts to share events with each other through a new resource called event bus. Event buses accept events from AWS services, other AWS accounts and PutEvents API calls. Currently all AWS accounts have one default event bus. To send events to another account, customers simply write rules to match the events of interest and attach an event bus in the receiving account as the target to the rule. The PutTargets API has been updated to allow adding cross account event buses as targets. In addition, we have released two new APIs - PutPermission and RemovePermission - that enables customers to add/remove permissions to their default event bus. -* `service/gamelift`: Updates service API and documentation - * Allow developers to download GameLift fleet creation logs to assist with debugging. -* `service/ssm`: Updates service API and documentation - * Adding Resource Data Sync support to SSM Inventory. New APIs: * CreateResourceDataSync - creates a new resource data sync configuration, * ListResourceDataSync - lists existing resource data sync configurations, * DeleteResourceDataSync - deletes an existing resource data sync configuration. - -Release v1.10.4 (2017-06-27) -=== - -### Service Client Updates -* `service/servicecatalog`: Updates service API, documentation, and paginators - * Proper tagging of resources is critical to post-launch operations such as billing, cost allocation, and resource management. By using Service Catalog's TagOption Library, administrators can define a library of re-usable TagOptions that conform to company standards, and associate these with Service Catalog portfolios and products. Learn how to move your current tags to the new library, create new TagOptions, and view and associate your library items with portfolios and products. Understand how to ensure that the right tags are created on products launched through Service Catalog and how to provide users with defined selectable tags. - -### SDK Bugs -* `aws/signer/v4`: checking length on `stripExcessSpaces` [#1372](https://github.com/aws/aws-sdk-go/issues/1372) - * Fixes a bug where `stripExcessSpaces` did not check length against the slice. - * Fixes: [#1371](https://github.com/aws/aws-sdk-go/issues/1371) -Release v1.10.3 (2017-06-23) -=== - -### Service Client Updates -* `service/lambda`: Updates service API and documentation - * The Lambda Invoke API will now throw new exception InvalidRuntimeException (status code 502) for invokes with deprecated runtimes. - -Release v1.10.2 (2017-06-22) -=== - -### Service Client Updates -* `service/codepipeline`: Updates service API, documentation, and paginators - * A new API, ListPipelineExecutions, enables you to retrieve summary information about the most recent executions in a pipeline, including pipeline execution ID, status, start time, and last updated time. You can request information for a maximum of 100 executions. Pipeline execution data is available for the most recent 12 months of activity. -* `service/dms`: Updates service API and documentation - * Added tagging for DMS certificates. -* `service/elasticloadbalancing`: Updates service waiters -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lightsail`: Updates service API and documentation - * This release adds a new nextPageToken property to the result of the GetOperationsForResource API. Developers can now get the next set of items in a list by making subsequent calls to GetOperationsForResource API with the token from the previous call. This release also deprecates the nextPageCount property, which previously returned null (use the nextPageToken property instead). This release also deprecates the customImageName property on the CreateInstancesRequest class, which was previously ignored by the API. -* `service/route53`: Updates service API and documentation - * This release reintroduces the HealthCheckInUse exception. - -Release v1.10.1 (2017-06-21) -=== - -### Service Client Updates -* `service/dax`: Adds new service - * Amazon DynamoDB Accelerator (DAX) is a fully managed, highly available, in-memory cache for DynamoDB that delivers up to a 10x performance improvement - from milliseconds to microseconds - even at millions of requests per second. DAX does all the heavy lifting required to add in-memory acceleration to your DynamoDB tables, without requiring developers to manage cache invalidation, data population, or cluster management. -* `service/route53`: Updates service API and documentation - * Amazon Route 53 now supports multivalue answers in response to DNS queries, which lets you route traffic approximately randomly to multiple resources, such as web servers. Create one multivalue answer record for each resource and, optionally, associate an Amazon Route 53 health check with each record, and Amazon Route 53 responds to DNS queries with up to eight healthy records. -* `service/ssm`: Updates service API, documentation, and paginators - * Adding hierarchy support to the SSM Parameter Store API. Added support tor tagging. New APIs: GetParameter - retrieves one parameter, DeleteParameters - deletes multiple parameters (max number 10), GetParametersByPath - retrieves parameters located in the hierarchy. Updated APIs: PutParameter - added ability to enforce parameter value by applying regex (AllowedPattern), DescribeParameters - modified to support Tag filtering. -* `service/waf`: Updates service API and documentation - * You can now create, edit, update, and delete a new type of WAF rule with a rate tracking component. -* `service/waf-regional`: Updates service API and documentation - -Release v1.10.0 (2017-06-20) -=== - -### Service Client Updates -* `service/workdocs`: Updates service API and documentation - * This release provides a new API to retrieve the activities performed by WorkDocs users. - -### SDK Features -* `aws/credentials/plugincreds`: Add support for Go plugin for credentials [#1320](https://github.com/aws/aws-sdk-go/pull/1320) - * Adds support for using plugins to retrieve credentials for API requests. This change adds a new package plugincreds under aws/credentials. See the `example/aws/credentials/plugincreds` folder in the SDK for example usage. - -Release v1.9.00 (2017-06-19) -=== - -### Service Client Updates -* `service/organizations`: Updates service API and documentation - * Improvements to Exception Modeling - -### SDK Features -* `service/s3/s3manager`: Adds batch operations to s3manager [#1333](https://github.com/aws/aws-sdk-go/pull/1333) - * Allows for batch upload, download, and delete of objects. Also adds the interface pattern to allow for easy traversal of objects. E.G `DownloadWithIterator`, `UploadWithIterator`, and `BatchDelete`. `BatchDelete` also contains a utility iterator using the `ListObjects` API to easily delete a list of objects. - -Release v1.8.44 (2017-06-16) -=== - -### Service Client Updates -* `service/xray`: Updates service API, documentation, and paginators - * Add a response time histogram to the services in response of GetServiceGraph API. - -Release v1.8.43 (2017-06-15) -=== - -### Service Client Updates -* `service/ec2`: Updates service API and documentation - * Adds API to describe Amazon FPGA Images (AFIs) available to customers, which includes public AFIs, private AFIs that you own, and AFIs owned by other AWS accounts for which you have load permissions. -* `service/ecs`: Updates service API and documentation - * Added support for cpu, memory, and memory reservation container overrides on the RunTask and StartTask APIs. -* `service/iot`: Updates service API and documentation - * Revert the last release: remove CertificatePem from DescribeCertificate API. -* `service/servicecatalog`: Updates service API, documentation, and paginators - * Added ProvisioningArtifactSummaries to DescribeProductAsAdmin's output to show the provisioning artifacts belong to the product. Allow filtering by SourceProductId in SearchProductsAsAdmin for AWS Marketplace products. Added a verbose option to DescribeProvisioningArtifact to display the CloudFormation template used to create the provisioning artifact.Added DescribeProvisionedProduct API. Changed the type of ProvisionedProduct's Status to be distinct from Record's Status. New ProvisionedProduct's Status are AVAILABLE, UNDER_CHANGE, TAINTED, ERROR. Changed Record's Status set of values to CREATED, IN_PROGRESS, IN_PROGRESS_IN_ERROR, SUCCEEDED, FAILED. - -### SDK Bugs -* `private/model/api`: Fix RESTXML support for XML Namespace [#1343](https://github.com/aws/aws-sdk-go/pull/1343) - * Fixes a bug with the SDK's generation of services using the REST XML protocol not annotating shape references with the XML Namespace attribute. - * Fixes [#1334](https://github.com/aws/aws-sdk-go/pull/1334) -Release v1.8.42 (2017-06-14) -=== - -### Service Client Updates -* `service/applicationautoscaling`: Updates service API and documentation -* `service/clouddirectory`: Updates service documentation - * Documentation update for Cloud Directory - -Release v1.8.41 (2017-06-13) -=== - -### Service Client Updates -* `service/configservice`: Updates service API - -Release v1.8.40 (2017-06-13) -=== - -### Service Client Updates -* `service/rds`: Updates service API and documentation - * API Update for RDS: this update enables copy-on-write, a new Aurora MySQL Compatible Edition feature that allows users to restore their database, and support copy of TDE enabled snapshot cross region. - -### SDK Bugs -* `aws/request`: Fix NewErrParamMinLen to use correct ParamMinLenErrCode [#1336](https://github.com/aws/aws-sdk-go/issues/1336) - * Fixes the `NewErrParamMinLen` function returning the wrong error code. `ParamMinLenErrCode` should be returned not `ParamMinValueErrCode`. - * Fixes [#1335](https://github.com/aws/aws-sdk-go/issues/1335) -Release v1.8.39 (2017-06-09) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/opsworks`: Updates service API and documentation - * Tagging Support for AWS OpsWorks Stacks - -Release v1.8.38 (2017-06-08) -=== - -### Service Client Updates -* `service/iot`: Updates service API and documentation - * In addition to using certificate ID, AWS IoT customers can now obtain the description of a certificate with the certificate PEM. -* `service/pinpoint`: Updates service API and documentation - * Starting today Amazon Pinpoint adds SMS Text and Email Messaging support in addition to Mobile Push Notifications, providing developers, product managers and marketers with multi-channel messaging capabilities to drive user engagement in their applications. Pinpoint also enables backend services and applications to message users directly and provides advanced user and app analytics to understand user behavior and messaging performance. -* `service/rekognition`: Updates service API and documentation - * API Update for AmazonRekognition: Adding RecognizeCelebrities API - -Release v1.8.37 (2017-06-07) -=== - -### Service Client Updates -* `service/codebuild`: Updates service API and documentation - * Add support to APIs for privileged containers. This change would allow performing privileged operations like starting the Docker daemon inside builds possible in custom docker images. -* `service/greengrass`: Adds new service - * AWS Greengrass is software that lets you run local compute, messaging, and device state synchronization for connected devices in a secure way. With AWS Greengrass, connected devices can run AWS Lambda functions, keep device data in sync, and communicate with other devices securely even when not connected to the Internet. Using AWS Lambda, Greengrass ensures your IoT devices can respond quickly to local events, operate with intermittent connections, and minimize the cost of transmitting IoT data to the cloud. - -Release v1.8.36 (2017-06-06) -=== - -### Service Client Updates -* `service/acm`: Updates service documentation - * Documentation update for AWS Certificate Manager. -* `service/cloudfront`: Updates service documentation - * Doc update to fix incorrect prefix in S3OriginConfig -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/iot`: Updates service API - * Update client side validation for SalesForce action. - -Release v1.8.35 (2017-06-05) -=== - -### Service Client Updates -* `service/appstream`: Updates service API and documentation - * AppStream 2.0 Custom Security Groups allows you to easily control what network resources your streaming instances and images have access to. You can assign up to 5 security groups per Fleet to control the inbound and outbound network access to your streaming instances to specific IP ranges, network protocols, or ports. -* `service/iot`: Updates service API, documentation, paginators, and examples - * Added Salesforce action to IoT Rules Engine. - -Release v1.8.34 (2017-06-02) -=== - -### Service Client Updates -* `service/kinesisanalytics`: Updates service API, documentation, and paginators - * Kinesis Analytics publishes error messages CloudWatch logs in case of application misconfigurations -* `service/workdocs`: Updates service API and documentation - * This release includes new APIs to manage tags and custom metadata on resources and also new APIs to add and retrieve comments at the document level. - -Release v1.8.33 (2017-06-01) -=== - -### Service Client Updates -* `service/codedeploy`: Updates service API and documentation - * AWS CodeDeploy has improved how it manages connections to GitHub accounts and repositories. You can now create and store up to 25 connections to GitHub accounts in order to associate AWS CodeDeploy applications with GitHub repositories. Each connection can support multiple repositories. You can create connections to up to 25 different GitHub accounts, or create more than one connection to a single account. The ListGitHubAccountTokenNames command has been introduced to retrieve the names of stored connections to GitHub accounts that you have created. The name of the connection to GitHub used for an AWS CodeDeploy application is also included in the ApplicationInfo structure. Two new fields, lastAttemptedDeployment and lastSuccessfulDeployment, have been added to DeploymentGroupInfo to improve the handling of deployment group information in the AWS CodeDeploy console. Information about these latest deployments can also be retrieved using the GetDeploymentGroup and BatchGetDeployment group requests. Also includes a region update (us-gov-west-1). -* `service/cognitoidentityprovider`: Updates service API, documentation, and paginators -* `service/elbv2`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lexmodelbuildingservice`: Updates service documentation and examples - -### SDK Enhancements -* `aws/defaults`: Exports shared credentials and config default filenames used by the SDK. [#1308](https://github.com/aws/aws-sdk-go/pull/1308) - * Adds SharedCredentialsFilename and SharedConfigFilename functions to defaults package. - -### SDK Bugs -* `aws/credentials`: Fixes shared credential provider's default filename on Windows. [#1308](https://github.com/aws/aws-sdk-go/pull/1308) - * The shared credentials provider would attempt to use the wrong filename on Windows if the `HOME` environment variable was defined. -* `service/s3/s3manager`: service/s3/s3manager: Fix Downloader ignoring Range get parameter [#1311](https://github.com/aws/aws-sdk-go/pull/1311) - * Fixes the S3 Download Manager ignoring the GetObjectInput's Range parameter. If this parameter is provided it will force the downloader to fallback to a single GetObject request disabling concurrency and automatic part size gets. - * Fixes [#1296](https://github.com/aws/aws-sdk-go/issues/1296) -Release v1.8.32 (2017-05-31) -=== - -### Service Client Updates -* `service/rds`: Updates service API and documentation - * Amazon RDS customers can now easily and quickly stop and start their DB instances. - -Release v1.8.31 (2017-05-30) -=== - -### Service Client Updates -* `service/clouddirectory`: Updates service API, documentation, and paginators - * Cloud Directory has launched support for Typed Links, enabling customers to create object-to-object relationships that are not hierarchical in nature. Typed Links enable customers to quickly query for data along these relationships. Customers can also enforce referential integrity using Typed Links, ensuring data in use is not inadvertently deleted. -* `service/s3`: Updates service paginators and examples - * New example snippets for Amazon S3. - -Release v1.8.30 (2017-05-25) -=== - -### Service Client Updates -* `service/appstream`: Updates service API and documentation - * Support added for persistent user storage, backed by S3. -* `service/rekognition`: Updates service API and documentation - * Updated the CompareFaces API response to include orientation information, unmatched faces, landmarks, pose, and quality of the compared faces. - -Release v1.8.29 (2017-05-24) -=== - -### Service Client Updates -* `service/iam`: Updates service API - * The unique ID and access key lengths were extended from 32 to 128 -* `service/storagegateway`: Updates service API and documentation - * Two Storage Gateway data types, Tape and TapeArchive, each have a new response element, TapeUsedInBytes. This element helps you manage your virtual tapes. By using TapeUsedInBytes, you can see the amount of data written to each virtual tape. -* `service/sts`: Updates service API, documentation, and paginators - * The unique ID and access key lengths were extended from 32 to 128. - -Release v1.8.28 (2017-05-23) -=== - -### Service Client Updates -* `service/databasemigrationservice`: Updates service API, documentation, paginators, and examples - * This release adds support for using Amazon S3 and Amazon DynamoDB as targets for database migration, and using MongoDB as a source for database migration. For more information, see the AWS Database Migration Service documentation. - -Release v1.8.27 (2017-05-22) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/resourcegroupstaggingapi`: Updates service API, documentation, and paginators - * You can now specify the number of resources returned per page in GetResources operation, as an optional parameter, to easily manage the list of resources returned by your queries. - -### SDK Bugs -* `aws/request`: Add support for PUT temporary redirects (307) [#1283](https://github.com/aws/aws-sdk-go/issues/1283) - * Adds support for Go 1.8's GetBody function allowing the SDK's http request using PUT and POST methods to be redirected with temporary redirects with 307 status code. - * Fixes: [#1267](https://github.com/aws/aws-sdk-go/issues/1267) -* `aws/request`: Add handling for retrying temporary errors during unmarshal [#1289](https://github.com/aws/aws-sdk-go/issues/1289) - * Adds support for retrying temporary errors that occur during unmarshaling of a request's response body. - * Fixes: [#1275](https://github.com/aws/aws-sdk-go/issues/1275) -Release v1.8.26 (2017-05-18) -=== - -### Service Client Updates -* `service/athena`: Adds new service - * This release adds support for Amazon Athena. Amazon Athena is an interactive query service that makes it easy to analyze data in Amazon S3 using standard SQL. Athena is serverless, so there is no infrastructure to manage, and you pay only for the queries that you run. -* `service/lightsail`: Updates service API, documentation, and paginators - * This release adds new APIs that make it easier to set network port configurations on Lightsail instances. Developers can now make a single request to both open and close public ports on an instance using the PutInstancePublicPorts operation. - -### SDK Bugs -* `aws/request`: Fix logging from reporting wrong retry request errors #1281 - * Fixes the SDK's retry request logging to report the the actual error that occurred, not a stubbed Unknown error message. - * Fixes the SDK's response logger to not output the response log multiple times per retry. -Release v1.8.25 (2017-05-17) -=== - -### Service Client Updates -* `service/autoscaling`: Updates service documentation, paginators, and examples - * Various Auto Scaling documentation updates -* `service/cloudwatchevents`: Updates service documentation - * Various CloudWatch Events documentation updates. -* `service/cloudwatchlogs`: Updates service documentation and paginators - * Various CloudWatch Logs documentation updates. -* `service/polly`: Updates service API - * Amazon Polly adds new German voice "Vicki" - -Release v1.8.24 (2017-05-16) -=== - -### Service Client Updates -* `service/codedeploy`: Updates service API and documentation - * This release introduces the previousRevision field in the responses to the GetDeployment and BatchGetDeployments actions. previousRevision provides information about the application revision that was deployed to the deployment group before the most recent successful deployment. Also, the fileExistsBehavior parameter has been added for CreateDeployment action requests. In the past, if the AWS CodeDeploy agent detected files in a target location that weren't part of the application revision from the most recent successful deployment, it would fail the current deployment by default. This new parameter provides options for how the agent handles these files: fail the deployment, retain the content, or overwrite the content. -* `service/gamelift`: Updates service API and documentation - * Allow developers to specify how metrics are grouped in CloudWatch for their GameLift fleets. Developers can also specify how many concurrent game sessions activate on a per-instance basis. -* `service/inspector`: Updates service API, documentation, paginators, and examples - * Adds ability to produce an assessment report that includes detailed and comprehensive results of a specified assessment run. -* `service/kms`: Updates service documentation - * Update documentation for KMS. - -Release v1.8.23 (2017-05-15) -=== - -### Service Client Updates -* `service/ssm`: Updates service API and documentation - * UpdateAssociation API now supports updating document name and targets of an association. GetAutomationExecution API can return FailureDetails as an optional field to the StepExecution Object, which contains failure type, failure stage as well as other failure related information for a failed step. - -### SDK Enhancements -* `aws/session`: SDK should be able to load multiple custom shared config files. [#1258](https://github.com/aws/aws-sdk-go/issues/1258) - * This change adds a `SharedConfigFiles` field to the `session.Options` type that allows you to specify the files, and their order, the SDK will use for loading shared configuration and credentials from when the `Session` is created. Use the `NewSessionWithOptions` Session constructor to specify these options. You'll also most likely want to enable support for the shared configuration file's additional attributes by setting `session.Option`'s `SharedConfigState` to `session.SharedConfigEnabled`. - -Release v1.8.22 (2017-05-11) -=== - -### Service Client Updates -* `service/elb`: Updates service API, documentation, and paginators -* `service/elbv2`: Updates service API and documentation -* `service/lexmodelbuildingservice`: Updates service API and documentation -* `service/organizations`: Updates service API, documentation, paginators, and examples - * AWS Organizations APIs that return an Account object now include the email address associated with the account’s root user. - -Release v1.8.21 (2017-05-09) -=== - -### Service Client Updates -* `service/codestar`: Updates service documentation - * Updated documentation for AWS CodeStar. -* `service/workspaces`: Updates service API, documentation, and paginators - * Doc-only Update for WorkSpaces - -Release v1.8.20 (2017-05-04) -=== - -### Service Client Updates -* `service/ecs`: Updates service API, documentation, and paginators - * Exposes container instance registration time in ECS:DescribeContainerInstances. -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/marketplaceentitlementservice`: Adds new service -* `service/lambda`: Updates service API and documentation - * Support for UpdateFunctionCode DryRun option - -Release v1.8.19 (2017-04-28) -=== - -### Service Client Updates -* `service/cloudformation`: Updates service waiters and paginators - * Adding back the removed waiters and paginators. - -Release v1.8.18 (2017-04-28) -=== - -### Service Client Updates -* `service/cloudformation`: Updates service API, documentation, waiters, paginators, and examples - * API update for CloudFormation: New optional parameter ClientRequestToken which can be used as an idempotency token to safely retry certain operations as well as tagging StackEvents. -* `service/rds`: Updates service API, documentation, and examples - * The DescribeDBClusterSnapshots API now returns a SourceDBClusterSnapshotArn field which identifies the source DB cluster snapshot of a copied snapshot. -* `service/rekognition`: Updates service API - * Fix for missing file type check -* `service/snowball`: Updates service API, documentation, and paginators - * The Snowball API has a new exception that can be thrown for list operation requests. -* `service/sqs`: Updates service API, documentation, and paginators - * Adding server-side encryption (SSE) support to SQS by integrating with AWS KMS; adding new queue attributes to SQS CreateQueue, SetQueueAttributes and GetQueueAttributes APIs to support SSE. - -Release v1.8.17 (2017-04-26) -=== - -### Service Client Updates -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service API and documentation - * With Amazon Relational Database Service (Amazon RDS) running MySQL or Amazon Aurora, you can now authenticate to your DB instance using IAM database authentication. - -Release v1.8.16 (2017-04-21) -=== - -### Service Client Updates -* `service/appstream`: Updates service API, documentation, and paginators - * The new feature named "Default Internet Access" will enable Internet access from AppStream 2.0 instances - image builders and fleet instances. Admins will check a flag either through AWS management console for AppStream 2.0 or through API while creating an image builder or while creating/updating a fleet. -* `service/kinesis`: Updates service API, documentation, waiters, and paginators - * Adds a new waiter, StreamNotExists, to Kinesis. - -### SDK Enhancements -* `aws/endpoints`: Add utilities improving endpoints lookup (#1218) - * Adds several utilities to the endpoints packages to make looking up partitions, regions, and services easier. - * Fixes #994 - -### SDK Bugs -* `private/protocol/xml/xmlutil`: Fix unmarshaling dropping errors (#1219) - * The XML unmarshaler would drop any serialization or body read error that occurred on the floor effectively hiding any errors that would occur. - * Fixes #1205 -Release v1.8.15 (2017-04-20) -=== - -### Service Client Updates -* `service/devicefarm`: Updates service API and documentation - * API Update for AWS Device Farm: Support for Deals and Promotions -* `service/directconnect`: Updates service documentation - * Documentation updates for AWS Direct Connect. -* `service/elbv2`: Updates service waiters -* `service/kms`: Updates service documentation and examples - * Doc-only update for Key Management Service (KMS): Update docs for GrantConstraints and GenerateRandom -* `service/route53`: Updates service documentation - * Release notes: SDK documentation now includes examples for ChangeResourceRecordSets for all types of resource record set, such as weighted, alias, and failover. -* `service/route53domains`: Updates service API, documentation, and paginators - * Adding examples and other documentation updates. - -### SDK Enhancements -* `service/s3`: Add utilities to make getting a bucket's region easier (#1207) - * Adds two features which make it easier to get a bucket's region, `s3.NormalizeBucketLocation` and `s3manager.GetBucketRegion`. - -### SDK Bugs -* `service/s3`: Fix HeadObject's incorrect documented error codes (#1213) - * The HeadObject's model incorrectly states that the operation can return the NoSuchKey error code. - * Fixes #1208 - -Release v1.8.14 (2017-04-19) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * Add support for "embed" property. -* `service/codestar`: Adds new service - * AWS CodeStar is a cloud-based service for creating, managing, and working with software development projects on AWS. An AWS CodeStar project creates and integrates AWS services for your project development toolchain. AWS CodeStar also manages the permissions required for project users. -* `service/ec2`: Updates service API and documentation - * Adds support for creating an Amazon FPGA Image (AFI) from a specified design checkpoint (DCP). -* `service/iam`: Updates service API and documentation - * This changes introduces a new IAM role type, Service Linked Role, which works like a normal role but must be managed via services' control. -* `service/lambda`: Updates service API and documentation - * Lambda integration with CloudDebugger service to enable customers to enable tracing for the Lambda functions and send trace information to the CloudDebugger service. -* `service/lexmodelbuildingservice`: Adds new service -* `service/polly`: Updates service API, documentation, and paginators - * API Update for Amazon Polly: Add support for speech marks -* `service/rekognition`: Updates service API and documentation - * Given an image, the API detects explicit or suggestive adult content in the image and returns a list of corresponding labels with confidence scores, as well as a taxonomy (parent-child relation) for each label. - -Release v1.8.13 (2017-04-18) -=== - -### Service Client Updates -* `service/lambda`: Updates service API and documentation - * You can use tags to group and filter your Lambda functions, making it easier to analyze them for billing allocation purposes. For more information, see Tagging Lambda Functions. You can now write or upgrade your Lambda functions using Python version 3.6. For more information, see Programming Model for Authoring Lambda Functions in Python. Note: Features will be rolled out in the US regions on 4/19. - -### SDK Enhancements -* `aws/request`: add support for appengine's custom standard library (#1190) - * Remove syscall error checking on appengine platforms. - -Release v1.8.12 (2017-04-11) -=== - -### Service Client Updates -* `service/apigateway`: Updates service API and documentation - * API Gateway request validators -* `service/batch`: Updates service API and documentation - * API Update for AWS Batch: Customer provided AMI for MANAGED Compute Environment -* `service/gamelift`: Updates service API and documentation - * Allows developers to utilize an improved workflow when calling our Queues API and introduces a new feature that allows developers to specify a maximum allowable latency per Queue. -* `service/opsworks`: Updates service API, documentation, and paginators - * Cloudwatch Logs agent configuration can now be attached to OpsWorks Layers using CreateLayer and UpdateLayer. OpsWorks will then automatically install and manage the CloudWatch Logs agent on the instances part of the OpsWorks Layer. - -### SDK Bugs -* `aws/client`: Fix clients polluting handler list (#1197) - * Fixes the clients potentially polluting the passed in handler list with the client's customizations. This change ensures every client always works with a clean copy of the request handlers and it cannot pollute the handlers back upstream. - * Fixes #1184 -* `aws/request`: Fix waiter error match condition (#1195) - * Fixes the waiters's matching overwriting the request's err, effectively ignoring the error condition. This broke waiters with the FailureWaiterState matcher state. -Release v1.8.11 (2017-04-07) -=== - -### Service Client Updates -* `service/redshift`: Updates service API, documentation, and paginators - * This update adds the GetClusterCredentials API which is used to get temporary login credentials to the cluster. AccountWithRestoreAccess now has a new member AccountAlias, this is the identifier of the AWS support account authorized to restore the specified snapshot. This is added to support the feature where the customer can share their snapshot with the Amazon Redshift Support Account without having to manually specify the AWS Redshift Service account ID on the AWS Console/API. - -Release v1.8.10 (2017-04-06) -=== - -### Service Client Updates -* `service/elbv2`: Updates service documentation - -Release v1.8.9 (2017-04-05) -=== - -### Service Client Updates -* `service/elasticache`: Updates service API, documentation, paginators, and examples - * ElastiCache added support for testing the Elasticache Multi-AZ feature with Automatic Failover. - -Release v1.8.8 (2017-04-04) -=== - -### Service Client Updates -* `service/cloudwatch`: Updates service API, documentation, and paginators - * Amazon Web Services announced the immediate availability of two additional alarm configuration rules for Amazon CloudWatch Alarms. The first rule is for configuring missing data treatment. Customers have the options to treat missing data as alarm threshold breached, alarm threshold not breached, maintain alarm state and the current default treatment. The second rule is for alarms based on percentiles metrics that can trigger unnecassarily if the percentile is calculated from a small number of samples. The new rule can treat percentiles with low sample counts as same as missing data. If the first rule is enabled, the same treatment will be applied when an alarm encounters a percentile with low sample counts. - -Release v1.8.7 (2017-04-03) -=== - -### Service Client Updates -* `service/lexruntimeservice`: Updates service API and documentation - * Adds support to PostContent for speech input - -### SDK Enhancements -* `aws/request`: Improve handler copy, push back, push front performance (#1171) - * Minor optimization to the handler list's handling of copying and pushing request handlers to the handler list. -* Update codegen header to use Go std wording (#1172) - * Go recently accepted the proposal for standard generated file header wording in, https://golang.org/s/generatedcode. - -### SDK Bugs -* `service/dynamodb`: Fix DynamoDB using custom retryer (#1170) - * Fixes (#1139) the DynamoDB service client clobbering any custom retryer that was passed into the service client or Session's config. -Release v1.8.6 (2017-04-01) -=== - -### Service Client Updates -* `service/clouddirectory`: Updates service API and documentation - * ListObjectAttributes now supports filtering by facet. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.8.5 (2017-03-30) -=== - -### Service Client Updates -* `service/cloudformation`: Updates service waiters and paginators - * Adding paginators for ListExports and ListImports -* `service/cloudfront`: Adds new service - * Amazon CloudFront now supports user configurable HTTP Read and Keep-Alive Idle Timeouts for your Custom Origin Servers -* `service/configservice`: Updates service documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/resourcegroupstaggingapi`: Adds new service -* `service/storagegateway`: Updates service API and documentation - * File gateway mode in AWS Storage gateway provides access to objects in S3 as files on a Network File System (NFS) mount point. Once a file share is created, any changes made externally to the S3 bucket will not be reflected by the gateway. Using the cache refresh feature in this update, the customer can trigger an on-demand scan of the keys in their S3 bucket and refresh the file namespace cached on the gateway. It takes as an input the fileShare ARN and refreshes the cache for only that file share. Additionally there is new functionality on file gateway that allows you configure what squash options they would like on their file share, this allows a customer to configure their gateway to not squash root permissions. This can be done by setting options in NfsOptions for CreateNfsFileShare and UpdateNfsFileShare APIs. - -Release v1.8.4 (2017-03-28) -=== - -### Service Client Updates -* `service/batch`: Updates service API, documentation, and paginators - * Customers can now provide a retryStrategy as part of the RegisterJobDefinition and SubmitJob API calls. The retryStrategy object has a number value for attempts. This is the number of non successful executions before a job is considered FAILED. In addition, the JobDetail object now has an attempts field and shows all execution attempts. -* `service/ec2`: Updates service API and documentation - * Customers can now tag their Amazon EC2 Instances and Amazon EBS Volumes at - the time of their creation. You can do this from the EC2 Instance launch - wizard or through the RunInstances or CreateVolume APIs. By tagging - resources at the time of creation, you can eliminate the need to run custom - tagging scripts after resource creation. In addition, you can now set - resource-level permissions on the CreateVolume, CreateTags, DeleteTags, and - the RunInstances APIs. This allows you to implement stronger security - policies by giving you more granular control over which users and groups - have access to these APIs. You can also enforce the use of tagging and - control what tag keys and values are set on your resources. When you combine - tag usage and resource-level IAM policies together, you can ensure your - instances and volumes are properly secured upon creation and achieve more - accurate cost allocation reporting. These new features are provided at no - additional cost. - -### SDK Enhancements -* `aws/request`: Add retry support for RequestTimeoutException (#1158) - * Adds support for retrying RequestTimeoutException error code that is returned by some services. - -### SDK Bugs -* `private/model/api`: Fix Waiter and Paginators panic on nil param inputs (#1157) - * Corrects the code generation for Paginators and waiters that caused a panic if nil input parameters were used with the operations. -Release v1.8.3 (2017-03-27) -=== - -## Service Client Updates -* `service/ssm`: Updates service API, documentation, and paginators - * Updated validation rules for SendCommand and RegisterTaskWithMaintenanceWindow APIs. -Release v1.8.2 (2017-03-24) -=== - -Service Client Updates ---- -* `service/applicationautoscaling`: Updates service API, documentation, and paginators - * Application AutoScaling is launching support for a new target resource (AppStream 2.0 Fleets) as a scalable target. -* `service/cloudtrail`: Updates service API and documentation - * Doc-only Update for CloudTrail: Add required parameters for GetEventSelectors and PutEventSelectors - -Release v1.8.1 (2017-03-23) -=== - -Service Client Updates ---- -* `service/applicationdiscoveryservice`: Updates service API, documentation, and paginators - * Adds export configuration options to the AWS Discovery Service API. -* `service/elbv2`: Updates waiters -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/lambda`: Updates service API and paginators - * Adds support for new runtime Node.js v6.10 for AWS Lambda service - -Release v1.8.0 (2017-03-22) -=== - -Service Client Updates ---- -* `service/codebuild`: Updates service documentation -* `service/directconnect`: Updates service API - * Deprecated DescribeConnectionLoa, DescribeInterconnectLoa, AllocateConnectionOnInterconnect and DescribeConnectionsOnInterconnect operations in favor of DescribeLoa, DescribeLoa, AllocateHostedConnection and DescribeHostedConnections respectively. -* `service/marketplacecommerceanalytics`: Updates service API, documentation, and paginators - * This update adds a new data set, us_sales_and_use_tax_records, which enables AWS Marketplace sellers to programmatically access to their U.S. Sales and Use Tax report data. -* `service/pinpoint`: Updates service API and documentation - * Amazon Pinpoint User Segmentation - * Added ability to segment endpoints by user attributes in addition to endpoint attributes. Amazon Pinpoint Event Stream Preview - * Added functionality to publish raw app analytics and campaign events data as events streams to Kinesis and Kinesis Firehose - * The feature provides developers with increased flexibility of exporting raw events to S3, Redshift, Elasticsearch using a Kinesis Firehose stream or enable real time event processing use cases using a Kinesis stream -* `service/rekognition`: Updates service documentation. - -SDK Features ---- -* `aws/request`: Add support for context.Context to SDK API operation requests (#1132) - * Adds support for context.Context to the SDK by adding `WithContext` methods for each API operation, Paginators and Waiters. e.g `PutObjectWithContext`. This change also adds the ability to provide request functional options to the method calls instead of requiring you to use the `Request` API operation method (e.g `PutObjectRequest`). - * Adds a `Complete` Request handler list that will be called ever time a request is completed. This includes both success and failure. Complete will only be called once per API operation request. - * `private/waiter` package moved from the private group to `aws/request/waiter` and made publicly available. - * Adds Context support to all API operations, Waiters(WaitUntil) and Paginators(Pages) methods. - * Adds Context support for s3manager and s3crypto clients. - -SDK Enhancements ---- -* `aws/signer/v4`: Adds support for unsigned payload signer config (#1130) - * Adds configuration option to the v4.Signer to specify the request's body should not be signed. This will only correclty function on services that support unsigned payload. e.g. S3, Glacier. - -SDK Bug Fixes ---- -* `service/s3`: Fix S3 HostID to be available in S3 request error message (#1131) - * Adds a new type s3.RequestFailure which exposes the S3 HostID value from a S3 API operation response. This is helpful when you have an error with S3, and need to contact support. Both RequestID and HostID are needed. -* `private/model/api`: Do not return a link if uid is empty (#1133) - * Fixes SDK's doc generation to not generate API reference doc links if the SDK us unable to create a valid link. -* `aws/request`: Optimization to handler list copy to prevent multiple alloc calls. (#1134) -Release v1.7.9 (2017-03-13) -=== - -Service Client Updates ---- -* `service/devicefarm`: Updates service API, documentation, paginators, and examples - * Network shaping allows users to simulate network connections and conditions while testing their Android, iOS, and web apps with AWS Device Farm. -* `service/cloudwatchevents`: Updates service API, documentation, and examples - -SDK Enhancement -=== -* `aws/session`: Add support for side loaded CA bundles (#1117) - * Adds supports for side loading Certificate Authority bundle files to the SDK using AWS_CA_BUNDLE environment variable or CustomCABundle session option. -* `service/s3/s3crypto`: Add support for AES/CBC/PKCS5Padding (#1124) - -SDK Bug -=== -* `service/rds`: Fixing issue when not providing `SourceRegion` on cross -region operations (#1127) -* `service/rds`: Enables cross region for `CopyDBClusterSnapshot` and -`CreateDBCluster` (#1128) - -Release v1.7.8 (2017-03-10) -=== - -Service Client Updates ---- -* `service/codedeploy`: Updates service paginators - * Add paginators for Codedeploy -* `service/emr`: Updates service API, documentation, and paginators - * This release includes support for instance fleets in Amazon EMR. - -Release v1.7.7 (2017-03-09) -=== - -Service Client Updates ---- -* `service/apigateway`: Updates service API, documentation, and paginators - * API Gateway has added support for ACM certificates on custom domain names. Both Amazon-issued certificates and uploaded third-part certificates are supported. -* `service/clouddirectory`: Updates service API, documentation, and paginators - * Introduces a new Cloud Directory API that enables you to retrieve all available parent paths for any type of object (a node, leaf node, policy node, and index node) in a hierarchy. - -Release v1.7.6 (2017-03-09) -=== - -Service Client Updates ---- -* `service/organizations`: Updates service documentation and examples - * Doc-only Update for Organizations: Add SDK Code Snippets -* `service/workdocs`: Adds new service - * The Administrative SDKs for Amazon WorkDocs provides full administrator level access to WorkDocs site resources, allowing developers to integrate their applications to manage WorkDocs users, content and permissions programmatically - -Release v1.7.5 (2017-03-08) -=== - -Service Client Updates ---- -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service API and documentation - * Add support to using encrypted clusters as cross-region replication masters. Update CopyDBClusterSnapshot API to support encrypted cross region copy of Aurora cluster snapshots. - -Release v1.7.4 (2017-03-06) -=== - -Service Client Updates ---- -* `service/budgets`: Updates service API and paginators - * When creating or editing a budget via the AWS Budgets API you can define notifications that are sent to subscribers when the actual or forecasted value for cost or usage exceeds the notificationThreshold associated with the budget notification object. Starting today, the maximum allowed value for the notificationThreshold was raised from 100 to 300. This change was made to give you more flexibility when setting budget notifications. -* `service/cloudtrail`: Updates service documentation and paginators - * Doc-only update for AWSCloudTrail: Updated links/descriptions -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/opsworkscm`: Updates service API, documentation, and paginators - * OpsWorks for Chef Automate has added a new field "AssociatePublicIpAddress" to the CreateServer request, "CloudFormationStackArn" to the Server model and "TERMINATED" server state. - - -Release v1.7.3 (2017-02-28) -=== - -Service Client Updates ---- -* `service/mturk`: Renaming service - * service/mechanicalturkrequesterservice was renamed to service/mturk. Be sure to change any references of the old client to the new. - -Release v1.7.2 (2017-02-28) -=== - -Service Client Updates ---- -* `service/dynamodb`: Updates service API and documentation - * Release notes: Time to Live (TTL) is a feature that allows you to define when items in a table expire and can be purged from the database, so that you don't have to track expired data and delete it manually. With TTL enabled on a DynamoDB table, you can set a timestamp for deletion on a per-item basis, allowing you to limit storage usage to only those records that are relevant. -* `service/iam`: Updates service API, documentation, and paginators - * This release adds support for AWS Organizations service control policies (SCPs) to SimulatePrincipalPolicy operation. If there are SCPs associated with the simulated user's account, their effect on the result is captured in the OrganizationDecisionDetail element in the EvaluationResult. -* `service/mechanicalturkrequesterservice`: Adds new service - * Amazon Mechanical Turk is a web service that provides an on-demand, scalable, human workforce to complete jobs that humans can do better than computers, for example, recognizing objects in photos. -* `service/organizations`: Adds new service - * AWS Organizations is a web service that enables you to consolidate your multiple AWS accounts into an organization and centrally manage your accounts and their resources. -* `service/dynamodbstreams`: Updates service API, documentation, and paginators -* `service/waf`: Updates service API, documentation, and paginators - * Aws WAF - For GetSampledRequests action, changed max number of samples from 100 to 500. -* `service/wafregional`: Updates service API, documentation, and paginators - -Release v1.7.1 (2017-02-24) -=== - -Service Client Updates ---- -* `service/elasticsearchservice`: Updates service API, documentation, paginators, and examples - * Added three new API calls to existing Amazon Elasticsearch service to expose Amazon Elasticsearch imposed limits to customers. - -Release v1.7.0 (2017-02-23) -=== - -Service Client Updates ---- -* `service/ec2`: Updates service API - * New EC2 I3 instance type - -SDK Bug ---- -* `service/s3/s3manager`: Adding support for SSE (#1097) - * Fixes SSE fields not being applied to a part during multi part upload. - -SDK Feature ---- -* `aws/session`: Add support for AssumeRoles with MFA (#1088) - * Adds support for assuming IAM roles with MFA enabled. A TokenProvider func was added to stscreds.AssumeRoleProvider that will be called each time the role's credentials need to be refreshed. A basic token provider that sources the MFA token from stdin as stscreds.StdinTokenProvider. -* `aws/session`: Update SDK examples and docs to use session.Must (#1099) - * Updates the SDK's example and docs to use session.Must where possible to highlight its usage as apposed to session error checking that is most cases errors will be terminal to the application anyways. -Release v1.6.27 (2017-02-22) -=== - -Service Client Updates ---- -* `service/clouddirectory`: Updates service documentation - * ListObjectAttributes documentation updated based on forum feedback -* `service/elasticbeanstalk`: Updates service API, documentation, and paginators - * Elastic Beanstalk adds support for creating and managing custom platform. -* `service/gamelift`: Updates service API, documentation, and paginators - * Allow developers to configure global queues for creating GameSessions. Allow PlayerData on PlayerSessions to store player-specific data. -* `service/route53`: Updates service API, documentation, and examples - * Added support for operations CreateVPCAssociationAuthorization and DeleteVPCAssociationAuthorization to throw a ConcurrentModification error when a conflicting modification occurs in parallel to the authorizations in place for a given hosted zone. - -Release v1.6.26 (2017-02-21) -=== - -Service Client Updates ---- -* `service/ec2`: Updates service API and documentation - * Added the billingProduct parameter to the RegisterImage API. - -Release v1.6.25 (2017-02-17) -=== - -Service Client Updates ---- -* `service/directconnect`: Updates service API, documentation, and paginators - * This update will introduce the ability for Direct Connect customers to take advantage of Link Aggregation (LAG). This allows you to bundle many individual physical interfaces into a single logical interface, referred to as a LAG. This makes administration much simpler as the majority of configuration is done on the LAG while you are free to add or remove physical interfaces from the bundle as bandwidth demand increases or decreases. A concrete example of the simplification added by LAG is that customers need only a single BGP session as opposed to one session per physical connection. - -Release v1.6.24 (2017-02-16) -=== - -Service Client Updates ---- -* `service/cognitoidentity`: Updates service API, documentation, and paginators - * Allow createIdentityPool and updateIdentityPool API to set server side token check value on identity pool -* `service/configservice`: Updates service API and documentation - * AWS Config now supports a new test mode for the PutEvaluations API. Set the TestMode parameter to true in your custom rule to verify whether your AWS Lambda function will deliver evaluation results to AWS Config. No updates occur to your existing evaluations, and evaluation results are not sent to AWS Config. - -Release v1.6.23 (2017-02-15) -=== - -Service Client Updates ---- -* `service/kms`: Updates service API, documentation, paginators, and examples - * his release of AWS Key Management Service introduces the ability to tag keys. Tagging keys can help you organize your keys and track your KMS costs in the cost allocation report. This release also increases the maximum length of a key ID to accommodate ARNs that include a long key alias. - -Release v1.6.22 (2017-02-14) -=== - -Service Client Updates ---- -* `service/ec2`: Updates service API, documentation, and paginators - * Adds support for the new Modify Volumes apis. - -Release v1.6.21 (2017-02-11) -=== - -Service Client Updates ---- -* `service/storagegateway`: Updates service API, documentation, and paginators - * File gateway mode in AWS Storage gateway provides access to objects in S3 as files on a Network File System (NFS) mount point. This is done by creating Nfs file shares using existing APIs CreateNfsFileShare. Using the feature in this update, the customer can restrict the clients that have read/write access to the gateway by specifying the list of clients as a list of IP addresses or CIDR blocks. This list can be specified using the API CreateNfsFileShare while creating new file shares, or UpdateNfsFileShare while update existing file shares. To find out the list of clients that have access, the existing API DescribeNfsFileShare will now output the list of clients that have access. - -Release v1.6.20 (2017-02-09) -=== - -Service Client Updates ---- -* `service/ec2`: Updates service API and documentation - * This feature allows customers to associate an IAM profile to running instances that do not have any. -* `service/rekognition`: Updates service API and documentation - * DetectFaces and IndexFaces operations now return an estimate of the age of the face as an age range. - -SDK Features ---- -* `aws/endpoints`: Add option to resolve unknown endpoints (#1074) -Release v1.6.19 (2017-02-08) -=== - -Service Client Updates ---- -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/glacier`: Updates service examples - * Doc Update -* `service/lexruntimeservice`: Adds new service - * Preview release - -SDK Bug Fixes ---- -* `private/protocol/json`: Fixes json to throw an error if a float number is (+/-)Inf and NaN (#1068) -* `private/model/api`: Fix documentation error listing (#1067) - -SDK Features ---- -* `private/model`: Add service response error code generation (#1061) - -Release v1.6.18 (2017-01-27) -=== - -Service Client Updates ---- -* `service/clouddirectory`: Adds new service - * Amazon Cloud Directory is a highly scalable, high performance, multi-tenant directory service in the cloud. Its web-based directories make it easy for you to organize and manage application resources such as users, groups, locations, devices, policies, and the rich relationships between them. -* `service/codedeploy`: Updates service API, documentation, and paginators - * This release of AWS CodeDeploy introduces support for blue/green deployments. In a blue/green deployment, the current set of instances in a deployment group is replaced by new instances that have the latest application revision installed on them. After traffic is rerouted behind a load balancer to the replacement instances, the original instances can be terminated automatically or kept running for other uses. -* `service/ec2`: Updates service API and documentation - * Adds instance health check functionality to replace unhealthy EC2 Spot fleet instances with fresh ones. -* `service/rds`: Updates service API and documentation - * Snapshot Engine Version Upgrade - -Release v1.6.17 (2017-01-25) -=== - -Service Client Updates ---- -* `service/elbv2`: Updates service API, documentation, and paginators - * Application Load Balancers now support native Internet Protocol version 6 (IPv6) in an Amazon Virtual Private Cloud (VPC). With this ability, clients can now connect to the Application Load Balancer in a dual-stack mode via either IPv4 or IPv6. -* `service/rds`: Updates service API and documentation - * Cross Region Read Replica Copying (CreateDBInstanceReadReplica) - -Release v1.6.16 (2017-01-24) -=== - -Service Client Updates ---- -* `service/codebuild`: Updates service documentation and paginators - * Documentation updates -* `service/codecommit`: Updates service API, documentation, and paginators - * AWS CodeCommit now includes the option to view the differences between a commit and its parent commit from within the console. You can view the differences inline (Unified view) or side by side (Split view). To view information about the differences between a commit and something other than its parent, you can use the AWS CLI and the get-differences and get-blob commands, or you can use the GetDifferences and GetBlob APIs. -* `service/ecs`: Updates service API and documentation - * Amazon ECS now supports a state for container instances that can be used to drain a container instance in preparation for maintenance or cluster scale down. - -Release v1.6.15 (2017-01-20) -=== - -Service Client Updates ---- -* `service/acm`: Updates service API, documentation, and paginators - * Update for AWS Certificate Manager: Updated response elements for DescribeCertificate API in support of managed renewal -* `service/health`: Updates service documentation - -Release v1.6.14 (2017-01-19) -=== - -Service Client Updates ---- -* `service/ec2`: Updates service API, documentation, and paginators - * Amazon EC2 Spot instances now support dedicated tenancy, providing the ability to run Spot instances single-tenant manner on physically isolated hardware within a VPC to satisfy security, privacy, or other compliance requirements. Dedicated Spot instances can be requested using RequestSpotInstances and RequestSpotFleet. - -Release v1.6.13 (2017-01-18) -=== - -Service Client Updates ---- -* `service/rds`: Updates service API, documentation, and paginators - -Release v1.6.12 (2017-01-17) -=== - -Service Client Updates ---- -* `service/dynamodb`: Updates service API, documentation, and paginators - * Tagging Support for Amazon DynamoDB Tables and Indexes -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/glacier`: Updates service API, paginators, and examples - * Doc-only Update for Glacier: Added code snippets -* `service/polly`: Updates service documentation and examples - * Doc-only update for Amazon Polly -- added snippets -* `service/rekognition`: Updates service documentation and paginators - * Added code samples to Rekognition reference topics. -* `service/route53`: Updates service API and paginators - * Add ca-central-1 and eu-west-2 enum values to CloudWatchRegion enum - -Release v1.6.11 (2017-01-16) -=== - -Service Client Updates ---- -* `service/configservice`: Updates service API, documentation, and paginators -* `service/costandusagereportservice`: Adds new service - * The AWS Cost and Usage Report Service API allows you to enable and disable the Cost & Usage report, as well as modify the report name, the data granularity, and the delivery preferences. -* `service/dynamodb`: Updates service API, documentation, and examples - * Snippets for the DynamoDB API. -* `service/elasticache`: Updates service API, documentation, and examples - * Adds new code examples. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.6.10 (2017-01-04) -=== - -Service Client Updates ---- -* `service/configservice`: Updates service API and documentation - * AWSConfig is planning to add support for OversizedConfigurationItemChangeNotification message type in putConfigRule. After this release customers can use/write rules based on OversizedConfigurationItemChangeNotification mesage type. -* `service/efs`: Updates service API, documentation, and examples - * Doc-only Update for EFS: Added code snippets -* `service/iam`: Updates service documentation and examples -* `service/lambda`: Updates service documentation and examples - * Doc only updates for Lambda: Added code snippets -* `service/marketplacecommerceanalytics`: Updates service API and documentation - * Added support for data set disbursed_amount_by_instance_hours, with historical data available starting 2012-09-04. New data is published to this data set every 30 days. -* `service/rds`: Updates service documentation - * Updated documentation for CopyDBSnapshot. -* `service/rekognition`: Updates service documentation and examples - * Doc-only Update for Rekognition: Added code snippets -* `service/snowball`: Updates service examples -* `service/dynamodbstreams`: Updates service API and examples - * Doc-only Update for DynamoDB Streams: Added code snippets - -SDK Feature ---- -* `private/model/api`: Increasing the readability of code generated files. (#1024) -Release v1.6.9 (2016-12-30) -=== - -Service Client Updates ---- -* `service/codedeploy`: Updates service API and documentation - * CodeDeploy will support Iam Session Arns in addition to Iam User Arns for on premise host authentication. -* `service/ecs`: Updates service API and documentation - * Amazon EC2 Container Service (ECS) now supports the ability to customize the placement of tasks on container instances. -* `aws/endpoints`: Updated Regions and Endpoints metadata. - -Release v1.6.8 (2016-12-22) -=== - -Service Client Updates ---- -* `service/apigateway`: Updates service API and documentation - * Amazon API Gateway is adding support for generating SDKs in more languages. This update introduces two new operations used to dynamically discover these SDK types and what configuration each type accepts. -* `service/directoryservice`: Updates service documentation - * Added code snippets for the DS SDKs -* `service/elasticbeanstalk`: Updates service API and documentation -* `service/iam`: Updates service API and documentation - * Adds service-specific credentials to IAM service to make it easier to onboard CodeCommit customers. These are username/password credentials that work with a single service. -* `service/kms`: Updates service API, documentation, and examples - * Update docs and add SDK examples - -Release v1.6.7 (2016-12-22) -=== - -Service Client Updates ---- -* `service/ecr`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/rds`: Updates service API and documentation - * Cross Region Encrypted Snapshot Copying (CopyDBSnapshot) - -Release v1.6.6 (2016-12-20) -=== - -Service Client Updates ---- -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/firehose`: Updates service API, documentation, and examples - * Processing feature enables users to process and modify records before Amazon Firehose delivers them to destinations. -* `service/route53`: Updates service API and documentation - * Enum updates for eu-west-2 and ca-central-1 -* `service/storagegateway`: Updates service API, documentation, and examples - * File gateway is a new mode in the AWS Storage Gateway that support a file interface into S3, alongside the current block-based volume and VTL storage. File gateway combines a service and virtual software appliance, enabling you to store and retrieve objects in Amazon S3 using industry standard file protocols such as NFS. The software appliance, or gateway, is deployed into your on-premises environment as a virtual machine (VM) running on VMware ESXi. The gateway provides access to objects in S3 as files on a Network File System (NFS) mount point. - -Release v1.6.5 (2016-12-19) -=== - -Service Client Updates ---- -* `service/cloudformation`: Updates service documentation - * Minor doc update for CloudFormation. -* `service/cloudtrail`: Updates service paginators -* `service/cognitoidentity`: Updates service API and documentation - * We are adding Groups to Cognito user pools. Developers can perform CRUD operations on groups, add and remove users from groups, list users in groups, etc. We are adding fine-grained role-based access control for Cognito identity pools. Developers can configure an identity pool to get the IAM role from an authenticated user's token, or they can configure rules that will map a user to a different role -* `service/applicationdiscoveryservice`: Updates service API and documentation - * Adds new APIs to group discovered servers into Applications with get summary and neighbors. Includes additional filters for ListConfigurations and DescribeAgents API. -* `service/inspector`: Updates service API, documentation, and examples - * Doc-only Update for Inspector: Adding SDK code snippets for Inspector -* `service/sqs`: Updates service documentation - -SDK Bug Fixes ---- -* `aws/request`: Add PriorRequestNotComplete to throttle retry codes (#1011) - * Fixes: Not retrying when PriorRequestNotComplete #1009 - -SDK Feature ---- -* `private/model/api`: Adds crosslinking to service documentation (#1010) - -Release v1.6.4 (2016-12-15) -=== - -Service Client Updates ---- -* `service/cognitoidentityprovider`: Updates service API and documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/ssm`: Updates service API and documentation - * This will provide customers with access to the Patch Baseline and Patch Compliance APIs. - -SDK Bug Fixes ---- -* `service/route53`: Fix URL path cleaning for Route53 API requests (#1006) - * Fixes: SerializationError when using Route53 ChangeResourceRecordSets #1005 -* `aws/request`: Add PriorRequestNotComplete to throttle retry codes (#1002) - * Fixes: Not retrying when PriorRequestNotComplete #1001 - -Release v1.6.3 (2016-12-14) -=== - -Service Client Updates ---- -* `service/batch`: Adds new service - * AWS Batch is a batch computing service that lets customers define queues and compute environments and then submit work as batch jobs. -* `service/databasemigrationservice`: Updates service API and documentation - * Adds support for SSL enabled Oracle endpoints and task modification. -* `service/elasticbeanstalk`: Updates service documentation -* `aws/endpoints`: Updated Regions and Endpoints metadata. -* `service/cloudwatchlogs`: Updates service API and documentation - * Add support for associating LogGroups with AWSTagris tags -* `service/marketplacecommerceanalytics`: Updates service API and documentation - * Add new enum to DataSetType: sales_compensation_billed_revenue -* `service/rds`: Updates service documentation - * Doc-only Update for RDS: New versions available in CreateDBInstance -* `service/sts`: Updates service documentation - * Adding Code Snippet Examples for SDKs for STS - -SDK Bug Fixes ---- -* `aws/request`: Fix retrying timeout requests (#981) - * Fixes: Requests Retrying is broken if the error was caused due to a client timeout #947 -* `aws/request`: Fix for Go 1.8 request incorrectly sent with body (#991) - * Fixes: service/route53: ListHostedZones hangs and then fails with go1.8 #984 -* private/protocol/rest: Use RawPath instead of Opaque (#993) - * Fixes: HTTP2 request failing with REST protocol services, e.g AWS X-Ray -* private/model/api: Generate REST-JSON JSONVersion correctly (#998) - * Fixes: REST-JSON protocol service code missing JSONVersion metadata. - -Release v1.6.2 (2016-12-08) -=== - -Service Client Updates ---- -* `service/cloudfront`: Add lambda function associations to cache behaviors -* `service/codepipeline`: This is a doc-only update request to incorporate some recent minor revisions to the doc content. -* `service/rds`: Updates service API and documentation -* `service/wafregional`: With this new feature, customers can use AWS WAF directly on Application Load Balancers in a VPC within available regions to protect their websites and web services from malicious attacks such as SQL injection, Cross Site Scripting, bad bots, etc. - -Release v1.6.1 (2016-12-07) -=== - -Service Client Updates ---- -* `service/config`: Updates service API -* `service/s3`: Updates service API -* `service/sqs`: Updates service API and documentation - -Release v1.6.0 (2016-12-06) -=== - -Service Client Updates ---- -* `service/config`: Updates service API and documentation -* `service/ec2`: Updates service API -* `service/sts`: Updates service API, documentation, and examples - -SDK Bug Fixes ---- -* private/protocol/xml/xmlutil: Fix SDK XML unmarshaler #975 - * Fixes GetBucketACL Grantee required type always nil. #916 - -SDK Feature ---- -* aws/endpoints: Add endpoint metadata to SDK #961 - * Adds Region and Endpoint metadata to the SDK. This allows you to enumerate regions and endpoint metadata based on a defined model embedded in the SDK. - -Release v1.5.13 (2016-12-01) -=== - -Service Client Updates ---- -* `service/apigateway`: Updates service API and documentation -* `service/appstream`: Adds new service -* `service/codebuild`: Adds new service -* `service/directconnect`: Updates service API and documentation -* `service/ec2`: Adds new service -* `service/elasticbeanstalk`: Updates service API and documentation -* `service/health`: Adds new service -* `service/lambda`: Updates service API and documentation -* `service/opsworkscm`: Adds new service -* `service/pinpoint`: Adds new service -* `service/shield`: Adds new service -* `service/ssm`: Updates service API and documentation -* `service/states`: Adds new service -* `service/xray`: Adds new service - -Release v1.5.12 (2016-11-30) -=== - -Service Client Updates ---- -* `service/lightsail`: Adds new service -* `service/polly`: Adds new service -* `service/rekognition`: Adds new service -* `service/snowball`: Updates service API and documentation - -Release v1.5.11 (2016-11-29) -=== - -Service Client Updates ---- -`service/s3`: Updates service API and documentation - -Release v1.5.10 (2016-11-22) -=== - -Service Client Updates ---- -* `service/cloudformation`: Updates service API and documentation -* `service/glacier`: Updates service API, documentation, and examples -* `service/route53`: Updates service API and documentation -* `service/s3`: Updates service API and documentation - -SDK Bug Fixes ---- -* `private/protocol/xml/xmlutil`: Fixes xml marshaler to unmarshal properly -into tagged fields -[#916](https://github.com/aws/aws-sdk-go/issues/916) - -Release v1.5.9 (2016-11-22) -=== - -Service Client Updates ---- -* `service/cloudtrail`: Updates service API and documentation -* `service/ecs`: Updates service API and documentation - -Release v1.5.8 (2016-11-18) -=== - -Service Client Updates ---- -* `service/application-autoscaling`: Updates service API and documentation -* `service/elasticmapreduce`: Updates service API and documentation -* `service/elastictranscoder`: Updates service API, documentation, and examples -* `service/gamelift`: Updates service API and documentation -* `service/lambda`: Updates service API and documentation - -Release v1.5.7 (2016-11-18) -=== - -Service Client Updates ---- -* `service/apigateway`: Updates service API and documentation -* `service/meteringmarketplace`: Updates service API and documentation -* `service/monitoring`: Updates service API and documentation -* `service/sqs`: Updates service API, documentation, and examples - -Release v1.5.6 (2016-11-16) -=== - -Service Client Updates ---- -`service/route53`: Updates service API and documentation -`service/servicecatalog`: Updates service API and documentation - -Release v1.5.5 (2016-11-15) -=== - -Service Client Updates ---- -* `service/ds`: Updates service API and documentation -* `service/elasticache`: Updates service API and documentation -* `service/kinesis`: Updates service API and documentation - -Release v1.5.4 (2016-11-15) -=== - -Service Client Updates ---- -* `service/cognito-idp`: Updates service API and documentation - -Release v1.5.3 (2016-11-11) -=== - -Service Client Updates ---- -* `service/cloudformation`: Updates service documentation and examples -* `service/logs`: Updates service API and documentation - -Release v1.5.2 (2016-11-03) -=== - -Service Client Updates ---- -* `service/directconnect`: Updates service API and documentation - -Release v1.5.1 (2016-11-02) -=== - -Service Client Updates ---- -* `service/email`: Updates service API and documentation - -Release v1.5.0 (2016-11-01) -=== - -Service Client Updates ---- -* `service/cloudformation`: Updates service API and documentation -* `service/ecr`: Updates service paginators - -SDK Feature Updates ---- -* `private/model/api`: Add generated setters for API parameters (#918) - * Adds setters to the SDK's API parameter types, and are a convenience method that reduce the need to use `aws.String` and like utility. - -Release v1.4.22 (2016-10-25) -=== - -Service Client Updates ---- -* `service/elasticloadbalancingv2`: Updates service documentation. -* `service/autoscaling`: Updates service documentation. - -Release v1.4.21 (2016-10-24) -=== - -Service Client Updates ---- -* `service/sms`: AWS Server Migration Service (SMS) is an agentless service which makes it easier and faster for you to migrate thousands of on-premises workloads to AWS. AWS SMS allows you to automate, schedule, and track incremental replications of live server volumes, making it easier for you to coordinate large-scale server migrations. -* `service/ecs`: Updates documentation. - -SDK Feature Updates ---- -* `private/models/api`: Improve code generation of documentation. - -Release v1.4.20 (2016-10-20) -=== - -Service Client Updates ---- -* `service/budgets`: Adds new service, AWS Budgets. -* `service/waf`: Updates service documentation. - -Release v1.4.19 (2016-10-18) -=== - -Service Client Updates ---- -* `service/cloudfront`: Updates service API and documentation. - * Ability to use Amazon CloudFront to deliver your content both via IPv6 and IPv4 using HTTP/HTTPS. -* `service/configservice`: Update service API and documentation. -* `service/iot`: Updates service API and documentation. -* `service/kinesisanalytics`: Updates service API and documentation. - * Whenever Amazon Kinesis Analytics is not able to detect schema for the given streaming source on DiscoverInputSchema API, we would return the raw records that was sampled to detect the schema. -* `service/rds`: Updates service API and documentation. - * Amazon Aurora integrates with other AWS services to allow you to extend your Aurora DB cluster to utilize other capabilities in the AWS cloud. Permission to access other AWS services is granted by creating an IAM role with the necessary permissions, and then associating the role with your DB cluster. - -SDK Feature Updates ---- -* `service/dynamodb/dynamodbattribute`: Add UnmarshalListOfMaps #897 - * Adds support for unmarshaling a list of maps. This is useful for unmarshaling the DynamoDB AttributeValue list of maps returned by APIs like Query and Scan. - -Release v1.4.18 (2016-10-17) -=== - -Service Model Updates ---- -* `service/route53`: Updates service API and documentation. - -Release v1.4.17 -=== - -Service Model Updates ---- -* `service/acm`: Update service API, and documentation. - * This change allows users to import third-party SSL/TLS certificates into ACM. -* `service/elasticbeanstalk`: Update service API, documentation, and pagination. - * Elastic Beanstalk DescribeApplicationVersions API is being updated to support pagination. -* `service/gamelift`: Update service API, and documentation. - * New APIs to protect game developer resource (builds, alias, fleets, instances, game sessions and player sessions) against abuse. - -SDK Features ---- -* `service/s3`: Add support for accelerate with dualstack [#887](https://github.com/aws/aws-sdk-go/issues/887) - -Release v1.4.16 (2016-10-13) -=== - -Service Model Updates ---- -* `service/ecr`: Update Amazon EC2 Container Registry service model - * DescribeImages is a new api used to expose image metadata which today includes image size and image creation timestamp. -* `service/elasticache`: Update Amazon ElastiCache service model - * Elasticache is launching a new major engine release of Redis, 3.2 (providing stability updates and new command sets over 2.8), as well as ElasticSupport for enabling Redis Cluster in 3.2, which provides support for multiple node groups to horizontally scale data, as well as superior engine failover capabilities - -SDK Bug Fixes ---- -* `aws/session`: Skip shared config on read errors [#883](https://github.com/aws/aws-sdk-go/issues/883) -* `aws/signer/v4`: Add support for URL.EscapedPath to signer [#885](https://github.com/aws/aws-sdk-go/issues/885) - -SDK Features ---- -* `private/model/api`: Add docs for errors to API operations [#881](https://github.com/aws/aws-sdk-go/issues/881) -* `private/model/api`: Improve field and waiter doc strings [#879](https://github.com/aws/aws-sdk-go/issues/879) -* `service/dynamodb/dynamodbattribute`: Allow multiple struct tag elements [#886](https://github.com/aws/aws-sdk-go/issues/886) -* Add build tags to internal SDK tools [#880](https://github.com/aws/aws-sdk-go/issues/880) - -Release v1.4.15 (2016-10-06) -=== - -Service Model Updates ---- -* `service/cognitoidentityprovider`: Update Amazon Cognito Identity Provider service model -* `service/devicefarm`: Update AWS Device Farm documentation -* `service/opsworks`: Update AWS OpsWorks service model -* `service/s3`: Update Amazon Simple Storage Service model -* `service/waf`: Update AWS WAF service model - -SDK Bug Fixes ---- -* `aws/request`: Fix HTTP Request Body race condition [#874](https://github.com/aws/aws-sdk-go/issues/874) - -SDK Feature Updates ---- -* `aws/ec2metadata`: Add support for EC2 User Data [#872](https://github.com/aws/aws-sdk-go/issues/872) -* `aws/signer/v4`: Remove logic determining if request needs to be resigned [#876](https://github.com/aws/aws-sdk-go/issues/876) - -Release v1.4.14 (2016-09-29) -=== -* `service/ec2`: api, documentation, and paginators updates. -* `service/s3`: api and documentation updates. - -Release v1.4.13 (2016-09-27) -=== -* `service/codepipeline`: documentation updates. -* `service/cloudformation`: api and documentation updates. -* `service/kms`: documentation updates. -* `service/elasticfilesystem`: documentation updates. -* `service/snowball`: documentation updates. diff --git a/vendor/github.com/aws/aws-sdk-go/CHANGELOG_PENDING.md b/vendor/github.com/aws/aws-sdk-go/CHANGELOG_PENDING.md deleted file mode 100644 index 8a1927a39ca..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/CHANGELOG_PENDING.md +++ /dev/null @@ -1,5 +0,0 @@ -### SDK Features - -### SDK Enhancements - -### SDK Bugs diff --git a/vendor/github.com/aws/aws-sdk-go/CONTRIBUTING.md b/vendor/github.com/aws/aws-sdk-go/CONTRIBUTING.md deleted file mode 100644 index 6f422a95edb..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/CONTRIBUTING.md +++ /dev/null @@ -1,127 +0,0 @@ -Contributing to the AWS SDK for Go - -We work hard to provide a high-quality and useful SDK, and we greatly value -feedback and contributions from our community. Whether it's a bug report, -new feature, correction, or additional documentation, we welcome your issues -and pull requests. Please read through this document before submitting any -issues or pull requests to ensure we have all the necessary information to -effectively respond to your bug report or contribution. - - -## Filing Bug Reports - -You can file bug reports against the SDK on the [GitHub issues][issues] page. - -If you are filing a report for a bug or regression in the SDK, it's extremely -helpful to provide as much information as possible when opening the original -issue. This helps us reproduce and investigate the possible bug without having -to wait for this extra information to be provided. Please read the following -guidelines prior to filing a bug report. - -1. Search through existing [issues][] to ensure that your specific issue has - not yet been reported. If it is a common issue, it is likely there is - already a bug report for your problem. - -2. Ensure that you have tested the latest version of the SDK. Although you - may have an issue against an older version of the SDK, we cannot provide - bug fixes for old versions. It's also possible that the bug may have been - fixed in the latest release. - -3. Provide as much information about your environment, SDK version, and - relevant dependencies as possible. For example, let us know what version - of Go you are using, which and version of the operating system, and the - the environment your code is running in. e.g Container. - -4. Provide a minimal test case that reproduces your issue or any error - information you related to your problem. We can provide feedback much - more quickly if we know what operations you are calling in the SDK. If - you cannot provide a full test case, provide as much code as you can - to help us diagnose the problem. Any relevant information should be provided - as well, like whether this is a persistent issue, or if it only occurs - some of the time. - - -## Submitting Pull Requests - -We are always happy to receive code and documentation contributions to the SDK. -Please be aware of the following notes prior to opening a pull request: - -1. The SDK is released under the [Apache license][license]. Any code you submit - will be released under that license. For substantial contributions, we may - ask you to sign a [Contributor License Agreement (CLA)][cla]. - -2. If you would like to implement support for a significant feature that is not - yet available in the SDK, please talk to us beforehand to avoid any - duplication of effort. - -3. Wherever possible, pull requests should contain tests as appropriate. - Bugfixes should contain tests that exercise the corrected behavior (i.e., the - test should fail without the bugfix and pass with it), and new features - should be accompanied by tests exercising the feature. - -4. Pull requests that contain failing tests will not be merged until the test - failures are addressed. Pull requests that cause a significant drop in the - SDK's test coverage percentage are unlikely to be merged until tests have - been added. - -5. The JSON files under the SDK's `models` folder are sourced from outside the SDK. - Such as `models/apis/ec2/2016-11-15/api.json`. We will not accept pull requests - directly on these models. If you discover an issue with the models please - create a [GitHub issue][issues] describing the issue. - -### Testing - -To run the tests locally, running the `make unit` command will `go get` the -SDK's testing dependencies, and run vet, link and unit tests for the SDK. - -``` -make unit -``` - -Standard go testing functionality is supported as well. To test SDK code that -is tagged with `codegen` you'll need to set the build tag in the go test -command. The `make unit` command will do this automatically. - -``` -go test -tags codegen ./private/... -``` - -See the `Makefile` for additional testing tags that can be used in testing. - -To test on multiple platform the SDK includes several DockerFiles under the -`awstesting/sandbox` folder, and associated make recipes to to execute -unit testing within environments configured for specific Go versions. - -``` -make sandbox-test-go18 -``` - -To run all sandbox environments use the following make recipe - -``` -# Optionally update the Go tip that will be used during the batch testing -make update-aws-golang-tip - -# Run all SDK tests for supported Go versions in sandboxes -make sandbox-test -``` - -In addition the sandbox environment include make recipes for interactive modes -so you can run command within the Docker container and context of the SDK. - -``` -make sandbox-go18 -``` - -### Changelog - -You can see all release changes in the `CHANGELOG.md` file at the root of the -repository. The release notes added to this file will contain service client -updates, and major SDK changes. - -[issues]: https://github.com/aws/aws-sdk-go/issues -[pr]: https://github.com/aws/aws-sdk-go/pulls -[license]: http://aws.amazon.com/apache2.0/ -[cla]: http://en.wikipedia.org/wiki/Contributor_License_Agreement -[releasenotes]: https://github.com/aws/aws-sdk-go/releases - diff --git a/vendor/github.com/aws/aws-sdk-go/Gopkg.lock b/vendor/github.com/aws/aws-sdk-go/Gopkg.lock deleted file mode 100644 index 854c94fdf04..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/Gopkg.lock +++ /dev/null @@ -1,20 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/go-ini/ini" - packages = ["."] - revision = "300e940a926eb277d3901b20bdfcc54928ad3642" - version = "v1.25.4" - -[[projects]] - name = "github.com/jmespath/go-jmespath" - packages = ["."] - revision = "0b12d6b5" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "51a86a867df617990082dec6b868e4efe2fdb2ed0e02a3daa93cd30f962b5085" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/aws/aws-sdk-go/Gopkg.toml b/vendor/github.com/aws/aws-sdk-go/Gopkg.toml deleted file mode 100644 index 664fc59553f..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/Gopkg.toml +++ /dev/null @@ -1,48 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - -ignored = [ - # Testing/Example/Codegen dependencies - "github.com/stretchr/testify", - "github.com/stretchr/testify/assert", - "github.com/stretchr/testify/require", - "github.com/go-sql-driver/mysql", - "github.com/gucumber/gucumber", - "github.com/pkg/errors", - "golang.org/x/net", - "golang.org/x/net/html", - "golang.org/x/net/http2", - "golang.org/x/text", - "golang.org/x/text/html", - "golang.org/x/tools", - "golang.org/x/tools/go/loader", -] - - -[[constraint]] - name = "github.com/go-ini/ini" - version = "1.25.4" - -[[constraint]] - name = "github.com/jmespath/go-jmespath" - revision = "0b12d6b5" - #version = "0.2.2" diff --git a/vendor/github.com/aws/aws-sdk-go/Makefile b/vendor/github.com/aws/aws-sdk-go/Makefile deleted file mode 100644 index 83ccc1e62fd..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/Makefile +++ /dev/null @@ -1,187 +0,0 @@ -LINTIGNOREDOT='awstesting/integration.+should not use dot imports' -LINTIGNOREDOC='service/[^/]+/(api|service|waiters)\.go:.+(comment on exported|should have comment or be unexported)' -LINTIGNORECONST='service/[^/]+/(api|service|waiters)\.go:.+(type|struct field|const|func) ([^ ]+) should be ([^ ]+)' -LINTIGNORESTUTTER='service/[^/]+/(api|service)\.go:.+(and that stutters)' -LINTIGNOREINFLECT='service/[^/]+/(api|errors|service)\.go:.+(method|const) .+ should be ' -LINTIGNOREINFLECTS3UPLOAD='service/s3/s3manager/upload\.go:.+struct field SSEKMSKeyId should be ' -LINTIGNOREDEPS='vendor/.+\.go' -LINTIGNOREPKGCOMMENT='service/[^/]+/doc_custom.go:.+package comment should be of the form' -UNIT_TEST_TAGS="example codegen awsinclude" - -SDK_WITH_VENDOR_PKGS=$(shell go list -tags ${UNIT_TEST_TAGS} ./... | grep -v "/vendor/src") -SDK_ONLY_PKGS=$(shell go list ./... | grep -v "/vendor/") -SDK_UNIT_TEST_ONLY_PKGS=$(shell go list -tags ${UNIT_TEST_TAGS} ./... | grep -v "/vendor/") -SDK_GO_1_4=$(shell go version | grep "go1.4") -SDK_GO_1_5=$(shell go version | grep "go1.5") -SDK_GO_VERSION=$(shell go version | awk '''{print $$3}''' | tr -d '''\n''') - -all: get-deps generate unit - -help: - @echo "Please use \`make ' where is one of" - @echo " api_info to print a list of services and versions" - @echo " docs to build SDK documentation" - @echo " build to go build the SDK" - @echo " unit to run unit tests" - @echo " integration to run integration tests" - @echo " performance to run performance tests" - @echo " verify to verify tests" - @echo " lint to lint the SDK" - @echo " vet to vet the SDK" - @echo " generate to go generate and make services" - @echo " gen-test to generate protocol tests" - @echo " gen-services to generate services" - @echo " get-deps to go get the SDK dependencies" - @echo " get-deps-tests to get the SDK's test dependencies" - @echo " get-deps-verify to get the SDK's verification dependencies" - -generate: gen-test gen-endpoints gen-services - -gen-test: gen-protocol-test - -gen-services: - go generate ./service - -gen-protocol-test: - go generate ./private/protocol/... - -gen-endpoints: - go generate ./models/endpoints/ - -build: - @echo "go build SDK and vendor packages" - @go build ${SDK_ONLY_PKGS} - -unit: get-deps-tests build verify - @echo "go test SDK and vendor packages" - @go test -tags ${UNIT_TEST_TAGS} $(SDK_UNIT_TEST_ONLY_PKGS) - -unit-with-race-cover: get-deps-tests build verify - @echo "go test SDK and vendor packages" - @go test -tags ${UNIT_TEST_TAGS} -race -cpu=1,2,4 $(SDK_UNIT_TEST_ONLY_PKGS) - -integration: get-deps-tests integ-custom smoke-tests performance - -integ-custom: - go test -tags "integration" ./awstesting/integration/customizations/... - -cleanup-integ: - go run -tags "integration" ./awstesting/cmd/bucket_cleanup/main.go "aws-sdk-go-integration" - -smoke-tests: get-deps-tests - gucumber -go-tags "integration" ./awstesting/integration/smoke - -performance: get-deps-tests - AWS_TESTING_LOG_RESULTS=${log-detailed} AWS_TESTING_REGION=$(region) AWS_TESTING_DB_TABLE=$(table) gucumber -go-tags "integration" ./awstesting/performance - -sandbox-tests: sandbox-test-go15 sandbox-test-go15-novendorexp sandbox-test-go16 sandbox-test-go17 sandbox-test-go18 sandbox-test-go19 sandbox-test-gotip - -sandbox-build-go15: - docker build -f ./awstesting/sandbox/Dockerfile.test.go1.5 -t "aws-sdk-go-1.5" . -sandbox-go15: sandbox-build-go15 - docker run -i -t aws-sdk-go-1.5 bash -sandbox-test-go15: sandbox-build-go15 - docker run -t aws-sdk-go-1.5 - -sandbox-build-go15-novendorexp: - docker build -f ./awstesting/sandbox/Dockerfile.test.go1.5-novendorexp -t "aws-sdk-go-1.5-novendorexp" . -sandbox-go15-novendorexp: sandbox-build-go15-novendorexp - docker run -i -t aws-sdk-go-1.5-novendorexp bash -sandbox-test-go15-novendorexp: sandbox-build-go15-novendorexp - docker run -t aws-sdk-go-1.5-novendorexp - -sandbox-build-go16: - docker build -f ./awstesting/sandbox/Dockerfile.test.go1.6 -t "aws-sdk-go-1.6" . -sandbox-go16: sandbox-build-go16 - docker run -i -t aws-sdk-go-1.6 bash -sandbox-test-go16: sandbox-build-go16 - docker run -t aws-sdk-go-1.6 - -sandbox-build-go17: - docker build -f ./awstesting/sandbox/Dockerfile.test.go1.7 -t "aws-sdk-go-1.7" . -sandbox-go17: sandbox-build-go17 - docker run -i -t aws-sdk-go-1.7 bash -sandbox-test-go17: sandbox-build-go17 - docker run -t aws-sdk-go-1.7 - -sandbox-build-go18: - docker build -f ./awstesting/sandbox/Dockerfile.test.go1.8 -t "aws-sdk-go-1.8" . -sandbox-go18: sandbox-build-go18 - docker run -i -t aws-sdk-go-1.8 bash -sandbox-test-go18: sandbox-build-go18 - docker run -t aws-sdk-go-1.8 - -sandbox-build-go19: - docker build -f ./awstesting/sandbox/Dockerfile.test.go1.8 -t "aws-sdk-go-1.9" . -sandbox-go19: sandbox-build-go19 - docker run -i -t aws-sdk-go-1.9 bash -sandbox-test-go19: sandbox-build-go19 - docker run -t aws-sdk-go-1.9 - -sandbox-build-gotip: - @echo "Run make update-aws-golang-tip, if this test fails because missing aws-golang:tip container" - docker build -f ./awstesting/sandbox/Dockerfile.test.gotip -t "aws-sdk-go-tip" . -sandbox-gotip: sandbox-build-gotip - docker run -i -t aws-sdk-go-tip bash -sandbox-test-gotip: sandbox-build-gotip - docker run -t aws-sdk-go-tip - -update-aws-golang-tip: - docker build --no-cache=true -f ./awstesting/sandbox/Dockerfile.golang-tip -t "aws-golang:tip" . - -verify: get-deps-verify lint vet - -lint: - @echo "go lint SDK and vendor packages" - @lint=`if [ \( -z "${SDK_GO_1_4}" \) -a \( -z "${SDK_GO_1_5}" \) ]; then golint ./...; else echo "skipping golint"; fi`; \ - lint=`echo "$$lint" | grep -E -v -e ${LINTIGNOREDOT} -e ${LINTIGNOREDOC} -e ${LINTIGNORECONST} -e ${LINTIGNORESTUTTER} -e ${LINTIGNOREINFLECT} -e ${LINTIGNOREDEPS} -e ${LINTIGNOREINFLECTS3UPLOAD} -e ${LINTIGNOREPKGCOMMENT}`; \ - echo "$$lint"; \ - if [ "$$lint" != "" ] && [ "$$lint" != "skipping golint" ]; then exit 1; fi - -SDK_BASE_FOLDERS=$(shell ls -d */ | grep -v vendor | grep -v awsmigrate) -ifneq (,$(findstring go1.4, ${SDK_GO_VERSION})) - GO_VET_CMD=echo skipping go vet, ${SDK_GO_VERSION} -else ifneq (,$(findstring go1.6, ${SDK_GO_VERSION})) - GO_VET_CMD=go tool vet --all -shadow -example=false -else - GO_VET_CMD=go tool vet --all -shadow -endif - -vet: - ${GO_VET_CMD} ${SDK_BASE_FOLDERS} - -get-deps: get-deps-tests get-deps-verify - @echo "go get SDK dependencies" - @go get -v $(SDK_ONLY_PKGS) - -get-deps-tests: - @echo "go get SDK testing dependencies" - go get github.com/gucumber/gucumber/cmd/gucumber - go get github.com/stretchr/testify - go get github.com/smartystreets/goconvey - go get golang.org/x/net/html - go get golang.org/x/net/http2 - -get-deps-verify: - @echo "go get SDK verification utilities" - @if [ \( -z "${SDK_GO_1_4}" \) -a \( -z "${SDK_GO_1_5}" \) ]; then go get github.com/golang/lint/golint; else echo "skipped getting golint"; fi - -bench: - @echo "go bench SDK packages" - @go test -run NONE -bench . -benchmem -tags 'bench' $(SDK_ONLY_PKGS) - -bench-protocol: - @echo "go bench SDK protocol marshallers" - @go test -run NONE -bench . -benchmem -tags 'bench' ./private/protocol/... - -docs: - @echo "generate SDK docs" - @# This env variable, DOCS, is for internal use - @if [ -z ${AWS_DOC_GEN_TOOL} ]; then\ - rm -rf doc && bundle install && bundle exec yard;\ - else\ - $(AWS_DOC_GEN_TOOL) `pwd`;\ - fi - -api_info: - @go run private/model/cli/api-info/api-info.go diff --git a/vendor/github.com/aws/aws-sdk-go/README.md b/vendor/github.com/aws/aws-sdk-go/README.md deleted file mode 100644 index c32774491c7..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/README.md +++ /dev/null @@ -1,451 +0,0 @@ -[![API Reference](http://img.shields.io/badge/api-reference-blue.svg)](http://docs.aws.amazon.com/sdk-for-go/api) [![Join the chat at https://gitter.im/aws/aws-sdk-go](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/aws/aws-sdk-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://img.shields.io/travis/aws/aws-sdk-go.svg)](https://travis-ci.org/aws/aws-sdk-go) [![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt) - -# AWS SDK for Go - -aws-sdk-go is the official AWS SDK for the Go programming language. - -Checkout our [release notes](https://github.com/aws/aws-sdk-go/releases) for information about the latest bug fixes, updates, and features added to the SDK. - -We [announced](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-2-0-developer-preview/) the Developer Preview for the [v2 AWS SDK for Go](). The v2 SDK is available at https://github.com/aws/aws-sdk-go-v2, and `go get github.com/aws/aws-sdk-go-v2` via `go get`. Check out the v2 SDK's [changes and updates](https://github.com/aws/aws-sdk-go-v2/blob/master/CHANGELOG.md), and let us know what you think. We want your feedback. - -## Installing - -If you are using Go 1.5 with the `GO15VENDOREXPERIMENT=1` vendoring flag, or 1.6 and higher you can use the following command to retrieve the SDK. The SDK's non-testing dependencies will be included and are vendored in the `vendor` folder. - - go get -u github.com/aws/aws-sdk-go - -Otherwise if your Go environment does not have vendoring support enabled, or you do not want to include the vendored SDK's dependencies you can use the following command to retrieve the SDK and its non-testing dependencies using `go get`. - - go get -u github.com/aws/aws-sdk-go/aws/... - go get -u github.com/aws/aws-sdk-go/service/... - -If you're looking to retrieve just the SDK without any dependencies use the following command. - - go get -d github.com/aws/aws-sdk-go/ - -These two processes will still include the `vendor` folder and it should be deleted if its not going to be used by your environment. - - rm -rf $GOPATH/src/github.com/aws/aws-sdk-go/vendor - -## Getting Help - -Please use these community resources for getting help. We use the GitHub issues for tracking bugs and feature requests. - -* Ask a question on [StackOverflow](http://stackoverflow.com/) and tag it with the [`aws-sdk-go`](http://stackoverflow.com/questions/tagged/aws-sdk-go) tag. -* Come join the AWS SDK for Go community chat on [gitter](https://gitter.im/aws/aws-sdk-go). -* Open a support ticket with [AWS Support](http://docs.aws.amazon.com/awssupport/latest/user/getting-started.html). -* If you think you may have found a bug, please open an [issue](https://github.com/aws/aws-sdk-go/issues/new). - -## Opening Issues - -If you encounter a bug with the AWS SDK for Go we would like to hear about it. Search the [existing issues](https://github.com/aws/aws-sdk-go/issues) and see if others are also experiencing the issue before opening a new issue. Please include the version of AWS SDK for Go, Go language, and OS you’re using. Please also include repro case when appropriate. - -The GitHub issues are intended for bug reports and feature requests. For help and questions with using AWS SDK for GO please make use of the resources listed in the [Getting Help](https://github.com/aws/aws-sdk-go#getting-help) section. Keeping the list of open issues lean will help us respond in a timely manner. - -## Reference Documentation - -[`Getting Started Guide`](https://aws.amazon.com/sdk-for-go/) - This document is a general introduction how to configure and make requests with the SDK. If this is your first time using the SDK, this documentation and the API documentation will help you get started. This document focuses on the syntax and behavior of the SDK. The [Service Developer Guide](https://aws.amazon.com/documentation/) will help you get started using specific AWS services. - -[`SDK API Reference Documentation`](https://docs.aws.amazon.com/sdk-for-go/api/) - Use this document to look up all API operation input and output parameters for AWS services supported by the SDK. The API reference also includes documentation of the SDK, and examples how to using the SDK, service client API operations, and API operation require parameters. - -[`Service Developer Guide`](https://aws.amazon.com/documentation/) - Use this documentation to learn how to interface with an AWS service. These are great guides both, if you're getting started with a service, or looking for more information on a service. You should not need this document for coding, though in some cases, services may supply helpful samples that you might want to look out for. - -[`SDK Examples`](https://github.com/aws/aws-sdk-go/tree/master/example) - Included in the SDK's repo are a several hand crafted examples using the SDK features and AWS services. - -## Overview of SDK's Packages - -The SDK is composed of two main components, SDK core, and service clients. -The SDK core packages are all available under the aws package at the root of -the SDK. Each client for a supported AWS service is available within its own -package under the service folder at the root of the SDK. - - * aws - SDK core, provides common shared types such as Config, Logger, - and utilities to make working with API parameters easier. - - * awserr - Provides the error interface that the SDK will use for all - errors that occur in the SDK's processing. This includes service API - response errors as well. The Error type is made up of a code and message. - Cast the SDK's returned error type to awserr.Error and call the Code - method to compare returned error to specific error codes. See the package's - documentation for additional values that can be extracted such as RequestID. - - * credentials - Provides the types and built in credentials providers - the SDK will use to retrieve AWS credentials to make API requests with. - Nested under this folder are also additional credentials providers such as - stscreds for assuming IAM roles, and ec2rolecreds for EC2 Instance roles. - - * endpoints - Provides the AWS Regions and Endpoints metadata for the SDK. - Use this to lookup AWS service endpoint information such as which services - are in a region, and what regions a service is in. Constants are also provided - for all region identifiers, e.g UsWest2RegionID for "us-west-2". - - * session - Provides initial default configuration, and load - configuration from external sources such as environment and shared - credentials file. - - * request - Provides the API request sending, and retry logic for the SDK. - This package also includes utilities for defining your own request - retryer, and configuring how the SDK processes the request. - - * service - Clients for AWS services. All services supported by the SDK are - available under this folder. - -## How to Use the SDK's AWS Service Clients - -The SDK includes the Go types and utilities you can use to make requests to -AWS service APIs. Within the service folder at the root of the SDK you'll find -a package for each AWS service the SDK supports. All service clients follows -a common pattern of creation and usage. - -When creating a client for an AWS service you'll first need to have a Session -value constructed. The Session provides shared configuration that can be shared -between your service clients. When service clients are created you can pass -in additional configuration via the aws.Config type to override configuration -provided by in the Session to create service client instances with custom -configuration. - -Once the service's client is created you can use it to make API requests the -AWS service. These clients are safe to use concurrently. - -## Configuring the SDK - -In the AWS SDK for Go, you can configure settings for service clients, such -as the log level and maximum number of retries. Most settings are optional; -however, for each service client, you must specify a region and your credentials. -The SDK uses these values to send requests to the correct AWS region and sign -requests with the correct credentials. You can specify these values as part -of a session or as environment variables. - -See the SDK's [configuration guide][config_guide] for more information. - -See the [session][session_pkg] package documentation for more information on how to use Session -with the SDK. - -See the [Config][config_typ] type in the [aws][aws_pkg] package for more information on configuration -options. - -[config_guide]: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html -[session_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ -[config_typ]: https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config -[aws_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/ - -### Configuring Credentials - -When using the SDK you'll generally need your AWS credentials to authenticate -with AWS services. The SDK supports multiple methods of supporting these -credentials. By default the SDK will source credentials automatically from -its default credential chain. See the session package for more information -on this chain, and how to configure it. The common items in the credential -chain are the following: - - * Environment Credentials - Set of environment variables that are useful - when sub processes are created for specific roles. - - * Shared Credentials file (~/.aws/credentials) - This file stores your - credentials based on a profile name and is useful for local development. - - * EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials - to application running on an EC2 instance. This removes the need to manage - credential files in production. - -Credentials can be configured in code as well by setting the Config's Credentials -value to a custom provider or using one of the providers included with the -SDK to bypass the default credential chain and use a custom one. This is -helpful when you want to instruct the SDK to only use a specific set of -credentials or providers. - -This example creates a credential provider for assuming an IAM role, "myRoleARN" -and configures the S3 service client to use that role for API requests. - -```go - // Initial credentials loaded from SDK's default credential chain. Such as - // the environment, shared credentials (~/.aws/credentials), or EC2 Instance - // Role. These credentials will be used to to make the STS Assume Role API. - sess := session.Must(session.NewSession()) - - // Create the credentials from AssumeRoleProvider to assume the role - // referenced by the "myRoleARN" ARN. - creds := stscreds.NewCredentials(sess, "myRoleArn") - - // Create service client value configured for credentials - // from assumed role. - svc := s3.New(sess, &aws.Config{Credentials: creds}) -``` - -See the [credentials][credentials_pkg] package documentation for more information on credential -providers included with the SDK, and how to customize the SDK's usage of -credentials. - -The SDK has support for the shared configuration file (~/.aws/config). This -support can be enabled by setting the environment variable, "AWS_SDK_LOAD_CONFIG=1", -or enabling the feature in code when creating a Session via the -Option's SharedConfigState parameter. - -```go - sess := session.Must(session.NewSessionWithOptions(session.Options{ - SharedConfigState: session.SharedConfigEnable, - })) -``` - -[credentials_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials - -### Configuring AWS Region - -In addition to the credentials you'll need to specify the region the SDK -will use to make AWS API requests to. In the SDK you can specify the region -either with an environment variable, or directly in code when a Session or -service client is created. The last value specified in code wins if the region -is specified multiple ways. - -To set the region via the environment variable set the "AWS_REGION" to the -region you want to the SDK to use. Using this method to set the region will -allow you to run your application in multiple regions without needing additional -code in the application to select the region. - - AWS_REGION=us-west-2 - -The endpoints package includes constants for all regions the SDK knows. The -values are all suffixed with RegionID. These values are helpful, because they -reduce the need to type the region string manually. - -To set the region on a Session use the aws package's Config struct parameter -Region to the AWS region you want the service clients created from the session to -use. This is helpful when you want to create multiple service clients, and -all of the clients make API requests to the same region. - -```go - sess := session.Must(session.NewSession(&aws.Config{ - Region: aws.String(endpoints.UsWest2RegionID), - })) -``` - -See the [endpoints][endpoints_pkg] package for the AWS Regions and Endpoints metadata. - -In addition to setting the region when creating a Session you can also set -the region on a per service client bases. This overrides the region of a -Session. This is helpful when you want to create service clients in specific -regions different from the Session's region. - -```go - svc := s3.New(sess, &aws.Config{ - Region: aws.String(endpoints.UsWest2RegionID), - }) -``` - -See the [Config][config_typ] type in the [aws][aws_pkg] package for more information and additional -options such as setting the Endpoint, and other service client configuration options. - -[endpoints_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/ - -## Making API Requests - -Once the client is created you can make an API request to the service. -Each API method takes a input parameter, and returns the service response -and an error. The SDK provides methods for making the API call in multiple ways. - -In this list we'll use the S3 ListObjects API as an example for the different -ways of making API requests. - - * ListObjects - Base API operation that will make the API request to the service. - - * ListObjectsRequest - API methods suffixed with Request will construct the - API request, but not send it. This is also helpful when you want to get a - presigned URL for a request, and share the presigned URL instead of your - application making the request directly. - - * ListObjectsPages - Same as the base API operation, but uses a callback to - automatically handle pagination of the API's response. - - * ListObjectsWithContext - Same as base API operation, but adds support for - the Context pattern. This is helpful for controlling the canceling of in - flight requests. See the Go standard library context package for more - information. This method also takes request package's Option functional - options as the variadic argument for modifying how the request will be - made, or extracting information from the raw HTTP response. - - * ListObjectsPagesWithContext - same as ListObjectsPages, but adds support for - the Context pattern. Similar to ListObjectsWithContext this method also - takes the request package's Option function option types as the variadic - argument. - -In addition to the API operations the SDK also includes several higher level -methods that abstract checking for and waiting for an AWS resource to be in -a desired state. In this list we'll use WaitUntilBucketExists to demonstrate -the different forms of waiters. - - * WaitUntilBucketExists. - Method to make API request to query an AWS service for - a resource's state. Will return successfully when that state is accomplished. - - * WaitUntilBucketExistsWithContext - Same as WaitUntilBucketExists, but adds - support for the Context pattern. In addition these methods take request - package's WaiterOptions to configure the waiter, and how underlying request - will be made by the SDK. - -The API method will document which error codes the service might return for -the operation. These errors will also be available as const strings prefixed -with "ErrCode" in the service client's package. If there are no errors listed -in the API's SDK documentation you'll need to consult the AWS service's API -documentation for the errors that could be returned. - -```go - ctx := context.Background() - - result, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{ - Bucket: aws.String("my-bucket"), - Key: aws.String("my-key"), - }) - if err != nil { - // Cast err to awserr.Error to handle specific error codes. - aerr, ok := err.(awserr.Error) - if ok && aerr.Code() == s3.ErrCodeNoSuchKey { - // Specific error code handling - } - return err - } - - // Make sure to close the body when done with it for S3 GetObject APIs or - // will leak connections. - defer result.Body.Close() - - fmt.Println("Object Size:", aws.Int64Value(result.ContentLength)) -``` - -### API Request Pagination and Resource Waiters - -Pagination helper methods are suffixed with "Pages", and provide the -functionality needed to round trip API page requests. Pagination methods -take a callback function that will be called for each page of the API's response. - -```go - objects := []string{} - err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{ - Bucket: aws.String(myBucket), - }, func(p *s3.ListObjectsOutput, lastPage bool) bool { - for _, o := range p.Contents { - objects = append(objects, aws.StringValue(o.Key)) - } - return true // continue paging - }) - if err != nil { - panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err)) - } - - fmt.Println("Objects in bucket:", objects) -``` - -Waiter helper methods provide the functionality to wait for an AWS resource -state. These methods abstract the logic needed to to check the state of an -AWS resource, and wait until that resource is in a desired state. The waiter -will block until the resource is in the state that is desired, an error occurs, -or the waiter times out. If a resource times out the error code returned will -be request.WaiterResourceNotReadyErrorCode. - -```go - err := svc.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{ - Bucket: aws.String(myBucket), - }) - if err != nil { - aerr, ok := err.(awserr.Error) - if ok && aerr.Code() == request.WaiterResourceNotReadyErrorCode { - fmt.Fprintf(os.Stderr, "timed out while waiting for bucket to exist") - } - panic(fmt.Errorf("failed to wait for bucket to exist, %v", err)) - } - fmt.Println("Bucket", myBucket, "exists") -``` - -## Complete SDK Example - -This example shows a complete working Go file which will upload a file to S3 -and use the Context pattern to implement timeout logic that will cancel the -request if it takes too long. This example highlights how to use sessions, -create a service client, make a request, handle the error, and process the -response. - -```go - package main - - import ( - "context" - "flag" - "fmt" - "os" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/s3" - ) - - // Uploads a file to S3 given a bucket and object key. Also takes a duration - // value to terminate the update if it doesn't complete within that time. - // - // The AWS Region needs to be provided in the AWS shared config or on the - // environment variable as `AWS_REGION`. Credentials also must be provided - // Will default to shared config file, but can load from environment if provided. - // - // Usage: - // # Upload myfile.txt to myBucket/myKey. Must complete within 10 minutes or will fail - // go run withContext.go -b mybucket -k myKey -d 10m < myfile.txt - func main() { - var bucket, key string - var timeout time.Duration - - flag.StringVar(&bucket, "b", "", "Bucket name.") - flag.StringVar(&key, "k", "", "Object key name.") - flag.DurationVar(&timeout, "d", 0, "Upload timeout.") - flag.Parse() - - // All clients require a Session. The Session provides the client with - // shared configuration such as region, endpoint, and credentials. A - // Session should be shared where possible to take advantage of - // configuration and credential caching. See the session package for - // more information. - sess := session.Must(session.NewSession()) - - // Create a new instance of the service's client with a Session. - // Optional aws.Config values can also be provided as variadic arguments - // to the New function. This option allows you to provide service - // specific configuration. - svc := s3.New(sess) - - // Create a context with a timeout that will abort the upload if it takes - // more than the passed in timeout. - ctx := context.Background() - var cancelFn func() - if timeout > 0 { - ctx, cancelFn = context.WithTimeout(ctx, timeout) - } - // Ensure the context is canceled to prevent leaking. - // See context package for more information, https://golang.org/pkg/context/ - defer cancelFn() - - // Uploads the object to S3. The Context will interrupt the request if the - // timeout expires. - _, err := svc.PutObjectWithContext(ctx, &s3.PutObjectInput{ - Bucket: aws.String(bucket), - Key: aws.String(key), - Body: os.Stdin, - }) - if err != nil { - if aerr, ok := err.(awserr.Error); ok && aerr.Code() == request.CanceledErrorCode { - // If the SDK can determine the request or retry delay was canceled - // by a context the CanceledErrorCode error code will be returned. - fmt.Fprintf(os.Stderr, "upload canceled due to timeout, %v\n", err) - } else { - fmt.Fprintf(os.Stderr, "failed to upload object, %v\n", err) - } - os.Exit(1) - } - - fmt.Printf("successfully uploaded file to %s/%s\n", bucket, key) - } -``` - -## License - -This SDK is distributed under the -[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0), -see LICENSE.txt and NOTICE.txt for more information. diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini b/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini deleted file mode 100644 index 7fc91d9d204..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini +++ /dev/null @@ -1,12 +0,0 @@ -[default] -aws_access_key_id = accessKey -aws_secret_access_key = secret -aws_session_token = token - -[no_token] -aws_access_key_id = accessKey -aws_secret_access_key = secret - -[with_colon] -aws_access_key_id: accessKey -aws_secret_access_key: secret diff --git a/vendor/github.com/aws/aws-sdk-go/doc.go b/vendor/github.com/aws/aws-sdk-go/doc.go deleted file mode 100644 index 32b806a4a2d..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/doc.go +++ /dev/null @@ -1,405 +0,0 @@ -// Package sdk is the official AWS SDK for the Go programming language. -// -// The AWS SDK for Go provides APIs and utilities that developers can use to -// build Go applications that use AWS services, such as Amazon Elastic Compute -// Cloud (Amazon EC2) and Amazon Simple Storage Service (Amazon S3). -// -// The SDK removes the complexity of coding directly against a web service -// interface. It hides a lot of the lower-level plumbing, such as authentication, -// request retries, and error handling. -// -// The SDK also includes helpful utilities on top of the AWS APIs that add additional -// capabilities and functionality. For example, the Amazon S3 Download and Upload -// Manager will automatically split up large objects into multiple parts and -// transfer them concurrently. -// -// See the s3manager package documentation for more information. -// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/ -// -// Getting More Information -// -// Checkout the Getting Started Guide and API Reference Docs detailed the SDK's -// components and details on each AWS client the SDK supports. -// -// The Getting Started Guide provides examples and detailed description of how -// to get setup with the SDK. -// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/welcome.html -// -// The API Reference Docs include a detailed breakdown of the SDK's components -// such as utilities and AWS clients. Use this as a reference of the Go types -// included with the SDK, such as AWS clients, API operations, and API parameters. -// https://docs.aws.amazon.com/sdk-for-go/api/ -// -// Overview of SDK's Packages -// -// The SDK is composed of two main components, SDK core, and service clients. -// The SDK core packages are all available under the aws package at the root of -// the SDK. Each client for a supported AWS service is available within its own -// package under the service folder at the root of the SDK. -// -// * aws - SDK core, provides common shared types such as Config, Logger, -// and utilities to make working with API parameters easier. -// -// * awserr - Provides the error interface that the SDK will use for all -// errors that occur in the SDK's processing. This includes service API -// response errors as well. The Error type is made up of a code and message. -// Cast the SDK's returned error type to awserr.Error and call the Code -// method to compare returned error to specific error codes. See the package's -// documentation for additional values that can be extracted such as RequestId. -// -// * credentials - Provides the types and built in credentials providers -// the SDK will use to retrieve AWS credentials to make API requests with. -// Nested under this folder are also additional credentials providers such as -// stscreds for assuming IAM roles, and ec2rolecreds for EC2 Instance roles. -// -// * endpoints - Provides the AWS Regions and Endpoints metadata for the SDK. -// Use this to lookup AWS service endpoint information such as which services -// are in a region, and what regions a service is in. Constants are also provided -// for all region identifiers, e.g UsWest2RegionID for "us-west-2". -// -// * session - Provides initial default configuration, and load -// configuration from external sources such as environment and shared -// credentials file. -// -// * request - Provides the API request sending, and retry logic for the SDK. -// This package also includes utilities for defining your own request -// retryer, and configuring how the SDK processes the request. -// -// * service - Clients for AWS services. All services supported by the SDK are -// available under this folder. -// -// How to Use the SDK's AWS Service Clients -// -// The SDK includes the Go types and utilities you can use to make requests to -// AWS service APIs. Within the service folder at the root of the SDK you'll find -// a package for each AWS service the SDK supports. All service clients follows -// a common pattern of creation and usage. -// -// When creating a client for an AWS service you'll first need to have a Session -// value constructed. The Session provides shared configuration that can be shared -// between your service clients. When service clients are created you can pass -// in additional configuration via the aws.Config type to override configuration -// provided by in the Session to create service client instances with custom -// configuration. -// -// Once the service's client is created you can use it to make API requests the -// AWS service. These clients are safe to use concurrently. -// -// Configuring the SDK -// -// In the AWS SDK for Go, you can configure settings for service clients, such -// as the log level and maximum number of retries. Most settings are optional; -// however, for each service client, you must specify a region and your credentials. -// The SDK uses these values to send requests to the correct AWS region and sign -// requests with the correct credentials. You can specify these values as part -// of a session or as environment variables. -// -// See the SDK's configuration guide for more information. -// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html -// -// See the session package documentation for more information on how to use Session -// with the SDK. -// https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ -// -// See the Config type in the aws package for more information on configuration -// options. -// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config -// -// Configuring Credentials -// -// When using the SDK you'll generally need your AWS credentials to authenticate -// with AWS services. The SDK supports multiple methods of supporting these -// credentials. By default the SDK will source credentials automatically from -// its default credential chain. See the session package for more information -// on this chain, and how to configure it. The common items in the credential -// chain are the following: -// -// * Environment Credentials - Set of environment variables that are useful -// when sub processes are created for specific roles. -// -// * Shared Credentials file (~/.aws/credentials) - This file stores your -// credentials based on a profile name and is useful for local development. -// -// * EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials -// to application running on an EC2 instance. This removes the need to manage -// credential files in production. -// -// Credentials can be configured in code as well by setting the Config's Credentials -// value to a custom provider or using one of the providers included with the -// SDK to bypass the default credential chain and use a custom one. This is -// helpful when you want to instruct the SDK to only use a specific set of -// credentials or providers. -// -// This example creates a credential provider for assuming an IAM role, "myRoleARN" -// and configures the S3 service client to use that role for API requests. -// -// // Initial credentials loaded from SDK's default credential chain. Such as -// // the environment, shared credentials (~/.aws/credentials), or EC2 Instance -// // Role. These credentials will be used to to make the STS Assume Role API. -// sess := session.Must(session.NewSession()) -// -// // Create the credentials from AssumeRoleProvider to assume the role -// // referenced by the "myRoleARN" ARN. -// creds := stscreds.NewCredentials(sess, "myRoleArn") -// -// // Create service client value configured for credentials -// // from assumed role. -// svc := s3.New(sess, &aws.Config{Credentials: creds})/ -// -// See the credentials package documentation for more information on credential -// providers included with the SDK, and how to customize the SDK's usage of -// credentials. -// https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials -// -// The SDK has support for the shared configuration file (~/.aws/config). This -// support can be enabled by setting the environment variable, "AWS_SDK_LOAD_CONFIG=1", -// or enabling the feature in code when creating a Session via the -// Option's SharedConfigState parameter. -// -// sess := session.Must(session.NewSessionWithOptions(session.Options{ -// SharedConfigState: session.SharedConfigEnable, -// })) -// -// Configuring AWS Region -// -// In addition to the credentials you'll need to specify the region the SDK -// will use to make AWS API requests to. In the SDK you can specify the region -// either with an environment variable, or directly in code when a Session or -// service client is created. The last value specified in code wins if the region -// is specified multiple ways. -// -// To set the region via the environment variable set the "AWS_REGION" to the -// region you want to the SDK to use. Using this method to set the region will -// allow you to run your application in multiple regions without needing additional -// code in the application to select the region. -// -// AWS_REGION=us-west-2 -// -// The endpoints package includes constants for all regions the SDK knows. The -// values are all suffixed with RegionID. These values are helpful, because they -// reduce the need to type the region string manually. -// -// To set the region on a Session use the aws package's Config struct parameter -// Region to the AWS region you want the service clients created from the session to -// use. This is helpful when you want to create multiple service clients, and -// all of the clients make API requests to the same region. -// -// sess := session.Must(session.NewSession(&aws.Config{ -// Region: aws.String(endpoints.UsWest2RegionID), -// })) -// -// See the endpoints package for the AWS Regions and Endpoints metadata. -// https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/ -// -// In addition to setting the region when creating a Session you can also set -// the region on a per service client bases. This overrides the region of a -// Session. This is helpful when you want to create service clients in specific -// regions different from the Session's region. -// -// svc := s3.New(sess, &aws.Config{ -// Region: aws.String(endpoints.UsWest2RegionID), -// }) -// -// See the Config type in the aws package for more information and additional -// options such as setting the Endpoint, and other service client configuration options. -// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config -// -// Making API Requests -// -// Once the client is created you can make an API request to the service. -// Each API method takes a input parameter, and returns the service response -// and an error. The SDK provides methods for making the API call in multiple ways. -// -// In this list we'll use the S3 ListObjects API as an example for the different -// ways of making API requests. -// -// * ListObjects - Base API operation that will make the API request to the service. -// -// * ListObjectsRequest - API methods suffixed with Request will construct the -// API request, but not send it. This is also helpful when you want to get a -// presigned URL for a request, and share the presigned URL instead of your -// application making the request directly. -// -// * ListObjectsPages - Same as the base API operation, but uses a callback to -// automatically handle pagination of the API's response. -// -// * ListObjectsWithContext - Same as base API operation, but adds support for -// the Context pattern. This is helpful for controlling the canceling of in -// flight requests. See the Go standard library context package for more -// information. This method also takes request package's Option functional -// options as the variadic argument for modifying how the request will be -// made, or extracting information from the raw HTTP response. -// -// * ListObjectsPagesWithContext - same as ListObjectsPages, but adds support for -// the Context pattern. Similar to ListObjectsWithContext this method also -// takes the request package's Option function option types as the variadic -// argument. -// -// In addition to the API operations the SDK also includes several higher level -// methods that abstract checking for and waiting for an AWS resource to be in -// a desired state. In this list we'll use WaitUntilBucketExists to demonstrate -// the different forms of waiters. -// -// * WaitUntilBucketExists. - Method to make API request to query an AWS service for -// a resource's state. Will return successfully when that state is accomplished. -// -// * WaitUntilBucketExistsWithContext - Same as WaitUntilBucketExists, but adds -// support for the Context pattern. In addition these methods take request -// package's WaiterOptions to configure the waiter, and how underlying request -// will be made by the SDK. -// -// The API method will document which error codes the service might return for -// the operation. These errors will also be available as const strings prefixed -// with "ErrCode" in the service client's package. If there are no errors listed -// in the API's SDK documentation you'll need to consult the AWS service's API -// documentation for the errors that could be returned. -// -// ctx := context.Background() -// -// result, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{ -// Bucket: aws.String("my-bucket"), -// Key: aws.String("my-key"), -// }) -// if err != nil { -// // Cast err to awserr.Error to handle specific error codes. -// aerr, ok := err.(awserr.Error) -// if ok && aerr.Code() == s3.ErrCodeNoSuchKey { -// // Specific error code handling -// } -// return err -// } -// -// // Make sure to close the body when done with it for S3 GetObject APIs or -// // will leak connections. -// defer result.Body.Close() -// -// fmt.Println("Object Size:", aws.StringValue(result.ContentLength)) -// -// API Request Pagination and Resource Waiters -// -// Pagination helper methods are suffixed with "Pages", and provide the -// functionality needed to round trip API page requests. Pagination methods -// take a callback function that will be called for each page of the API's response. -// -// objects := []string{} -// err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{ -// Bucket: aws.String(myBucket), -// }, func(p *s3.ListObjectsOutput, lastPage bool) bool { -// for _, o := range p.Contents { -// objects = append(objects, aws.StringValue(o.Key)) -// } -// return true // continue paging -// }) -// if err != nil { -// panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err)) -// } -// -// fmt.Println("Objects in bucket:", objects) -// -// Waiter helper methods provide the functionality to wait for an AWS resource -// state. These methods abstract the logic needed to to check the state of an -// AWS resource, and wait until that resource is in a desired state. The waiter -// will block until the resource is in the state that is desired, an error occurs, -// or the waiter times out. If a resource times out the error code returned will -// be request.WaiterResourceNotReadyErrorCode. -// -// err := svc.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{ -// Bucket: aws.String(myBucket), -// }) -// if err != nil { -// aerr, ok := err.(awserr.Error) -// if ok && aerr.Code() == request.WaiterResourceNotReadyErrorCode { -// fmt.Fprintf(os.Stderr, "timed out while waiting for bucket to exist") -// } -// panic(fmt.Errorf("failed to wait for bucket to exist, %v", err)) -// } -// fmt.Println("Bucket", myBucket, "exists") -// -// Complete SDK Example -// -// This example shows a complete working Go file which will upload a file to S3 -// and use the Context pattern to implement timeout logic that will cancel the -// request if it takes too long. This example highlights how to use sessions, -// create a service client, make a request, handle the error, and process the -// response. -// -// package main -// -// import ( -// "context" -// "flag" -// "fmt" -// "os" -// "time" -// -// "github.com/aws/aws-sdk-go/aws" -// "github.com/aws/aws-sdk-go/aws/awserr" -// "github.com/aws/aws-sdk-go/aws/request" -// "github.com/aws/aws-sdk-go/aws/session" -// "github.com/aws/aws-sdk-go/service/s3" -// ) -// -// // Uploads a file to S3 given a bucket and object key. Also takes a duration -// // value to terminate the update if it doesn't complete within that time. -// // -// // The AWS Region needs to be provided in the AWS shared config or on the -// // environment variable as `AWS_REGION`. Credentials also must be provided -// // Will default to shared config file, but can load from environment if provided. -// // -// // Usage: -// // # Upload myfile.txt to myBucket/myKey. Must complete within 10 minutes or will fail -// // go run withContext.go -b mybucket -k myKey -d 10m < myfile.txt -// func main() { -// var bucket, key string -// var timeout time.Duration -// -// flag.StringVar(&bucket, "b", "", "Bucket name.") -// flag.StringVar(&key, "k", "", "Object key name.") -// flag.DurationVar(&timeout, "d", 0, "Upload timeout.") -// flag.Parse() -// -// // All clients require a Session. The Session provides the client with -// // shared configuration such as region, endpoint, and credentials. A -// // Session should be shared where possible to take advantage of -// // configuration and credential caching. See the session package for -// // more information. -// sess := session.Must(session.NewSession()) -// -// // Create a new instance of the service's client with a Session. -// // Optional aws.Config values can also be provided as variadic arguments -// // to the New function. This option allows you to provide service -// // specific configuration. -// svc := s3.New(sess) -// -// // Create a context with a timeout that will abort the upload if it takes -// // more than the passed in timeout. -// ctx := context.Background() -// var cancelFn func() -// if timeout > 0 { -// ctx, cancelFn = context.WithTimeout(ctx, timeout) -// } -// // Ensure the context is canceled to prevent leaking. -// // See context package for more information, https://golang.org/pkg/context/ -// defer cancelFn() -// -// // Uploads the object to S3. The Context will interrupt the request if the -// // timeout expires. -// _, err := svc.PutObjectWithContext(ctx, &s3.PutObjectInput{ -// Bucket: aws.String(bucket), -// Key: aws.String(key), -// Body: os.Stdin, -// }) -// if err != nil { -// if aerr, ok := err.(awserr.Error); ok && aerr.Code() == request.CanceledErrorCode { -// // If the SDK can determine the request or retry delay was canceled -// // by a context the CanceledErrorCode error code will be returned. -// fmt.Fprintf(os.Stderr, "upload canceled due to timeout, %v\n", err) -// } else { -// fmt.Fprintf(os.Stderr, "failed to upload object, %v\n", err) -// } -// os.Exit(1) -// } -// -// fmt.Printf("successfully uploaded file to %s/%s\n", bucket, key) -// } -package sdk diff --git a/vendor/github.com/aws/aws-sdk-go/private/README.md b/vendor/github.com/aws/aws-sdk-go/private/README.md deleted file mode 100644 index 5bdb4c50ac2..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/README.md +++ /dev/null @@ -1,4 +0,0 @@ -## AWS SDK for Go Private packages ## -`private` is a collection of packages used internally by the SDK, and is subject to have breaking changes. This package is not `internal` so that if you really need to use its functionality, and understand breaking changes will be made, you are able to. - -These packages will be refactored in the future so that the API generator and model parsers are exposed cleanly on their own. Making it easier for you to generate your own code based on the API models. diff --git a/vendor/github.com/aws/aws-sdk-go/service/generate.go b/vendor/github.com/aws/aws-sdk-go/service/generate.go deleted file mode 100644 index 3ffc9fcc5f6..00000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/generate.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package service contains automatically generated AWS clients. -package service - -//go:generate go run -tags codegen ../private/model/cli/gen-api/main.go -path=../service ../models/apis/*/*/api-2.json -//go:generate gofmt -s -w ../service diff --git a/vendor/github.com/benbjohnson/clock/README.md b/vendor/github.com/benbjohnson/clock/README.md deleted file mode 100644 index 5d4f4fe72e7..00000000000 --- a/vendor/github.com/benbjohnson/clock/README.md +++ /dev/null @@ -1,104 +0,0 @@ -clock [![Build Status](https://drone.io/github.com/benbjohnson/clock/status.png)](https://drone.io/github.com/benbjohnson/clock/latest) [![Coverage Status](https://coveralls.io/repos/benbjohnson/clock/badge.png?branch=master)](https://coveralls.io/r/benbjohnson/clock?branch=master) [![GoDoc](https://godoc.org/github.com/benbjohnson/clock?status.png)](https://godoc.org/github.com/benbjohnson/clock) ![Project status](http://img.shields.io/status/experimental.png?color=red) -===== - -Clock is a small library for mocking time in Go. It provides an interface -around the standard library's [`time`][time] package so that the application -can use the realtime clock while tests can use the mock clock. - -[time]: http://golang.org/pkg/time/ - - -## Usage - -### Realtime Clock - -Your application can maintain a `Clock` variable that will allow realtime and -mock clocks to be interchangable. For example, if you had an `Application` type: - -```go -import "github.com/benbjohnson/clock" - -type Application struct { - Clock clock.Clock -} -``` - -You could initialize it to use the realtime clock like this: - -```go -var app Application -app.Clock = clock.New() -... -``` - -Then all timers and time-related functionality should be performed from the -`Clock` variable. - - -### Mocking time - -In your tests, you will want to use a `Mock` clock: - -```go -import ( - "testing" - - "github.com/benbjohnson/clock" -) - -func TestApplication_DoSomething(t *testing.T) { - mock := clock.NewMock() - app := Application{Clock: mock} - ... -} -``` - -Now that you've initialized your application to use the mock clock, you can -adjust the time programmatically. The mock clock always starts from the Unix -epoch (midnight, Jan 1, 1970 UTC). - - -### Controlling time - -The mock clock provides the same functions that the standard library's `time` -package provides. For example, to find the current time, you use the `Now()` -function: - -```go -mock := clock.NewMock() - -// Find the current time. -mock.Now().UTC() // 1970-01-01 00:00:00 +0000 UTC - -// Move the clock forward. -mock.Add(2 * time.Hour) - -// Check the time again. It's 2 hours later! -mock.Now().UTC() // 1970-01-01 02:00:00 +0000 UTC -``` - -Timers and Tickers are also controlled by this same mock clock. They will only -execute when the clock is moved forward: - -``` -mock := clock.NewMock() -count := 0 - -// Kick off a timer to increment every 1 mock second. -go func() { - ticker := clock.Ticker(1 * time.Second) - for { - <-ticker.C - count++ - } -}() -runtime.Gosched() - -// Move the clock forward 10 second. -mock.Add(10 * time.Second) - -// This prints 10. -fmt.Println(count) -``` - - diff --git a/vendor/github.com/beorn7/perks/.gitignore b/vendor/github.com/beorn7/perks/.gitignore deleted file mode 100644 index 1bd9209aa19..00000000000 --- a/vendor/github.com/beorn7/perks/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.test -*.prof diff --git a/vendor/github.com/beorn7/perks/README.md b/vendor/github.com/beorn7/perks/README.md deleted file mode 100644 index fc05777701a..00000000000 --- a/vendor/github.com/beorn7/perks/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Perks for Go (golang.org) - -Perks contains the Go package quantile that computes approximate quantiles over -an unbounded data stream within low memory and CPU bounds. - -For more information and examples, see: -http://godoc.org/github.com/bmizerany/perks - -A very special thank you and shout out to Graham Cormode (Rutgers University), -Flip Korn (AT&T Labs–Research), S. Muthukrishnan (Rutgers University), and -Divesh Srivastava (AT&T Labs–Research) for their research and publication of -[Effective Computation of Biased Quantiles over Data Streams](http://www.cs.rutgers.edu/~muthu/bquant.pdf) - -Thank you, also: -* Armon Dadgar (@armon) -* Andrew Gerrand (@nf) -* Brad Fitzpatrick (@bradfitz) -* Keith Rarick (@kr) - -FAQ: - -Q: Why not move the quantile package into the project root? -A: I want to add more packages to perks later. - -Copyright (C) 2013 Blake Mizerany - -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/beorn7/perks/quantile/exampledata.txt b/vendor/github.com/beorn7/perks/quantile/exampledata.txt deleted file mode 100644 index 1602287d7ce..00000000000 --- a/vendor/github.com/beorn7/perks/quantile/exampledata.txt +++ /dev/null @@ -1,2388 +0,0 @@ -8 -5 -26 -12 -5 -235 -13 -6 -28 -30 -3 -3 -3 -3 -5 -2 -33 -7 -2 -4 -7 -12 -14 -5 -8 -3 -10 -4 -5 -3 -6 -6 -209 -20 -3 -10 -14 -3 -4 -6 -8 -5 -11 -7 -3 -2 -3 -3 -212 -5 -222 -4 -10 -10 -5 -6 -3 -8 -3 -10 -254 -220 -2 -3 -5 -24 -5 -4 -222 -7 -3 -3 -223 -8 -15 -12 -14 -14 -3 -2 -2 -3 -13 -3 -11 -4 -4 -6 -5 -7 -13 -5 -3 -5 -2 -5 -3 -5 -2 -7 -15 -17 -14 -3 -6 -6 -3 -17 -5 -4 -7 -6 -4 -4 -8 -6 -8 -3 -9 -3 -6 -3 -4 -5 -3 -3 -660 -4 -6 -10 -3 -6 -3 -2 -5 -13 -2 -4 -4 -10 -4 -8 -4 -3 -7 -9 -9 -3 -10 -37 -3 -13 -4 -12 -3 -6 -10 -8 -5 -21 -2 -3 -8 -3 -2 -3 -3 -4 -12 -2 -4 -8 -8 -4 -3 -2 -20 -1 -6 -32 -2 -11 -6 -18 -3 -8 -11 -3 -212 -3 -4 -2 -6 -7 -12 -11 -3 -2 -16 -10 -6 -4 -6 -3 -2 -7 -3 -2 -2 -2 -2 -5 -6 -4 -3 -10 -3 -4 -6 -5 -3 -4 -4 -5 -6 -4 -3 -4 -4 -5 -7 -5 -5 -3 -2 -7 -2 -4 -12 -4 -5 -6 -2 -4 -4 -8 -4 -15 -13 -7 -16 -5 -3 -23 -5 -5 -7 -3 -2 -9 -8 -7 -5 -8 -11 -4 -10 -76 -4 -47 -4 -3 -2 -7 -4 -2 -3 -37 -10 -4 -2 -20 -5 -4 -4 -10 -10 -4 -3 -7 -23 -240 -7 -13 -5 -5 -3 -3 -2 -5 -4 -2 -8 -7 -19 -2 -23 -8 -7 -2 -5 -3 -8 -3 -8 -13 -5 -5 -5 -2 -3 -23 -4 -9 -8 -4 -3 -3 -5 -220 -2 -3 -4 -6 -14 -3 -53 -6 -2 -5 -18 -6 -3 -219 -6 -5 -2 -5 -3 -6 -5 -15 -4 -3 -17 -3 -2 -4 -7 -2 -3 -3 -4 -4 -3 -2 -664 -6 -3 -23 -5 -5 -16 -5 -8 -2 -4 -2 -24 -12 -3 -2 -3 -5 -8 -3 -5 -4 -3 -14 -3 -5 -8 -2 -3 -7 -9 -4 -2 -3 -6 -8 -4 -3 -4 -6 -5 -3 -3 -6 -3 -19 -4 -4 -6 -3 -6 -3 -5 -22 -5 -4 -4 -3 -8 -11 -4 -9 -7 -6 -13 -4 -4 -4 -6 -17 -9 -3 -3 -3 -4 -3 -221 -5 -11 -3 -4 -2 -12 -6 -3 -5 -7 -5 -7 -4 -9 -7 -14 -37 -19 -217 -16 -3 -5 -2 -2 -7 -19 -7 -6 -7 -4 -24 -5 -11 -4 -7 -7 -9 -13 -3 -4 -3 -6 -28 -4 -4 -5 -5 -2 -5 -6 -4 -4 -6 -10 -5 -4 -3 -2 -3 -3 -6 -5 -5 -4 -3 -2 -3 -7 -4 -6 -18 -16 -8 -16 -4 -5 -8 -6 -9 -13 -1545 -6 -215 -6 -5 -6 -3 -45 -31 -5 -2 -2 -4 -3 -3 -2 -5 -4 -3 -5 -7 -7 -4 -5 -8 -5 -4 -749 -2 -31 -9 -11 -2 -11 -5 -4 -4 -7 -9 -11 -4 -5 -4 -7 -3 -4 -6 -2 -15 -3 -4 -3 -4 -3 -5 -2 -13 -5 -5 -3 -3 -23 -4 -4 -5 -7 -4 -13 -2 -4 -3 -4 -2 -6 -2 -7 -3 -5 -5 -3 -29 -5 -4 -4 -3 -10 -2 -3 -79 -16 -6 -6 -7 -7 -3 -5 -5 -7 -4 -3 -7 -9 -5 -6 -5 -9 -6 -3 -6 -4 -17 -2 -10 -9 -3 -6 -2 -3 -21 -22 -5 -11 -4 -2 -17 -2 -224 -2 -14 -3 -4 -4 -2 -4 -4 -4 -4 -5 -3 -4 -4 -10 -2 -6 -3 -3 -5 -7 -2 -7 -5 -6 -3 -218 -2 -2 -5 -2 -6 -3 -5 -222 -14 -6 -33 -3 -2 -5 -3 -3 -3 -9 -5 -3 -3 -2 -7 -4 -3 -4 -3 -5 -6 -5 -26 -4 -13 -9 -7 -3 -221 -3 -3 -4 -4 -4 -4 -2 -18 -5 -3 -7 -9 -6 -8 -3 -10 -3 -11 -9 -5 -4 -17 -5 -5 -6 -6 -3 -2 -4 -12 -17 -6 -7 -218 -4 -2 -4 -10 -3 -5 -15 -3 -9 -4 -3 -3 -6 -29 -3 -3 -4 -5 -5 -3 -8 -5 -6 -6 -7 -5 -3 -5 -3 -29 -2 -31 -5 -15 -24 -16 -5 -207 -4 -3 -3 -2 -15 -4 -4 -13 -5 -5 -4 -6 -10 -2 -7 -8 -4 -6 -20 -5 -3 -4 -3 -12 -12 -5 -17 -7 -3 -3 -3 -6 -10 -3 -5 -25 -80 -4 -9 -3 -2 -11 -3 -3 -2 -3 -8 -7 -5 -5 -19 -5 -3 -3 -12 -11 -2 -6 -5 -5 -5 -3 -3 -3 -4 -209 -14 -3 -2 -5 -19 -4 -4 -3 -4 -14 -5 -6 -4 -13 -9 -7 -4 -7 -10 -2 -9 -5 -7 -2 -8 -4 -6 -5 -5 -222 -8 -7 -12 -5 -216 -3 -4 -4 -6 -3 -14 -8 -7 -13 -4 -3 -3 -3 -3 -17 -5 -4 -3 -33 -6 -6 -33 -7 -5 -3 -8 -7 -5 -2 -9 -4 -2 -233 -24 -7 -4 -8 -10 -3 -4 -15 -2 -16 -3 -3 -13 -12 -7 -5 -4 -207 -4 -2 -4 -27 -15 -2 -5 -2 -25 -6 -5 -5 -6 -13 -6 -18 -6 -4 -12 -225 -10 -7 -5 -2 -2 -11 -4 -14 -21 -8 -10 -3 -5 -4 -232 -2 -5 -5 -3 -7 -17 -11 -6 -6 -23 -4 -6 -3 -5 -4 -2 -17 -3 -6 -5 -8 -3 -2 -2 -14 -9 -4 -4 -2 -5 -5 -3 -7 -6 -12 -6 -10 -3 -6 -2 -2 -19 -5 -4 -4 -9 -2 -4 -13 -3 -5 -6 -3 -6 -5 -4 -9 -6 -3 -5 -7 -3 -6 -6 -4 -3 -10 -6 -3 -221 -3 -5 -3 -6 -4 -8 -5 -3 -6 -4 -4 -2 -54 -5 -6 -11 -3 -3 -4 -4 -4 -3 -7 -3 -11 -11 -7 -10 -6 -13 -223 -213 -15 -231 -7 -3 -7 -228 -2 -3 -4 -4 -5 -6 -7 -4 -13 -3 -4 -5 -3 -6 -4 -6 -7 -2 -4 -3 -4 -3 -3 -6 -3 -7 -3 -5 -18 -5 -6 -8 -10 -3 -3 -3 -2 -4 -2 -4 -4 -5 -6 -6 -4 -10 -13 -3 -12 -5 -12 -16 -8 -4 -19 -11 -2 -4 -5 -6 -8 -5 -6 -4 -18 -10 -4 -2 -216 -6 -6 -6 -2 -4 -12 -8 -3 -11 -5 -6 -14 -5 -3 -13 -4 -5 -4 -5 -3 -28 -6 -3 -7 -219 -3 -9 -7 -3 -10 -6 -3 -4 -19 -5 -7 -11 -6 -15 -19 -4 -13 -11 -3 -7 -5 -10 -2 -8 -11 -2 -6 -4 -6 -24 -6 -3 -3 -3 -3 -6 -18 -4 -11 -4 -2 -5 -10 -8 -3 -9 -5 -3 -4 -5 -6 -2 -5 -7 -4 -4 -14 -6 -4 -4 -5 -5 -7 -2 -4 -3 -7 -3 -3 -6 -4 -5 -4 -4 -4 -3 -3 -3 -3 -8 -14 -2 -3 -5 -3 -2 -4 -5 -3 -7 -3 -3 -18 -3 -4 -4 -5 -7 -3 -3 -3 -13 -5 -4 -8 -211 -5 -5 -3 -5 -2 -5 -4 -2 -655 -6 -3 -5 -11 -2 -5 -3 -12 -9 -15 -11 -5 -12 -217 -2 -6 -17 -3 -3 -207 -5 -5 -4 -5 -9 -3 -2 -8 -5 -4 -3 -2 -5 -12 -4 -14 -5 -4 -2 -13 -5 -8 -4 -225 -4 -3 -4 -5 -4 -3 -3 -6 -23 -9 -2 -6 -7 -233 -4 -4 -6 -18 -3 -4 -6 -3 -4 -4 -2 -3 -7 -4 -13 -227 -4 -3 -5 -4 -2 -12 -9 -17 -3 -7 -14 -6 -4 -5 -21 -4 -8 -9 -2 -9 -25 -16 -3 -6 -4 -7 -8 -5 -2 -3 -5 -4 -3 -3 -5 -3 -3 -3 -2 -3 -19 -2 -4 -3 -4 -2 -3 -4 -4 -2 -4 -3 -3 -3 -2 -6 -3 -17 -5 -6 -4 -3 -13 -5 -3 -3 -3 -4 -9 -4 -2 -14 -12 -4 -5 -24 -4 -3 -37 -12 -11 -21 -3 -4 -3 -13 -4 -2 -3 -15 -4 -11 -4 -4 -3 -8 -3 -4 -4 -12 -8 -5 -3 -3 -4 -2 -220 -3 -5 -223 -3 -3 -3 -10 -3 -15 -4 -241 -9 -7 -3 -6 -6 -23 -4 -13 -7 -3 -4 -7 -4 -9 -3 -3 -4 -10 -5 -5 -1 -5 -24 -2 -4 -5 -5 -6 -14 -3 -8 -2 -3 -5 -13 -13 -3 -5 -2 -3 -15 -3 -4 -2 -10 -4 -4 -4 -5 -5 -3 -5 -3 -4 -7 -4 -27 -3 -6 -4 -15 -3 -5 -6 -6 -5 -4 -8 -3 -9 -2 -6 -3 -4 -3 -7 -4 -18 -3 -11 -3 -3 -8 -9 -7 -24 -3 -219 -7 -10 -4 -5 -9 -12 -2 -5 -4 -4 -4 -3 -3 -19 -5 -8 -16 -8 -6 -22 -3 -23 -3 -242 -9 -4 -3 -3 -5 -7 -3 -3 -5 -8 -3 -7 -5 -14 -8 -10 -3 -4 -3 -7 -4 -6 -7 -4 -10 -4 -3 -11 -3 -7 -10 -3 -13 -6 -8 -12 -10 -5 -7 -9 -3 -4 -7 -7 -10 -8 -30 -9 -19 -4 -3 -19 -15 -4 -13 -3 -215 -223 -4 -7 -4 -8 -17 -16 -3 -7 -6 -5 -5 -4 -12 -3 -7 -4 -4 -13 -4 -5 -2 -5 -6 -5 -6 -6 -7 -10 -18 -23 -9 -3 -3 -6 -5 -2 -4 -2 -7 -3 -3 -2 -5 -5 -14 -10 -224 -6 -3 -4 -3 -7 -5 -9 -3 -6 -4 -2 -5 -11 -4 -3 -3 -2 -8 -4 -7 -4 -10 -7 -3 -3 -18 -18 -17 -3 -3 -3 -4 -5 -3 -3 -4 -12 -7 -3 -11 -13 -5 -4 -7 -13 -5 -4 -11 -3 -12 -3 -6 -4 -4 -21 -4 -6 -9 -5 -3 -10 -8 -4 -6 -4 -4 -6 -5 -4 -8 -6 -4 -6 -4 -4 -5 -9 -6 -3 -4 -2 -9 -3 -18 -2 -4 -3 -13 -3 -6 -6 -8 -7 -9 -3 -2 -16 -3 -4 -6 -3 -2 -33 -22 -14 -4 -9 -12 -4 -5 -6 -3 -23 -9 -4 -3 -5 -5 -3 -4 -5 -3 -5 -3 -10 -4 -5 -5 -8 -4 -4 -6 -8 -5 -4 -3 -4 -6 -3 -3 -3 -5 -9 -12 -6 -5 -9 -3 -5 -3 -2 -2 -2 -18 -3 -2 -21 -2 -5 -4 -6 -4 -5 -10 -3 -9 -3 -2 -10 -7 -3 -6 -6 -4 -4 -8 -12 -7 -3 -7 -3 -3 -9 -3 -4 -5 -4 -4 -5 -5 -10 -15 -4 -4 -14 -6 -227 -3 -14 -5 -216 -22 -5 -4 -2 -2 -6 -3 -4 -2 -9 -9 -4 -3 -28 -13 -11 -4 -5 -3 -3 -2 -3 -3 -5 -3 -4 -3 -5 -23 -26 -3 -4 -5 -6 -4 -6 -3 -5 -5 -3 -4 -3 -2 -2 -2 -7 -14 -3 -6 -7 -17 -2 -2 -15 -14 -16 -4 -6 -7 -13 -6 -4 -5 -6 -16 -3 -3 -28 -3 -6 -15 -3 -9 -2 -4 -6 -3 -3 -22 -4 -12 -6 -7 -2 -5 -4 -10 -3 -16 -6 -9 -2 -5 -12 -7 -5 -5 -5 -5 -2 -11 -9 -17 -4 -3 -11 -7 -3 -5 -15 -4 -3 -4 -211 -8 -7 -5 -4 -7 -6 -7 -6 -3 -6 -5 -6 -5 -3 -4 -4 -26 -4 -6 -10 -4 -4 -3 -2 -3 -3 -4 -5 -9 -3 -9 -4 -4 -5 -5 -8 -2 -4 -2 -3 -8 -4 -11 -19 -5 -8 -6 -3 -5 -6 -12 -3 -2 -4 -16 -12 -3 -4 -4 -8 -6 -5 -6 -6 -219 -8 -222 -6 -16 -3 -13 -19 -5 -4 -3 -11 -6 -10 -4 -7 -7 -12 -5 -3 -3 -5 -6 -10 -3 -8 -2 -5 -4 -7 -2 -4 -4 -2 -12 -9 -6 -4 -2 -40 -2 -4 -10 -4 -223 -4 -2 -20 -6 -7 -24 -5 -4 -5 -2 -20 -16 -6 -5 -13 -2 -3 -3 -19 -3 -2 -4 -5 -6 -7 -11 -12 -5 -6 -7 -7 -3 -5 -3 -5 -3 -14 -3 -4 -4 -2 -11 -1 -7 -3 -9 -6 -11 -12 -5 -8 -6 -221 -4 -2 -12 -4 -3 -15 -4 -5 -226 -7 -218 -7 -5 -4 -5 -18 -4 -5 -9 -4 -4 -2 -9 -18 -18 -9 -5 -6 -6 -3 -3 -7 -3 -5 -4 -4 -4 -12 -3 -6 -31 -5 -4 -7 -3 -6 -5 -6 -5 -11 -2 -2 -11 -11 -6 -7 -5 -8 -7 -10 -5 -23 -7 -4 -3 -5 -34 -2 -5 -23 -7 -3 -6 -8 -4 -4 -4 -2 -5 -3 -8 -5 -4 -8 -25 -2 -3 -17 -8 -3 -4 -8 -7 -3 -15 -6 -5 -7 -21 -9 -5 -6 -6 -5 -3 -2 -3 -10 -3 -6 -3 -14 -7 -4 -4 -8 -7 -8 -2 -6 -12 -4 -213 -6 -5 -21 -8 -2 -5 -23 -3 -11 -2 -3 -6 -25 -2 -3 -6 -7 -6 -6 -4 -4 -6 -3 -17 -9 -7 -6 -4 -3 -10 -7 -2 -3 -3 -3 -11 -8 -3 -7 -6 -4 -14 -36 -3 -4 -3 -3 -22 -13 -21 -4 -2 -7 -4 -4 -17 -15 -3 -7 -11 -2 -4 -7 -6 -209 -6 -3 -2 -2 -24 -4 -9 -4 -3 -3 -3 -29 -2 -2 -4 -3 -3 -5 -4 -6 -3 -3 -2 -4 diff --git a/vendor/github.com/bmizerany/assert/.gitignore b/vendor/github.com/bmizerany/assert/.gitignore deleted file mode 100644 index b6fadf4ebe7..00000000000 --- a/vendor/github.com/bmizerany/assert/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -_go_.* -_gotest_.* -_obj -_test -_testmain.go -*.out -*.[568] diff --git a/vendor/github.com/bmizerany/assert/README.md b/vendor/github.com/bmizerany/assert/README.md deleted file mode 100644 index a682983a286..00000000000 --- a/vendor/github.com/bmizerany/assert/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# NO LONGER MAINTAINED - Just use Go's testing package. - -# Assert (c) Blake Mizerany and Keith Rarick -- MIT LICENCE - -## Assertions for Go tests - -## Install - - $ go get github.com/bmizerany/assert - -## Use - -**point.go** - - package point - - type Point struct { - x, y int - } - -**point_test.go** - - - package point - - import ( - "testing" - "github.com/bmizerany/assert" - ) - - func TestAsserts(t *testing.T) { - p1 := Point{1, 1} - p2 := Point{2, 1} - - assert.Equal(t, p1, p2) - } - -**output** - $ go test - --- FAIL: TestAsserts (0.00 seconds) - assert.go:15: /Users/flavio.barbosa/dev/stewie/src/point_test.go:12 - assert.go:24: ! X: 1 != 2 - FAIL - -## Docs - - http://github.com/bmizerany/assert diff --git a/vendor/github.com/bmizerany/assert/assert_test.go b/vendor/github.com/bmizerany/assert/assert_test.go deleted file mode 100644 index 162a590c62f..00000000000 --- a/vendor/github.com/bmizerany/assert/assert_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package assert - -import ( - "testing" -) - -func TestLineNumbers(t *testing.T) { - Equal(t, "foo", "foo", "msg!") - //Equal(t, "foo", "bar", "this should blow up") -} - -func TestNotEqual(t *testing.T) { - NotEqual(t, "foo", "bar", "msg!") - //NotEqual(t, "foo", "foo", "this should blow up") -} diff --git a/vendor/github.com/bradfitz/gomemcache/.gitignore b/vendor/github.com/bradfitz/gomemcache/.gitignore deleted file mode 100644 index 02c604d7a84..00000000000 --- a/vendor/github.com/bradfitz/gomemcache/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -_* -*.out -*~ diff --git a/vendor/github.com/bradfitz/gomemcache/README.md b/vendor/github.com/bradfitz/gomemcache/README.md deleted file mode 100644 index f987363ccd3..00000000000 --- a/vendor/github.com/bradfitz/gomemcache/README.md +++ /dev/null @@ -1,37 +0,0 @@ -## About - -This is a memcache client library for the Go programming language -(http://golang.org/). - -## Installing - -### Using *go get* - - $ go get github.com/bradfitz/gomemcache/memcache - -After this command *gomemcache* is ready to use. Its source will be in: - - $GOPATH/src/github.com/bradfitz/gomemcache/memcache - -## Example - - import ( - "github.com/bradfitz/gomemcache/memcache" - ) - - func main() { - mc := memcache.New("10.0.0.1:11211", "10.0.0.2:11211", "10.0.0.3:11212") - mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")}) - - it, err := mc.Get("foo") - ... - } - -## Full docs, see: - -See https://godoc.org/github.com/bradfitz/gomemcache/memcache - -Or run: - - $ godoc github.com/bradfitz/gomemcache/memcache - diff --git a/vendor/github.com/codahale/hdrhistogram/README.md b/vendor/github.com/codahale/hdrhistogram/README.md deleted file mode 100644 index 614b197c3dd..00000000000 --- a/vendor/github.com/codahale/hdrhistogram/README.md +++ /dev/null @@ -1,15 +0,0 @@ -hdrhistogram -============ - -[![Build Status](https://travis-ci.org/codahale/hdrhistogram.png?branch=master)](https://travis-ci.org/codahale/hdrhistogram) - -A pure Go implementation of the [HDR Histogram](https://github.com/HdrHistogram/HdrHistogram). - -> A Histogram that supports recording and analyzing sampled data value counts -> across a configurable integer value range with configurable value precision -> within the range. Value precision is expressed as the number of significant -> digits in the value recording, and provides control over value quantization -> behavior across the value range and the subsequent value resolution at any -> given level. - -For documentation, check [godoc](http://godoc.org/github.com/codahale/hdrhistogram). diff --git a/vendor/github.com/codegangsta/cli/.flake8 b/vendor/github.com/codegangsta/cli/.flake8 deleted file mode 100644 index 6deafc26170..00000000000 --- a/vendor/github.com/codegangsta/cli/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -max-line-length = 120 diff --git a/vendor/github.com/codegangsta/cli/.gitignore b/vendor/github.com/codegangsta/cli/.gitignore deleted file mode 100644 index faf70c4c240..00000000000 --- a/vendor/github.com/codegangsta/cli/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.coverprofile -node_modules/ diff --git a/vendor/github.com/codegangsta/cli/.travis.yml b/vendor/github.com/codegangsta/cli/.travis.yml deleted file mode 100644 index cf8d0980dca..00000000000 --- a/vendor/github.com/codegangsta/cli/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: go -sudo: false -dist: trusty -osx_image: xcode8.3 -go: 1.8.x - -os: -- linux -- osx - -cache: - directories: - - node_modules - -before_script: -- go get github.com/urfave/gfmrun/... || true -- go get golang.org/x/tools/cmd/goimports -- if [ ! -f node_modules/.bin/markdown-toc ] ; then - npm install markdown-toc ; - fi - -script: -- ./runtests gen -- ./runtests vet -- ./runtests test -- ./runtests gfmrun -- ./runtests toc diff --git a/vendor/github.com/codegangsta/cli/CHANGELOG.md b/vendor/github.com/codegangsta/cli/CHANGELOG.md deleted file mode 100644 index 401eae5a2cc..00000000000 --- a/vendor/github.com/codegangsta/cli/CHANGELOG.md +++ /dev/null @@ -1,435 +0,0 @@ -# Change Log - -**ATTN**: This project uses [semantic versioning](http://semver.org/). - -## [Unreleased] - -## 1.20.0 - 2017-08-10 - -### Fixed - -* `HandleExitCoder` is now correctly iterates over all errors in - a `MultiError`. The exit code is the exit code of the last error or `1` if - there are no `ExitCoder`s in the `MultiError`. -* Fixed YAML file loading on Windows (previously would fail validate the file path) -* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly - propogated -* `ErrWriter` is now passed downwards through command structure to avoid the - need to redefine it -* Pass `Command` context into `OnUsageError` rather than parent context so that - all fields are avaiable -* Errors occuring in `Before` funcs are no longer double printed -* Use `UsageText` in the help templates for commands and subcommands if - defined; otherwise build the usage as before (was previously ignoring this - field) -* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if - a program calls `Set` or `GlobalSet` directly after flag parsing (would - previously only return `true` if the flag was set during parsing) - -### Changed - -* No longer exit the program on command/subcommand error if the error raised is - not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was - determined to be a regression in functionality. See [the - PR](https://github.com/urfave/cli/pull/595) for discussion. - -### Added - -* `CommandsByName` type was added to make it easy to sort `Command`s by name, - alphabetically -* `altsrc` now handles loading of string and int arrays from TOML -* Support for definition of custom help templates for `App` via - `CustomAppHelpTemplate` -* Support for arbitrary key/value fields on `App` to be used with - `CustomAppHelpTemplate` via `ExtraInfo` -* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be - `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` - interface to be used. - - -## [1.19.1] - 2016-11-21 - -### Fixed - -- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as - the `Action` for a command would cause it to error rather than calling the - function. Should not have a affected declarative cases using `func(c - *cli.Context) err)`. -- Shell completion now handles the case where the user specifies - `--generate-bash-completion` immediately after a flag that takes an argument. - Previously it call the application with `--generate-bash-completion` as the - flag value. - -## [1.19.0] - 2016-11-19 -### Added -- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) -- A `Description` field was added to `App` for a more detailed description of - the application (similar to the existing `Description` field on `Command`) -- Flag type code generation via `go generate` -- Write to stderr and exit 1 if action returns non-nil error -- Added support for TOML to the `altsrc` loader -- `SkipArgReorder` was added to allow users to skip the argument reordering. - This is useful if you want to consider all "flags" after an argument as - arguments rather than flags (the default behavior of the stdlib `flag` - library). This is backported functionality from the [removal of the flag - reordering](https://github.com/urfave/cli/pull/398) in the unreleased version - 2 -- For formatted errors (those implementing `ErrorFormatter`), the errors will - be formatted during output. Compatible with `pkg/errors`. - -### Changed -- Raise minimum tested/supported Go version to 1.2+ - -### Fixed -- Consider empty environment variables as set (previously environment variables - with the equivalent of `""` would be skipped rather than their value used). -- Return an error if the value in a given environment variable cannot be parsed - as the flag type. Previously these errors were silently swallowed. -- Print full error when an invalid flag is specified (which includes the invalid flag) -- `App.Writer` defaults to `stdout` when `nil` -- If no action is specified on a command or app, the help is now printed instead of `panic`ing -- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) -- Correctly show help message if `-h` is provided to a subcommand -- `context.(Global)IsSet` now respects environment variables. Previously it - would return `false` if a flag was specified in the environment rather than - as an argument -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user -- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This - fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well - as `altsrc` where Go would complain that the types didn't match - -## [1.18.1] - 2016-08-28 -### Fixed -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) - -## [1.18.0] - 2016-06-27 -### Added -- `./runtests` test runner with coverage tracking by default -- testing on OS X -- testing on Windows -- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code - -### Changed -- Use spaces for alignment in help/usage output instead of tabs, making the - output alignment consistent regardless of tab width - -### Fixed -- Printing of command aliases in help text -- Printing of visible flags for both struct and struct pointer flags -- Display the `help` subcommand when using `CommandCategories` -- No longer swallows `panic`s that occur within the `Action`s themselves when - detecting the signature of the `Action` field - -## [1.17.1] - 2016-08-28 -### Fixed -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user - -## [1.17.0] - 2016-05-09 -### Added -- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` -- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` -- Support for hiding commands by setting `Hidden: true` -- this will hide the - commands in help output - -### Changed -- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer - quoted in help text output. -- All flag types now include `(default: {value})` strings following usage when a - default value can be (reasonably) detected. -- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent - with non-slice flag types -- Apps now exit with a code of 3 if an unknown subcommand is specified - (previously they printed "No help topic for...", but still exited 0. This - makes it easier to script around apps built using `cli` since they can trust - that a 0 exit code indicated a successful execution. -- cleanups based on [Go Report Card - feedback](https://goreportcard.com/report/github.com/urfave/cli) - -## [1.16.1] - 2016-08-28 -### Fixed -- Removed deprecation warnings to STDERR to avoid them leaking to the end-user - -## [1.16.0] - 2016-05-02 -### Added -- `Hidden` field on all flag struct types to omit from generated help text - -### Changed -- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from -generated help text via the `Hidden` field - -### Fixed -- handling of error values in `HandleAction` and `HandleExitCoder` - -## [1.15.0] - 2016-04-30 -### Added -- This file! -- Support for placeholders in flag usage strings -- `App.Metadata` map for arbitrary data/state management -- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after -parsing. -- Support for nested lookup of dot-delimited keys in structures loaded from -YAML. - -### Changed -- The `App.Action` and `Command.Action` now prefer a return signature of -`func(*cli.Context) error`, as defined by `cli.ActionFunc`. If a non-nil -`error` is returned, there may be two outcomes: - - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called - automatically - - Else the error is bubbled up and returned from `App.Run` -- Specifying an `Action` with the legacy return signature of -`func(*cli.Context)` will produce a deprecation message to stderr -- Specifying an `Action` that is not a `func` type will produce a non-zero exit -from `App.Run` -- Specifying an `Action` func that has an invalid (input) signature will -produce a non-zero exit from `App.Run` - -### Deprecated -- -`cli.App.RunAndExitOnError`, which should now be done by returning an error -that fulfills `cli.ExitCoder` to `cli.App.Run`. -- the legacy signature for -`cli.App.Action` of `func(*cli.Context)`, which should now have a return -signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. - -### Fixed -- Added missing `*cli.Context.GlobalFloat64` method - -## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) -### Added -- Codebeat badge -- Support for categorization via `CategorizedHelp` and `Categories` on app. - -### Changed -- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. - -### Fixed -- Ensure version is not shown in help text when `HideVersion` set. - -## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) -### Added -- YAML file input support. -- `NArg` method on context. - -## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) -### Added -- Custom usage error handling. -- Custom text support in `USAGE` section of help output. -- Improved help messages for empty strings. -- AppVeyor CI configuration. - -### Changed -- Removed `panic` from default help printer func. -- De-duping and optimizations. - -### Fixed -- Correctly handle `Before`/`After` at command level when no subcommands. -- Case of literal `-` argument causing flag reordering. -- Environment variable hints on Windows. -- Docs updates. - -## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) -### Changed -- Use `path.Base` in `Name` and `HelpName` -- Export `GetName` on flag types. - -### Fixed -- Flag parsing when skipping is enabled. -- Test output cleanup. -- Move completion check to account for empty input case. - -## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) -### Added -- Destination scan support for flags. -- Testing against `tip` in Travis CI config. - -### Changed -- Go version in Travis CI config. - -### Fixed -- Removed redundant tests. -- Use correct example naming in tests. - -## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) -### Fixed -- Remove unused var in bash completion. - -## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) -### Added -- Coverage and reference logos in README. - -### Fixed -- Use specified values in help and version parsing. -- Only display app version and help message once. - -## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) -### Added -- More tests for existing functionality. -- `ArgsUsage` at app and command level for help text flexibility. - -### Fixed -- Honor `HideHelp` and `HideVersion` in `App.Run`. -- Remove juvenile word from README. - -## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) -### Added -- `FullName` on command with accompanying help output update. -- Set default `$PROG` in bash completion. - -### Changed -- Docs formatting. - -### Fixed -- Removed self-referential imports in tests. - -## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) -### Added -- Support for `Copyright` at app level. -- `Parent` func at context level to walk up context lineage. - -### Fixed -- Global flag processing at top level. - -## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) -### Added -- Aggregate errors from `Before`/`After` funcs. -- Doc comments on flag structs. -- Include non-global flags when checking version and help. -- Travis CI config updates. - -### Fixed -- Ensure slice type flags have non-nil values. -- Collect global flags from the full command hierarchy. -- Docs prose. - -## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) -### Changed -- `HelpPrinter` signature includes output writer. - -### Fixed -- Specify go 1.1+ in docs. -- Set `Writer` when running command as app. - -## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) -### Added -- Multiple author support. -- `NumFlags` at context level. -- `Aliases` at command level. - -### Deprecated -- `ShortName` at command level. - -### Fixed -- Subcommand help output. -- Backward compatible support for deprecated `Author` and `Email` fields. -- Docs regarding `Names`/`Aliases`. - -## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) -### Added -- `After` hook func support at app and command level. - -### Fixed -- Use parsed context when running command as subcommand. -- Docs prose. - -## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) -### Added -- Support for hiding `-h / --help` flags, but not `help` subcommand. -- Stop flag parsing after `--`. - -### Fixed -- Help text for generic flags to specify single value. -- Use double quotes in output for defaults. -- Use `ParseInt` instead of `ParseUint` for int environment var values. -- Use `0` as base when parsing int environment var values. - -## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) -### Added -- Support for environment variable lookup "cascade". -- Support for `Stdout` on app for output redirection. - -### Fixed -- Print command help instead of app help in `ShowCommandHelp`. - -## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) -### Added -- Docs and example code updates. - -### Changed -- Default `-v / --version` flag made optional. - -## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) -### Added -- `FlagNames` at context level. -- Exposed `VersionPrinter` var for more control over version output. -- Zsh completion hook. -- `AUTHOR` section in default app help template. -- Contribution guidelines. -- `DurationFlag` type. - -## [1.2.0] - 2014-08-02 -### Added -- Support for environment variable defaults on flags plus tests. - -## [1.1.0] - 2014-07-15 -### Added -- Bash completion. -- Optional hiding of built-in help command. -- Optional skipping of flag parsing at command level. -- `Author`, `Email`, and `Compiled` metadata on app. -- `Before` hook func support at app and command level. -- `CommandNotFound` func support at app level. -- Command reference available on context. -- `GenericFlag` type. -- `Float64Flag` type. -- `BoolTFlag` type. -- `IsSet` flag helper on context. -- More flag lookup funcs at context level. -- More tests & docs. - -### Changed -- Help template updates to account for presence/absence of flags. -- Separated subcommand help template. -- Exposed `HelpPrinter` var for more control over help output. - -## [1.0.0] - 2013-11-01 -### Added -- `help` flag in default app flag set and each command flag set. -- Custom handling of argument parsing errors. -- Command lookup by name at app level. -- `StringSliceFlag` type and supporting `StringSlice` type. -- `IntSliceFlag` type and supporting `IntSlice` type. -- Slice type flag lookups by name at context level. -- Export of app and command help functions. -- More tests & docs. - -## 0.1.0 - 2013-07-22 -### Added -- Initial implementation. - -[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD -[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 -[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 -[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 -[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 -[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 -[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 -[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 -[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 -[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 -[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 -[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 -[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 -[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 -[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 -[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 -[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 -[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 -[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 -[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 -[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 -[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 -[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 -[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 -[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 -[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 diff --git a/vendor/github.com/codegangsta/cli/README.md b/vendor/github.com/codegangsta/cli/README.md deleted file mode 100644 index 2bbbd8ea972..00000000000 --- a/vendor/github.com/codegangsta/cli/README.md +++ /dev/null @@ -1,1381 +0,0 @@ -cli -=== - -[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli) -[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli) -[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) -[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) -[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) -[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) / -[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc) - -**Notice:** This is the library formerly known as -`github.com/codegangsta/cli` -- Github will automatically redirect requests -to this repository, but we recommend updating your references for clarity. - -cli is a simple, fast, and fun package for building command line apps in Go. The -goal is to enable developers to write fast and distributable command line -applications in an expressive way. - - - -- [Overview](#overview) -- [Installation](#installation) - * [Supported platforms](#supported-platforms) - * [Using the `v2` branch](#using-the-v2-branch) - * [Pinning to the `v1` releases](#pinning-to-the-v1-releases) -- [Getting Started](#getting-started) -- [Examples](#examples) - * [Arguments](#arguments) - * [Flags](#flags) - + [Placeholder Values](#placeholder-values) - + [Alternate Names](#alternate-names) - + [Ordering](#ordering) - + [Values from the Environment](#values-from-the-environment) - + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others) - * [Subcommands](#subcommands) - * [Subcommands categories](#subcommands-categories) - * [Exit code](#exit-code) - * [Bash Completion](#bash-completion) - + [Enabling](#enabling) - + [Distribution](#distribution) - + [Customization](#customization) - * [Generated Help Text](#generated-help-text) - + [Customization](#customization-1) - * [Version Flag](#version-flag) - + [Customization](#customization-2) - + [Full API Example](#full-api-example) -- [Contribution Guidelines](#contribution-guidelines) - - - -## Overview - -Command line apps are usually so tiny that there is absolutely no reason why -your code should *not* be self-documenting. Things like generating help text and -parsing command flags/options should not hinder productivity when writing a -command line app. - -**This is where cli comes into play.** cli makes command line programming fun, -organized, and expressive! - -## Installation - -Make sure you have a working Go environment. Go version 1.2+ is supported. [See -the install instructions for Go](http://golang.org/doc/install.html). - -To install cli, simply run: -``` -$ go get github.com/urfave/cli -``` - -Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can -be easily used: -``` -export PATH=$PATH:$GOPATH/bin -``` - -### Supported platforms - -cli is tested against multiple versions of Go on Linux, and against the latest -released version of Go on OS X and Windows. For full details, see -[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml). - -### Using the `v2` branch - -**Warning**: The `v2` branch is currently unreleased and considered unstable. - -There is currently a long-lived branch named `v2` that is intended to land as -the new `master` branch once development there has settled down. The current -`master` branch (mirrored as `v1`) is being manually merged into `v2` on -an irregular human-based schedule, but generally if one wants to "upgrade" to -`v2` *now* and accept the volatility (read: "awesomeness") that comes along with -that, please use whatever version pinning of your preference, such as via -`gopkg.in`: - -``` -$ go get gopkg.in/urfave/cli.v2 -``` - -``` go -... -import ( - "gopkg.in/urfave/cli.v2" // imports as package "cli" -) -... -``` - -### Pinning to the `v1` releases - -Similarly to the section above describing use of the `v2` branch, if one wants -to avoid any unexpected compatibility pains once `v2` becomes `master`, then -pinning to `v1` is an acceptable option, e.g.: - -``` -$ go get gopkg.in/urfave/cli.v1 -``` - -``` go -... -import ( - "gopkg.in/urfave/cli.v1" // imports as package "cli" -) -... -``` - -This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing). - -## Getting Started - -One of the philosophies behind cli is that an API should be playful and full of -discovery. So a cli app can be as little as one line of code in `main()`. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.NewApp().Run(os.Args) -} -``` - -This app will run and show help text, but is not very useful. Let's give an -action to execute and some help documentation: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - app.Name = "boom" - app.Usage = "make an explosive entrance" - app.Action = func(c *cli.Context) error { - fmt.Println("boom! I say!") - return nil - } - - app.Run(os.Args) -} -``` - -Running this already gives you a ton of functionality, plus support for things -like subcommands and flags, which are covered below. - -## Examples - -Being a programmer can be a lonely job. Thankfully by the power of automation -that is not the case! Let's create a greeter app to fend off our demons of -loneliness! - -Start by creating a directory named `greet`, and within it, add a file, -`greet.go` with the following code in it: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - app.Name = "greet" - app.Usage = "fight the loneliness!" - app.Action = func(c *cli.Context) error { - fmt.Println("Hello friend!") - return nil - } - - app.Run(os.Args) -} -``` - -Install our command to the `$GOPATH/bin` directory: - -``` -$ go install -``` - -Finally run our new command: - -``` -$ greet -Hello friend! -``` - -cli also generates neat help text: - -``` -$ greet help -NAME: - greet - fight the loneliness! - -USAGE: - greet [global options] command [command options] [arguments...] - -VERSION: - 0.0.0 - -COMMANDS: - help, h Shows a list of commands or help for one command - -GLOBAL OPTIONS - --version Shows version information -``` - -### Arguments - -You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Action = func(c *cli.Context) error { - fmt.Printf("Hello %q", c.Args().Get(0)) - return nil - } - - app.Run(os.Args) -} -``` - -### Flags - -Setting and querying flags is simple. - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - }, - } - - app.Action = func(c *cli.Context) error { - name := "Nefertiti" - if c.NArg() > 0 { - name = c.Args().Get(0) - } - if c.String("lang") == "spanish" { - fmt.Println("Hola", name) - } else { - fmt.Println("Hello", name) - } - return nil - } - - app.Run(os.Args) -} -``` - -You can also set a destination variable for a flag, to which the content will be -scanned. - - -``` go -package main - -import ( - "os" - "fmt" - - "github.com/urfave/cli" -) - -func main() { - var language string - - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang", - Value: "english", - Usage: "language for the greeting", - Destination: &language, - }, - } - - app.Action = func(c *cli.Context) error { - name := "someone" - if c.NArg() > 0 { - name = c.Args()[0] - } - if language == "spanish" { - fmt.Println("Hola", name) - } else { - fmt.Println("Hello", name) - } - return nil - } - - app.Run(os.Args) -} -``` - -See full list of flags at http://godoc.org/github.com/urfave/cli - -#### Placeholder Values - -Sometimes it's useful to specify a flag's value within the usage string itself. -Such placeholders are indicated with back quotes. - -For example this: - - -```go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag{ - cli.StringFlag{ - Name: "config, c", - Usage: "Load configuration from `FILE`", - }, - } - - app.Run(os.Args) -} -``` - -Will result in help output like: - -``` ---config FILE, -c FILE Load configuration from FILE -``` - -Note that only the first placeholder is used. Subsequent back-quoted words will -be left as-is. - -#### Alternate Names - -You can set alternate (or short) names for flags by providing a comma-delimited -list for the `Name`. e.g. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - }, - } - - app.Run(os.Args) -} -``` - -That flag can then be set with `--lang spanish` or `-l spanish`. Note that -giving two different forms of the same flag in the same command invocation is an -error. - -#### Ordering - -Flags for the application and commands are shown in the order they are defined. -However, it's possible to sort them from outside this library by using `FlagsByName` -or `CommandsByName` with `sort`. - -For example this: - - -``` go -package main - -import ( - "os" - "sort" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "Language for the greeting", - }, - cli.StringFlag{ - Name: "config, c", - Usage: "Load configuration from `FILE`", - }, - } - - app.Commands = []cli.Command{ - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) error { - return nil - }, - }, - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) error { - return nil - }, - }, - } - - sort.Sort(cli.FlagsByName(app.Flags)) - sort.Sort(cli.CommandsByName(app.Commands)) - - app.Run(os.Args) -} -``` - -Will result in help output like: - -``` ---config FILE, -c FILE Load configuration from FILE ---lang value, -l value Language for the greeting (default: "english") -``` - -#### Values from the Environment - -You can also have the default value set from the environment via `EnvVar`. e.g. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - EnvVar: "APP_LANG", - }, - } - - app.Run(os.Args) -} -``` - -The `EnvVar` may also be given as a comma-delimited "cascade", where the first -environment variable that resolves is used as the default. - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Flags = []cli.Flag { - cli.StringFlag{ - Name: "lang, l", - Value: "english", - Usage: "language for the greeting", - EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", - }, - } - - app.Run(os.Args) -} -``` - -#### Values from alternate input sources (YAML, TOML, and others) - -There is a separate package altsrc that adds support for getting flag values -from other file input sources. - -Currently supported input source formats: -* YAML -* TOML - -In order to get values for a flag from an alternate input source the following -code would be added to wrap an existing cli.Flag like below: - -``` go - altsrc.NewIntFlag(cli.IntFlag{Name: "test"}) -``` - -Initialization must also occur for these flags. Below is an example initializing -getting data from a yaml file below. - -``` go - command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load")) -``` - -The code above will use the "load" string as a flag name to get the file name of -a yaml file from the cli.Context. It will then use that file name to initialize -the yaml input source for any flags that are defined on that command. As a note -the "load" flag used would also have to be defined on the command flags in order -for this code snipped to work. - -Currently only the aboved specified formats are supported but developers can -add support for other input sources by implementing the -altsrc.InputSourceContext for their given sources. - -Here is a more complete sample of a command using YAML support: - - -``` go -package notmain - -import ( - "fmt" - "os" - - "github.com/urfave/cli" - "github.com/urfave/cli/altsrc" -) - -func main() { - app := cli.NewApp() - - flags := []cli.Flag{ - altsrc.NewIntFlag(cli.IntFlag{Name: "test"}), - cli.StringFlag{Name: "load"}, - } - - app.Action = func(c *cli.Context) error { - fmt.Println("yaml ist rad") - return nil - } - - app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load")) - app.Flags = flags - - app.Run(os.Args) -} -``` - -### Subcommands - -Subcommands can be defined for a more git-like command line app. - - -```go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Commands = []cli.Command{ - { - Name: "add", - Aliases: []string{"a"}, - Usage: "add a task to the list", - Action: func(c *cli.Context) error { - fmt.Println("added task: ", c.Args().First()) - return nil - }, - }, - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) error { - fmt.Println("completed task: ", c.Args().First()) - return nil - }, - }, - { - Name: "template", - Aliases: []string{"t"}, - Usage: "options for task templates", - Subcommands: []cli.Command{ - { - Name: "add", - Usage: "add a new template", - Action: func(c *cli.Context) error { - fmt.Println("new task template: ", c.Args().First()) - return nil - }, - }, - { - Name: "remove", - Usage: "remove an existing template", - Action: func(c *cli.Context) error { - fmt.Println("removed task template: ", c.Args().First()) - return nil - }, - }, - }, - }, - } - - app.Run(os.Args) -} -``` - -### Subcommands categories - -For additional organization in apps that have many subcommands, you can -associate a category for each command to group them together in the help -output. - -E.g. - -```go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - - app.Commands = []cli.Command{ - { - Name: "noop", - }, - { - Name: "add", - Category: "template", - }, - { - Name: "remove", - Category: "template", - }, - } - - app.Run(os.Args) -} -``` - -Will include: - -``` -COMMANDS: - noop - - Template actions: - add - remove -``` - -### Exit code - -Calling `App.Run` will not automatically call `os.Exit`, which means that by -default the exit code will "fall through" to being `0`. An explicit exit code -may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a -`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.: - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - app := cli.NewApp() - app.Flags = []cli.Flag{ - cli.BoolTFlag{ - Name: "ginger-crouton", - Usage: "is it in the soup?", - }, - } - app.Action = func(ctx *cli.Context) error { - if !ctx.Bool("ginger-crouton") { - return cli.NewExitError("it is not in the soup", 86) - } - return nil - } - - app.Run(os.Args) -} -``` - -### Bash Completion - -You can enable completion commands by setting the `EnableBashCompletion` -flag on the `App` object. By default, this setting will only auto-complete to -show an app's subcommands, but you can write your own completion methods for -the App or its subcommands. - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -func main() { - tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"} - - app := cli.NewApp() - app.EnableBashCompletion = true - app.Commands = []cli.Command{ - { - Name: "complete", - Aliases: []string{"c"}, - Usage: "complete a task on the list", - Action: func(c *cli.Context) error { - fmt.Println("completed task: ", c.Args().First()) - return nil - }, - BashComplete: func(c *cli.Context) { - // This will complete if no args are passed - if c.NArg() > 0 { - return - } - for _, t := range tasks { - fmt.Println(t) - } - }, - }, - } - - app.Run(os.Args) -} -``` - -#### Enabling - -Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while -setting the `PROG` variable to the name of your program: - -`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` - -#### Distribution - -Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename -it to the name of the program you wish to add autocomplete support for (or -automatically install it there if you are distributing a package). Don't forget -to source the file to make it active in the current shell. - -``` -sudo cp src/bash_autocomplete /etc/bash_completion.d/ -source /etc/bash_completion.d/ -``` - -Alternatively, you can just document that users should source the generic -`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set -to the name of their program (as above). - -#### Customization - -The default bash completion flag (`--generate-bash-completion`) is defined as -`cli.BashCompletionFlag`, and may be redefined if desired, e.g.: - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.BashCompletionFlag = cli.BoolFlag{ - Name: "compgen", - Hidden: true, - } - - app := cli.NewApp() - app.EnableBashCompletion = true - app.Commands = []cli.Command{ - { - Name: "wat", - }, - } - app.Run(os.Args) -} -``` - -### Generated Help Text - -The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked -by the cli internals in order to print generated help text for the app, command, -or subcommand, and break execution. - -#### Customization - -All of the help text generation may be customized, and at multiple levels. The -templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and -`SubcommandHelpTemplate` which may be reassigned or augmented, and full override -is possible by assigning a compatible func to the `cli.HelpPrinter` variable, -e.g.: - - -``` go -package main - -import ( - "fmt" - "io" - "os" - - "github.com/urfave/cli" -) - -func main() { - // EXAMPLE: Append to an existing template - cli.AppHelpTemplate = fmt.Sprintf(`%s - -WEBSITE: http://awesometown.example.com - -SUPPORT: support@awesometown.example.com - -`, cli.AppHelpTemplate) - - // EXAMPLE: Override a template - cli.AppHelpTemplate = `NAME: - {{.Name}} - {{.Usage}} -USAGE: - {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} - {{if len .Authors}} -AUTHOR: - {{range .Authors}}{{ . }}{{end}} - {{end}}{{if .Commands}} -COMMANDS: -{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} -GLOBAL OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}}{{if .Copyright }} -COPYRIGHT: - {{.Copyright}} - {{end}}{{if .Version}} -VERSION: - {{.Version}} - {{end}} -` - - // EXAMPLE: Replace the `HelpPrinter` func - cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { - fmt.Println("Ha HA. I pwnd the help!!1") - } - - cli.NewApp().Run(os.Args) -} -``` - -The default flag may be customized to something other than `-h/--help` by -setting `cli.HelpFlag`, e.g.: - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.HelpFlag = cli.BoolFlag{ - Name: "halp, haaaaalp", - Usage: "HALP", - EnvVar: "SHOW_HALP,HALPPLZ", - } - - cli.NewApp().Run(os.Args) -} -``` - -### Version Flag - -The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which -is checked by the cli internals in order to print the `App.Version` via -`cli.VersionPrinter` and break execution. - -#### Customization - -The default flag may be customized to something other than `-v/--version` by -setting `cli.VersionFlag`, e.g.: - - -``` go -package main - -import ( - "os" - - "github.com/urfave/cli" -) - -func main() { - cli.VersionFlag = cli.BoolFlag{ - Name: "print-version, V", - Usage: "print only the version", - } - - app := cli.NewApp() - app.Name = "partay" - app.Version = "19.99.0" - app.Run(os.Args) -} -``` - -Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.: - - -``` go -package main - -import ( - "fmt" - "os" - - "github.com/urfave/cli" -) - -var ( - Revision = "fafafaf" -) - -func main() { - cli.VersionPrinter = func(c *cli.Context) { - fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision) - } - - app := cli.NewApp() - app.Name = "partay" - app.Version = "19.99.0" - app.Run(os.Args) -} -``` - -#### Full API Example - -**Notice**: This is a contrived (functioning) example meant strictly for API -demonstration purposes. Use of one's imagination is encouraged. - - -``` go -package main - -import ( - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "time" - - "github.com/urfave/cli" -) - -func init() { - cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n" - cli.CommandHelpTemplate += "\nYMMV\n" - cli.SubcommandHelpTemplate += "\nor something\n" - - cli.HelpFlag = cli.BoolFlag{Name: "halp"} - cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true} - cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"} - - cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { - fmt.Fprintf(w, "best of luck to you\n") - } - cli.VersionPrinter = func(c *cli.Context) { - fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version) - } - cli.OsExiter = func(c int) { - fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c) - } - cli.ErrWriter = ioutil.Discard - cli.FlagStringer = func(fl cli.Flag) string { - return fmt.Sprintf("\t\t%s", fl.GetName()) - } -} - -type hexWriter struct{} - -func (w *hexWriter) Write(p []byte) (int, error) { - for _, b := range p { - fmt.Printf("%x", b) - } - fmt.Printf("\n") - - return len(p), nil -} - -type genericType struct{ - s string -} - -func (g *genericType) Set(value string) error { - g.s = value - return nil -} - -func (g *genericType) String() string { - return g.s -} - -func main() { - app := cli.NewApp() - app.Name = "kənˈtrīv" - app.Version = "19.99.0" - app.Compiled = time.Now() - app.Authors = []cli.Author{ - cli.Author{ - Name: "Example Human", - Email: "human@example.com", - }, - } - app.Copyright = "(c) 1999 Serious Enterprise" - app.HelpName = "contrive" - app.Usage = "demonstrate available API" - app.UsageText = "contrive - demonstrating the available API" - app.ArgsUsage = "[args and such]" - app.Commands = []cli.Command{ - cli.Command{ - Name: "doo", - Aliases: []string{"do"}, - Category: "motion", - Usage: "do the doo", - UsageText: "doo - does the dooing", - Description: "no really, there is a lot of dooing to be done", - ArgsUsage: "[arrgh]", - Flags: []cli.Flag{ - cli.BoolFlag{Name: "forever, forevvarr"}, - }, - Subcommands: cli.Commands{ - cli.Command{ - Name: "wop", - Action: wopAction, - }, - }, - SkipFlagParsing: false, - HideHelp: false, - Hidden: false, - HelpName: "doo!", - BashComplete: func(c *cli.Context) { - fmt.Fprintf(c.App.Writer, "--better\n") - }, - Before: func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "brace for impact\n") - return nil - }, - After: func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "did we lose anyone?\n") - return nil - }, - Action: func(c *cli.Context) error { - c.Command.FullName() - c.Command.HasName("wop") - c.Command.Names() - c.Command.VisibleFlags() - fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n") - if c.Bool("forever") { - c.Command.Run(c) - } - return nil - }, - OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error { - fmt.Fprintf(c.App.Writer, "for shame\n") - return err - }, - }, - } - app.Flags = []cli.Flag{ - cli.BoolFlag{Name: "fancy"}, - cli.BoolTFlag{Name: "fancier"}, - cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3}, - cli.Float64Flag{Name: "howmuch"}, - cli.GenericFlag{Name: "wat", Value: &genericType{}}, - cli.Int64Flag{Name: "longdistance"}, - cli.Int64SliceFlag{Name: "intervals"}, - cli.IntFlag{Name: "distance"}, - cli.IntSliceFlag{Name: "times"}, - cli.StringFlag{Name: "dance-move, d"}, - cli.StringSliceFlag{Name: "names, N"}, - cli.UintFlag{Name: "age"}, - cli.Uint64Flag{Name: "bigage"}, - } - app.EnableBashCompletion = true - app.HideHelp = false - app.HideVersion = false - app.BashComplete = func(c *cli.Context) { - fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n") - } - app.Before = func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n") - return nil - } - app.After = func(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, "Phew!\n") - return nil - } - app.CommandNotFound = func(c *cli.Context, command string) { - fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command) - } - app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error { - if isSubcommand { - return err - } - - fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err) - return nil - } - app.Action = func(c *cli.Context) error { - cli.DefaultAppComplete(c) - cli.HandleExitCoder(errors.New("not an exit coder, though")) - cli.ShowAppHelp(c) - cli.ShowCommandCompletions(c, "nope") - cli.ShowCommandHelp(c, "also-nope") - cli.ShowCompletions(c) - cli.ShowSubcommandHelp(c) - cli.ShowVersion(c) - - categories := c.App.Categories() - categories.AddCommand("sounds", cli.Command{ - Name: "bloop", - }) - - for _, category := range c.App.Categories() { - fmt.Fprintf(c.App.Writer, "%s\n", category.Name) - fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands) - fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands()) - } - - fmt.Printf("%#v\n", c.App.Command("doo")) - if c.Bool("infinite") { - c.App.Run([]string{"app", "doo", "wop"}) - } - - if c.Bool("forevar") { - c.App.RunAsSubcommand(c) - } - c.App.Setup() - fmt.Printf("%#v\n", c.App.VisibleCategories()) - fmt.Printf("%#v\n", c.App.VisibleCommands()) - fmt.Printf("%#v\n", c.App.VisibleFlags()) - - fmt.Printf("%#v\n", c.Args().First()) - if len(c.Args()) > 0 { - fmt.Printf("%#v\n", c.Args()[1]) - } - fmt.Printf("%#v\n", c.Args().Present()) - fmt.Printf("%#v\n", c.Args().Tail()) - - set := flag.NewFlagSet("contrive", 0) - nc := cli.NewContext(c.App, set, c) - - fmt.Printf("%#v\n", nc.Args()) - fmt.Printf("%#v\n", nc.Bool("nope")) - fmt.Printf("%#v\n", nc.BoolT("nerp")) - fmt.Printf("%#v\n", nc.Duration("howlong")) - fmt.Printf("%#v\n", nc.Float64("hay")) - fmt.Printf("%#v\n", nc.Generic("bloop")) - fmt.Printf("%#v\n", nc.Int64("bonk")) - fmt.Printf("%#v\n", nc.Int64Slice("burnks")) - fmt.Printf("%#v\n", nc.Int("bips")) - fmt.Printf("%#v\n", nc.IntSlice("blups")) - fmt.Printf("%#v\n", nc.String("snurt")) - fmt.Printf("%#v\n", nc.StringSlice("snurkles")) - fmt.Printf("%#v\n", nc.Uint("flub")) - fmt.Printf("%#v\n", nc.Uint64("florb")) - fmt.Printf("%#v\n", nc.GlobalBool("global-nope")) - fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp")) - fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong")) - fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay")) - fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop")) - fmt.Printf("%#v\n", nc.GlobalInt("global-bips")) - fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups")) - fmt.Printf("%#v\n", nc.GlobalString("global-snurt")) - fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles")) - - fmt.Printf("%#v\n", nc.FlagNames()) - fmt.Printf("%#v\n", nc.GlobalFlagNames()) - fmt.Printf("%#v\n", nc.GlobalIsSet("wat")) - fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope")) - fmt.Printf("%#v\n", nc.NArg()) - fmt.Printf("%#v\n", nc.NumFlags()) - fmt.Printf("%#v\n", nc.Parent()) - - nc.Set("wat", "also-nope") - - ec := cli.NewExitError("ohwell", 86) - fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode()) - fmt.Printf("made it!\n") - return ec - } - - if os.Getenv("HEXY") != "" { - app.Writer = &hexWriter{} - app.ErrWriter = &hexWriter{} - } - - app.Metadata = map[string]interface{}{ - "layers": "many", - "explicable": false, - "whatever-values": 19.99, - } - - app.Run(os.Args) -} - -func wopAction(c *cli.Context) error { - fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n") - return nil -} -``` - -## Contribution Guidelines - -Feel free to put up a pull request to fix a bug or maybe add a feature. I will -give it a code review and make sure that it does not break backwards -compatibility. If I or any other collaborators agree that it is in line with -the vision of the project, we will work with you to get the code into -a mergeable state and merge it into the master branch. - -If you have contributed something significant to the project, we will most -likely add you as a collaborator. As a collaborator you are given the ability -to merge others pull requests. It is very important that new code does not -break existing code, so be careful about what code you do choose to merge. - -If you feel like you have contributed to the project but have not yet been -added as a collaborator, we probably forgot to add you, please open an issue. diff --git a/vendor/github.com/codegangsta/cli/flag-types.json b/vendor/github.com/codegangsta/cli/flag-types.json deleted file mode 100644 index 1223107859a..00000000000 --- a/vendor/github.com/codegangsta/cli/flag-types.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "name": "Bool", - "type": "bool", - "value": false, - "context_default": "false", - "parser": "strconv.ParseBool(f.Value.String())" - }, - { - "name": "BoolT", - "type": "bool", - "value": false, - "doctail": " that is true by default", - "context_default": "false", - "parser": "strconv.ParseBool(f.Value.String())" - }, - { - "name": "Duration", - "type": "time.Duration", - "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", - "context_default": "0", - "parser": "time.ParseDuration(f.Value.String())" - }, - { - "name": "Float64", - "type": "float64", - "context_default": "0", - "parser": "strconv.ParseFloat(f.Value.String(), 64)" - }, - { - "name": "Generic", - "type": "Generic", - "dest": false, - "context_default": "nil", - "context_type": "interface{}" - }, - { - "name": "Int64", - "type": "int64", - "context_default": "0", - "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" - }, - { - "name": "Int", - "type": "int", - "context_default": "0", - "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", - "parser_cast": "int(parsed)" - }, - { - "name": "IntSlice", - "type": "*IntSlice", - "dest": false, - "context_default": "nil", - "context_type": "[]int", - "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" - }, - { - "name": "Int64Slice", - "type": "*Int64Slice", - "dest": false, - "context_default": "nil", - "context_type": "[]int64", - "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" - }, - { - "name": "String", - "type": "string", - "context_default": "\"\"", - "parser": "f.Value.String(), error(nil)" - }, - { - "name": "StringSlice", - "type": "*StringSlice", - "dest": false, - "context_default": "nil", - "context_type": "[]string", - "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" - }, - { - "name": "Uint64", - "type": "uint64", - "context_default": "0", - "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" - }, - { - "name": "Uint", - "type": "uint", - "context_default": "0", - "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", - "parser_cast": "uint(parsed)" - } -] diff --git a/vendor/github.com/codegangsta/cli/generate-flag-types b/vendor/github.com/codegangsta/cli/generate-flag-types deleted file mode 100755 index 7147381ce37..00000000000 --- a/vendor/github.com/codegangsta/cli/generate-flag-types +++ /dev/null @@ -1,255 +0,0 @@ -#!/usr/bin/env python -""" -The flag types that ship with the cli library have many things in common, and -so we can take advantage of the `go generate` command to create much of the -source code from a list of definitions. These definitions attempt to cover -the parts that vary between flag types, and should evolve as needed. - -An example of the minimum definition needed is: - - { - "name": "SomeType", - "type": "sometype", - "context_default": "nil" - } - -In this example, the code generated for the `cli` package will include a type -named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. -Fetching values by name via `*cli.Context` will default to a value of `nil`. - -A more complete, albeit somewhat redundant, example showing all available -definition keys is: - - { - "name": "VeryMuchType", - "type": "*VeryMuchType", - "value": true, - "dest": false, - "doctail": " which really only wraps a []float64, oh well!", - "context_type": "[]float64", - "context_default": "nil", - "parser": "parseVeryMuchType(f.Value.String())", - "parser_cast": "[]float64(parsed)" - } - -The meaning of each field is as follows: - - name (string) - The type "name", which will be suffixed with - `Flag` when generating the type definition - for `cli` and the wrapper type for `altsrc` - type (string) - The type that the generated `Flag` type for `cli` - is expected to "contain" as its `.Value` member - value (bool) - Should the generated `cli` type have a `Value` - member? - dest (bool) - Should the generated `cli` type support a - destination pointer? - doctail (string) - Additional docs for the `cli` flag type comment - context_type (string) - The literal type used in the `*cli.Context` - reader func signature - context_default (string) - The literal value used as the default by the - `*cli.Context` reader funcs when no value is - present - parser (string) - Literal code used to parse the flag `f`, - expected to have a return signature of - (value, error) - parser_cast (string) - Literal code used to cast the `parsed` value - returned from the `parser` code -""" - -from __future__ import print_function, unicode_literals - -import argparse -import json -import os -import subprocess -import sys -import tempfile -import textwrap - - -class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - pass - - -def main(sysargs=sys.argv[:]): - parser = argparse.ArgumentParser( - description='Generate flag type code!', - formatter_class=_FancyFormatter) - parser.add_argument( - 'package', - type=str, default='cli', choices=_WRITEFUNCS.keys(), - help='Package for which flag types will be generated' - ) - parser.add_argument( - '-i', '--in-json', - type=argparse.FileType('r'), - default=sys.stdin, - help='Input JSON file which defines each type to be generated' - ) - parser.add_argument( - '-o', '--out-go', - type=argparse.FileType('w'), - default=sys.stdout, - help='Output file/stream to which generated source will be written' - ) - parser.epilog = __doc__ - - args = parser.parse_args(sysargs[1:]) - _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) - return 0 - - -def _generate_flag_types(writefunc, output_go, input_json): - types = json.load(input_json) - - tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) - writefunc(tmp, types) - tmp.close() - - new_content = subprocess.check_output( - ['goimports', tmp.name] - ).decode('utf-8') - - print(new_content, file=output_go, end='') - output_go.flush() - os.remove(tmp.name) - - -def _set_typedef_defaults(typedef): - typedef.setdefault('doctail', '') - typedef.setdefault('context_type', typedef['type']) - typedef.setdefault('dest', True) - typedef.setdefault('value', True) - typedef.setdefault('parser', 'f.Value, error(nil)') - typedef.setdefault('parser_cast', 'parsed') - - -def _write_cli_flag_types(outfile, types): - _fwrite(outfile, """\ - package cli - - // WARNING: This file is generated! - - """) - - for typedef in types: - _set_typedef_defaults(typedef) - - _fwrite(outfile, """\ - // {name}Flag is a flag with type {type}{doctail} - type {name}Flag struct {{ - Name string - Usage string - EnvVar string - Hidden bool - """.format(**typedef)) - - if typedef['value']: - _fwrite(outfile, """\ - Value {type} - """.format(**typedef)) - - if typedef['dest']: - _fwrite(outfile, """\ - Destination *{type} - """.format(**typedef)) - - _fwrite(outfile, "\n}\n\n") - - _fwrite(outfile, """\ - // String returns a readable representation of this value - // (for usage defaults) - func (f {name}Flag) String() string {{ - return FlagStringer(f) - }} - - // GetName returns the name of the flag - func (f {name}Flag) GetName() string {{ - return f.Name - }} - - // {name} looks up the value of a local {name}Flag, returns - // {context_default} if not found - func (c *Context) {name}(name string) {context_type} {{ - return lookup{name}(name, c.flagSet) - }} - - // Global{name} looks up the value of a global {name}Flag, returns - // {context_default} if not found - func (c *Context) Global{name}(name string) {context_type} {{ - if fs := lookupGlobalFlagSet(name, c); fs != nil {{ - return lookup{name}(name, fs) - }} - return {context_default} - }} - - func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ - f := set.Lookup(name) - if f != nil {{ - parsed, err := {parser} - if err != nil {{ - return {context_default} - }} - return {parser_cast} - }} - return {context_default} - }} - """.format(**typedef)) - - -def _write_altsrc_flag_types(outfile, types): - _fwrite(outfile, """\ - package altsrc - - import ( - "gopkg.in/urfave/cli.v1" - ) - - // WARNING: This file is generated! - - """) - - for typedef in types: - _set_typedef_defaults(typedef) - - _fwrite(outfile, """\ - // {name}Flag is the flag type that wraps cli.{name}Flag to allow - // for other values to be specified - type {name}Flag struct {{ - cli.{name}Flag - set *flag.FlagSet - }} - - // New{name}Flag creates a new {name}Flag - func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ - return &{name}Flag{{{name}Flag: fl, set: nil}} - }} - - // Apply saves the flagSet for later usage calls, then calls the - // wrapped {name}Flag.Apply - func (f *{name}Flag) Apply(set *flag.FlagSet) {{ - f.set = set - f.{name}Flag.Apply(set) - }} - - // ApplyWithError saves the flagSet for later usage calls, then calls the - // wrapped {name}Flag.ApplyWithError - func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ - f.set = set - return f.{name}Flag.ApplyWithError(set) - }} - """.format(**typedef)) - - -def _fwrite(outfile, text): - print(textwrap.dedent(text), end='', file=outfile) - - -_WRITEFUNCS = { - 'cli': _write_cli_flag_types, - 'altsrc': _write_altsrc_flag_types -} - -if __name__ == '__main__': - sys.exit(main()) diff --git a/vendor/github.com/codegangsta/cli/runtests b/vendor/github.com/codegangsta/cli/runtests deleted file mode 100755 index ee22bdeed55..00000000000 --- a/vendor/github.com/codegangsta/cli/runtests +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function - -import argparse -import os -import sys -import tempfile - -from subprocess import check_call, check_output - - -PACKAGE_NAME = os.environ.get( - 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' -) - - -def main(sysargs=sys.argv[:]): - targets = { - 'vet': _vet, - 'test': _test, - 'gfmrun': _gfmrun, - 'toc': _toc, - 'gen': _gen, - } - - parser = argparse.ArgumentParser() - parser.add_argument( - 'target', nargs='?', choices=tuple(targets.keys()), default='test' - ) - args = parser.parse_args(sysargs[1:]) - - targets[args.target]() - return 0 - - -def _test(): - if check_output('go version'.split()).split()[2] < 'go1.2': - _run('go test -v .') - return - - coverprofiles = [] - for subpackage in ['', 'altsrc']: - coverprofile = 'cli.coverprofile' - if subpackage != '': - coverprofile = '{}.coverprofile'.format(subpackage) - - coverprofiles.append(coverprofile) - - _run('go test -v'.split() + [ - '-coverprofile={}'.format(coverprofile), - ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') - ]) - - combined_name = _combine_coverprofiles(coverprofiles) - _run('go tool cover -func={}'.format(combined_name)) - os.remove(combined_name) - - -def _gfmrun(): - go_version = check_output('go version'.split()).split()[2] - if go_version < 'go1.3': - print('runtests: skip on {}'.format(go_version), file=sys.stderr) - return - _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) - - -def _vet(): - _run('go vet ./...') - - -def _toc(): - _run('node_modules/.bin/markdown-toc -i README.md') - _run('git diff --exit-code') - - -def _gen(): - go_version = check_output('go version'.split()).split()[2] - if go_version < 'go1.5': - print('runtests: skip on {}'.format(go_version), file=sys.stderr) - return - - _run('go generate ./...') - _run('git diff --exit-code') - - -def _run(command): - if hasattr(command, 'split'): - command = command.split() - print('runtests: {}'.format(' '.join(command)), file=sys.stderr) - check_call(command) - - -def _gfmrun_count(): - with open('README.md') as infile: - lines = infile.read().splitlines() - return len(filter(_is_go_runnable, lines)) - - -def _is_go_runnable(line): - return line.startswith('package main') - - -def _combine_coverprofiles(coverprofiles): - combined = tempfile.NamedTemporaryFile( - suffix='.coverprofile', delete=False - ) - combined.write('mode: set\n') - - for coverprofile in coverprofiles: - with open(coverprofile, 'r') as infile: - for line in infile.readlines(): - if not line.startswith('mode: '): - combined.write(line) - - combined.flush() - name = combined.name - combined.close() - return name - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/vendor/github.com/davecgh/go-spew/.gitignore b/vendor/github.com/davecgh/go-spew/.gitignore deleted file mode 100644 index 00268614f04..00000000000 --- a/vendor/github.com/davecgh/go-spew/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# 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 diff --git a/vendor/github.com/davecgh/go-spew/README.md b/vendor/github.com/davecgh/go-spew/README.md deleted file mode 100644 index 262430449b2..00000000000 --- a/vendor/github.com/davecgh/go-spew/README.md +++ /dev/null @@ -1,205 +0,0 @@ -go-spew -======= - -[![Build Status](https://img.shields.io/travis/davecgh/go-spew.svg)] -(https://travis-ci.org/davecgh/go-spew) [![ISC License] -(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) [![Coverage Status] -(https://img.shields.io/coveralls/davecgh/go-spew.svg)] -(https://coveralls.io/r/davecgh/go-spew?branch=master) - - -Go-spew implements a deep pretty printer for Go data structures to aid in -debugging. A comprehensive suite of tests with 100% test coverage is provided -to ensure proper functionality. See `test_coverage.txt` for the gocov coverage -report. Go-spew is licensed under the liberal ISC license, so it may be used in -open source or commercial projects. - -If you're interested in reading about how this package came to life and some -of the challenges involved in providing a deep pretty printer, there is a blog -post about it -[here](https://web.archive.org/web/20160304013555/https://blog.cyphertite.com/go-spew-a-journey-into-dumping-go-data-structures/). - -## Documentation - -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)] -(http://godoc.org/github.com/davecgh/go-spew/spew) - -Full `go doc` style documentation for the project can be viewed online without -installing this package by using the excellent GoDoc site here: -http://godoc.org/github.com/davecgh/go-spew/spew - -You can also view the documentation locally once the package is installed with -the `godoc` tool by running `godoc -http=":6060"` and pointing your browser to -http://localhost:6060/pkg/github.com/davecgh/go-spew/spew - -## Installation - -```bash -$ go get -u github.com/davecgh/go-spew/spew -``` - -## Quick Start - -Add this import line to the file you're working in: - -```Go -import "github.com/davecgh/go-spew/spew" -``` - -To dump a variable with full newlines, indentation, type, and pointer -information use Dump, Fdump, or Sdump: - -```Go -spew.Dump(myVar1, myVar2, ...) -spew.Fdump(someWriter, myVar1, myVar2, ...) -str := spew.Sdump(myVar1, myVar2, ...) -``` - -Alternatively, if you would prefer to use format strings with a compacted inline -printing style, use the convenience wrappers Printf, Fprintf, etc with %v (most -compact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types -and pointer addresses): - -```Go -spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) -spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) -spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) -spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) -``` - -## Debugging a Web Application Example - -Here is an example of how you can use `spew.Sdump()` to help debug a web application. Please be sure to wrap your output using the `html.EscapeString()` function for safety reasons. You should also only use this debugging technique in a development environment, never in production. - -```Go -package main - -import ( - "fmt" - "html" - "net/http" - - "github.com/davecgh/go-spew/spew" -) - -func handler(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/html") - fmt.Fprintf(w, "Hi there, %s!", r.URL.Path[1:]) - fmt.Fprintf(w, "") -} - -func main() { - http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) -} -``` - -## Sample Dump Output - -``` -(main.Foo) { - unexportedField: (*main.Bar)(0xf84002e210)({ - flag: (main.Flag) flagTwo, - data: (uintptr) - }), - ExportedField: (map[interface {}]interface {}) { - (string) "one": (bool) true - } -} -([]uint8) { - 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | - 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| - 00000020 31 32 |12| -} -``` - -## Sample Formatter Output - -Double pointer to a uint8: -``` - %v: <**>5 - %+v: <**>(0xf8400420d0->0xf8400420c8)5 - %#v: (**uint8)5 - %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 -``` - -Pointer to circular struct with a uint8 field and a pointer to itself: -``` - %v: <*>{1 <*>} - %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} - %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} - %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} -``` - -## Configuration Options - -Configuration of spew is handled by fields in the ConfigState type. For -convenience, all of the top-level functions use a global state available via the -spew.Config global. - -It is also possible to create a ConfigState instance that provides methods -equivalent to the top-level functions. This allows concurrent configuration -options. See the ConfigState documentation for more details. - -``` -* Indent - String to use for each indentation level for Dump functions. - It is a single space by default. A popular alternative is "\t". - -* MaxDepth - Maximum number of levels to descend into nested data structures. - There is no limit by default. - -* DisableMethods - Disables invocation of error and Stringer interface methods. - Method invocation is enabled by default. - -* DisablePointerMethods - Disables invocation of error and Stringer interface methods on types - which only accept pointer receivers from non-pointer variables. This option - relies on access to the unsafe package, so it will not have any effect when - running in environments without access to the unsafe package such as Google - App Engine or with the "safe" build tag specified. - Pointer method invocation is enabled by default. - -* DisablePointerAddresses - DisablePointerAddresses specifies whether to disable the printing of - pointer addresses. This is useful when diffing data structures in tests. - -* DisableCapacities - DisableCapacities specifies whether to disable the printing of capacities - for arrays, slices, maps and channels. This is useful when diffing data - structures in tests. - -* ContinueOnMethod - Enables recursion into types after invoking error and Stringer interface - methods. Recursion after method invocation is disabled by default. - -* SortKeys - Specifies map keys should be sorted before being printed. Use - this to have a more deterministic, diffable output. Note that - only native types (bool, int, uint, floats, uintptr and string) - and types which implement error or Stringer interfaces are supported, - with other types sorted according to the reflect.Value.String() output - which guarantees display stability. Natural map order is used by - default. - -* SpewKeys - SpewKeys specifies that, as a last resort attempt, map keys should be - spewed to strings and sorted by those strings. This is only considered - if SortKeys is true. - -``` - -## Unsafe Package Dependency - -This package relies on the unsafe package to perform some of the more advanced -features, however it also supports a "limited" mode which allows it to work in -environments where the unsafe package is not available. By default, it will -operate in this mode on Google App Engine and when compiled with GopherJS. The -"safe" build tag may also be specified to force the package to build without -using the unsafe package. - -## License - -Go-spew is licensed under the [copyfree](http://copyfree.org) ISC License. diff --git a/vendor/github.com/davecgh/go-spew/cov_report.sh b/vendor/github.com/davecgh/go-spew/cov_report.sh deleted file mode 100644 index 9579497e411..00000000000 --- a/vendor/github.com/davecgh/go-spew/cov_report.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# This script uses gocov to generate a test coverage report. -# The gocov tool my be obtained with the following command: -# go get github.com/axw/gocov/gocov -# -# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. - -# Check for gocov. -if ! type gocov >/dev/null 2>&1; then - echo >&2 "This script requires the gocov tool." - echo >&2 "You may obtain it with the following command:" - echo >&2 "go get github.com/axw/gocov/gocov" - exit 1 -fi - -# Only run the cgo tests if gcc is installed. -if type gcc >/dev/null 2>&1; then - (cd spew && gocov test -tags testcgo | gocov report) -else - (cd spew && gocov test | gocov report) -fi diff --git a/vendor/github.com/davecgh/go-spew/spew/common_test.go b/vendor/github.com/davecgh/go-spew/spew/common_test.go deleted file mode 100644 index 0f5ce47dcaf..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/common_test.go +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew_test - -import ( - "fmt" - "reflect" - "testing" - - "github.com/davecgh/go-spew/spew" -) - -// custom type to test Stinger interface on non-pointer receiver. -type stringer string - -// String implements the Stringer interface for testing invocation of custom -// stringers on types with non-pointer receivers. -func (s stringer) String() string { - return "stringer " + string(s) -} - -// custom type to test Stinger interface on pointer receiver. -type pstringer string - -// String implements the Stringer interface for testing invocation of custom -// stringers on types with only pointer receivers. -func (s *pstringer) String() string { - return "stringer " + string(*s) -} - -// xref1 and xref2 are cross referencing structs for testing circular reference -// detection. -type xref1 struct { - ps2 *xref2 -} -type xref2 struct { - ps1 *xref1 -} - -// indirCir1, indirCir2, and indirCir3 are used to generate an indirect circular -// reference for testing detection. -type indirCir1 struct { - ps2 *indirCir2 -} -type indirCir2 struct { - ps3 *indirCir3 -} -type indirCir3 struct { - ps1 *indirCir1 -} - -// embed is used to test embedded structures. -type embed struct { - a string -} - -// embedwrap is used to test embedded structures. -type embedwrap struct { - *embed - e *embed -} - -// panicer is used to intentionally cause a panic for testing spew properly -// handles them -type panicer int - -func (p panicer) String() string { - panic("test panic") -} - -// customError is used to test custom error interface invocation. -type customError int - -func (e customError) Error() string { - return fmt.Sprintf("error: %d", int(e)) -} - -// stringizeWants converts a slice of wanted test output into a format suitable -// for a test error message. -func stringizeWants(wants []string) string { - s := "" - for i, want := range wants { - if i > 0 { - s += fmt.Sprintf("want%d: %s", i+1, want) - } else { - s += "want: " + want - } - } - return s -} - -// testFailed returns whether or not a test failed by checking if the result -// of the test is in the slice of wanted strings. -func testFailed(result string, wants []string) bool { - for _, want := range wants { - if result == want { - return false - } - } - return true -} - -type sortableStruct struct { - x int -} - -func (ss sortableStruct) String() string { - return fmt.Sprintf("ss.%d", ss.x) -} - -type unsortableStruct struct { - x int -} - -type sortTestCase struct { - input []reflect.Value - expected []reflect.Value -} - -func helpTestSortValues(tests []sortTestCase, cs *spew.ConfigState, t *testing.T) { - getInterfaces := func(values []reflect.Value) []interface{} { - interfaces := []interface{}{} - for _, v := range values { - interfaces = append(interfaces, v.Interface()) - } - return interfaces - } - - for _, test := range tests { - spew.SortValues(test.input, cs) - // reflect.DeepEqual cannot really make sense of reflect.Value, - // probably because of all the pointer tricks. For instance, - // v(2.0) != v(2.0) on a 32-bits system. Turn them into interface{} - // instead. - input := getInterfaces(test.input) - expected := getInterfaces(test.expected) - if !reflect.DeepEqual(input, expected) { - t.Errorf("Sort mismatch:\n %v != %v", input, expected) - } - } -} - -// TestSortValues ensures the sort functionality for relect.Value based sorting -// works as intended. -func TestSortValues(t *testing.T) { - v := reflect.ValueOf - - a := v("a") - b := v("b") - c := v("c") - embedA := v(embed{"a"}) - embedB := v(embed{"b"}) - embedC := v(embed{"c"}) - tests := []sortTestCase{ - // No values. - { - []reflect.Value{}, - []reflect.Value{}, - }, - // Bools. - { - []reflect.Value{v(false), v(true), v(false)}, - []reflect.Value{v(false), v(false), v(true)}, - }, - // Ints. - { - []reflect.Value{v(2), v(1), v(3)}, - []reflect.Value{v(1), v(2), v(3)}, - }, - // Uints. - { - []reflect.Value{v(uint8(2)), v(uint8(1)), v(uint8(3))}, - []reflect.Value{v(uint8(1)), v(uint8(2)), v(uint8(3))}, - }, - // Floats. - { - []reflect.Value{v(2.0), v(1.0), v(3.0)}, - []reflect.Value{v(1.0), v(2.0), v(3.0)}, - }, - // Strings. - { - []reflect.Value{b, a, c}, - []reflect.Value{a, b, c}, - }, - // Array - { - []reflect.Value{v([3]int{3, 2, 1}), v([3]int{1, 3, 2}), v([3]int{1, 2, 3})}, - []reflect.Value{v([3]int{1, 2, 3}), v([3]int{1, 3, 2}), v([3]int{3, 2, 1})}, - }, - // Uintptrs. - { - []reflect.Value{v(uintptr(2)), v(uintptr(1)), v(uintptr(3))}, - []reflect.Value{v(uintptr(1)), v(uintptr(2)), v(uintptr(3))}, - }, - // SortableStructs. - { - // Note: not sorted - DisableMethods is set. - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - }, - // UnsortableStructs. - { - // Note: not sorted - SpewKeys is false. - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - }, - // Invalid. - { - []reflect.Value{embedB, embedA, embedC}, - []reflect.Value{embedB, embedA, embedC}, - }, - } - cs := spew.ConfigState{DisableMethods: true, SpewKeys: false} - helpTestSortValues(tests, &cs, t) -} - -// TestSortValuesWithMethods ensures the sort functionality for relect.Value -// based sorting works as intended when using string methods. -func TestSortValuesWithMethods(t *testing.T) { - v := reflect.ValueOf - - a := v("a") - b := v("b") - c := v("c") - tests := []sortTestCase{ - // Ints. - { - []reflect.Value{v(2), v(1), v(3)}, - []reflect.Value{v(1), v(2), v(3)}, - }, - // Strings. - { - []reflect.Value{b, a, c}, - []reflect.Value{a, b, c}, - }, - // SortableStructs. - { - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, - }, - // UnsortableStructs. - { - // Note: not sorted - SpewKeys is false. - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - }, - } - cs := spew.ConfigState{DisableMethods: false, SpewKeys: false} - helpTestSortValues(tests, &cs, t) -} - -// TestSortValuesWithSpew ensures the sort functionality for relect.Value -// based sorting works as intended when using spew to stringify keys. -func TestSortValuesWithSpew(t *testing.T) { - v := reflect.ValueOf - - a := v("a") - b := v("b") - c := v("c") - tests := []sortTestCase{ - // Ints. - { - []reflect.Value{v(2), v(1), v(3)}, - []reflect.Value{v(1), v(2), v(3)}, - }, - // Strings. - { - []reflect.Value{b, a, c}, - []reflect.Value{a, b, c}, - }, - // SortableStructs. - { - []reflect.Value{v(sortableStruct{2}), v(sortableStruct{1}), v(sortableStruct{3})}, - []reflect.Value{v(sortableStruct{1}), v(sortableStruct{2}), v(sortableStruct{3})}, - }, - // UnsortableStructs. - { - []reflect.Value{v(unsortableStruct{2}), v(unsortableStruct{1}), v(unsortableStruct{3})}, - []reflect.Value{v(unsortableStruct{1}), v(unsortableStruct{2}), v(unsortableStruct{3})}, - }, - } - cs := spew.ConfigState{DisableMethods: true, SpewKeys: true} - helpTestSortValues(tests, &cs, t) -} diff --git a/vendor/github.com/davecgh/go-spew/spew/dump_test.go b/vendor/github.com/davecgh/go-spew/spew/dump_test.go deleted file mode 100644 index 5aad9c7af0b..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/dump_test.go +++ /dev/null @@ -1,1042 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -Test Summary: -NOTE: For each test, a nil pointer, a single pointer and double pointer to the -base test element are also tested to ensure proper indirection across all types. - -- Max int8, int16, int32, int64, int -- Max uint8, uint16, uint32, uint64, uint -- Boolean true and false -- Standard complex64 and complex128 -- Array containing standard ints -- Array containing type with custom formatter on pointer receiver only -- Array containing interfaces -- Array containing bytes -- Slice containing standard float32 values -- Slice containing type with custom formatter on pointer receiver only -- Slice containing interfaces -- Slice containing bytes -- Nil slice -- Standard string -- Nil interface -- Sub-interface -- Map with string keys and int vals -- Map with custom formatter type on pointer receiver only keys and vals -- Map with interface keys and values -- Map with nil interface value -- Struct with primitives -- Struct that contains another struct -- Struct that contains custom type with Stringer pointer interface via both - exported and unexported fields -- Struct that contains embedded struct and field to same struct -- Uintptr to 0 (null pointer) -- Uintptr address of real variable -- Unsafe.Pointer to 0 (null pointer) -- Unsafe.Pointer to address of real variable -- Nil channel -- Standard int channel -- Function with no params and no returns -- Function with param and no returns -- Function with multiple params and multiple returns -- Struct that is circular through self referencing -- Structs that are circular through cross referencing -- Structs that are indirectly circular -- Type that panics in its Stringer interface -*/ - -package spew_test - -import ( - "bytes" - "fmt" - "testing" - "unsafe" - - "github.com/davecgh/go-spew/spew" -) - -// dumpTest is used to describe a test to be performed against the Dump method. -type dumpTest struct { - in interface{} - wants []string -} - -// dumpTests houses all of the tests to be performed against the Dump method. -var dumpTests = make([]dumpTest, 0) - -// addDumpTest is a helper method to append the passed input and desired result -// to dumpTests -func addDumpTest(in interface{}, wants ...string) { - test := dumpTest{in, wants} - dumpTests = append(dumpTests, test) -} - -func addIntDumpTests() { - // Max int8. - v := int8(127) - nv := (*int8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "int8" - vs := "127" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Max int16. - v2 := int16(32767) - nv2 := (*int16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "int16" - v2s := "32767" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Max int32. - v3 := int32(2147483647) - nv3 := (*int32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "int32" - v3s := "2147483647" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Max int64. - v4 := int64(9223372036854775807) - nv4 := (*int64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "int64" - v4s := "9223372036854775807" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") - - // Max int. - v5 := int(2147483647) - nv5 := (*int)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "int" - v5s := "2147483647" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") - addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") - addDumpTest(nv5, "(*"+v5t+")()\n") -} - -func addUintDumpTests() { - // Max uint8. - v := uint8(255) - nv := (*uint8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uint8" - vs := "255" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Max uint16. - v2 := uint16(65535) - nv2 := (*uint16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Max uint32. - v3 := uint32(4294967295) - nv3 := (*uint32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "uint32" - v3s := "4294967295" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Max uint64. - v4 := uint64(18446744073709551615) - nv4 := (*uint64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "uint64" - v4s := "18446744073709551615" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") - - // Max uint. - v5 := uint(4294967295) - nv5 := (*uint)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "uint" - v5s := "4294967295" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") - addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") - addDumpTest(nv5, "(*"+v5t+")()\n") -} - -func addBoolDumpTests() { - // Boolean true. - v := bool(true) - nv := (*bool)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "bool" - vs := "true" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Boolean false. - v2 := bool(false) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "bool" - v2s := "false" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") -} - -func addFloatDumpTests() { - // Standard float32. - v := float32(3.1415) - nv := (*float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "float32" - vs := "3.1415" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Standard float64. - v2 := float64(3.1415926) - nv2 := (*float64)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "float64" - v2s := "3.1415926" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") -} - -func addComplexDumpTests() { - // Standard complex64. - v := complex(float32(6), -2) - nv := (*complex64)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "complex64" - vs := "(6-2i)" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Standard complex128. - v2 := complex(float64(-6), 2) - nv2 := (*complex128)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "complex128" - v2s := "(-6+2i)" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") -} - -func addArrayDumpTests() { - // Array containing standard ints. - v := [3]int{1, 2, 3} - vLen := fmt.Sprintf("%d", len(v)) - vCap := fmt.Sprintf("%d", cap(v)) - nv := (*[3]int)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "int" - vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 1,\n (" + - vt + ") 2,\n (" + vt + ") 3\n}" - addDumpTest(v, "([3]"+vt+") "+vs+"\n") - addDumpTest(pv, "(*[3]"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**[3]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*[3]"+vt+")()\n") - - // Array containing type with custom formatter on pointer receiver only. - v2i0 := pstringer("1") - v2i1 := pstringer("2") - v2i2 := pstringer("3") - v2 := [3]pstringer{v2i0, v2i1, v2i2} - v2i0Len := fmt.Sprintf("%d", len(v2i0)) - v2i1Len := fmt.Sprintf("%d", len(v2i1)) - v2i2Len := fmt.Sprintf("%d", len(v2i2)) - v2Len := fmt.Sprintf("%d", len(v2)) - v2Cap := fmt.Sprintf("%d", cap(v2)) - nv2 := (*[3]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.pstringer" - v2sp := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + - ") (len=" + v2i0Len + ") stringer 1,\n (" + v2t + - ") (len=" + v2i1Len + ") stringer 2,\n (" + v2t + - ") (len=" + v2i2Len + ") " + "stringer 3\n}" - v2s := v2sp - if spew.UnsafeDisabled { - v2s = "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + - ") (len=" + v2i0Len + ") \"1\",\n (" + v2t + ") (len=" + - v2i1Len + ") \"2\",\n (" + v2t + ") (len=" + v2i2Len + - ") " + "\"3\"\n}" - } - addDumpTest(v2, "([3]"+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*[3]"+v2t+")("+v2Addr+")("+v2sp+")\n") - addDumpTest(&pv2, "(**[3]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2sp+")\n") - addDumpTest(nv2, "(*[3]"+v2t+")()\n") - - // Array containing interfaces. - v3i0 := "one" - v3 := [3]interface{}{v3i0, int(2), uint(3)} - v3i0Len := fmt.Sprintf("%d", len(v3i0)) - v3Len := fmt.Sprintf("%d", len(v3)) - v3Cap := fmt.Sprintf("%d", cap(v3)) - nv3 := (*[3]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[3]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + - "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + - v3t4 + ") 3\n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Array containing bytes. - v4 := [34]byte{ - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, - } - v4Len := fmt.Sprintf("%d", len(v4)) - v4Cap := fmt.Sprintf("%d", cap(v4)) - nv4 := (*[34]byte)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "[34]uint8" - v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + - "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + - " |............... |\n" + - " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + - " |!\"#$%&'()*+,-./0|\n" + - " 00000020 31 32 " + - " |12|\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") -} - -func addSliceDumpTests() { - // Slice containing standard float32 values. - v := []float32{3.14, 6.28, 12.56} - vLen := fmt.Sprintf("%d", len(v)) - vCap := fmt.Sprintf("%d", cap(v)) - nv := (*[]float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "float32" - vs := "(len=" + vLen + " cap=" + vCap + ") {\n (" + vt + ") 3.14,\n (" + - vt + ") 6.28,\n (" + vt + ") 12.56\n}" - addDumpTest(v, "([]"+vt+") "+vs+"\n") - addDumpTest(pv, "(*[]"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**[]"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*[]"+vt+")()\n") - - // Slice containing type with custom formatter on pointer receiver only. - v2i0 := pstringer("1") - v2i1 := pstringer("2") - v2i2 := pstringer("3") - v2 := []pstringer{v2i0, v2i1, v2i2} - v2i0Len := fmt.Sprintf("%d", len(v2i0)) - v2i1Len := fmt.Sprintf("%d", len(v2i1)) - v2i2Len := fmt.Sprintf("%d", len(v2i2)) - v2Len := fmt.Sprintf("%d", len(v2)) - v2Cap := fmt.Sprintf("%d", cap(v2)) - nv2 := (*[]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.pstringer" - v2s := "(len=" + v2Len + " cap=" + v2Cap + ") {\n (" + v2t + ") (len=" + - v2i0Len + ") stringer 1,\n (" + v2t + ") (len=" + v2i1Len + - ") stringer 2,\n (" + v2t + ") (len=" + v2i2Len + ") " + - "stringer 3\n}" - addDumpTest(v2, "([]"+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*[]"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**[]"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*[]"+v2t+")()\n") - - // Slice containing interfaces. - v3i0 := "one" - v3 := []interface{}{v3i0, int(2), uint(3), nil} - v3i0Len := fmt.Sprintf("%d", len(v3i0)) - v3Len := fmt.Sprintf("%d", len(v3)) - v3Cap := fmt.Sprintf("%d", cap(v3)) - nv3 := (*[]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3t5 := "interface {}" - v3s := "(len=" + v3Len + " cap=" + v3Cap + ") {\n (" + v3t2 + ") " + - "(len=" + v3i0Len + ") \"one\",\n (" + v3t3 + ") 2,\n (" + - v3t4 + ") 3,\n (" + v3t5 + ") \n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Slice containing bytes. - v4 := []byte{ - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, - } - v4Len := fmt.Sprintf("%d", len(v4)) - v4Cap := fmt.Sprintf("%d", cap(v4)) - nv4 := (*[]byte)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "[]uint8" - v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + - "{\n 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20" + - " |............... |\n" + - " 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30" + - " |!\"#$%&'()*+,-./0|\n" + - " 00000020 31 32 " + - " |12|\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") - - // Nil slice. - v5 := []int(nil) - nv5 := (*[]int)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "[]int" - v5s := "" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - addDumpTest(pv5, "(*"+v5t+")("+v5Addr+")("+v5s+")\n") - addDumpTest(&pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")("+v5s+")\n") - addDumpTest(nv5, "(*"+v5t+")()\n") -} - -func addStringDumpTests() { - // Standard string. - v := "test" - vLen := fmt.Sprintf("%d", len(v)) - nv := (*string)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "string" - vs := "(len=" + vLen + ") \"test\"" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -func addInterfaceDumpTests() { - // Nil interface. - var v interface{} - nv := (*interface{})(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "interface {}" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Sub-interface. - v2 := interface{}(uint16(65535)) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") -} - -func addMapDumpTests() { - // Map with string keys and int vals. - k := "one" - kk := "two" - m := map[string]int{k: 1, kk: 2} - klen := fmt.Sprintf("%d", len(k)) // not kLen to shut golint up - kkLen := fmt.Sprintf("%d", len(kk)) - mLen := fmt.Sprintf("%d", len(m)) - nilMap := map[string]int(nil) - nm := (*map[string]int)(nil) - pm := &m - mAddr := fmt.Sprintf("%p", pm) - pmAddr := fmt.Sprintf("%p", &pm) - mt := "map[string]int" - mt1 := "string" - mt2 := "int" - ms := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + klen + ") " + - "\"one\": (" + mt2 + ") 1,\n (" + mt1 + ") (len=" + kkLen + - ") \"two\": (" + mt2 + ") 2\n}" - ms2 := "(len=" + mLen + ") {\n (" + mt1 + ") (len=" + kkLen + ") " + - "\"two\": (" + mt2 + ") 2,\n (" + mt1 + ") (len=" + klen + - ") \"one\": (" + mt2 + ") 1\n}" - addDumpTest(m, "("+mt+") "+ms+"\n", "("+mt+") "+ms2+"\n") - addDumpTest(pm, "(*"+mt+")("+mAddr+")("+ms+")\n", - "(*"+mt+")("+mAddr+")("+ms2+")\n") - addDumpTest(&pm, "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms+")\n", - "(**"+mt+")("+pmAddr+"->"+mAddr+")("+ms2+")\n") - addDumpTest(nm, "(*"+mt+")()\n") - addDumpTest(nilMap, "("+mt+") \n") - - // Map with custom formatter type on pointer receiver only keys and vals. - k2 := pstringer("one") - v2 := pstringer("1") - m2 := map[pstringer]pstringer{k2: v2} - k2Len := fmt.Sprintf("%d", len(k2)) - v2Len := fmt.Sprintf("%d", len(v2)) - m2Len := fmt.Sprintf("%d", len(m2)) - nilMap2 := map[pstringer]pstringer(nil) - nm2 := (*map[pstringer]pstringer)(nil) - pm2 := &m2 - m2Addr := fmt.Sprintf("%p", pm2) - pm2Addr := fmt.Sprintf("%p", &pm2) - m2t := "map[spew_test.pstringer]spew_test.pstringer" - m2t1 := "spew_test.pstringer" - m2t2 := "spew_test.pstringer" - m2s := "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + ") " + - "stringer one: (" + m2t2 + ") (len=" + v2Len + ") stringer 1\n}" - if spew.UnsafeDisabled { - m2s = "(len=" + m2Len + ") {\n (" + m2t1 + ") (len=" + k2Len + - ") " + "\"one\": (" + m2t2 + ") (len=" + v2Len + - ") \"1\"\n}" - } - addDumpTest(m2, "("+m2t+") "+m2s+"\n") - addDumpTest(pm2, "(*"+m2t+")("+m2Addr+")("+m2s+")\n") - addDumpTest(&pm2, "(**"+m2t+")("+pm2Addr+"->"+m2Addr+")("+m2s+")\n") - addDumpTest(nm2, "(*"+m2t+")()\n") - addDumpTest(nilMap2, "("+m2t+") \n") - - // Map with interface keys and values. - k3 := "one" - k3Len := fmt.Sprintf("%d", len(k3)) - m3 := map[interface{}]interface{}{k3: 1} - m3Len := fmt.Sprintf("%d", len(m3)) - nilMap3 := map[interface{}]interface{}(nil) - nm3 := (*map[interface{}]interface{})(nil) - pm3 := &m3 - m3Addr := fmt.Sprintf("%p", pm3) - pm3Addr := fmt.Sprintf("%p", &pm3) - m3t := "map[interface {}]interface {}" - m3t1 := "string" - m3t2 := "int" - m3s := "(len=" + m3Len + ") {\n (" + m3t1 + ") (len=" + k3Len + ") " + - "\"one\": (" + m3t2 + ") 1\n}" - addDumpTest(m3, "("+m3t+") "+m3s+"\n") - addDumpTest(pm3, "(*"+m3t+")("+m3Addr+")("+m3s+")\n") - addDumpTest(&pm3, "(**"+m3t+")("+pm3Addr+"->"+m3Addr+")("+m3s+")\n") - addDumpTest(nm3, "(*"+m3t+")()\n") - addDumpTest(nilMap3, "("+m3t+") \n") - - // Map with nil interface value. - k4 := "nil" - k4Len := fmt.Sprintf("%d", len(k4)) - m4 := map[string]interface{}{k4: nil} - m4Len := fmt.Sprintf("%d", len(m4)) - nilMap4 := map[string]interface{}(nil) - nm4 := (*map[string]interface{})(nil) - pm4 := &m4 - m4Addr := fmt.Sprintf("%p", pm4) - pm4Addr := fmt.Sprintf("%p", &pm4) - m4t := "map[string]interface {}" - m4t1 := "string" - m4t2 := "interface {}" - m4s := "(len=" + m4Len + ") {\n (" + m4t1 + ") (len=" + k4Len + ")" + - " \"nil\": (" + m4t2 + ") \n}" - addDumpTest(m4, "("+m4t+") "+m4s+"\n") - addDumpTest(pm4, "(*"+m4t+")("+m4Addr+")("+m4s+")\n") - addDumpTest(&pm4, "(**"+m4t+")("+pm4Addr+"->"+m4Addr+")("+m4s+")\n") - addDumpTest(nm4, "(*"+m4t+")()\n") - addDumpTest(nilMap4, "("+m4t+") \n") -} - -func addStructDumpTests() { - // Struct with primitives. - type s1 struct { - a int8 - b uint8 - } - v := s1{127, 255} - nv := (*s1)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.s1" - vt2 := "int8" - vt3 := "uint8" - vs := "{\n a: (" + vt2 + ") 127,\n b: (" + vt3 + ") 255\n}" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Struct that contains another struct. - type s2 struct { - s1 s1 - b bool - } - v2 := s2{s1{127, 255}, true} - nv2 := (*s2)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.s2" - v2t2 := "spew_test.s1" - v2t3 := "int8" - v2t4 := "uint8" - v2t5 := "bool" - v2s := "{\n s1: (" + v2t2 + ") {\n a: (" + v2t3 + ") 127,\n b: (" + - v2t4 + ") 255\n },\n b: (" + v2t5 + ") true\n}" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Struct that contains custom type with Stringer pointer interface via both - // exported and unexported fields. - type s3 struct { - s pstringer - S pstringer - } - v3 := s3{"test", "test2"} - nv3 := (*s3)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.s3" - v3t2 := "spew_test.pstringer" - v3s := "{\n s: (" + v3t2 + ") (len=4) stringer test,\n S: (" + v3t2 + - ") (len=5) stringer test2\n}" - v3sp := v3s - if spew.UnsafeDisabled { - v3s = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + - v3t2 + ") (len=5) \"test2\"\n}" - v3sp = "{\n s: (" + v3t2 + ") (len=4) \"test\",\n S: (" + - v3t2 + ") (len=5) stringer test2\n}" - } - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3sp+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3sp+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") - - // Struct that contains embedded struct and field to same struct. - e := embed{"embedstr"} - eLen := fmt.Sprintf("%d", len("embedstr")) - v4 := embedwrap{embed: &e, e: &e} - nv4 := (*embedwrap)(nil) - pv4 := &v4 - eAddr := fmt.Sprintf("%p", &e) - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "spew_test.embedwrap" - v4t2 := "spew_test.embed" - v4t3 := "string" - v4s := "{\n embed: (*" + v4t2 + ")(" + eAddr + ")({\n a: (" + v4t3 + - ") (len=" + eLen + ") \"embedstr\"\n }),\n e: (*" + v4t2 + - ")(" + eAddr + ")({\n a: (" + v4t3 + ") (len=" + eLen + ")" + - " \"embedstr\"\n })\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - addDumpTest(pv4, "(*"+v4t+")("+v4Addr+")("+v4s+")\n") - addDumpTest(&pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")("+v4s+")\n") - addDumpTest(nv4, "(*"+v4t+")()\n") -} - -func addUintptrDumpTests() { - // Null pointer. - v := uintptr(0) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uintptr" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - - // Address of real variable. - i := 1 - v2 := uintptr(unsafe.Pointer(&i)) - nv2 := (*uintptr)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uintptr" - v2s := fmt.Sprintf("%p", &i) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") -} - -func addUnsafePointerDumpTests() { - // Null pointer. - v := unsafe.Pointer(uintptr(0)) - nv := (*unsafe.Pointer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "unsafe.Pointer" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Address of real variable. - i := 1 - v2 := unsafe.Pointer(&i) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "unsafe.Pointer" - v2s := fmt.Sprintf("%p", &i) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -func addChanDumpTests() { - // Nil channel. - var v chan int - pv := &v - nv := (*chan int)(nil) - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "chan int" - vs := "" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Real channel. - v2 := make(chan int) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "chan int" - v2s := fmt.Sprintf("%p", v2) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") -} - -func addFuncDumpTests() { - // Function with no params and no returns. - v := addIntDumpTests - nv := (*func())(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "func()" - vs := fmt.Sprintf("%p", v) - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") - - // Function with param and no returns. - v2 := TestDump - nv2 := (*func(*testing.T))(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "func(*testing.T)" - v2s := fmt.Sprintf("%p", v2) - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s+")\n") - addDumpTest(nv2, "(*"+v2t+")()\n") - - // Function with multiple params and multiple returns. - var v3 = func(i int, s string) (b bool, err error) { - return true, nil - } - nv3 := (*func(int, string) (bool, error))(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "func(int, string) (bool, error)" - v3s := fmt.Sprintf("%p", v3) - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s+")\n") - addDumpTest(nv3, "(*"+v3t+")()\n") -} - -func addCircularDumpTests() { - // Struct that is circular through self referencing. - type circular struct { - c *circular - } - v := circular{nil} - v.c = &v - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.circular" - vs := "{\n c: (*" + vt + ")(" + vAddr + ")({\n c: (*" + vt + ")(" + - vAddr + ")()\n })\n}" - vs2 := "{\n c: (*" + vt + ")(" + vAddr + ")()\n}" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs2+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs2+")\n") - - // Structs that are circular through cross referencing. - v2 := xref1{nil} - ts2 := xref2{&v2} - v2.ps2 = &ts2 - pv2 := &v2 - ts2Addr := fmt.Sprintf("%p", &ts2) - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.xref1" - v2t2 := "spew_test.xref2" - v2s := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + - ")(" + v2Addr + ")({\n ps2: (*" + v2t2 + ")(" + ts2Addr + - ")()\n })\n })\n}" - v2s2 := "{\n ps2: (*" + v2t2 + ")(" + ts2Addr + ")({\n ps1: (*" + v2t + - ")(" + v2Addr + ")()\n })\n}" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - addDumpTest(pv2, "(*"+v2t+")("+v2Addr+")("+v2s2+")\n") - addDumpTest(&pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")("+v2s2+")\n") - - // Structs that are indirectly circular. - v3 := indirCir1{nil} - tic2 := indirCir2{nil} - tic3 := indirCir3{&v3} - tic2.ps3 = &tic3 - v3.ps2 = &tic2 - pv3 := &v3 - tic2Addr := fmt.Sprintf("%p", &tic2) - tic3Addr := fmt.Sprintf("%p", &tic3) - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.indirCir1" - v3t2 := "spew_test.indirCir2" - v3t3 := "spew_test.indirCir3" - v3s := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + - ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + - ")({\n ps2: (*" + v3t2 + ")(" + tic2Addr + - ")()\n })\n })\n })\n}" - v3s2 := "{\n ps2: (*" + v3t2 + ")(" + tic2Addr + ")({\n ps3: (*" + v3t3 + - ")(" + tic3Addr + ")({\n ps1: (*" + v3t + ")(" + v3Addr + - ")()\n })\n })\n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n") - addDumpTest(pv3, "(*"+v3t+")("+v3Addr+")("+v3s2+")\n") - addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s2+")\n") -} - -func addPanicDumpTests() { - // Type that panics in its Stringer interface. - v := panicer(127) - nv := (*panicer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.panicer" - vs := "(PANIC=test panic)127" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -func addErrorDumpTests() { - // Type that has a custom Error interface. - v := customError(127) - nv := (*customError)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.customError" - vs := "error: 127" - addDumpTest(v, "("+vt+") "+vs+"\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n") - addDumpTest(nv, "(*"+vt+")()\n") -} - -// TestDump executes all of the tests described by dumpTests. -func TestDump(t *testing.T) { - // Setup tests. - addIntDumpTests() - addUintDumpTests() - addBoolDumpTests() - addFloatDumpTests() - addComplexDumpTests() - addArrayDumpTests() - addSliceDumpTests() - addStringDumpTests() - addInterfaceDumpTests() - addMapDumpTests() - addStructDumpTests() - addUintptrDumpTests() - addUnsafePointerDumpTests() - addChanDumpTests() - addFuncDumpTests() - addCircularDumpTests() - addPanicDumpTests() - addErrorDumpTests() - addCgoDumpTests() - - t.Logf("Running %d tests", len(dumpTests)) - for i, test := range dumpTests { - buf := new(bytes.Buffer) - spew.Fdump(buf, test.in) - s := buf.String() - if testFailed(s, test.wants) { - t.Errorf("Dump #%d\n got: %s %s", i, s, stringizeWants(test.wants)) - continue - } - } -} - -func TestDumpSortedKeys(t *testing.T) { - cfg := spew.ConfigState{SortKeys: true} - s := cfg.Sdump(map[int]string{1: "1", 3: "3", 2: "2"}) - expected := "(map[int]string) (len=3) {\n(int) 1: (string) (len=1) " + - "\"1\",\n(int) 2: (string) (len=1) \"2\",\n(int) 3: (string) " + - "(len=1) \"3\"\n" + - "}\n" - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - - s = cfg.Sdump(map[stringer]int{"1": 1, "3": 3, "2": 2}) - expected = "(map[spew_test.stringer]int) (len=3) {\n" + - "(spew_test.stringer) (len=1) stringer 1: (int) 1,\n" + - "(spew_test.stringer) (len=1) stringer 2: (int) 2,\n" + - "(spew_test.stringer) (len=1) stringer 3: (int) 3\n" + - "}\n" - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - - s = cfg.Sdump(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) - expected = "(map[spew_test.pstringer]int) (len=3) {\n" + - "(spew_test.pstringer) (len=1) stringer 1: (int) 1,\n" + - "(spew_test.pstringer) (len=1) stringer 2: (int) 2,\n" + - "(spew_test.pstringer) (len=1) stringer 3: (int) 3\n" + - "}\n" - if spew.UnsafeDisabled { - expected = "(map[spew_test.pstringer]int) (len=3) {\n" + - "(spew_test.pstringer) (len=1) \"1\": (int) 1,\n" + - "(spew_test.pstringer) (len=1) \"2\": (int) 2,\n" + - "(spew_test.pstringer) (len=1) \"3\": (int) 3\n" + - "}\n" - } - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - - s = cfg.Sdump(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) - expected = "(map[spew_test.customError]int) (len=3) {\n" + - "(spew_test.customError) error: 1: (int) 1,\n" + - "(spew_test.customError) error: 2: (int) 2,\n" + - "(spew_test.customError) error: 3: (int) 3\n" + - "}\n" - if s != expected { - t.Errorf("Sorted keys mismatch:\n %v %v", s, expected) - } - -} diff --git a/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go b/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go deleted file mode 100644 index 6ab180809a6..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/dumpcgo_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2013-2016 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when both cgo is supported and "-tags testcgo" is added to the go test -// command line. This means the cgo tests are only added (and hence run) when -// specifially requested. This configuration is used because spew itself -// does not require cgo to run even though it does handle certain cgo types -// specially. Rather than forcing all clients to require cgo and an external -// C compiler just to run the tests, this scheme makes them optional. -// +build cgo,testcgo - -package spew_test - -import ( - "fmt" - - "github.com/davecgh/go-spew/spew/testdata" -) - -func addCgoDumpTests() { - // C char pointer. - v := testdata.GetCgoCharPointer() - nv := testdata.GetCgoNullCharPointer() - pv := &v - vcAddr := fmt.Sprintf("%p", v) - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "*testdata._Ctype_char" - vs := "116" - addDumpTest(v, "("+vt+")("+vcAddr+")("+vs+")\n") - addDumpTest(pv, "(*"+vt+")("+vAddr+"->"+vcAddr+")("+vs+")\n") - addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+"->"+vcAddr+")("+vs+")\n") - addDumpTest(nv, "("+vt+")()\n") - - // C char array. - v2, v2l, v2c := testdata.GetCgoCharArray() - v2Len := fmt.Sprintf("%d", v2l) - v2Cap := fmt.Sprintf("%d", v2c) - v2t := "[6]testdata._Ctype_char" - v2s := "(len=" + v2Len + " cap=" + v2Cap + ") " + - "{\n 00000000 74 65 73 74 32 00 " + - " |test2.|\n}" - addDumpTest(v2, "("+v2t+") "+v2s+"\n") - - // C unsigned char array. - v3, v3l, v3c := testdata.GetCgoUnsignedCharArray() - v3Len := fmt.Sprintf("%d", v3l) - v3Cap := fmt.Sprintf("%d", v3c) - v3t := "[6]testdata._Ctype_unsignedchar" - v3t2 := "[6]testdata._Ctype_uchar" - v3s := "(len=" + v3Len + " cap=" + v3Cap + ") " + - "{\n 00000000 74 65 73 74 33 00 " + - " |test3.|\n}" - addDumpTest(v3, "("+v3t+") "+v3s+"\n", "("+v3t2+") "+v3s+"\n") - - // C signed char array. - v4, v4l, v4c := testdata.GetCgoSignedCharArray() - v4Len := fmt.Sprintf("%d", v4l) - v4Cap := fmt.Sprintf("%d", v4c) - v4t := "[6]testdata._Ctype_schar" - v4t2 := "testdata._Ctype_schar" - v4s := "(len=" + v4Len + " cap=" + v4Cap + ") " + - "{\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 101,\n (" + v4t2 + - ") 115,\n (" + v4t2 + ") 116,\n (" + v4t2 + ") 52,\n (" + v4t2 + - ") 0\n}" - addDumpTest(v4, "("+v4t+") "+v4s+"\n") - - // C uint8_t array. - v5, v5l, v5c := testdata.GetCgoUint8tArray() - v5Len := fmt.Sprintf("%d", v5l) - v5Cap := fmt.Sprintf("%d", v5c) - v5t := "[6]testdata._Ctype_uint8_t" - v5s := "(len=" + v5Len + " cap=" + v5Cap + ") " + - "{\n 00000000 74 65 73 74 35 00 " + - " |test5.|\n}" - addDumpTest(v5, "("+v5t+") "+v5s+"\n") - - // C typedefed unsigned char array. - v6, v6l, v6c := testdata.GetCgoTypdefedUnsignedCharArray() - v6Len := fmt.Sprintf("%d", v6l) - v6Cap := fmt.Sprintf("%d", v6c) - v6t := "[6]testdata._Ctype_custom_uchar_t" - v6s := "(len=" + v6Len + " cap=" + v6Cap + ") " + - "{\n 00000000 74 65 73 74 36 00 " + - " |test6.|\n}" - addDumpTest(v6, "("+v6t+") "+v6s+"\n") -} diff --git a/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go b/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go deleted file mode 100644 index 52a0971fb3f..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/dumpnocgo_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2013 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when either cgo is not supported or "-tags testcgo" is not added to the go -// test command line. This file intentionally does not setup any cgo tests in -// this scenario. -// +build !cgo !testcgo - -package spew_test - -func addCgoDumpTests() { - // Don't add any tests for cgo since this file is only compiled when - // there should not be any cgo tests. -} diff --git a/vendor/github.com/davecgh/go-spew/spew/example_test.go b/vendor/github.com/davecgh/go-spew/spew/example_test.go deleted file mode 100644 index c6ec8c6d59e..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/example_test.go +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew_test - -import ( - "fmt" - - "github.com/davecgh/go-spew/spew" -) - -type Flag int - -const ( - flagOne Flag = iota - flagTwo -) - -var flagStrings = map[Flag]string{ - flagOne: "flagOne", - flagTwo: "flagTwo", -} - -func (f Flag) String() string { - if s, ok := flagStrings[f]; ok { - return s - } - return fmt.Sprintf("Unknown flag (%d)", int(f)) -} - -type Bar struct { - data uintptr -} - -type Foo struct { - unexportedField Bar - ExportedField map[interface{}]interface{} -} - -// This example demonstrates how to use Dump to dump variables to stdout. -func ExampleDump() { - // The following package level declarations are assumed for this example: - /* - type Flag int - - const ( - flagOne Flag = iota - flagTwo - ) - - var flagStrings = map[Flag]string{ - flagOne: "flagOne", - flagTwo: "flagTwo", - } - - func (f Flag) String() string { - if s, ok := flagStrings[f]; ok { - return s - } - return fmt.Sprintf("Unknown flag (%d)", int(f)) - } - - type Bar struct { - data uintptr - } - - type Foo struct { - unexportedField Bar - ExportedField map[interface{}]interface{} - } - */ - - // Setup some sample data structures for the example. - bar := Bar{uintptr(0)} - s1 := Foo{bar, map[interface{}]interface{}{"one": true}} - f := Flag(5) - b := []byte{ - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x32, - } - - // Dump! - spew.Dump(s1, f, b) - - // Output: - // (spew_test.Foo) { - // unexportedField: (spew_test.Bar) { - // data: (uintptr) - // }, - // ExportedField: (map[interface {}]interface {}) (len=1) { - // (string) (len=3) "one": (bool) true - // } - // } - // (spew_test.Flag) Unknown flag (5) - // ([]uint8) (len=34 cap=34) { - // 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | - // 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| - // 00000020 31 32 |12| - // } - // -} - -// This example demonstrates how to use Printf to display a variable with a -// format string and inline formatting. -func ExamplePrintf() { - // Create a double pointer to a uint 8. - ui8 := uint8(5) - pui8 := &ui8 - ppui8 := &pui8 - - // Create a circular data type. - type circular struct { - ui8 uint8 - c *circular - } - c := circular{ui8: 1} - c.c = &c - - // Print! - spew.Printf("ppui8: %v\n", ppui8) - spew.Printf("circular: %v\n", c) - - // Output: - // ppui8: <**>5 - // circular: {1 <*>{1 <*>}} -} - -// This example demonstrates how to use a ConfigState. -func ExampleConfigState() { - // Modify the indent level of the ConfigState only. The global - // configuration is not modified. - scs := spew.ConfigState{Indent: "\t"} - - // Output using the ConfigState instance. - v := map[string]int{"one": 1} - scs.Printf("v: %v\n", v) - scs.Dump(v) - - // Output: - // v: map[one:1] - // (map[string]int) (len=1) { - // (string) (len=3) "one": (int) 1 - // } -} - -// This example demonstrates how to use ConfigState.Dump to dump variables to -// stdout -func ExampleConfigState_Dump() { - // See the top-level Dump example for details on the types used in this - // example. - - // Create two ConfigState instances with different indentation. - scs := spew.ConfigState{Indent: "\t"} - scs2 := spew.ConfigState{Indent: " "} - - // Setup some sample data structures for the example. - bar := Bar{uintptr(0)} - s1 := Foo{bar, map[interface{}]interface{}{"one": true}} - - // Dump using the ConfigState instances. - scs.Dump(s1) - scs2.Dump(s1) - - // Output: - // (spew_test.Foo) { - // unexportedField: (spew_test.Bar) { - // data: (uintptr) - // }, - // ExportedField: (map[interface {}]interface {}) (len=1) { - // (string) (len=3) "one": (bool) true - // } - // } - // (spew_test.Foo) { - // unexportedField: (spew_test.Bar) { - // data: (uintptr) - // }, - // ExportedField: (map[interface {}]interface {}) (len=1) { - // (string) (len=3) "one": (bool) true - // } - // } - // -} - -// This example demonstrates how to use ConfigState.Printf to display a variable -// with a format string and inline formatting. -func ExampleConfigState_Printf() { - // See the top-level Dump example for details on the types used in this - // example. - - // Create two ConfigState instances and modify the method handling of the - // first ConfigState only. - scs := spew.NewDefaultConfig() - scs2 := spew.NewDefaultConfig() - scs.DisableMethods = true - - // Alternatively - // scs := spew.ConfigState{Indent: " ", DisableMethods: true} - // scs2 := spew.ConfigState{Indent: " "} - - // This is of type Flag which implements a Stringer and has raw value 1. - f := flagTwo - - // Dump using the ConfigState instances. - scs.Printf("f: %v\n", f) - scs2.Printf("f: %v\n", f) - - // Output: - // f: 1 - // f: flagTwo -} diff --git a/vendor/github.com/davecgh/go-spew/spew/format_test.go b/vendor/github.com/davecgh/go-spew/spew/format_test.go deleted file mode 100644 index f9b93abe86b..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/format_test.go +++ /dev/null @@ -1,1558 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -Test Summary: -NOTE: For each test, a nil pointer, a single pointer and double pointer to the -base test element are also tested to ensure proper indirection across all types. - -- Max int8, int16, int32, int64, int -- Max uint8, uint16, uint32, uint64, uint -- Boolean true and false -- Standard complex64 and complex128 -- Array containing standard ints -- Array containing type with custom formatter on pointer receiver only -- Array containing interfaces -- Slice containing standard float32 values -- Slice containing type with custom formatter on pointer receiver only -- Slice containing interfaces -- Nil slice -- Standard string -- Nil interface -- Sub-interface -- Map with string keys and int vals -- Map with custom formatter type on pointer receiver only keys and vals -- Map with interface keys and values -- Map with nil interface value -- Struct with primitives -- Struct that contains another struct -- Struct that contains custom type with Stringer pointer interface via both - exported and unexported fields -- Struct that contains embedded struct and field to same struct -- Uintptr to 0 (null pointer) -- Uintptr address of real variable -- Unsafe.Pointer to 0 (null pointer) -- Unsafe.Pointer to address of real variable -- Nil channel -- Standard int channel -- Function with no params and no returns -- Function with param and no returns -- Function with multiple params and multiple returns -- Struct that is circular through self referencing -- Structs that are circular through cross referencing -- Structs that are indirectly circular -- Type that panics in its Stringer interface -- Type that has a custom Error interface -- %x passthrough with uint -- %#x passthrough with uint -- %f passthrough with precision -- %f passthrough with width and precision -- %d passthrough with width -- %q passthrough with string -*/ - -package spew_test - -import ( - "bytes" - "fmt" - "testing" - "unsafe" - - "github.com/davecgh/go-spew/spew" -) - -// formatterTest is used to describe a test to be performed against NewFormatter. -type formatterTest struct { - format string - in interface{} - wants []string -} - -// formatterTests houses all of the tests to be performed against NewFormatter. -var formatterTests = make([]formatterTest, 0) - -// addFormatterTest is a helper method to append the passed input and desired -// result to formatterTests. -func addFormatterTest(format string, in interface{}, wants ...string) { - test := formatterTest{format, in, wants} - formatterTests = append(formatterTests, test) -} - -func addIntFormatterTests() { - // Max int8. - v := int8(127) - nv := (*int8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "int8" - vs := "127" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Max int16. - v2 := int16(32767) - nv2 := (*int16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "int16" - v2s := "32767" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Max int32. - v3 := int32(2147483647) - nv3 := (*int32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "int32" - v3s := "2147483647" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - - // Max int64. - v4 := int64(9223372036854775807) - nv4 := (*int64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "int64" - v4s := "9223372036854775807" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") - - // Max int. - v5 := int(2147483647) - nv5 := (*int)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "int" - v5s := "2147483647" - addFormatterTest("%v", v5, v5s) - addFormatterTest("%v", pv5, "<*>"+v5s) - addFormatterTest("%v", &pv5, "<**>"+v5s) - addFormatterTest("%v", nv5, "") - addFormatterTest("%+v", v5, v5s) - addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) - addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%+v", nv5, "") - addFormatterTest("%#v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) - addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) - addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") - addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) - addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%#+v", nv5, "(*"+v5t+")"+"") -} - -func addUintFormatterTests() { - // Max uint8. - v := uint8(255) - nv := (*uint8)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uint8" - vs := "255" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Max uint16. - v2 := uint16(65535) - nv2 := (*uint16)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Max uint32. - v3 := uint32(4294967295) - nv3 := (*uint32)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "uint32" - v3s := "4294967295" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - - // Max uint64. - v4 := uint64(18446744073709551615) - nv4 := (*uint64)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "uint64" - v4s := "18446744073709551615" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") - - // Max uint. - v5 := uint(4294967295) - nv5 := (*uint)(nil) - pv5 := &v5 - v5Addr := fmt.Sprintf("%p", pv5) - pv5Addr := fmt.Sprintf("%p", &pv5) - v5t := "uint" - v5s := "4294967295" - addFormatterTest("%v", v5, v5s) - addFormatterTest("%v", pv5, "<*>"+v5s) - addFormatterTest("%v", &pv5, "<**>"+v5s) - addFormatterTest("%v", nv5, "") - addFormatterTest("%+v", v5, v5s) - addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s) - addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%+v", nv5, "") - addFormatterTest("%#v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s) - addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s) - addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") - addFormatterTest("%#+v", v5, "("+v5t+")"+v5s) - addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s) - addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s) - addFormatterTest("%#v", nv5, "(*"+v5t+")"+"") -} - -func addBoolFormatterTests() { - // Boolean true. - v := bool(true) - nv := (*bool)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "bool" - vs := "true" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Boolean false. - v2 := bool(false) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "bool" - v2s := "false" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addFloatFormatterTests() { - // Standard float32. - v := float32(3.1415) - nv := (*float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "float32" - vs := "3.1415" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Standard float64. - v2 := float64(3.1415926) - nv2 := (*float64)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "float64" - v2s := "3.1415926" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") -} - -func addComplexFormatterTests() { - // Standard complex64. - v := complex(float32(6), -2) - nv := (*complex64)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "complex64" - vs := "(6-2i)" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Standard complex128. - v2 := complex(float64(-6), 2) - nv2 := (*complex128)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "complex128" - v2s := "(-6+2i)" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") -} - -func addArrayFormatterTests() { - // Array containing standard ints. - v := [3]int{1, 2, 3} - nv := (*[3]int)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "[3]int" - vs := "[1 2 3]" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Array containing type with custom formatter on pointer receiver only. - v2 := [3]pstringer{"1", "2", "3"} - nv2 := (*[3]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "[3]spew_test.pstringer" - v2sp := "[stringer 1 stringer 2 stringer 3]" - v2s := v2sp - if spew.UnsafeDisabled { - v2s = "[1 2 3]" - } - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2sp) - addFormatterTest("%v", &pv2, "<**>"+v2sp) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2sp) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2sp) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2sp) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2sp) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2sp) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2sp) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Array containing interfaces. - v3 := [3]interface{}{"one", int(2), uint(3)} - nv3 := (*[3]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[3]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3s := "[one 2 3]" - v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") -} - -func addSliceFormatterTests() { - // Slice containing standard float32 values. - v := []float32{3.14, 6.28, 12.56} - nv := (*[]float32)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "[]float32" - vs := "[3.14 6.28 12.56]" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Slice containing type with custom formatter on pointer receiver only. - v2 := []pstringer{"1", "2", "3"} - nv2 := (*[]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "[]spew_test.pstringer" - v2s := "[stringer 1 stringer 2 stringer 3]" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Slice containing interfaces. - v3 := []interface{}{"one", int(2), uint(3), nil} - nv3 := (*[]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "[]interface {}" - v3t2 := "string" - v3t3 := "int" - v3t4 := "uint" - v3t5 := "interface {}" - v3s := "[one 2 3 ]" - v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3 (" + v3t5 + - ")]" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") - - // Nil slice. - var v4 []int - nv4 := (*[]int)(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "[]int" - v4s := "" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") -} - -func addStringFormatterTests() { - // Standard string. - v := "test" - nv := (*string)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "string" - vs := "test" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") -} - -func addInterfaceFormatterTests() { - // Nil interface. - var v interface{} - nv := (*interface{})(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "interface {}" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Sub-interface. - v2 := interface{}(uint16(65535)) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uint16" - v2s := "65535" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addMapFormatterTests() { - // Map with string keys and int vals. - v := map[string]int{"one": 1, "two": 2} - nilMap := map[string]int(nil) - nv := (*map[string]int)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "map[string]int" - vs := "map[one:1 two:2]" - vs2 := "map[two:2 one:1]" - addFormatterTest("%v", v, vs, vs2) - addFormatterTest("%v", pv, "<*>"+vs, "<*>"+vs2) - addFormatterTest("%v", &pv, "<**>"+vs, "<**>"+vs2) - addFormatterTest("%+v", nilMap, "") - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs, vs2) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs, "<*>("+vAddr+")"+vs2) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs, - "<**>("+pvAddr+"->"+vAddr+")"+vs2) - addFormatterTest("%+v", nilMap, "") - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs, "("+vt+")"+vs2) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs, "(*"+vt+")"+vs2) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs, "(**"+vt+")"+vs2) - addFormatterTest("%#v", nilMap, "("+vt+")"+"") - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs, "("+vt+")"+vs2) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs, - "(*"+vt+")("+vAddr+")"+vs2) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs, - "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs2) - addFormatterTest("%#+v", nilMap, "("+vt+")"+"") - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Map with custom formatter type on pointer receiver only keys and vals. - v2 := map[pstringer]pstringer{"one": "1"} - nv2 := (*map[pstringer]pstringer)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "map[spew_test.pstringer]spew_test.pstringer" - v2s := "map[stringer one:stringer 1]" - if spew.UnsafeDisabled { - v2s = "map[one:1]" - } - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Map with interface keys and values. - v3 := map[interface{}]interface{}{"one": 1} - nv3 := (*map[interface{}]interface{})(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "map[interface {}]interface {}" - v3t1 := "string" - v3t2 := "int" - v3s := "map[one:1]" - v3s2 := "map[(" + v3t1 + ")one:(" + v3t2 + ")1]" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") - - // Map with nil interface value - v4 := map[string]interface{}{"nil": nil} - nv4 := (*map[string]interface{})(nil) - pv4 := &v4 - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "map[string]interface {}" - v4t1 := "interface {}" - v4s := "map[nil:]" - v4s2 := "map[nil:(" + v4t1 + ")]" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%+v", v4, v4s) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s2) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s2) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s2) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s2) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s2) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s2) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") -} - -func addStructFormatterTests() { - // Struct with primitives. - type s1 struct { - a int8 - b uint8 - } - v := s1{127, 255} - nv := (*s1)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.s1" - vt2 := "int8" - vt3 := "uint8" - vs := "{127 255}" - vs2 := "{a:127 b:255}" - vs3 := "{a:(" + vt2 + ")127 b:(" + vt3 + ")255}" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs2) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs3) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs3) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs3) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs3) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs3) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs3) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Struct that contains another struct. - type s2 struct { - s1 s1 - b bool - } - v2 := s2{s1{127, 255}, true} - nv2 := (*s2)(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.s2" - v2t2 := "spew_test.s1" - v2t3 := "int8" - v2t4 := "uint8" - v2t5 := "bool" - v2s := "{{127 255} true}" - v2s2 := "{s1:{a:127 b:255} b:true}" - v2s3 := "{s1:(" + v2t2 + "){a:(" + v2t3 + ")127 b:(" + v2t4 + ")255} b:(" + - v2t5 + ")true}" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s2) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s3) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s3) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s3) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s3) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s3) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s3) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Struct that contains custom type with Stringer pointer interface via both - // exported and unexported fields. - type s3 struct { - s pstringer - S pstringer - } - v3 := s3{"test", "test2"} - nv3 := (*s3)(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.s3" - v3t2 := "spew_test.pstringer" - v3s := "{stringer test stringer test2}" - v3sp := v3s - v3s2 := "{s:stringer test S:stringer test2}" - v3s2p := v3s2 - v3s3 := "{s:(" + v3t2 + ")stringer test S:(" + v3t2 + ")stringer test2}" - v3s3p := v3s3 - if spew.UnsafeDisabled { - v3s = "{test test2}" - v3sp = "{test stringer test2}" - v3s2 = "{s:test S:test2}" - v3s2p = "{s:test S:stringer test2}" - v3s3 = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")test2}" - v3s3p = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")stringer test2}" - } - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3sp) - addFormatterTest("%v", &pv3, "<**>"+v3sp) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s2) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2p) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2p) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s3) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s3p) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s3p) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s3) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s3p) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s3p) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") - - // Struct that contains embedded struct and field to same struct. - e := embed{"embedstr"} - v4 := embedwrap{embed: &e, e: &e} - nv4 := (*embedwrap)(nil) - pv4 := &v4 - eAddr := fmt.Sprintf("%p", &e) - v4Addr := fmt.Sprintf("%p", pv4) - pv4Addr := fmt.Sprintf("%p", &pv4) - v4t := "spew_test.embedwrap" - v4t2 := "spew_test.embed" - v4t3 := "string" - v4s := "{<*>{embedstr} <*>{embedstr}}" - v4s2 := "{embed:<*>(" + eAddr + "){a:embedstr} e:<*>(" + eAddr + - "){a:embedstr}}" - v4s3 := "{embed:(*" + v4t2 + "){a:(" + v4t3 + ")embedstr} e:(*" + v4t2 + - "){a:(" + v4t3 + ")embedstr}}" - v4s4 := "{embed:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + - ")embedstr} e:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + ")embedstr}}" - addFormatterTest("%v", v4, v4s) - addFormatterTest("%v", pv4, "<*>"+v4s) - addFormatterTest("%v", &pv4, "<**>"+v4s) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%+v", v4, v4s2) - addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s2) - addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s2) - addFormatterTest("%+v", nv4, "") - addFormatterTest("%#v", v4, "("+v4t+")"+v4s3) - addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s3) - addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s3) - addFormatterTest("%#v", nv4, "(*"+v4t+")"+"") - addFormatterTest("%#+v", v4, "("+v4t+")"+v4s4) - addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s4) - addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s4) - addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"") -} - -func addUintptrFormatterTests() { - // Null pointer. - v := uintptr(0) - nv := (*uintptr)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "uintptr" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Address of real variable. - i := 1 - v2 := uintptr(unsafe.Pointer(&i)) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "uintptr" - v2s := fmt.Sprintf("%p", &i) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addUnsafePointerFormatterTests() { - // Null pointer. - v := unsafe.Pointer(uintptr(0)) - nv := (*unsafe.Pointer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "unsafe.Pointer" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Address of real variable. - i := 1 - v2 := unsafe.Pointer(&i) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "unsafe.Pointer" - v2s := fmt.Sprintf("%p", &i) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addChanFormatterTests() { - // Nil channel. - var v chan int - pv := &v - nv := (*chan int)(nil) - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "chan int" - vs := "" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Real channel. - v2 := make(chan int) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "chan int" - v2s := fmt.Sprintf("%p", v2) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) -} - -func addFuncFormatterTests() { - // Function with no params and no returns. - v := addIntFormatterTests - nv := (*func())(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "func()" - vs := fmt.Sprintf("%p", v) - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") - - // Function with param and no returns. - v2 := TestFormatter - nv2 := (*func(*testing.T))(nil) - pv2 := &v2 - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "func(*testing.T)" - v2s := fmt.Sprintf("%p", v2) - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s) - addFormatterTest("%v", &pv2, "<**>"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%+v", v2, v2s) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%+v", nv2, "") - addFormatterTest("%#v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s) - addFormatterTest("%#v", nv2, "(*"+v2t+")"+"") - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s) - addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"") - - // Function with multiple params and multiple returns. - var v3 = func(i int, s string) (b bool, err error) { - return true, nil - } - nv3 := (*func(int, string) (bool, error))(nil) - pv3 := &v3 - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "func(int, string) (bool, error)" - v3s := fmt.Sprintf("%p", v3) - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s) - addFormatterTest("%v", &pv3, "<**>"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%+v", v3, v3s) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%+v", nv3, "") - addFormatterTest("%#v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s) - addFormatterTest("%#v", nv3, "(*"+v3t+")"+"") - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s) - addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"") -} - -func addCircularFormatterTests() { - // Struct that is circular through self referencing. - type circular struct { - c *circular - } - v := circular{nil} - v.c = &v - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.circular" - vs := "{<*>{<*>}}" - vs2 := "{<*>}" - vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")}}" - vs4 := "{c:<*>(" + vAddr + ")}" - vs5 := "{c:(*" + vt + "){c:(*" + vt + ")}}" - vs6 := "{c:(*" + vt + ")}" - vs7 := "{c:(*" + vt + ")(" + vAddr + "){c:(*" + vt + ")(" + vAddr + - ")}}" - vs8 := "{c:(*" + vt + ")(" + vAddr + ")}" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs2) - addFormatterTest("%v", &pv, "<**>"+vs2) - addFormatterTest("%+v", v, vs3) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4) - addFormatterTest("%#v", v, "("+vt+")"+vs5) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs6) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs6) - addFormatterTest("%#+v", v, "("+vt+")"+vs7) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs8) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs8) - - // Structs that are circular through cross referencing. - v2 := xref1{nil} - ts2 := xref2{&v2} - v2.ps2 = &ts2 - pv2 := &v2 - ts2Addr := fmt.Sprintf("%p", &ts2) - v2Addr := fmt.Sprintf("%p", pv2) - pv2Addr := fmt.Sprintf("%p", &pv2) - v2t := "spew_test.xref1" - v2t2 := "spew_test.xref2" - v2s := "{<*>{<*>{<*>}}}" - v2s2 := "{<*>{<*>}}" - v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" + - ts2Addr + ")}}}" - v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")}}" - v2s5 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + "){ps2:(*" + v2t2 + - ")}}}" - v2s6 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + ")}}" - v2s7 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + - ")(" + v2Addr + "){ps2:(*" + v2t2 + ")(" + ts2Addr + - ")}}}" - v2s8 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t + - ")(" + v2Addr + ")}}" - addFormatterTest("%v", v2, v2s) - addFormatterTest("%v", pv2, "<*>"+v2s2) - addFormatterTest("%v", &pv2, "<**>"+v2s2) - addFormatterTest("%+v", v2, v2s3) - addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4) - addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4) - addFormatterTest("%#v", v2, "("+v2t+")"+v2s5) - addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s6) - addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s6) - addFormatterTest("%#+v", v2, "("+v2t+")"+v2s7) - addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s8) - addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s8) - - // Structs that are indirectly circular. - v3 := indirCir1{nil} - tic2 := indirCir2{nil} - tic3 := indirCir3{&v3} - tic2.ps3 = &tic3 - v3.ps2 = &tic2 - pv3 := &v3 - tic2Addr := fmt.Sprintf("%p", &tic2) - tic3Addr := fmt.Sprintf("%p", &tic3) - v3Addr := fmt.Sprintf("%p", pv3) - pv3Addr := fmt.Sprintf("%p", &pv3) - v3t := "spew_test.indirCir1" - v3t2 := "spew_test.indirCir2" - v3t3 := "spew_test.indirCir3" - v3s := "{<*>{<*>{<*>{<*>}}}}" - v3s2 := "{<*>{<*>{<*>}}}" - v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + - v3Addr + "){ps2:<*>(" + tic2Addr + ")}}}}" - v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" + - v3Addr + ")}}}" - v3s5 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + - "){ps2:(*" + v3t2 + ")}}}}" - v3s6 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t + - ")}}}" - v3s7 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + - tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + "){ps2:(*" + v3t2 + - ")(" + tic2Addr + ")}}}}" - v3s8 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" + - tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + ")}}}" - addFormatterTest("%v", v3, v3s) - addFormatterTest("%v", pv3, "<*>"+v3s2) - addFormatterTest("%v", &pv3, "<**>"+v3s2) - addFormatterTest("%+v", v3, v3s3) - addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4) - addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4) - addFormatterTest("%#v", v3, "("+v3t+")"+v3s5) - addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s6) - addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s6) - addFormatterTest("%#+v", v3, "("+v3t+")"+v3s7) - addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s8) - addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8) -} - -func addPanicFormatterTests() { - // Type that panics in its Stringer interface. - v := panicer(127) - nv := (*panicer)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.panicer" - vs := "(PANIC=test panic)127" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") -} - -func addErrorFormatterTests() { - // Type that has a custom Error interface. - v := customError(127) - nv := (*customError)(nil) - pv := &v - vAddr := fmt.Sprintf("%p", pv) - pvAddr := fmt.Sprintf("%p", &pv) - vt := "spew_test.customError" - vs := "error: 127" - addFormatterTest("%v", v, vs) - addFormatterTest("%v", pv, "<*>"+vs) - addFormatterTest("%v", &pv, "<**>"+vs) - addFormatterTest("%v", nv, "") - addFormatterTest("%+v", v, vs) - addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) - addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%+v", nv, "") - addFormatterTest("%#v", v, "("+vt+")"+vs) - addFormatterTest("%#v", pv, "(*"+vt+")"+vs) - addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) - addFormatterTest("%#v", nv, "(*"+vt+")"+"") - addFormatterTest("%#+v", v, "("+vt+")"+vs) - addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) - addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) - addFormatterTest("%#+v", nv, "(*"+vt+")"+"") -} - -func addPassthroughFormatterTests() { - // %x passthrough with uint. - v := uint(4294967295) - pv := &v - vAddr := fmt.Sprintf("%x", pv) - pvAddr := fmt.Sprintf("%x", &pv) - vs := "ffffffff" - addFormatterTest("%x", v, vs) - addFormatterTest("%x", pv, vAddr) - addFormatterTest("%x", &pv, pvAddr) - - // %#x passthrough with uint. - v2 := int(2147483647) - pv2 := &v2 - v2Addr := fmt.Sprintf("%#x", pv2) - pv2Addr := fmt.Sprintf("%#x", &pv2) - v2s := "0x7fffffff" - addFormatterTest("%#x", v2, v2s) - addFormatterTest("%#x", pv2, v2Addr) - addFormatterTest("%#x", &pv2, pv2Addr) - - // %f passthrough with precision. - addFormatterTest("%.2f", 3.1415, "3.14") - addFormatterTest("%.3f", 3.1415, "3.142") - addFormatterTest("%.4f", 3.1415, "3.1415") - - // %f passthrough with width and precision. - addFormatterTest("%5.2f", 3.1415, " 3.14") - addFormatterTest("%6.3f", 3.1415, " 3.142") - addFormatterTest("%7.4f", 3.1415, " 3.1415") - - // %d passthrough with width. - addFormatterTest("%3d", 127, "127") - addFormatterTest("%4d", 127, " 127") - addFormatterTest("%5d", 127, " 127") - - // %q passthrough with string. - addFormatterTest("%q", "test", "\"test\"") -} - -// TestFormatter executes all of the tests described by formatterTests. -func TestFormatter(t *testing.T) { - // Setup tests. - addIntFormatterTests() - addUintFormatterTests() - addBoolFormatterTests() - addFloatFormatterTests() - addComplexFormatterTests() - addArrayFormatterTests() - addSliceFormatterTests() - addStringFormatterTests() - addInterfaceFormatterTests() - addMapFormatterTests() - addStructFormatterTests() - addUintptrFormatterTests() - addUnsafePointerFormatterTests() - addChanFormatterTests() - addFuncFormatterTests() - addCircularFormatterTests() - addPanicFormatterTests() - addErrorFormatterTests() - addPassthroughFormatterTests() - - t.Logf("Running %d tests", len(formatterTests)) - for i, test := range formatterTests { - buf := new(bytes.Buffer) - spew.Fprintf(buf, test.format, test.in) - s := buf.String() - if testFailed(s, test.wants) { - t.Errorf("Formatter #%d format: %s got: %s %s", i, test.format, s, - stringizeWants(test.wants)) - continue - } - } -} - -type testStruct struct { - x int -} - -func (ts testStruct) String() string { - return fmt.Sprintf("ts.%d", ts.x) -} - -type testStructP struct { - x int -} - -func (ts *testStructP) String() string { - return fmt.Sprintf("ts.%d", ts.x) -} - -func TestPrintSortedKeys(t *testing.T) { - cfg := spew.ConfigState{SortKeys: true} - s := cfg.Sprint(map[int]string{1: "1", 3: "3", 2: "2"}) - expected := "map[1:1 2:2 3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 1:\n %v %v", s, expected) - } - - s = cfg.Sprint(map[stringer]int{"1": 1, "3": 3, "2": 2}) - expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 2:\n %v %v", s, expected) - } - - s = cfg.Sprint(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2}) - expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]" - if spew.UnsafeDisabled { - expected = "map[1:1 2:2 3:3]" - } - if s != expected { - t.Errorf("Sorted keys mismatch 3:\n %v %v", s, expected) - } - - s = cfg.Sprint(map[testStruct]int{testStruct{1}: 1, testStruct{3}: 3, testStruct{2}: 2}) - expected = "map[ts.1:1 ts.2:2 ts.3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 4:\n %v %v", s, expected) - } - - if !spew.UnsafeDisabled { - s = cfg.Sprint(map[testStructP]int{testStructP{1}: 1, testStructP{3}: 3, testStructP{2}: 2}) - expected = "map[ts.1:1 ts.2:2 ts.3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 5:\n %v %v", s, expected) - } - } - - s = cfg.Sprint(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2}) - expected = "map[error: 1:1 error: 2:2 error: 3:3]" - if s != expected { - t.Errorf("Sorted keys mismatch 6:\n %v %v", s, expected) - } -} diff --git a/vendor/github.com/davecgh/go-spew/spew/internal_test.go b/vendor/github.com/davecgh/go-spew/spew/internal_test.go deleted file mode 100644 index 20a9cfefc61..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/internal_test.go +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -This test file is part of the spew package rather than than the spew_test -package because it needs access to internals to properly test certain cases -which are not possible via the public interface since they should never happen. -*/ - -package spew - -import ( - "bytes" - "reflect" - "testing" -) - -// dummyFmtState implements a fake fmt.State to use for testing invalid -// reflect.Value handling. This is necessary because the fmt package catches -// invalid values before invoking the formatter on them. -type dummyFmtState struct { - bytes.Buffer -} - -func (dfs *dummyFmtState) Flag(f int) bool { - if f == int('+') { - return true - } - return false -} - -func (dfs *dummyFmtState) Precision() (int, bool) { - return 0, false -} - -func (dfs *dummyFmtState) Width() (int, bool) { - return 0, false -} - -// TestInvalidReflectValue ensures the dump and formatter code handles an -// invalid reflect value properly. This needs access to internal state since it -// should never happen in real code and therefore can't be tested via the public -// API. -func TestInvalidReflectValue(t *testing.T) { - i := 1 - - // Dump invalid reflect value. - v := new(reflect.Value) - buf := new(bytes.Buffer) - d := dumpState{w: buf, cs: &Config} - d.dump(*v) - s := buf.String() - want := "" - if s != want { - t.Errorf("InvalidReflectValue #%d\n got: %s want: %s", i, s, want) - } - i++ - - // Formatter invalid reflect value. - buf2 := new(dummyFmtState) - f := formatState{value: *v, cs: &Config, fs: buf2} - f.format(*v) - s = buf2.String() - want = "" - if s != want { - t.Errorf("InvalidReflectValue #%d got: %s want: %s", i, s, want) - } -} - -// SortValues makes the internal sortValues function available to the test -// package. -func SortValues(values []reflect.Value, cs *ConfigState) { - sortValues(values, cs) -} diff --git a/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go b/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go deleted file mode 100644 index a0c612ec3d5..00000000000 --- a/vendor/github.com/davecgh/go-spew/spew/internalunsafe_test.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2013-2016 Dave Collins - -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. - -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when the code is not running on Google App Engine, compiled by GopherJS, and -// "-tags safe" is not added to the go build command line. The "disableunsafe" -// tag is deprecated and thus should not be used. -// +build !js,!appengine,!safe,!disableunsafe - -/* -This test file is part of the spew package rather than than the spew_test -package because it needs access to internals to properly test certain cases -which are not possible via the public interface since they should never happen. -*/ - -package spew - -import ( - "bytes" - "reflect" - "testing" - "unsafe" -) - -// changeKind uses unsafe to intentionally change the kind of a reflect.Value to -// the maximum kind value which does not exist. This is needed to test the -// fallback code which punts to the standard fmt library for new types that -// might get added to the language. -func changeKind(v *reflect.Value, readOnly bool) { - rvf := (*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + offsetFlag)) - *rvf = *rvf | ((1< - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "testing" - - "github.com/davecgh/go-spew/spew" -) - -// spewFunc is used to identify which public function of the spew package or -// ConfigState a test applies to. -type spewFunc int - -const ( - fCSFdump spewFunc = iota - fCSFprint - fCSFprintf - fCSFprintln - fCSPrint - fCSPrintln - fCSSdump - fCSSprint - fCSSprintf - fCSSprintln - fCSErrorf - fCSNewFormatter - fErrorf - fFprint - fFprintln - fPrint - fPrintln - fSdump - fSprint - fSprintf - fSprintln -) - -// Map of spewFunc values to names for pretty printing. -var spewFuncStrings = map[spewFunc]string{ - fCSFdump: "ConfigState.Fdump", - fCSFprint: "ConfigState.Fprint", - fCSFprintf: "ConfigState.Fprintf", - fCSFprintln: "ConfigState.Fprintln", - fCSSdump: "ConfigState.Sdump", - fCSPrint: "ConfigState.Print", - fCSPrintln: "ConfigState.Println", - fCSSprint: "ConfigState.Sprint", - fCSSprintf: "ConfigState.Sprintf", - fCSSprintln: "ConfigState.Sprintln", - fCSErrorf: "ConfigState.Errorf", - fCSNewFormatter: "ConfigState.NewFormatter", - fErrorf: "spew.Errorf", - fFprint: "spew.Fprint", - fFprintln: "spew.Fprintln", - fPrint: "spew.Print", - fPrintln: "spew.Println", - fSdump: "spew.Sdump", - fSprint: "spew.Sprint", - fSprintf: "spew.Sprintf", - fSprintln: "spew.Sprintln", -} - -func (f spewFunc) String() string { - if s, ok := spewFuncStrings[f]; ok { - return s - } - return fmt.Sprintf("Unknown spewFunc (%d)", int(f)) -} - -// spewTest is used to describe a test to be performed against the public -// functions of the spew package or ConfigState. -type spewTest struct { - cs *spew.ConfigState - f spewFunc - format string - in interface{} - want string -} - -// spewTests houses the tests to be performed against the public functions of -// the spew package and ConfigState. -// -// These tests are only intended to ensure the public functions are exercised -// and are intentionally not exhaustive of types. The exhaustive type -// tests are handled in the dump and format tests. -var spewTests []spewTest - -// redirStdout is a helper function to return the standard output from f as a -// byte slice. -func redirStdout(f func()) ([]byte, error) { - tempFile, err := ioutil.TempFile("", "ss-test") - if err != nil { - return nil, err - } - fileName := tempFile.Name() - defer os.Remove(fileName) // Ignore error - - origStdout := os.Stdout - os.Stdout = tempFile - f() - os.Stdout = origStdout - tempFile.Close() - - return ioutil.ReadFile(fileName) -} - -func initSpewTests() { - // Config states with various settings. - scsDefault := spew.NewDefaultConfig() - scsNoMethods := &spew.ConfigState{Indent: " ", DisableMethods: true} - scsNoPmethods := &spew.ConfigState{Indent: " ", DisablePointerMethods: true} - scsMaxDepth := &spew.ConfigState{Indent: " ", MaxDepth: 1} - scsContinue := &spew.ConfigState{Indent: " ", ContinueOnMethod: true} - scsNoPtrAddr := &spew.ConfigState{DisablePointerAddresses: true} - scsNoCap := &spew.ConfigState{DisableCapacities: true} - - // Variables for tests on types which implement Stringer interface with and - // without a pointer receiver. - ts := stringer("test") - tps := pstringer("test") - - type ptrTester struct { - s *struct{} - } - tptr := &ptrTester{s: &struct{}{}} - - // depthTester is used to test max depth handling for structs, array, slices - // and maps. - type depthTester struct { - ic indirCir1 - arr [1]string - slice []string - m map[string]int - } - dt := depthTester{indirCir1{nil}, [1]string{"arr"}, []string{"slice"}, - map[string]int{"one": 1}} - - // Variable for tests on types which implement error interface. - te := customError(10) - - spewTests = []spewTest{ - {scsDefault, fCSFdump, "", int8(127), "(int8) 127\n"}, - {scsDefault, fCSFprint, "", int16(32767), "32767"}, - {scsDefault, fCSFprintf, "%v", int32(2147483647), "2147483647"}, - {scsDefault, fCSFprintln, "", int(2147483647), "2147483647\n"}, - {scsDefault, fCSPrint, "", int64(9223372036854775807), "9223372036854775807"}, - {scsDefault, fCSPrintln, "", uint8(255), "255\n"}, - {scsDefault, fCSSdump, "", uint8(64), "(uint8) 64\n"}, - {scsDefault, fCSSprint, "", complex(1, 2), "(1+2i)"}, - {scsDefault, fCSSprintf, "%v", complex(float32(3), 4), "(3+4i)"}, - {scsDefault, fCSSprintln, "", complex(float64(5), 6), "(5+6i)\n"}, - {scsDefault, fCSErrorf, "%#v", uint16(65535), "(uint16)65535"}, - {scsDefault, fCSNewFormatter, "%v", uint32(4294967295), "4294967295"}, - {scsDefault, fErrorf, "%v", uint64(18446744073709551615), "18446744073709551615"}, - {scsDefault, fFprint, "", float32(3.14), "3.14"}, - {scsDefault, fFprintln, "", float64(6.28), "6.28\n"}, - {scsDefault, fPrint, "", true, "true"}, - {scsDefault, fPrintln, "", false, "false\n"}, - {scsDefault, fSdump, "", complex(-10, -20), "(complex128) (-10-20i)\n"}, - {scsDefault, fSprint, "", complex(-1, -2), "(-1-2i)"}, - {scsDefault, fSprintf, "%v", complex(float32(-3), -4), "(-3-4i)"}, - {scsDefault, fSprintln, "", complex(float64(-5), -6), "(-5-6i)\n"}, - {scsNoMethods, fCSFprint, "", ts, "test"}, - {scsNoMethods, fCSFprint, "", &ts, "<*>test"}, - {scsNoMethods, fCSFprint, "", tps, "test"}, - {scsNoMethods, fCSFprint, "", &tps, "<*>test"}, - {scsNoPmethods, fCSFprint, "", ts, "stringer test"}, - {scsNoPmethods, fCSFprint, "", &ts, "<*>stringer test"}, - {scsNoPmethods, fCSFprint, "", tps, "test"}, - {scsNoPmethods, fCSFprint, "", &tps, "<*>stringer test"}, - {scsMaxDepth, fCSFprint, "", dt, "{{} [] [] map[]}"}, - {scsMaxDepth, fCSFdump, "", dt, "(spew_test.depthTester) {\n" + - " ic: (spew_test.indirCir1) {\n \n },\n" + - " arr: ([1]string) (len=1 cap=1) {\n \n },\n" + - " slice: ([]string) (len=1 cap=1) {\n \n },\n" + - " m: (map[string]int) (len=1) {\n \n }\n}\n"}, - {scsContinue, fCSFprint, "", ts, "(stringer test) test"}, - {scsContinue, fCSFdump, "", ts, "(spew_test.stringer) " + - "(len=4) (stringer test) \"test\"\n"}, - {scsContinue, fCSFprint, "", te, "(error: 10) 10"}, - {scsContinue, fCSFdump, "", te, "(spew_test.customError) " + - "(error: 10) 10\n"}, - {scsNoPtrAddr, fCSFprint, "", tptr, "<*>{<*>{}}"}, - {scsNoPtrAddr, fCSSdump, "", tptr, "(*spew_test.ptrTester)({\ns: (*struct {})({\n})\n})\n"}, - {scsNoCap, fCSSdump, "", make([]string, 0, 10), "([]string) {\n}\n"}, - {scsNoCap, fCSSdump, "", make([]string, 1, 10), "([]string) (len=1) {\n(string) \"\"\n}\n"}, - } -} - -// TestSpew executes all of the tests described by spewTests. -func TestSpew(t *testing.T) { - initSpewTests() - - t.Logf("Running %d tests", len(spewTests)) - for i, test := range spewTests { - buf := new(bytes.Buffer) - switch test.f { - case fCSFdump: - test.cs.Fdump(buf, test.in) - - case fCSFprint: - test.cs.Fprint(buf, test.in) - - case fCSFprintf: - test.cs.Fprintf(buf, test.format, test.in) - - case fCSFprintln: - test.cs.Fprintln(buf, test.in) - - case fCSPrint: - b, err := redirStdout(func() { test.cs.Print(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fCSPrintln: - b, err := redirStdout(func() { test.cs.Println(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fCSSdump: - str := test.cs.Sdump(test.in) - buf.WriteString(str) - - case fCSSprint: - str := test.cs.Sprint(test.in) - buf.WriteString(str) - - case fCSSprintf: - str := test.cs.Sprintf(test.format, test.in) - buf.WriteString(str) - - case fCSSprintln: - str := test.cs.Sprintln(test.in) - buf.WriteString(str) - - case fCSErrorf: - err := test.cs.Errorf(test.format, test.in) - buf.WriteString(err.Error()) - - case fCSNewFormatter: - fmt.Fprintf(buf, test.format, test.cs.NewFormatter(test.in)) - - case fErrorf: - err := spew.Errorf(test.format, test.in) - buf.WriteString(err.Error()) - - case fFprint: - spew.Fprint(buf, test.in) - - case fFprintln: - spew.Fprintln(buf, test.in) - - case fPrint: - b, err := redirStdout(func() { spew.Print(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fPrintln: - b, err := redirStdout(func() { spew.Println(test.in) }) - if err != nil { - t.Errorf("%v #%d %v", test.f, i, err) - continue - } - buf.Write(b) - - case fSdump: - str := spew.Sdump(test.in) - buf.WriteString(str) - - case fSprint: - str := spew.Sprint(test.in) - buf.WriteString(str) - - case fSprintf: - str := spew.Sprintf(test.format, test.in) - buf.WriteString(str) - - case fSprintln: - str := spew.Sprintln(test.in) - buf.WriteString(str) - - default: - t.Errorf("%v #%d unrecognized function", test.f, i) - continue - } - s := buf.String() - if test.want != s { - t.Errorf("ConfigState #%d\n got: %s want: %s", i, s, test.want) - continue - } - } -} diff --git a/vendor/github.com/davecgh/go-spew/test_coverage.txt b/vendor/github.com/davecgh/go-spew/test_coverage.txt deleted file mode 100644 index 2cd087a2a12..00000000000 --- a/vendor/github.com/davecgh/go-spew/test_coverage.txt +++ /dev/null @@ -1,61 +0,0 @@ - -github.com/davecgh/go-spew/spew/dump.go dumpState.dump 100.00% (88/88) -github.com/davecgh/go-spew/spew/format.go formatState.format 100.00% (82/82) -github.com/davecgh/go-spew/spew/format.go formatState.formatPtr 100.00% (52/52) -github.com/davecgh/go-spew/spew/dump.go dumpState.dumpPtr 100.00% (44/44) -github.com/davecgh/go-spew/spew/dump.go dumpState.dumpSlice 100.00% (39/39) -github.com/davecgh/go-spew/spew/common.go handleMethods 100.00% (30/30) -github.com/davecgh/go-spew/spew/common.go printHexPtr 100.00% (18/18) -github.com/davecgh/go-spew/spew/common.go unsafeReflectValue 100.00% (13/13) -github.com/davecgh/go-spew/spew/format.go formatState.constructOrigFormat 100.00% (12/12) -github.com/davecgh/go-spew/spew/dump.go fdump 100.00% (11/11) -github.com/davecgh/go-spew/spew/format.go formatState.Format 100.00% (11/11) -github.com/davecgh/go-spew/spew/common.go init 100.00% (10/10) -github.com/davecgh/go-spew/spew/common.go printComplex 100.00% (9/9) -github.com/davecgh/go-spew/spew/common.go valuesSorter.Less 100.00% (8/8) -github.com/davecgh/go-spew/spew/format.go formatState.buildDefaultFormat 100.00% (7/7) -github.com/davecgh/go-spew/spew/format.go formatState.unpackValue 100.00% (5/5) -github.com/davecgh/go-spew/spew/dump.go dumpState.indent 100.00% (4/4) -github.com/davecgh/go-spew/spew/common.go catchPanic 100.00% (4/4) -github.com/davecgh/go-spew/spew/config.go ConfigState.convertArgs 100.00% (4/4) -github.com/davecgh/go-spew/spew/spew.go convertArgs 100.00% (4/4) -github.com/davecgh/go-spew/spew/format.go newFormatter 100.00% (3/3) -github.com/davecgh/go-spew/spew/dump.go Sdump 100.00% (3/3) -github.com/davecgh/go-spew/spew/common.go printBool 100.00% (3/3) -github.com/davecgh/go-spew/spew/common.go sortValues 100.00% (3/3) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sdump 100.00% (3/3) -github.com/davecgh/go-spew/spew/dump.go dumpState.unpackValue 100.00% (3/3) -github.com/davecgh/go-spew/spew/spew.go Printf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Println 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Sprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Sprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Sprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go printFloat 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go NewDefaultConfig 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go printInt 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go printUint 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go valuesSorter.Len 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go valuesSorter.Swap 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Errorf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Print 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Printf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Println 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.NewFormatter 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fdump 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Dump 100.00% (1/1) -github.com/davecgh/go-spew/spew/dump.go Fdump 100.00% (1/1) -github.com/davecgh/go-spew/spew/dump.go Dump 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Fprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/format.go NewFormatter 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Errorf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Fprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Fprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Print 100.00% (1/1) -github.com/davecgh/go-spew/spew ------------------------------- 100.00% (505/505) - diff --git a/vendor/github.com/fatih/color/.travis.yml b/vendor/github.com/fatih/color/.travis.yml deleted file mode 100644 index 57b4b57c825..00000000000 --- a/vendor/github.com/fatih/color/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: go -go: - - 1.6 - - tip - diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md deleted file mode 100644 index 623baf3c39e..00000000000 --- a/vendor/github.com/fatih/color/README.md +++ /dev/null @@ -1,177 +0,0 @@ -# Color [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/fatih/color) [![Build Status](http://img.shields.io/travis/fatih/color.svg?style=flat-square)](https://travis-ci.org/fatih/color) - - - -Color lets you use colorized outputs in terms of [ANSI Escape -Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It -has support for Windows too! The API can be used in several ways, pick one that -suits you. - - -![Color](http://i.imgur.com/c1JI0lA.png) - - -## Install - -```bash -go get github.com/fatih/color -``` - -Note that the `vendor` folder is here for stability. Remove the folder if you -already have the dependencies in your GOPATH. - -## Examples - -### Standard colors - -```go -// Print with default helper functions -color.Cyan("Prints text in cyan.") - -// A newline will be appended automatically -color.Blue("Prints %s in blue.", "text") - -// These are using the default foreground colors -color.Red("We have red") -color.Magenta("And many others ..") - -``` - -### Mix and reuse colors - -```go -// Create a new color object -c := color.New(color.FgCyan).Add(color.Underline) -c.Println("Prints cyan text with an underline.") - -// Or just add them to New() -d := color.New(color.FgCyan, color.Bold) -d.Printf("This prints bold cyan %s\n", "too!.") - -// Mix up foreground and background colors, create new mixes! -red := color.New(color.FgRed) - -boldRed := red.Add(color.Bold) -boldRed.Println("This will print text in bold red.") - -whiteBackground := red.Add(color.BgWhite) -whiteBackground.Println("Red text with white background.") -``` - -### Use your own output (io.Writer) - -```go -// Use your own io.Writer output -color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - -blue := color.New(color.FgBlue) -blue.Fprint(writer, "This will print text in blue.") -``` - -### Custom print functions (PrintFunc) - -```go -// Create a custom print function for convenience -red := color.New(color.FgRed).PrintfFunc() -red("Warning") -red("Error: %s", err) - -// Mix up multiple attributes -notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() -notice("Don't forget this...") -``` - -### Custom fprint functions (FprintFunc) - -```go -blue := color.New(FgBlue).FprintfFunc() -blue(myWriter, "important notice: %s", stars) - -// Mix up with multiple attributes -success := color.New(color.Bold, color.FgGreen).FprintlnFunc() -success(myWriter, "Don't forget this...") -``` - -### Insert into noncolor strings (SprintFunc) - -```go -// Create SprintXxx functions to mix strings with other non-colorized strings: -yellow := color.New(color.FgYellow).SprintFunc() -red := color.New(color.FgRed).SprintFunc() -fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error")) - -info := color.New(color.FgWhite, color.BgGreen).SprintFunc() -fmt.Printf("This %s rocks!\n", info("package")) - -// Use helper functions -fmt.Println("This", color.RedString("warning"), "should be not neglected.") -fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.") - -// Windows supported too! Just don't forget to change the output to color.Output -fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) -``` - -### Plug into existing code - -```go -// Use handy standard colors -color.Set(color.FgYellow) - -fmt.Println("Existing text will now be in yellow") -fmt.Printf("This one %s\n", "too") - -color.Unset() // Don't forget to unset - -// You can mix up parameters -color.Set(color.FgMagenta, color.Bold) -defer color.Unset() // Use it in your function - -fmt.Println("All text will now be bold magenta.") -``` - -### Disable color - -There might be a case where you want to disable color output (for example to -pipe the standard output of your app to somewhere else). `Color` has support to -disable colors both globally and for single color definition. For example -suppose you have a CLI app and a `--no-color` bool flag. You can easily disable -the color output with: - -```go - -var flagNoColor = flag.Bool("no-color", false, "Disable color output") - -if *flagNoColor { - color.NoColor = true // disables colorized output -} -``` - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - -```go -c := color.New(color.FgCyan) -c.Println("Prints cyan text") - -c.DisableColor() -c.Println("This is printed without any color") - -c.EnableColor() -c.Println("This prints again cyan...") -``` - -## Todo - -* Save/Return previous values -* Evaluate fmt.Formatter interface - - -## Credits - - * [Fatih Arslan](https://github.com/fatih) - * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) - -## License - -The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details - diff --git a/vendor/github.com/go-ini/ini/.gitignore b/vendor/github.com/go-ini/ini/.gitignore deleted file mode 100644 index 12411127b39..00000000000 --- a/vendor/github.com/go-ini/ini/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -testdata/conf_out.ini -ini.sublime-project -ini.sublime-workspace -testdata/conf_reflect.ini -.idea -/.vscode diff --git a/vendor/github.com/go-ini/ini/Makefile b/vendor/github.com/go-ini/ini/Makefile deleted file mode 100644 index 1316911d2df..00000000000 --- a/vendor/github.com/go-ini/ini/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -.PHONY: build test bench vet coverage - -build: vet bench - -test: - go test -v -cover -race - -bench: - go test -v -cover -race -test.bench=. -test.benchmem - -vet: - go vet - -coverage: - go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out \ No newline at end of file diff --git a/vendor/github.com/go-ini/ini/README.md b/vendor/github.com/go-ini/ini/README.md deleted file mode 100644 index f4ff27cd30c..00000000000 --- a/vendor/github.com/go-ini/ini/README.md +++ /dev/null @@ -1,763 +0,0 @@ -INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini) [![Sourcegraph](https://sourcegraph.com/github.com/go-ini/ini/-/badge.svg)](https://sourcegraph.com/github.com/go-ini/ini?badge) -=== - -![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200) - -Package ini provides INI file read and write functionality in Go. - -[简体中文](README_ZH.md) - -## Feature - -- Load multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites. -- Read with recursion values. -- Read with parent-child sections. -- Read with auto-increment key names. -- Read with multiple-line values. -- Read with tons of helper methods. -- Read and convert values to Go types. -- Read and **WRITE** comments of sections and keys. -- Manipulate sections, keys and comments with ease. -- Keep sections and keys in order as you parse and save. - -## Installation - -To use a tagged revision: - - go get gopkg.in/ini.v1 - -To use with latest changes: - - go get github.com/go-ini/ini - -Please add `-u` flag to update in the future. - -### Testing - -If you want to test on your machine, please apply `-t` flag: - - go get -t gopkg.in/ini.v1 - -Please add `-u` flag to update in the future. - -## Getting Started - -### Loading from data sources - -A **Data Source** is either raw data in type `[]byte`, a file name with type `string` or `io.ReadCloser`. You can load **as many data sources as you want**. Passing other types will simply return an error. - -```go -cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data")))) -``` - -Or start with an empty object: - -```go -cfg := ini.Empty() -``` - -When you cannot decide how many data sources to load at the beginning, you will still be able to **Append()** them later. - -```go -err := cfg.Append("other file", []byte("other raw data")) -``` - -If you have a list of files with possibilities that some of them may not available at the time, and you don't know exactly which ones, you can use `LooseLoad` to ignore nonexistent files without returning error. - -```go -cfg, err := ini.LooseLoad("filename", "filename_404") -``` - -The cool thing is, whenever the file is available to load while you're calling `Reload` method, it will be counted as usual. - -#### Ignore cases of key name - -When you do not care about cases of section and key names, you can use `InsensitiveLoad` to force all names to be lowercased while parsing. - -```go -cfg, err := ini.InsensitiveLoad("filename") -//... - -// sec1 and sec2 are the exactly same section object -sec1, err := cfg.GetSection("Section") -sec2, err := cfg.GetSection("SecTIOn") - -// key1 and key2 are the exactly same key object -key1, err := sec1.GetKey("Key") -key2, err := sec2.GetKey("KeY") -``` - -#### MySQL-like boolean key - -MySQL's configuration allows a key without value as follows: - -```ini -[mysqld] -... -skip-host-cache -skip-name-resolve -``` - -By default, this is considered as missing value. But if you know you're going to deal with those cases, you can assign advanced load options: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{AllowBooleanKeys: true}, "my.cnf")) -``` - -The value of those keys are always `true`, and when you save to a file, it will keep in the same foramt as you read. - -To generate such keys in your program, you could use `NewBooleanKey`: - -```go -key, err := sec.NewBooleanKey("skip-host-cache") -``` - -#### Comment - -Take care that following format will be treated as comment: - -1. Line begins with `#` or `;` -2. Words after `#` or `;` -3. Words after section name (i.e words after `[some section name]`) - -If you want to save a value with `#` or `;`, please quote them with ``` ` ``` or ``` """ ```. - -Alternatively, you can use following `LoadOptions` to completely ignore inline comments: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true}, "app.ini")) -``` - -### Working with sections - -To get a section, you would need to: - -```go -section, err := cfg.GetSection("section name") -``` - -For a shortcut for default section, just give an empty string as name: - -```go -section, err := cfg.GetSection("") -``` - -When you're pretty sure the section exists, following code could make your life easier: - -```go -section := cfg.Section("section name") -``` - -What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you. - -To create a new section: - -```go -err := cfg.NewSection("new section") -``` - -To get a list of sections or section names: - -```go -sections := cfg.Sections() -names := cfg.SectionStrings() -``` - -### Working with keys - -To get a key under a section: - -```go -key, err := cfg.Section("").GetKey("key name") -``` - -Same rule applies to key operations: - -```go -key := cfg.Section("").Key("key name") -``` - -To check if a key exists: - -```go -yes := cfg.Section("").HasKey("key name") -``` - -To create a new key: - -```go -err := cfg.Section("").NewKey("name", "value") -``` - -To get a list of keys or key names: - -```go -keys := cfg.Section("").Keys() -names := cfg.Section("").KeyStrings() -``` - -To get a clone hash of keys and corresponding values: - -```go -hash := cfg.Section("").KeysHash() -``` - -### Working with values - -To get a string value: - -```go -val := cfg.Section("").Key("key name").String() -``` - -To validate key value on the fly: - -```go -val := cfg.Section("").Key("key name").Validate(func(in string) string { - if len(in) == 0 { - return "default" - } - return in -}) -``` - -If you do not want any auto-transformation (such as recursive read) for the values, you can get raw value directly (this way you get much better performance): - -```go -val := cfg.Section("").Key("key name").Value() -``` - -To check if raw value exists: - -```go -yes := cfg.Section("").HasValue("test value") -``` - -To get value with types: - -```go -// For boolean values: -// true when value is: 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On -// false when value is: 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off -v, err = cfg.Section("").Key("BOOL").Bool() -v, err = cfg.Section("").Key("FLOAT64").Float64() -v, err = cfg.Section("").Key("INT").Int() -v, err = cfg.Section("").Key("INT64").Int64() -v, err = cfg.Section("").Key("UINT").Uint() -v, err = cfg.Section("").Key("UINT64").Uint64() -v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) -v, err = cfg.Section("").Key("TIME").Time() // RFC3339 - -v = cfg.Section("").Key("BOOL").MustBool() -v = cfg.Section("").Key("FLOAT64").MustFloat64() -v = cfg.Section("").Key("INT").MustInt() -v = cfg.Section("").Key("INT64").MustInt64() -v = cfg.Section("").Key("UINT").MustUint() -v = cfg.Section("").Key("UINT64").MustUint64() -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) -v = cfg.Section("").Key("TIME").MustTime() // RFC3339 - -// Methods start with Must also accept one argument for default value -// when key not found or fail to parse value to given type. -// Except method MustString, which you have to pass a default value. - -v = cfg.Section("").Key("String").MustString("default") -v = cfg.Section("").Key("BOOL").MustBool(true) -v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) -v = cfg.Section("").Key("INT").MustInt(10) -v = cfg.Section("").Key("INT64").MustInt64(99) -v = cfg.Section("").Key("UINT").MustUint(3) -v = cfg.Section("").Key("UINT64").MustUint64(6) -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) -v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339 -``` - -What if my value is three-line long? - -```ini -[advance] -ADDRESS = """404 road, -NotFound, State, 5000 -Earth""" -``` - -Not a problem! - -```go -cfg.Section("advance").Key("ADDRESS").String() - -/* --- start --- -404 road, -NotFound, State, 5000 -Earth ------- end --- */ -``` - -That's cool, how about continuation lines? - -```ini -[advance] -two_lines = how about \ - continuation lines? -lots_of_lines = 1 \ - 2 \ - 3 \ - 4 -``` - -Piece of cake! - -```go -cfg.Section("advance").Key("two_lines").String() // how about continuation lines? -cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4 -``` - -Well, I hate continuation lines, how do I disable that? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{ - IgnoreContinuation: true, -}, "filename") -``` - -Holy crap! - -Note that single quotes around values will be stripped: - -```ini -foo = "some value" // foo: some value -bar = 'some value' // bar: some value -``` - -Sometimes you downloaded file from [Crowdin](https://crowdin.com/) has values like the following (value is surrounded by double quotes and quotes in the value are escaped): - -```ini -create_repo="created repository %s" -``` - -How do you transform this to regular format automatically? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{UnescapeValueDoubleQuotes: true}, "en-US.ini")) -cfg.Section("").Key("create_repo").String() -// You got: created repository %s -``` - -That's all? Hmm, no. - -#### Helper methods of working with values - -To get value with given candidates: - -```go -v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) -v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) -v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) -v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) -v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) -v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) -v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) -v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 -``` - -Default value will be presented if value of key is not in candidates you given, and default value does not need be one of candidates. - -To validate value in a given range: - -```go -vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) -vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) -vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) -vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) -vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) -vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) -vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339 -``` - -##### Auto-split values into a slice - -To use zero value of type for invalid inputs: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] -vals = cfg.Section("").Key("STRINGS").Strings(",") -vals = cfg.Section("").Key("FLOAT64S").Float64s(",") -vals = cfg.Section("").Key("INTS").Ints(",") -vals = cfg.Section("").Key("INT64S").Int64s(",") -vals = cfg.Section("").Key("UINTS").Uints(",") -vals = cfg.Section("").Key("UINT64S").Uint64s(",") -vals = cfg.Section("").Key("TIMES").Times(",") -``` - -To exclude invalid values out of result slice: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [2.2] -vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",") -vals = cfg.Section("").Key("INTS").ValidInts(",") -vals = cfg.Section("").Key("INT64S").ValidInt64s(",") -vals = cfg.Section("").Key("UINTS").ValidUints(",") -vals = cfg.Section("").Key("UINT64S").ValidUint64s(",") -vals = cfg.Section("").Key("TIMES").ValidTimes(",") -``` - -Or to return nothing but error when have invalid inputs: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> error -vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",") -vals = cfg.Section("").Key("INTS").StrictInts(",") -vals = cfg.Section("").Key("INT64S").StrictInt64s(",") -vals = cfg.Section("").Key("UINTS").StrictUints(",") -vals = cfg.Section("").Key("UINT64S").StrictUint64s(",") -vals = cfg.Section("").Key("TIMES").StrictTimes(",") -``` - -### Save your configuration - -Finally, it's time to save your configuration to somewhere. - -A typical way to save configuration is writing it to a file: - -```go -// ... -err = cfg.SaveTo("my.ini") -err = cfg.SaveToIndent("my.ini", "\t") -``` - -Another way to save is writing to a `io.Writer` interface: - -```go -// ... -cfg.WriteTo(writer) -cfg.WriteToIndent(writer, "\t") -``` - -By default, spaces are used to align "=" sign between key and values, to disable that: - -```go -ini.PrettyFormat = false -``` - -## Advanced Usage - -### Recursive Values - -For all value of keys, there is a special syntax `%()s`, where `` is the key name in same section or default section, and `%()s` will be replaced by corresponding value(empty string if key not found). You can use this syntax at most 99 level of recursions. - -```ini -NAME = ini - -[author] -NAME = Unknwon -GITHUB = https://github.com/%(NAME)s - -[package] -FULL_NAME = github.com/go-ini/%(NAME)s -``` - -```go -cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon -cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini -``` - -### Parent-child Sections - -You can use `.` in section name to indicate parent-child relationship between two or more sections. If the key not found in the child section, library will try again on its parent section until there is no parent section. - -```ini -NAME = ini -VERSION = v1 -IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s - -[package] -CLONE_URL = https://%(IMPORT_PATH)s - -[package.sub] -``` - -```go -cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1 -``` - -#### Retrieve parent keys available to a child section - -```go -cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"] -``` - -### Unparseable Sections - -Sometimes, you have sections that do not contain key-value pairs but raw content, to handle such case, you can use `LoadOptions.UnparsableSections`: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS] -<1> This slide has the fuel listed in the wrong units `)) - -body := cfg.Section("COMMENTS").Body() - -/* --- start --- -<1> This slide has the fuel listed in the wrong units ------- end --- */ -``` - -### Auto-increment Key Names - -If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter. - -```ini -[features] --: Support read/write comments of keys and sections --: Support auto-increment of key names --: Support load multiple files to overwrite key values -``` - -```go -cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"} -``` - -### Map To Struct - -Want more objective way to play with INI? Cool. - -```ini -Name = Unknwon -age = 21 -Male = true -Born = 1993-01-01T20:17:05Z - -[Note] -Content = Hi is a good man! -Cities = HangZhou, Boston -``` - -```go -type Note struct { - Content string - Cities []string -} - -type Person struct { - Name string - Age int `ini:"age"` - Male bool - Born time.Time - Note - Created time.Time `ini:"-"` -} - -func main() { - cfg, err := ini.Load("path/to/ini") - // ... - p := new(Person) - err = cfg.MapTo(p) - // ... - - // Things can be simpler. - err = ini.MapTo(p, "path/to/ini") - // ... - - // Just map a section? Fine. - n := new(Note) - err = cfg.Section("Note").MapTo(n) - // ... -} -``` - -Can I have default value for field? Absolutely. - -Assign it before you map to struct. It will keep the value as it is if the key is not presented or got wrong type. - -```go -// ... -p := &Person{ - Name: "Joe", -} -// ... -``` - -It's really cool, but what's the point if you can't give me my file back from struct? - -### Reflect From Struct - -Why not? - -```go -type Embeded struct { - Dates []time.Time `delim:"|" comment:"Time data"` - Places []string `ini:"places,omitempty"` - None []int `ini:",omitempty"` -} - -type Author struct { - Name string `ini:"NAME"` - Male bool - Age int `comment:"Author's age"` - GPA float64 - NeverMind string `ini:"-"` - *Embeded `comment:"Embeded section"` -} - -func main() { - a := &Author{"Unknwon", true, 21, 2.8, "", - &Embeded{ - []time.Time{time.Now(), time.Now()}, - []string{"HangZhou", "Boston"}, - []int{}, - }} - cfg := ini.Empty() - err = ini.ReflectFrom(cfg, a) - // ... -} -``` - -So, what do I get? - -```ini -NAME = Unknwon -Male = true -; Author's age -Age = 21 -GPA = 2.8 - -; Embeded section -[Embeded] -; Time data -Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00 -places = HangZhou,Boston -``` - -#### Name Mapper - -To save your time and make your code cleaner, this library supports [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) between struct field and actual section and key name. - -There are 2 built-in name mappers: - -- `AllCapsUnderscore`: it converts to format `ALL_CAPS_UNDERSCORE` then match section or key. -- `TitleUnderscore`: it converts to format `title_underscore` then match section or key. - -To use them: - -```go -type Info struct { - PackageName string -} - -func main() { - err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini")) - // ... - - cfg, err := ini.Load([]byte("PACKAGE_NAME=ini")) - // ... - info := new(Info) - cfg.NameMapper = ini.AllCapsUnderscore - err = cfg.MapTo(info) - // ... -} -``` - -Same rules of name mapper apply to `ini.ReflectFromWithMapper` function. - -#### Value Mapper - -To expand values (e.g. from environment variables), you can use the `ValueMapper` to transform values: - -```go -type Env struct { - Foo string `ini:"foo"` -} - -func main() { - cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n") - cfg.ValueMapper = os.ExpandEnv - // ... - env := &Env{} - err = cfg.Section("env").MapTo(env) -} -``` - -This would set the value of `env.Foo` to the value of the environment variable `MY_VAR`. - -#### Other Notes On Map/Reflect - -Any embedded struct is treated as a section by default, and there is no automatic parent-child relations in map/reflect feature: - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child -} - -type Config struct { - City string - Parent -} -``` - -Example configuration: - -```ini -City = Boston - -[Parent] -Name = Unknwon - -[Child] -Age = 21 -``` - -What if, yes, I'm paranoid, I want embedded struct to be in the same section. Well, all roads lead to Rome. - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child `ini:"Parent"` -} - -type Config struct { - City string - Parent -} -``` - -Example configuration: - -```ini -City = Boston - -[Parent] -Name = Unknwon -Age = 21 -``` - -## Getting Help - -- [API Documentation](https://gowalker.org/gopkg.in/ini.v1) -- [File An Issue](https://github.com/go-ini/ini/issues/new) - -## FAQs - -### What does `BlockMode` field do? - -By default, library lets you read and write values so we need a locker to make sure your data is safe. But in cases that you are very sure about only reading data through the library, you can set `cfg.BlockMode = false` to speed up read operations about **50-70%** faster. - -### Why another INI library? - -Many people are using my another INI library [goconfig](https://github.com/Unknwon/goconfig), so the reason for this one is I would like to make more Go style code. Also when you set `cfg.BlockMode = false`, this one is about **10-30%** faster. - -To make those changes I have to confirm API broken, so it's safer to keep it in another place and start using `gopkg.in` to version my package at this time.(PS: shorter import path) - -## License - -This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/github.com/go-ini/ini/README_ZH.md b/vendor/github.com/go-ini/ini/README_ZH.md deleted file mode 100644 index 69aefef12e9..00000000000 --- a/vendor/github.com/go-ini/ini/README_ZH.md +++ /dev/null @@ -1,750 +0,0 @@ -本包提供了 Go 语言中读写 INI 文件的功能。 - -## 功能特性 - -- 支持覆盖加载多个数据源(`[]byte`、文件和 `io.ReadCloser`) -- 支持递归读取键值 -- 支持读取父子分区 -- 支持读取自增键名 -- 支持读取多行的键值 -- 支持大量辅助方法 -- 支持在读取时直接转换为 Go 语言类型 -- 支持读取和 **写入** 分区和键的注释 -- 轻松操作分区、键值和注释 -- 在保存文件时分区和键值会保持原有的顺序 - -## 下载安装 - -使用一个特定版本: - - go get gopkg.in/ini.v1 - -使用最新版: - - go get github.com/go-ini/ini - -如需更新请添加 `-u` 选项。 - -### 测试安装 - -如果您想要在自己的机器上运行测试,请使用 `-t` 标记: - - go get -t gopkg.in/ini.v1 - -如需更新请添加 `-u` 选项。 - -## 开始使用 - -### 从数据源加载 - -一个 **数据源** 可以是 `[]byte` 类型的原始数据,`string` 类型的文件路径或 `io.ReadCloser`。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。 - -```go -cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data")))) -``` - -或者从一个空白的文件开始: - -```go -cfg := ini.Empty() -``` - -当您在一开始无法决定需要加载哪些数据源时,仍可以使用 **Append()** 在需要的时候加载它们。 - -```go -err := cfg.Append("other file", []byte("other raw data")) -``` - -当您想要加载一系列文件,但是不能够确定其中哪些文件是不存在的,可以通过调用函数 `LooseLoad` 来忽略它们(`Load` 会因为文件不存在而返回错误): - -```go -cfg, err := ini.LooseLoad("filename", "filename_404") -``` - -更牛逼的是,当那些之前不存在的文件在重新调用 `Reload` 方法的时候突然出现了,那么它们会被正常加载。 - -#### 忽略键名的大小写 - -有时候分区和键的名称大小写混合非常烦人,这个时候就可以通过 `InsensitiveLoad` 将所有分区和键名在读取里强制转换为小写: - -```go -cfg, err := ini.InsensitiveLoad("filename") -//... - -// sec1 和 sec2 指向同一个分区对象 -sec1, err := cfg.GetSection("Section") -sec2, err := cfg.GetSection("SecTIOn") - -// key1 和 key2 指向同一个键对象 -key1, err := sec1.GetKey("Key") -key2, err := sec2.GetKey("KeY") -``` - -#### 类似 MySQL 配置中的布尔值键 - -MySQL 的配置文件中会出现没有具体值的布尔类型的键: - -```ini -[mysqld] -... -skip-host-cache -skip-name-resolve -``` - -默认情况下这被认为是缺失值而无法完成解析,但可以通过高级的加载选项对它们进行处理: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{AllowBooleanKeys: true}, "my.cnf")) -``` - -这些键的值永远为 `true`,且在保存到文件时也只会输出键名。 - -如果您想要通过程序来生成此类键,则可以使用 `NewBooleanKey`: - -```go -key, err := sec.NewBooleanKey("skip-host-cache") -``` - -#### 关于注释 - -下述几种情况的内容将被视为注释: - -1. 所有以 `#` 或 `;` 开头的行 -2. 所有在 `#` 或 `;` 之后的内容 -3. 分区标签后的文字 (即 `[分区名]` 之后的内容) - -如果你希望使用包含 `#` 或 `;` 的值,请使用 ``` ` ``` 或 ``` """ ``` 进行包覆。 - -除此之外,您还可以通过 `LoadOptions` 完全忽略行内注释: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true}, "app.ini")) -``` - -### 操作分区(Section) - -获取指定分区: - -```go -section, err := cfg.GetSection("section name") -``` - -如果您想要获取默认分区,则可以用空字符串代替分区名: - -```go -section, err := cfg.GetSection("") -``` - -当您非常确定某个分区是存在的,可以使用以下简便方法: - -```go -section := cfg.Section("section name") -``` - -如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。 - -创建一个分区: - -```go -err := cfg.NewSection("new section") -``` - -获取所有分区对象或名称: - -```go -sections := cfg.Sections() -names := cfg.SectionStrings() -``` - -### 操作键(Key) - -获取某个分区下的键: - -```go -key, err := cfg.Section("").GetKey("key name") -``` - -和分区一样,您也可以直接获取键而忽略错误处理: - -```go -key := cfg.Section("").Key("key name") -``` - -判断某个键是否存在: - -```go -yes := cfg.Section("").HasKey("key name") -``` - -创建一个新的键: - -```go -err := cfg.Section("").NewKey("name", "value") -``` - -获取分区下的所有键或键名: - -```go -keys := cfg.Section("").Keys() -names := cfg.Section("").KeyStrings() -``` - -获取分区下的所有键值对的克隆: - -```go -hash := cfg.Section("").KeysHash() -``` - -### 操作键值(Value) - -获取一个类型为字符串(string)的值: - -```go -val := cfg.Section("").Key("key name").String() -``` - -获取值的同时通过自定义函数进行处理验证: - -```go -val := cfg.Section("").Key("key name").Validate(func(in string) string { - if len(in) == 0 { - return "default" - } - return in -}) -``` - -如果您不需要任何对值的自动转变功能(例如递归读取),可以直接获取原值(这种方式性能最佳): - -```go -val := cfg.Section("").Key("key name").Value() -``` - -判断某个原值是否存在: - -```go -yes := cfg.Section("").HasValue("test value") -``` - -获取其它类型的值: - -```go -// 布尔值的规则: -// true 当值为:1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On -// false 当值为:0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off -v, err = cfg.Section("").Key("BOOL").Bool() -v, err = cfg.Section("").Key("FLOAT64").Float64() -v, err = cfg.Section("").Key("INT").Int() -v, err = cfg.Section("").Key("INT64").Int64() -v, err = cfg.Section("").Key("UINT").Uint() -v, err = cfg.Section("").Key("UINT64").Uint64() -v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) -v, err = cfg.Section("").Key("TIME").Time() // RFC3339 - -v = cfg.Section("").Key("BOOL").MustBool() -v = cfg.Section("").Key("FLOAT64").MustFloat64() -v = cfg.Section("").Key("INT").MustInt() -v = cfg.Section("").Key("INT64").MustInt64() -v = cfg.Section("").Key("UINT").MustUint() -v = cfg.Section("").Key("UINT64").MustUint64() -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) -v = cfg.Section("").Key("TIME").MustTime() // RFC3339 - -// 由 Must 开头的方法名允许接收一个相同类型的参数来作为默认值, -// 当键不存在或者转换失败时,则会直接返回该默认值。 -// 但是,MustString 方法必须传递一个默认值。 - -v = cfg.Seciont("").Key("String").MustString("default") -v = cfg.Section("").Key("BOOL").MustBool(true) -v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) -v = cfg.Section("").Key("INT").MustInt(10) -v = cfg.Section("").Key("INT64").MustInt64(99) -v = cfg.Section("").Key("UINT").MustUint(3) -v = cfg.Section("").Key("UINT64").MustUint64(6) -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) -v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339 -``` - -如果我的值有好多行怎么办? - -```ini -[advance] -ADDRESS = """404 road, -NotFound, State, 5000 -Earth""" -``` - -嗯哼?小 case! - -```go -cfg.Section("advance").Key("ADDRESS").String() - -/* --- start --- -404 road, -NotFound, State, 5000 -Earth ------- end --- */ -``` - -赞爆了!那要是我属于一行的内容写不下想要写到第二行怎么办? - -```ini -[advance] -two_lines = how about \ - continuation lines? -lots_of_lines = 1 \ - 2 \ - 3 \ - 4 -``` - -简直是小菜一碟! - -```go -cfg.Section("advance").Key("two_lines").String() // how about continuation lines? -cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4 -``` - -可是我有时候觉得两行连在一起特别没劲,怎么才能不自动连接两行呢? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{ - IgnoreContinuation: true, -}, "filename") -``` - -哇靠给力啊! - -需要注意的是,值两侧的单引号会被自动剔除: - -```ini -foo = "some value" // foo: some value -bar = 'some value' // bar: some value -``` - -有时您会获得像从 [Crowdin](https://crowdin.com/) 网站下载的文件那样具有特殊格式的值(值使用双引号括起来,内部的双引号被转义): - -```ini -create_repo="创建了仓库 %s" -``` - -那么,怎么自动地将这类值进行处理呢? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{UnescapeValueDoubleQuotes: true}, "en-US.ini")) -cfg.Section("").Key("create_repo").String() -// You got: 创建了仓库 %s -``` - -这就是全部了?哈哈,当然不是。 - -#### 操作键值的辅助方法 - -获取键值时设定候选值: - -```go -v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) -v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) -v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) -v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) -v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) -v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) -v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) -v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 -``` - -如果获取到的值不是候选值的任意一个,则会返回默认值,而默认值不需要是候选值中的一员。 - -验证获取的值是否在指定范围内: - -```go -vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) -vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) -vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) -vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) -vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) -vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) -vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339 -``` - -##### 自动分割键值到切片(slice) - -当存在无效输入时,使用零值代替: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] -vals = cfg.Section("").Key("STRINGS").Strings(",") -vals = cfg.Section("").Key("FLOAT64S").Float64s(",") -vals = cfg.Section("").Key("INTS").Ints(",") -vals = cfg.Section("").Key("INT64S").Int64s(",") -vals = cfg.Section("").Key("UINTS").Uints(",") -vals = cfg.Section("").Key("UINT64S").Uint64s(",") -vals = cfg.Section("").Key("TIMES").Times(",") -``` - -从结果切片中剔除无效输入: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [2.2] -vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",") -vals = cfg.Section("").Key("INTS").ValidInts(",") -vals = cfg.Section("").Key("INT64S").ValidInt64s(",") -vals = cfg.Section("").Key("UINTS").ValidUints(",") -vals = cfg.Section("").Key("UINT64S").ValidUint64s(",") -vals = cfg.Section("").Key("TIMES").ValidTimes(",") -``` - -当存在无效输入时,直接返回错误: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> error -vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",") -vals = cfg.Section("").Key("INTS").StrictInts(",") -vals = cfg.Section("").Key("INT64S").StrictInt64s(",") -vals = cfg.Section("").Key("UINTS").StrictUints(",") -vals = cfg.Section("").Key("UINT64S").StrictUint64s(",") -vals = cfg.Section("").Key("TIMES").StrictTimes(",") -``` - -### 保存配置 - -终于到了这个时刻,是时候保存一下配置了。 - -比较原始的做法是输出配置到某个文件: - -```go -// ... -err = cfg.SaveTo("my.ini") -err = cfg.SaveToIndent("my.ini", "\t") -``` - -另一个比较高级的做法是写入到任何实现 `io.Writer` 接口的对象中: - -```go -// ... -cfg.WriteTo(writer) -cfg.WriteToIndent(writer, "\t") -``` - -默认情况下,空格将被用于对齐键值之间的等号以美化输出结果,以下代码可以禁用该功能: - -```go -ini.PrettyFormat = false -``` - -## 高级用法 - -### 递归读取键值 - -在获取所有键值的过程中,特殊语法 `%()s` 会被应用,其中 `` 可以是相同分区或者默认分区下的键名。字符串 `%()s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。 - -```ini -NAME = ini - -[author] -NAME = Unknwon -GITHUB = https://github.com/%(NAME)s - -[package] -FULL_NAME = github.com/go-ini/%(NAME)s -``` - -```go -cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon -cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini -``` - -### 读取父子分区 - -您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。 - -```ini -NAME = ini -VERSION = v1 -IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s - -[package] -CLONE_URL = https://%(IMPORT_PATH)s - -[package.sub] -``` - -```go -cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1 -``` - -#### 获取上级父分区下的所有键名 - -```go -cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"] -``` - -### 无法解析的分区 - -如果遇到一些比较特殊的分区,它们不包含常见的键值对,而是没有固定格式的纯文本,则可以使用 `LoadOptions.UnparsableSections` 进行处理: - -```go -cfg, err := LoadSources(ini.LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS] -<1> This slide has the fuel listed in the wrong units `)) - -body := cfg.Section("COMMENTS").Body() - -/* --- start --- -<1> This slide has the fuel listed in the wrong units ------- end --- */ -``` - -### 读取自增键名 - -如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。 - -```ini -[features] --: Support read/write comments of keys and sections --: Support auto-increment of key names --: Support load multiple files to overwrite key values -``` - -```go -cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"} -``` - -### 映射到结构 - -想要使用更加面向对象的方式玩转 INI 吗?好主意。 - -```ini -Name = Unknwon -age = 21 -Male = true -Born = 1993-01-01T20:17:05Z - -[Note] -Content = Hi is a good man! -Cities = HangZhou, Boston -``` - -```go -type Note struct { - Content string - Cities []string -} - -type Person struct { - Name string - Age int `ini:"age"` - Male bool - Born time.Time - Note - Created time.Time `ini:"-"` -} - -func main() { - cfg, err := ini.Load("path/to/ini") - // ... - p := new(Person) - err = cfg.MapTo(p) - // ... - - // 一切竟可以如此的简单。 - err = ini.MapTo(p, "path/to/ini") - // ... - - // 嗯哼?只需要映射一个分区吗? - n := new(Note) - err = cfg.Section("Note").MapTo(n) - // ... -} -``` - -结构的字段怎么设置默认值呢?很简单,只要在映射之前对指定字段进行赋值就可以了。如果键未找到或者类型错误,该值不会发生改变。 - -```go -// ... -p := &Person{ - Name: "Joe", -} -// ... -``` - -这样玩 INI 真的好酷啊!然而,如果不能还给我原来的配置文件,有什么卵用? - -### 从结构反射 - -可是,我有说不能吗? - -```go -type Embeded struct { - Dates []time.Time `delim:"|" comment:"Time data"` - Places []string `ini:"places,omitempty"` - None []int `ini:",omitempty"` -} - -type Author struct { - Name string `ini:"NAME"` - Male bool - Age int `comment:"Author's age"` - GPA float64 - NeverMind string `ini:"-"` - *Embeded `comment:"Embeded section"` -} - -func main() { - a := &Author{"Unknwon", true, 21, 2.8, "", - &Embeded{ - []time.Time{time.Now(), time.Now()}, - []string{"HangZhou", "Boston"}, - []int{}, - }} - cfg := ini.Empty() - err = ini.ReflectFrom(cfg, a) - // ... -} -``` - -瞧瞧,奇迹发生了。 - -```ini -NAME = Unknwon -Male = true -; Author's age -Age = 21 -GPA = 2.8 - -; Embeded section -[Embeded] -; Time data -Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00 -places = HangZhou,Boston -``` - -#### 名称映射器(Name Mapper) - -为了节省您的时间并简化代码,本库支持类型为 [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) 的名称映射器,该映射器负责结构字段名与分区名和键名之间的映射。 - -目前有 2 款内置的映射器: - -- `AllCapsUnderscore`:该映射器将字段名转换至格式 `ALL_CAPS_UNDERSCORE` 后再去匹配分区名和键名。 -- `TitleUnderscore`:该映射器将字段名转换至格式 `title_underscore` 后再去匹配分区名和键名。 - -使用方法: - -```go -type Info struct{ - PackageName string -} - -func main() { - err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini")) - // ... - - cfg, err := ini.Load([]byte("PACKAGE_NAME=ini")) - // ... - info := new(Info) - cfg.NameMapper = ini.AllCapsUnderscore - err = cfg.MapTo(info) - // ... -} -``` - -使用函数 `ini.ReflectFromWithMapper` 时也可应用相同的规则。 - -#### 值映射器(Value Mapper) - -值映射器允许使用一个自定义函数自动展开值的具体内容,例如:运行时获取环境变量: - -```go -type Env struct { - Foo string `ini:"foo"` -} - -func main() { - cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n") - cfg.ValueMapper = os.ExpandEnv - // ... - env := &Env{} - err = cfg.Section("env").MapTo(env) -} -``` - -本例中,`env.Foo` 将会是运行时所获取到环境变量 `MY_VAR` 的值。 - -#### 映射/反射的其它说明 - -任何嵌入的结构都会被默认认作一个不同的分区,并且不会自动产生所谓的父子分区关联: - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child -} - -type Config struct { - City string - Parent -} -``` - -示例配置文件: - -```ini -City = Boston - -[Parent] -Name = Unknwon - -[Child] -Age = 21 -``` - -很好,但是,我就是要嵌入结构也在同一个分区。好吧,你爹是李刚! - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child `ini:"Parent"` -} - -type Config struct { - City string - Parent -} -``` - -示例配置文件: - -```ini -City = Boston - -[Parent] -Name = Unknwon -Age = 21 -``` - -## 获取帮助 - -- [API 文档](https://gowalker.org/gopkg.in/ini.v1) -- [创建工单](https://github.com/go-ini/ini/issues/new) - -## 常见问题 - -### 字段 `BlockMode` 是什么? - -默认情况下,本库会在您进行读写操作时采用锁机制来确保数据时间。但在某些情况下,您非常确定只进行读操作。此时,您可以通过设置 `cfg.BlockMode = false` 来将读操作提升大约 **50-70%** 的性能。 - -### 为什么要写另一个 INI 解析库? - -许多人都在使用我的 [goconfig](https://github.com/Unknwon/goconfig) 来完成对 INI 文件的操作,但我希望使用更加 Go 风格的代码。并且当您设置 `cfg.BlockMode = false` 时,会有大约 **10-30%** 的性能提升。 - -为了做出这些改变,我必须对 API 进行破坏,所以新开一个仓库是最安全的做法。除此之外,本库直接使用 `gopkg.in` 来进行版本化发布。(其实真相是导入路径更短了) diff --git a/vendor/github.com/go-ldap/ldap/.gitignore b/vendor/github.com/go-ldap/ldap/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor/github.com/go-ldap/ldap/.travis.yml b/vendor/github.com/go-ldap/ldap/.travis.yml deleted file mode 100644 index 9782c9bac8b..00000000000 --- a/vendor/github.com/go-ldap/ldap/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -language: go -env: - global: - - VET_VERSIONS="1.6 1.7 1.8 1.9 tip" - - LINT_VERSIONS="1.6 1.7 1.8 1.9 tip" -go: - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - 1.9 - - tip -matrix: - fast_finish: true - allow_failures: - - go: tip -go_import_path: gopkg.in/ldap.v2 -install: - - go get gopkg.in/asn1-ber.v1 - - go get gopkg.in/ldap.v2 - - go get code.google.com/p/go.tools/cmd/cover || go get golang.org/x/tools/cmd/cover - - go get github.com/golang/lint/golint || true - - go build -v ./... -script: - - make test - - make fmt - - if [[ "$VET_VERSIONS" == *"$TRAVIS_GO_VERSION"* ]]; then make vet; fi - - if [[ "$LINT_VERSIONS" == *"$TRAVIS_GO_VERSION"* ]]; then make lint; fi diff --git a/vendor/github.com/go-ldap/ldap/Makefile b/vendor/github.com/go-ldap/ldap/Makefile deleted file mode 100644 index a9d351c7640..00000000000 --- a/vendor/github.com/go-ldap/ldap/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -.PHONY: default install build test quicktest fmt vet lint - -GO_VERSION := $(shell go version | cut -d' ' -f3 | cut -d. -f2) - -# Only use the `-race` flag on newer versions of Go -IS_OLD_GO := $(shell test $(GO_VERSION) -le 2 && echo true) -ifeq ($(IS_OLD_GO),true) - RACE_FLAG := -else - RACE_FLAG := -race -cpu 1,2,4 -endif - -default: fmt vet lint build quicktest - -install: - go get -t -v ./... - -build: - go build -v ./... - -test: - go test -v $(RACE_FLAG) -cover ./... - -quicktest: - go test ./... - -# Capture output and force failure when there is non-empty output -fmt: - @echo gofmt -l . - @OUTPUT=`gofmt -l . 2>&1`; \ - if [ "$$OUTPUT" ]; then \ - echo "gofmt must be run on the following files:"; \ - echo "$$OUTPUT"; \ - exit 1; \ - fi - -# Only run on go1.5+ -vet: - go tool vet -atomic -bool -copylocks -nilfunc -printf -shadow -rangeloops -unreachable -unsafeptr -unusedresult . - -# https://github.com/golang/lint -# go get github.com/golang/lint/golint -# Capture output and force failure when there is non-empty output -# Only run on go1.5+ -lint: - @echo golint ./... - @OUTPUT=`golint ./... 2>&1`; \ - if [ "$$OUTPUT" ]; then \ - echo "golint errors:"; \ - echo "$$OUTPUT"; \ - exit 1; \ - fi diff --git a/vendor/github.com/go-ldap/ldap/README.md b/vendor/github.com/go-ldap/ldap/README.md deleted file mode 100644 index a26ed2d82b3..00000000000 --- a/vendor/github.com/go-ldap/ldap/README.md +++ /dev/null @@ -1,53 +0,0 @@ -[![GoDoc](https://godoc.org/gopkg.in/ldap.v2?status.svg)](https://godoc.org/gopkg.in/ldap.v2) -[![Build Status](https://travis-ci.org/go-ldap/ldap.svg)](https://travis-ci.org/go-ldap/ldap) - -# Basic LDAP v3 functionality for the GO programming language. - -## Install - -For the latest version use: - - go get gopkg.in/ldap.v2 - -Import the latest version with: - - import "gopkg.in/ldap.v2" - -## Required Libraries: - - - gopkg.in/asn1-ber.v1 - -## Features: - - - Connecting to LDAP server (non-TLS, TLS, STARTTLS) - - Binding to LDAP server - - Searching for entries - - Filter Compile / Decompile - - Paging Search Results - - Modify Requests / Responses - - Add Requests / Responses - - Delete Requests / Responses - -## Examples: - - - search - - modify - -## Contributing: - -Bug reports and pull requests are welcome! - -Before submitting a pull request, please make sure tests and verification scripts pass: -``` -make all -``` - -To set up a pre-push hook to run the tests and verify scripts before pushing: -``` -ln -s ../../.githooks/pre-push .git/hooks/pre-push -``` - ---- -The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) -The design is licensed under the Creative Commons 3.0 Attributions license. -Read this article for more details: http://blog.golang.org/gopher diff --git a/vendor/github.com/go-ldap/ldap/dn_test.go b/vendor/github.com/go-ldap/ldap/dn_test.go deleted file mode 100644 index af5fc1468a5..00000000000 --- a/vendor/github.com/go-ldap/ldap/dn_test.go +++ /dev/null @@ -1,211 +0,0 @@ -package ldap_test - -import ( - "reflect" - "testing" - - "gopkg.in/ldap.v2" -) - -func TestSuccessfulDNParsing(t *testing.T) { - testcases := map[string]ldap.DN{ - "": ldap.DN{[]*ldap.RelativeDN{}}, - "cn=Jim\\2C \\22Hasse Hö\\22 Hansson!,dc=dummy,dc=com": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"cn", "Jim, \"Hasse Hö\" Hansson!"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"dc", "dummy"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"dc", "com"}}}}}, - "UID=jsmith,DC=example,DC=net": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"UID", "jsmith"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"DC", "example"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"DC", "net"}}}}}, - "OU=Sales+CN=J. Smith,DC=example,DC=net": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{ - &ldap.AttributeTypeAndValue{"OU", "Sales"}, - &ldap.AttributeTypeAndValue{"CN", "J. Smith"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"DC", "example"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"DC", "net"}}}}}, - "1.3.6.1.4.1.1466.0=#04024869": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"1.3.6.1.4.1.1466.0", "Hi"}}}}}, - "1.3.6.1.4.1.1466.0=#04024869,DC=net": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"1.3.6.1.4.1.1466.0", "Hi"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"DC", "net"}}}}}, - "CN=Lu\\C4\\8Di\\C4\\87": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"CN", "Lučić"}}}}}, - " CN = Lu\\C4\\8Di\\C4\\87 ": ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"CN", "Lučić"}}}}}, - ` A = 1 , B = 2 `: ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"A", "1"}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{"B", "2"}}}}}, - ` A = 1 + B = 2 `: ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{ - &ldap.AttributeTypeAndValue{"A", "1"}, - &ldap.AttributeTypeAndValue{"B", "2"}}}}}, - ` \ \ A\ \ = \ \ 1\ \ , \ \ B\ \ = \ \ 2\ \ `: ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{" A ", " 1 "}}}, - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{&ldap.AttributeTypeAndValue{" B ", " 2 "}}}}}, - ` \ \ A\ \ = \ \ 1\ \ + \ \ B\ \ = \ \ 2\ \ `: ldap.DN{[]*ldap.RelativeDN{ - &ldap.RelativeDN{[]*ldap.AttributeTypeAndValue{ - &ldap.AttributeTypeAndValue{" A ", " 1 "}, - &ldap.AttributeTypeAndValue{" B ", " 2 "}}}}}, - } - - for test, answer := range testcases { - dn, err := ldap.ParseDN(test) - if err != nil { - t.Errorf(err.Error()) - continue - } - if !reflect.DeepEqual(dn, &answer) { - t.Errorf("Parsed DN %s is not equal to the expected structure", test) - t.Logf("Expected:") - for _, rdn := range answer.RDNs { - for _, attribs := range rdn.Attributes { - t.Logf("#%v\n", attribs) - } - } - t.Logf("Actual:") - for _, rdn := range dn.RDNs { - for _, attribs := range rdn.Attributes { - t.Logf("#%v\n", attribs) - } - } - } - } -} - -func TestErrorDNParsing(t *testing.T) { - testcases := map[string]string{ - "*": "DN ended with incomplete type, value pair", - "cn=Jim\\0Test": "Failed to decode escaped character: encoding/hex: invalid byte: U+0054 'T'", - "cn=Jim\\0": "Got corrupted escaped character", - "DC=example,=net": "DN ended with incomplete type, value pair", - "1=#0402486": "Failed to decode BER encoding: encoding/hex: odd length hex string", - "test,DC=example,DC=com": "incomplete type, value pair", - "=test,DC=example,DC=com": "incomplete type, value pair", - } - - for test, answer := range testcases { - _, err := ldap.ParseDN(test) - if err == nil { - t.Errorf("Expected %s to fail parsing but succeeded\n", test) - } else if err.Error() != answer { - t.Errorf("Unexpected error on %s:\n%s\nvs.\n%s\n", test, answer, err.Error()) - } - } -} - -func TestDNEqual(t *testing.T) { - testcases := []struct { - A string - B string - Equal bool - }{ - // Exact match - {"", "", true}, - {"o=A", "o=A", true}, - {"o=A", "o=B", false}, - - {"o=A,o=B", "o=A,o=B", true}, - {"o=A,o=B", "o=A,o=C", false}, - - {"o=A+o=B", "o=A+o=B", true}, - {"o=A+o=B", "o=A+o=C", false}, - - // Case mismatch in type is ignored - {"o=A", "O=A", true}, - {"o=A,o=B", "o=A,O=B", true}, - {"o=A+o=B", "o=A+O=B", true}, - - // Case mismatch in value is significant - {"o=a", "O=A", false}, - {"o=a,o=B", "o=A,O=B", false}, - {"o=a+o=B", "o=A+O=B", false}, - - // Multi-valued RDN order mismatch is ignored - {"o=A+o=B", "O=B+o=A", true}, - // Number of RDN attributes is significant - {"o=A+o=B", "O=B+o=A+O=B", false}, - - // Missing values are significant - {"o=A+o=B", "O=B+o=A+O=C", false}, // missing values matter - {"o=A+o=B+o=C", "O=B+o=A", false}, // missing values matter - - // Whitespace tests - // Matching - { - "cn=John Doe, ou=People, dc=sun.com", - "cn=John Doe, ou=People, dc=sun.com", - true, - }, - // Difference in leading/trailing chars is ignored - { - "cn=John Doe, ou=People, dc=sun.com", - "cn=John Doe,ou=People,dc=sun.com", - true, - }, - // Difference in values is significant - { - "cn=John Doe, ou=People, dc=sun.com", - "cn=John Doe, ou=People, dc=sun.com", - false, - }, - } - - for i, tc := range testcases { - a, err := ldap.ParseDN(tc.A) - if err != nil { - t.Errorf("%d: %v", i, err) - continue - } - b, err := ldap.ParseDN(tc.B) - if err != nil { - t.Errorf("%d: %v", i, err) - continue - } - if expected, actual := tc.Equal, a.Equal(b); expected != actual { - t.Errorf("%d: when comparing '%s' and '%s' expected %v, got %v", i, tc.A, tc.B, expected, actual) - continue - } - if expected, actual := tc.Equal, b.Equal(a); expected != actual { - t.Errorf("%d: when comparing '%s' and '%s' expected %v, got %v", i, tc.A, tc.B, expected, actual) - continue - } - } -} - -func TestDNAncestor(t *testing.T) { - testcases := []struct { - A string - B string - Ancestor bool - }{ - // Exact match returns false - {"", "", false}, - {"o=A", "o=A", false}, - {"o=A,o=B", "o=A,o=B", false}, - {"o=A+o=B", "o=A+o=B", false}, - - // Mismatch - {"ou=C,ou=B,o=A", "ou=E,ou=D,ou=B,o=A", false}, - - // Descendant - {"ou=C,ou=B,o=A", "ou=E,ou=C,ou=B,o=A", true}, - } - - for i, tc := range testcases { - a, err := ldap.ParseDN(tc.A) - if err != nil { - t.Errorf("%d: %v", i, err) - continue - } - b, err := ldap.ParseDN(tc.B) - if err != nil { - t.Errorf("%d: %v", i, err) - continue - } - if expected, actual := tc.Ancestor, a.AncestorOf(b); expected != actual { - t.Errorf("%d: when comparing '%s' and '%s' expected %v, got %v", i, tc.A, tc.B, expected, actual) - continue - } - } -} diff --git a/vendor/github.com/go-ldap/ldap/example_test.go b/vendor/github.com/go-ldap/ldap/example_test.go deleted file mode 100644 index 650af0a43e3..00000000000 --- a/vendor/github.com/go-ldap/ldap/example_test.go +++ /dev/null @@ -1,305 +0,0 @@ -package ldap_test - -import ( - "crypto/tls" - "fmt" - "log" - - "gopkg.in/ldap.v2" -) - -// ExampleConn_Bind demonstrates how to bind a connection to an ldap user -// allowing access to restricted attributes that user has access to -func ExampleConn_Bind() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - err = l.Bind("cn=read-only-admin,dc=example,dc=com", "password") - if err != nil { - log.Fatal(err) - } -} - -// ExampleConn_Search demonstrates how to use the search interface -func ExampleConn_Search() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - searchRequest := ldap.NewSearchRequest( - "dc=example,dc=com", // The base dn to search - ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - "(&(objectClass=organizationalPerson))", // The filter to apply - []string{"dn", "cn"}, // A list attributes to retrieve - nil, - ) - - sr, err := l.Search(searchRequest) - if err != nil { - log.Fatal(err) - } - - for _, entry := range sr.Entries { - fmt.Printf("%s: %v\n", entry.DN, entry.GetAttributeValue("cn")) - } -} - -// ExampleStartTLS demonstrates how to start a TLS connection -func ExampleConn_StartTLS() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - // Reconnect with TLS - err = l.StartTLS(&tls.Config{InsecureSkipVerify: true}) - if err != nil { - log.Fatal(err) - } - - // Operations via l are now encrypted -} - -// ExampleConn_Compare demonstrates how to compare an attribute with a value -func ExampleConn_Compare() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - matched, err := l.Compare("cn=user,dc=example,dc=com", "uid", "someuserid") - if err != nil { - log.Fatal(err) - } - - fmt.Println(matched) -} - -func ExampleConn_PasswordModify_admin() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - err = l.Bind("cn=admin,dc=example,dc=com", "password") - if err != nil { - log.Fatal(err) - } - - passwordModifyRequest := ldap.NewPasswordModifyRequest("cn=user,dc=example,dc=com", "", "NewPassword") - _, err = l.PasswordModify(passwordModifyRequest) - - if err != nil { - log.Fatalf("Password could not be changed: %s", err.Error()) - } -} - -func ExampleConn_PasswordModify_generatedPassword() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - err = l.Bind("cn=user,dc=example,dc=com", "password") - if err != nil { - log.Fatal(err) - } - - passwordModifyRequest := ldap.NewPasswordModifyRequest("", "OldPassword", "") - passwordModifyResponse, err := l.PasswordModify(passwordModifyRequest) - if err != nil { - log.Fatalf("Password could not be changed: %s", err.Error()) - } - - generatedPassword := passwordModifyResponse.GeneratedPassword - log.Printf("Generated password: %s\n", generatedPassword) -} - -func ExampleConn_PasswordModify_setNewPassword() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - err = l.Bind("cn=user,dc=example,dc=com", "password") - if err != nil { - log.Fatal(err) - } - - passwordModifyRequest := ldap.NewPasswordModifyRequest("", "OldPassword", "NewPassword") - _, err = l.PasswordModify(passwordModifyRequest) - - if err != nil { - log.Fatalf("Password could not be changed: %s", err.Error()) - } -} - -func ExampleConn_Modify() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - // Add a description, and replace the mail attributes - modify := ldap.NewModifyRequest("cn=user,dc=example,dc=com") - modify.Add("description", []string{"An example user"}) - modify.Replace("mail", []string{"user@example.org"}) - - err = l.Modify(modify) - if err != nil { - log.Fatal(err) - } -} - -// Example User Authentication shows how a typical application can verify a login attempt -func Example_userAuthentication() { - // The username and password we want to check - username := "someuser" - password := "userpassword" - - bindusername := "readonly" - bindpassword := "password" - - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - // Reconnect with TLS - err = l.StartTLS(&tls.Config{InsecureSkipVerify: true}) - if err != nil { - log.Fatal(err) - } - - // First bind with a read only user - err = l.Bind(bindusername, bindpassword) - if err != nil { - log.Fatal(err) - } - - // Search for the given username - searchRequest := ldap.NewSearchRequest( - "dc=example,dc=com", - ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - fmt.Sprintf("(&(objectClass=organizationalPerson)(uid=%s))", username), - []string{"dn"}, - nil, - ) - - sr, err := l.Search(searchRequest) - if err != nil { - log.Fatal(err) - } - - if len(sr.Entries) != 1 { - log.Fatal("User does not exist or too many entries returned") - } - - userdn := sr.Entries[0].DN - - // Bind as the user to verify their password - err = l.Bind(userdn, password) - if err != nil { - log.Fatal(err) - } - - // Rebind as the read only user for any further queries - err = l.Bind(bindusername, bindpassword) - if err != nil { - log.Fatal(err) - } -} - -func Example_beherappolicy() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - - controls := []ldap.Control{} - controls = append(controls, ldap.NewControlBeheraPasswordPolicy()) - bindRequest := ldap.NewSimpleBindRequest("cn=admin,dc=example,dc=com", "password", controls) - - r, err := l.SimpleBind(bindRequest) - ppolicyControl := ldap.FindControl(r.Controls, ldap.ControlTypeBeheraPasswordPolicy) - - var ppolicy *ldap.ControlBeheraPasswordPolicy - if ppolicyControl != nil { - ppolicy = ppolicyControl.(*ldap.ControlBeheraPasswordPolicy) - } else { - log.Printf("ppolicyControl response not available.\n") - } - if err != nil { - errStr := "ERROR: Cannot bind: " + err.Error() - if ppolicy != nil && ppolicy.Error >= 0 { - errStr += ":" + ppolicy.ErrorString - } - log.Print(errStr) - } else { - logStr := "Login Ok" - if ppolicy != nil { - if ppolicy.Expire >= 0 { - logStr += fmt.Sprintf(". Password expires in %d seconds\n", ppolicy.Expire) - } else if ppolicy.Grace >= 0 { - logStr += fmt.Sprintf(". Password expired, %d grace logins remain\n", ppolicy.Grace) - } - } - log.Print(logStr) - } -} - -func Example_vchuppolicy() { - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", "ldap.example.com", 389)) - if err != nil { - log.Fatal(err) - } - defer l.Close() - l.Debug = true - - bindRequest := ldap.NewSimpleBindRequest("cn=admin,dc=example,dc=com", "password", nil) - - r, err := l.SimpleBind(bindRequest) - - passwordMustChangeControl := ldap.FindControl(r.Controls, ldap.ControlTypeVChuPasswordMustChange) - var passwordMustChange *ldap.ControlVChuPasswordMustChange - if passwordMustChangeControl != nil { - passwordMustChange = passwordMustChangeControl.(*ldap.ControlVChuPasswordMustChange) - } - - if passwordMustChange != nil && passwordMustChange.MustChange { - log.Printf("Password Must be changed.\n") - } - - passwordWarningControl := ldap.FindControl(r.Controls, ldap.ControlTypeVChuPasswordWarning) - - var passwordWarning *ldap.ControlVChuPasswordWarning - if passwordWarningControl != nil { - passwordWarning = passwordWarningControl.(*ldap.ControlVChuPasswordWarning) - } else { - log.Printf("ppolicyControl response not available.\n") - } - if err != nil { - log.Print("ERROR: Cannot bind: " + err.Error()) - } else { - logStr := "Login Ok" - if passwordWarning != nil { - if passwordWarning.Expire >= 0 { - logStr += fmt.Sprintf(". Password expires in %d seconds\n", passwordWarning.Expire) - } - } - log.Print(logStr) - } -} diff --git a/vendor/github.com/go-ldap/ldap/filter_test.go b/vendor/github.com/go-ldap/ldap/filter_test.go deleted file mode 100644 index 2b019ac5dda..00000000000 --- a/vendor/github.com/go-ldap/ldap/filter_test.go +++ /dev/null @@ -1,254 +0,0 @@ -package ldap_test - -import ( - "strings" - "testing" - - "gopkg.in/asn1-ber.v1" - "gopkg.in/ldap.v2" -) - -type compileTest struct { - filterStr string - - expectedFilter string - expectedType int - expectedErr string -} - -var testFilters = []compileTest{ - compileTest{ - filterStr: "(&(sn=Miller)(givenName=Bob))", - expectedFilter: "(&(sn=Miller)(givenName=Bob))", - expectedType: ldap.FilterAnd, - }, - compileTest{ - filterStr: "(|(sn=Miller)(givenName=Bob))", - expectedFilter: "(|(sn=Miller)(givenName=Bob))", - expectedType: ldap.FilterOr, - }, - compileTest{ - filterStr: "(!(sn=Miller))", - expectedFilter: "(!(sn=Miller))", - expectedType: ldap.FilterNot, - }, - compileTest{ - filterStr: "(sn=Miller)", - expectedFilter: "(sn=Miller)", - expectedType: ldap.FilterEqualityMatch, - }, - compileTest{ - filterStr: "(sn=Mill*)", - expectedFilter: "(sn=Mill*)", - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn=*Mill)", - expectedFilter: "(sn=*Mill)", - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn=*Mill*)", - expectedFilter: "(sn=*Mill*)", - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn=*i*le*)", - expectedFilter: "(sn=*i*le*)", - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn=Mi*l*r)", - expectedFilter: "(sn=Mi*l*r)", - expectedType: ldap.FilterSubstrings, - }, - // substring filters escape properly - compileTest{ - filterStr: `(sn=Mi*함*r)`, - expectedFilter: `(sn=Mi*\ed\95\a8*r)`, - expectedType: ldap.FilterSubstrings, - }, - // already escaped substring filters don't get double-escaped - compileTest{ - filterStr: `(sn=Mi*\ed\95\a8*r)`, - expectedFilter: `(sn=Mi*\ed\95\a8*r)`, - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn=Mi*le*)", - expectedFilter: "(sn=Mi*le*)", - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn=*i*ler)", - expectedFilter: "(sn=*i*ler)", - expectedType: ldap.FilterSubstrings, - }, - compileTest{ - filterStr: "(sn>=Miller)", - expectedFilter: "(sn>=Miller)", - expectedType: ldap.FilterGreaterOrEqual, - }, - compileTest{ - filterStr: "(sn<=Miller)", - expectedFilter: "(sn<=Miller)", - expectedType: ldap.FilterLessOrEqual, - }, - compileTest{ - filterStr: "(sn=*)", - expectedFilter: "(sn=*)", - expectedType: ldap.FilterPresent, - }, - compileTest{ - filterStr: "(sn~=Miller)", - expectedFilter: "(sn~=Miller)", - expectedType: ldap.FilterApproxMatch, - }, - compileTest{ - filterStr: `(objectGUID='\fc\fe\a3\ab\f9\90N\aaGm\d5I~\d12)`, - expectedFilter: `(objectGUID='\fc\fe\a3\ab\f9\90N\aaGm\d5I~\d12)`, - expectedType: ldap.FilterEqualityMatch, - }, - compileTest{ - filterStr: `(objectGUID=абвгдеёжзийклмнопрстуфхцчшщъыьэюя)`, - expectedFilter: `(objectGUID=\d0\b0\d0\b1\d0\b2\d0\b3\d0\b4\d0\b5\d1\91\d0\b6\d0\b7\d0\b8\d0\b9\d0\ba\d0\bb\d0\bc\d0\bd\d0\be\d0\bf\d1\80\d1\81\d1\82\d1\83\d1\84\d1\85\d1\86\d1\87\d1\88\d1\89\d1\8a\d1\8b\d1\8c\d1\8d\d1\8e\d1\8f)`, - expectedType: ldap.FilterEqualityMatch, - }, - compileTest{ - filterStr: `(objectGUID=함수목록)`, - expectedFilter: `(objectGUID=\ed\95\a8\ec\88\98\eb\aa\a9\eb\a1\9d)`, - expectedType: ldap.FilterEqualityMatch, - }, - compileTest{ - filterStr: `(objectGUID=`, - expectedFilter: ``, - expectedType: 0, - expectedErr: "unexpected end of filter", - }, - compileTest{ - filterStr: `(objectGUID=함수목록`, - expectedFilter: ``, - expectedType: 0, - expectedErr: "unexpected end of filter", - }, - compileTest{ - filterStr: `((cn=)`, - expectedFilter: ``, - expectedType: 0, - expectedErr: "unexpected end of filter", - }, - compileTest{ - filterStr: `(&(objectclass=inetorgperson)(cn=中文))`, - expectedFilter: `(&(objectclass=inetorgperson)(cn=\e4\b8\ad\e6\96\87))`, - expectedType: 0, - }, - // attr extension - compileTest{ - filterStr: `(memberOf:=foo)`, - expectedFilter: `(memberOf:=foo)`, - expectedType: ldap.FilterExtensibleMatch, - }, - // attr+named matching rule extension - compileTest{ - filterStr: `(memberOf:test:=foo)`, - expectedFilter: `(memberOf:test:=foo)`, - expectedType: ldap.FilterExtensibleMatch, - }, - // attr+oid matching rule extension - compileTest{ - filterStr: `(cn:1.2.3.4.5:=Fred Flintstone)`, - expectedFilter: `(cn:1.2.3.4.5:=Fred Flintstone)`, - expectedType: ldap.FilterExtensibleMatch, - }, - // attr+dn+oid matching rule extension - compileTest{ - filterStr: `(sn:dn:2.4.6.8.10:=Barney Rubble)`, - expectedFilter: `(sn:dn:2.4.6.8.10:=Barney Rubble)`, - expectedType: ldap.FilterExtensibleMatch, - }, - // attr+dn extension - compileTest{ - filterStr: `(o:dn:=Ace Industry)`, - expectedFilter: `(o:dn:=Ace Industry)`, - expectedType: ldap.FilterExtensibleMatch, - }, - // dn extension - compileTest{ - filterStr: `(:dn:2.4.6.8.10:=Dino)`, - expectedFilter: `(:dn:2.4.6.8.10:=Dino)`, - expectedType: ldap.FilterExtensibleMatch, - }, - compileTest{ - filterStr: `(memberOf:1.2.840.113556.1.4.1941:=CN=User1,OU=blah,DC=mydomain,DC=net)`, - expectedFilter: `(memberOf:1.2.840.113556.1.4.1941:=CN=User1,OU=blah,DC=mydomain,DC=net)`, - expectedType: ldap.FilterExtensibleMatch, - }, - - // compileTest{ filterStr: "()", filterType: FilterExtensibleMatch }, -} - -var testInvalidFilters = []string{ - `(objectGUID=\zz)`, - `(objectGUID=\a)`, -} - -func TestFilter(t *testing.T) { - // Test Compiler and Decompiler - for _, i := range testFilters { - filter, err := ldap.CompileFilter(i.filterStr) - if err != nil { - if i.expectedErr == "" || !strings.Contains(err.Error(), i.expectedErr) { - t.Errorf("Problem compiling '%s' - '%v' (expected error to contain '%v')", i.filterStr, err, i.expectedErr) - } - } else if filter.Tag != ber.Tag(i.expectedType) { - t.Errorf("%q Expected %q got %q", i.filterStr, ldap.FilterMap[uint64(i.expectedType)], ldap.FilterMap[uint64(filter.Tag)]) - } else { - o, err := ldap.DecompileFilter(filter) - if err != nil { - t.Errorf("Problem compiling %s - %s", i.filterStr, err.Error()) - } else if i.expectedFilter != o { - t.Errorf("%q expected, got %q", i.expectedFilter, o) - } - } - } -} - -func TestInvalidFilter(t *testing.T) { - for _, filterStr := range testInvalidFilters { - if _, err := ldap.CompileFilter(filterStr); err == nil { - t.Errorf("Problem compiling %s - expected err", filterStr) - } - } -} - -func BenchmarkFilterCompile(b *testing.B) { - b.StopTimer() - filters := make([]string, len(testFilters)) - - // Test Compiler and Decompiler - for idx, i := range testFilters { - filters[idx] = i.filterStr - } - - maxIdx := len(filters) - b.StartTimer() - for i := 0; i < b.N; i++ { - ldap.CompileFilter(filters[i%maxIdx]) - } -} - -func BenchmarkFilterDecompile(b *testing.B) { - b.StopTimer() - filters := make([]*ber.Packet, len(testFilters)) - - // Test Compiler and Decompiler - for idx, i := range testFilters { - filters[idx], _ = ldap.CompileFilter(i.filterStr) - } - - maxIdx := len(filters) - b.StartTimer() - for i := 0; i < b.N; i++ { - ldap.DecompileFilter(filters[i%maxIdx]) - } -} diff --git a/vendor/github.com/go-ldap/ldap/ldap_test.go b/vendor/github.com/go-ldap/ldap/ldap_test.go deleted file mode 100644 index 9f430518001..00000000000 --- a/vendor/github.com/go-ldap/ldap/ldap_test.go +++ /dev/null @@ -1,275 +0,0 @@ -package ldap_test - -import ( - "crypto/tls" - "fmt" - "testing" - - "gopkg.in/ldap.v2" -) - -var ldapServer = "ldap.itd.umich.edu" -var ldapPort = uint16(389) -var ldapTLSPort = uint16(636) -var baseDN = "dc=umich,dc=edu" -var filter = []string{ - "(cn=cis-fac)", - "(&(owner=*)(cn=cis-fac))", - "(&(objectclass=rfc822mailgroup)(cn=*Computer*))", - "(&(objectclass=rfc822mailgroup)(cn=*Mathematics*))"} -var attributes = []string{ - "cn", - "description"} - -func TestDial(t *testing.T) { - fmt.Printf("TestDial: starting...\n") - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Errorf(err.Error()) - return - } - defer l.Close() - fmt.Printf("TestDial: finished...\n") -} - -func TestDialTLS(t *testing.T) { - fmt.Printf("TestDialTLS: starting...\n") - l, err := ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapTLSPort), &tls.Config{InsecureSkipVerify: true}) - if err != nil { - t.Errorf(err.Error()) - return - } - defer l.Close() - fmt.Printf("TestDialTLS: finished...\n") -} - -func TestStartTLS(t *testing.T) { - fmt.Printf("TestStartTLS: starting...\n") - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Errorf(err.Error()) - return - } - err = l.StartTLS(&tls.Config{InsecureSkipVerify: true}) - if err != nil { - t.Errorf(err.Error()) - return - } - fmt.Printf("TestStartTLS: finished...\n") -} - -func TestSearch(t *testing.T) { - fmt.Printf("TestSearch: starting...\n") - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Errorf(err.Error()) - return - } - defer l.Close() - - searchRequest := ldap.NewSearchRequest( - baseDN, - ldap.ScopeWholeSubtree, ldap.DerefAlways, 0, 0, false, - filter[0], - attributes, - nil) - - sr, err := l.Search(searchRequest) - if err != nil { - t.Errorf(err.Error()) - return - } - - fmt.Printf("TestSearch: %s -> num of entries = %d\n", searchRequest.Filter, len(sr.Entries)) -} - -func TestSearchStartTLS(t *testing.T) { - fmt.Printf("TestSearchStartTLS: starting...\n") - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Errorf(err.Error()) - return - } - defer l.Close() - - searchRequest := ldap.NewSearchRequest( - baseDN, - ldap.ScopeWholeSubtree, ldap.DerefAlways, 0, 0, false, - filter[0], - attributes, - nil) - - sr, err := l.Search(searchRequest) - if err != nil { - t.Errorf(err.Error()) - return - } - - fmt.Printf("TestSearchStartTLS: %s -> num of entries = %d\n", searchRequest.Filter, len(sr.Entries)) - - fmt.Printf("TestSearchStartTLS: upgrading with startTLS\n") - err = l.StartTLS(&tls.Config{InsecureSkipVerify: true}) - if err != nil { - t.Errorf(err.Error()) - return - } - - sr, err = l.Search(searchRequest) - if err != nil { - t.Errorf(err.Error()) - return - } - - fmt.Printf("TestSearchStartTLS: %s -> num of entries = %d\n", searchRequest.Filter, len(sr.Entries)) -} - -func TestSearchWithPaging(t *testing.T) { - fmt.Printf("TestSearchWithPaging: starting...\n") - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Errorf(err.Error()) - return - } - defer l.Close() - - err = l.Bind("", "") - if err != nil { - t.Errorf(err.Error()) - return - } - - searchRequest := ldap.NewSearchRequest( - baseDN, - ldap.ScopeWholeSubtree, ldap.DerefAlways, 0, 0, false, - filter[2], - attributes, - nil) - sr, err := l.SearchWithPaging(searchRequest, 5) - if err != nil { - t.Errorf(err.Error()) - return - } - - fmt.Printf("TestSearchWithPaging: %s -> num of entries = %d\n", searchRequest.Filter, len(sr.Entries)) - - searchRequest = ldap.NewSearchRequest( - baseDN, - ldap.ScopeWholeSubtree, ldap.DerefAlways, 0, 0, false, - filter[2], - attributes, - []ldap.Control{ldap.NewControlPaging(5)}) - sr, err = l.SearchWithPaging(searchRequest, 5) - if err != nil { - t.Errorf(err.Error()) - return - } - - fmt.Printf("TestSearchWithPaging: %s -> num of entries = %d\n", searchRequest.Filter, len(sr.Entries)) - - searchRequest = ldap.NewSearchRequest( - baseDN, - ldap.ScopeWholeSubtree, ldap.DerefAlways, 0, 0, false, - filter[2], - attributes, - []ldap.Control{ldap.NewControlPaging(500)}) - sr, err = l.SearchWithPaging(searchRequest, 5) - if err == nil { - t.Errorf("expected an error when paging size in control in search request doesn't match size given in call, got none") - return - } -} - -func searchGoroutine(t *testing.T, l *ldap.Conn, results chan *ldap.SearchResult, i int) { - searchRequest := ldap.NewSearchRequest( - baseDN, - ldap.ScopeWholeSubtree, ldap.DerefAlways, 0, 0, false, - filter[i], - attributes, - nil) - sr, err := l.Search(searchRequest) - if err != nil { - t.Errorf(err.Error()) - results <- nil - return - } - results <- sr -} - -func testMultiGoroutineSearch(t *testing.T, TLS bool, startTLS bool) { - fmt.Printf("TestMultiGoroutineSearch: starting...\n") - var l *ldap.Conn - var err error - if TLS { - l, err = ldap.DialTLS("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapTLSPort), &tls.Config{InsecureSkipVerify: true}) - if err != nil { - t.Errorf(err.Error()) - return - } - defer l.Close() - } else { - l, err = ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Errorf(err.Error()) - return - } - if startTLS { - fmt.Printf("TestMultiGoroutineSearch: using StartTLS...\n") - err := l.StartTLS(&tls.Config{InsecureSkipVerify: true}) - if err != nil { - t.Errorf(err.Error()) - return - } - - } - } - - results := make([]chan *ldap.SearchResult, len(filter)) - for i := range filter { - results[i] = make(chan *ldap.SearchResult) - go searchGoroutine(t, l, results[i], i) - } - for i := range filter { - sr := <-results[i] - if sr == nil { - t.Errorf("Did not receive results from goroutine for %q", filter[i]) - } else { - fmt.Printf("TestMultiGoroutineSearch(%d): %s -> num of entries = %d\n", i, filter[i], len(sr.Entries)) - } - } -} - -func TestMultiGoroutineSearch(t *testing.T) { - testMultiGoroutineSearch(t, false, false) - testMultiGoroutineSearch(t, true, true) - testMultiGoroutineSearch(t, false, true) -} - -func TestEscapeFilter(t *testing.T) { - if got, want := ldap.EscapeFilter("a\x00b(c)d*e\\f"), `a\00b\28c\29d\2ae\5cf`; got != want { - t.Errorf("Got %s, expected %s", want, got) - } - if got, want := ldap.EscapeFilter("Lučić"), `Lu\c4\8di\c4\87`; got != want { - t.Errorf("Got %s, expected %s", want, got) - } -} - -func TestCompare(t *testing.T) { - fmt.Printf("TestCompare: starting...\n") - l, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapServer, ldapPort)) - if err != nil { - t.Fatal(err.Error()) - } - defer l.Close() - - dn := "cn=math mich,ou=User Groups,ou=Groups,dc=umich,dc=edu" - attribute := "cn" - value := "math mich" - - sr, err := l.Compare(dn, attribute, value) - if err != nil { - t.Errorf(err.Error()) - return - } - - fmt.Printf("TestCompare: -> %v\n", sr) -} diff --git a/vendor/github.com/go-ldap/ldap/search_test.go b/vendor/github.com/go-ldap/ldap/search_test.go deleted file mode 100644 index 5f77b22e9a2..00000000000 --- a/vendor/github.com/go-ldap/ldap/search_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package ldap - -import ( - "reflect" - "testing" -) - -// TestNewEntry tests that repeated calls to NewEntry return the same value with the same input -func TestNewEntry(t *testing.T) { - dn := "testDN" - attributes := map[string][]string{ - "alpha": {"value"}, - "beta": {"value"}, - "gamma": {"value"}, - "delta": {"value"}, - "epsilon": {"value"}, - } - executedEntry := NewEntry(dn, attributes) - - iteration := 0 - for { - if iteration == 100 { - break - } - testEntry := NewEntry(dn, attributes) - if !reflect.DeepEqual(executedEntry, testEntry) { - t.Fatalf("subsequent calls to NewEntry did not yield the same result:\n\texpected:\n\t%s\n\tgot:\n\t%s\n", executedEntry, testEntry) - } - iteration = iteration + 1 - } -} diff --git a/vendor/github.com/go-macaron/binding/.gitignore b/vendor/github.com/go-macaron/binding/.gitignore deleted file mode 100644 index 485dee64bcf..00000000000 --- a/vendor/github.com/go-macaron/binding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea diff --git a/vendor/github.com/go-macaron/binding/README.md b/vendor/github.com/go-macaron/binding/README.md deleted file mode 100644 index aeaa5719399..00000000000 --- a/vendor/github.com/go-macaron/binding/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# binding [![Build Status](https://travis-ci.org/go-macaron/binding.svg?branch=master)](https://travis-ci.org/go-macaron/binding) [![Sourcegraph](https://sourcegraph.com/github.com/go-macaron/binding/-/badge.svg)](https://sourcegraph.com/github.com/go-macaron/binding?badge) - -Middleware binding provides request data binding and validation for [Macaron](https://github.com/go-macaron/macaron). - -### Installation - - go get github.com/go-macaron/binding - -## Getting Help - -- [API Reference](https://gowalker.org/github.com/go-macaron/binding) -- [Documentation](http://go-macaron.com/docs/middlewares/binding) - -## Credits - -This package is a modified version of [martini-contrib/binding](https://github.com/martini-contrib/binding). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/gzip/README.md b/vendor/github.com/go-macaron/gzip/README.md deleted file mode 100644 index 0c438a72027..00000000000 --- a/vendor/github.com/go-macaron/gzip/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# gzip [![Build Status](https://travis-ci.org/go-macaron/gzip.svg?branch=master)](https://travis-ci.org/go-macaron/gzip) [![](http://gocover.io/_badge/github.com/go-macaron/gzip)](http://gocover.io/github.com/go-macaron/gzip) - -Middleware gzip provides compress to responses for [Macaron](https://github.com/go-macaron/macaron). - -### Installation - - go get github.com/go-macaron/gzip - -## Getting Help - -- [API Reference](https://gowalker.org/github.com/go-macaron/gzip) -- [Documentation](http://go-macaron.com/docs/middlewares/gzip) - -## Credits - -This package is a modified version of [martini-contrib/gzip](https://github.com/martini-contrib/gzip). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/inject/README.md b/vendor/github.com/go-macaron/inject/README.md deleted file mode 100644 index c65c76955dd..00000000000 --- a/vendor/github.com/go-macaron/inject/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# inject [![Build Status](https://travis-ci.org/go-macaron/inject.svg?branch=master)](https://travis-ci.org/go-macaron/inject) [![](http://gocover.io/_badge/github.com/go-macaron/inject)](http://gocover.io/github.com/go-macaron/inject) - -Package inject provides utilities for mapping and injecting dependencies in various ways. - -**This a modified version of [codegangsta/inject](https://github.com/codegangsta/inject) for special purpose of Macaron** - -**Please use the original version if you need dependency injection feature** - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/.gitignore b/vendor/github.com/go-macaron/session/.gitignore deleted file mode 100644 index 9297dbcd7c4..00000000000 --- a/vendor/github.com/go-macaron/session/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -ledis/tmp.db -nodb/tmp.db \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/README.md b/vendor/github.com/go-macaron/session/README.md deleted file mode 100644 index b11bd4a793d..00000000000 --- a/vendor/github.com/go-macaron/session/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# session [![Build Status](https://travis-ci.org/go-macaron/session.svg?branch=master)](https://travis-ci.org/go-macaron/session) - -Middleware session provides session management for [Macaron](https://github.com/go-macaron/macaron). It can use many session providers, including memory, file, Redis, Memcache, PostgreSQL, MySQL, Couchbase, Ledis and Nodb. - -### Installation - - go get github.com/go-macaron/session - -## Getting Help - -- [API Reference](https://gowalker.org/github.com/go-macaron/session) -- [Documentation](https://go-macaron.com/docs/middlewares/session) - -## Credits - -This package is a modified version of [beego/session](https://github.com/astaxie/beego/tree/master/session). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/memcache/memcache.goconvey b/vendor/github.com/go-macaron/session/memcache/memcache.goconvey deleted file mode 100644 index 8485e986e45..00000000000 --- a/vendor/github.com/go-macaron/session/memcache/memcache.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/mysql/mysql.goconvey b/vendor/github.com/go-macaron/session/mysql/mysql.goconvey deleted file mode 100644 index 8485e986e45..00000000000 --- a/vendor/github.com/go-macaron/session/mysql/mysql.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/postgres/postgres.goconvey b/vendor/github.com/go-macaron/session/postgres/postgres.goconvey deleted file mode 100644 index 8485e986e45..00000000000 --- a/vendor/github.com/go-macaron/session/postgres/postgres.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/vendor/github.com/go-macaron/session/redis/redis.goconvey b/vendor/github.com/go-macaron/session/redis/redis.goconvey deleted file mode 100644 index 8485e986e45..00000000000 --- a/vendor/github.com/go-macaron/session/redis/redis.goconvey +++ /dev/null @@ -1 +0,0 @@ -ignore \ No newline at end of file diff --git a/vendor/github.com/go-sql-driver/mysql/.gitignore b/vendor/github.com/go-sql-driver/mysql/.gitignore deleted file mode 100644 index 2de28da1663..00000000000 --- a/vendor/github.com/go-sql-driver/mysql/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -Icon? -ehthumbs.db -Thumbs.db -.idea diff --git a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md deleted file mode 100644 index 6bcad7eaa17..00000000000 --- a/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md +++ /dev/null @@ -1,119 +0,0 @@ -## Version 1.3 (2016-12-01) - -Changes: - - - Go 1.1 is no longer supported - - Use decimals fields in MySQL to format time types (#249) - - Buffer optimizations (#269) - - TLS ServerName defaults to the host (#283) - - Refactoring (#400, #410, #437) - - Adjusted documentation for second generation CloudSQL (#485) - - Documented DSN system var quoting rules (#502) - - Made statement.Close() calls idempotent to avoid errors in Go 1.6+ (#512) - -New Features: - - - Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249) - - Support for returning table alias on Columns() (#289, #359, #382) - - Placeholder interpolation, can be actived with the DSN parameter `interpolateParams=true` (#309, #318, #490) - - Support for uint64 parameters with high bit set (#332, #345) - - Cleartext authentication plugin support (#327) - - Exported ParseDSN function and the Config struct (#403, #419, #429) - - Read / Write timeouts (#401) - - Support for JSON field type (#414) - - Support for multi-statements and multi-results (#411, #431) - - DSN parameter to set the driver-side max_allowed_packet value manually (#489) - - Native password authentication plugin support (#494, #524) - -Bugfixes: - - - Fixed handling of queries without columns and rows (#255) - - Fixed a panic when SetKeepAlive() failed (#298) - - Handle ERR packets while reading rows (#321) - - Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349) - - Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356) - - Actually zero out bytes in handshake response (#378) - - Fixed race condition in registering LOAD DATA INFILE handler (#383) - - Fixed tests with MySQL 5.7.9+ (#380) - - QueryUnescape TLS config names (#397) - - Fixed "broken pipe" error by writing to closed socket (#390) - - Fixed LOAD LOCAL DATA INFILE buffering (#424) - - Fixed parsing of floats into float64 when placeholders are used (#434) - - Fixed DSN tests with Go 1.7+ (#459) - - Handle ERR packets while waiting for EOF (#473) - - Invalidate connection on error while discarding additional results (#513) - - Allow terminating packets of length 0 (#516) - - -## Version 1.2 (2014-06-03) - -Changes: - - - We switched back to a "rolling release". `go get` installs the current master branch again - - Version v1 of the driver will not be maintained anymore. Go 1.0 is no longer supported by this driver - - Exported errors to allow easy checking from application code - - Enabled TCP Keepalives on TCP connections - - Optimized INFILE handling (better buffer size calculation, lazy init, ...) - - The DSN parser also checks for a missing separating slash - - Faster binary date / datetime to string formatting - - Also exported the MySQLWarning type - - mysqlConn.Close returns the first error encountered instead of ignoring all errors - - writePacket() automatically writes the packet size to the header - - readPacket() uses an iterative approach instead of the recursive approach to merge splitted packets - -New Features: - - - `RegisterDial` allows the usage of a custom dial function to establish the network connection - - Setting the connection collation is possible with the `collation` DSN parameter. This parameter should be preferred over the `charset` parameter - - Logging of critical errors is configurable with `SetLogger` - - Google CloudSQL support - -Bugfixes: - - - Allow more than 32 parameters in prepared statements - - Various old_password fixes - - Fixed TestConcurrent test to pass Go's race detection - - Fixed appendLengthEncodedInteger for large numbers - - Renamed readLengthEnodedString to readLengthEncodedString and skipLengthEnodedString to skipLengthEncodedString (fixed typo) - - -## Version 1.1 (2013-11-02) - -Changes: - - - Go-MySQL-Driver now requires Go 1.1 - - Connections now use the collation `utf8_general_ci` by default. Adding `&charset=UTF8` to the DSN should not be necessary anymore - - Made closing rows and connections error tolerant. This allows for example deferring rows.Close() without checking for errors - - `[]byte(nil)` is now treated as a NULL value. Before, it was treated like an empty string / `[]byte("")` - - DSN parameter values must now be url.QueryEscape'ed. This allows text values to contain special characters, such as '&'. - - Use the IO buffer also for writing. This results in zero allocations (by the driver) for most queries - - Optimized the buffer for reading - - stmt.Query now caches column metadata - - New Logo - - Changed the copyright header to include all contributors - - Improved the LOAD INFILE documentation - - The driver struct is now exported to make the driver directly accessible - - Refactored the driver tests - - Added more benchmarks and moved all to a separate file - - Other small refactoring - -New Features: - - - Added *old_passwords* support: Required in some cases, but must be enabled by adding `allowOldPasswords=true` to the DSN since it is insecure - - Added a `clientFoundRows` parameter: Return the number of matching rows instead of the number of rows changed on UPDATEs - - Added TLS/SSL support: Use a TLS/SSL encrypted connection to the server. Custom TLS configs can be registered and used - -Bugfixes: - - - Fixed MySQL 4.1 support: MySQL 4.1 sends packets with lengths which differ from the specification - - Convert to DB timezone when inserting `time.Time` - - Splitted packets (more than 16MB) are now merged correctly - - Fixed false positive `io.EOF` errors when the data was fully read - - Avoid panics on reuse of closed connections - - Fixed empty string producing false nil values - - Fixed sign byte for positive TIME fields - - -## Version 1.0 (2013-05-14) - -Initial Release diff --git a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md b/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md deleted file mode 100644 index 8fe16bcb497..00000000000 --- a/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -# Contributing Guidelines - -## Reporting Issues - -Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/go-sql-driver/mysql/issues?state=open) or was [recently closed](https://github.com/go-sql-driver/mysql/issues?direction=desc&page=1&sort=updated&state=closed). - -## Contributing Code - -By contributing to this project, you share your code under the Mozilla Public License 2, as specified in the LICENSE file. -Don't forget to add yourself to the AUTHORS file. - -### Code Review - -Everyone is invited to review and comment on pull requests. -If it looks fine to you, comment with "LGTM" (Looks good to me). - -If changes are required, notice the reviewers with "PTAL" (Please take another look) after committing the fixes. - -Before merging the Pull Request, at least one [team member](https://github.com/go-sql-driver?tab=members) must have commented with "LGTM". - -## Development Ideas - -If you are looking for ideas for code contributions, please check our [Development Ideas](https://github.com/go-sql-driver/mysql/wiki/Development-Ideas) Wiki page. diff --git a/vendor/github.com/go-sql-driver/mysql/README.md b/vendor/github.com/go-sql-driver/mysql/README.md deleted file mode 100644 index 299198d533f..00000000000 --- a/vendor/github.com/go-sql-driver/mysql/README.md +++ /dev/null @@ -1,476 +0,0 @@ -# Go-MySQL-Driver - -A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) package - -![Go-MySQL-Driver logo](https://raw.github.com/wiki/go-sql-driver/mysql/gomysql_m.png "Golang Gopher holding the MySQL Dolphin") - ---------------------------------------- - * [Features](#features) - * [Requirements](#requirements) - * [Installation](#installation) - * [Usage](#usage) - * [DSN (Data Source Name)](#dsn-data-source-name) - * [Password](#password) - * [Protocol](#protocol) - * [Address](#address) - * [Parameters](#parameters) - * [Examples](#examples) - * [Connection pool and timeouts](#connection-pool-and-timeouts) - * [context.Context Support](#contextcontext-support) - * [ColumnType Support](#columntype-support) - * [LOAD DATA LOCAL INFILE support](#load-data-local-infile-support) - * [time.Time support](#timetime-support) - * [Unicode support](#unicode-support) - * [Testing / Development](#testing--development) - * [License](#license) - ---------------------------------------- - -## Features - * Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance") - * Native Go implementation. No C-bindings, just pure Go - * Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](https://godoc.org/github.com/go-sql-driver/mysql#DialFunc) - * Automatic handling of broken connections - * Automatic Connection Pooling *(by database/sql package)* - * Supports queries larger than 16MB - * Full [`sql.RawBytes`](https://golang.org/pkg/database/sql/#RawBytes) support. - * Intelligent `LONG DATA` handling in prepared statements - * Secure `LOAD DATA LOCAL INFILE` support with file Whitelisting and `io.Reader` support - * Optional `time.Time` parsing - * Optional placeholder interpolation - -## Requirements - * Go 1.7 or higher. We aim to support the 3 latest versions of Go. - * MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+) - ---------------------------------------- - -## Installation -Simple install the package to your [$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH") with the [go tool](https://golang.org/cmd/go/ "go command") from shell: -```bash -$ go get -u github.com/go-sql-driver/mysql -``` -Make sure [Git is installed](https://git-scm.com/downloads) on your machine and in your system's `PATH`. - -## Usage -_Go MySQL Driver_ is an implementation of Go's `database/sql/driver` interface. You only need to import the driver and can use the full [`database/sql`](https://golang.org/pkg/database/sql/) API then. - -Use `mysql` as `driverName` and a valid [DSN](#dsn-data-source-name) as `dataSourceName`: -```go -import "database/sql" -import _ "github.com/go-sql-driver/mysql" - -db, err := sql.Open("mysql", "user:password@/dbname") -``` - -[Examples are available in our Wiki](https://github.com/go-sql-driver/mysql/wiki/Examples "Go-MySQL-Driver Examples"). - - -### DSN (Data Source Name) - -The Data Source Name has a common format, like e.g. [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php) uses it, but without type-prefix (optional parts marked by squared brackets): -``` -[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] -``` - -A DSN in its fullest form: -``` -username:password@protocol(address)/dbname?param=value -``` - -Except for the databasename, all values are optional. So the minimal DSN is: -``` -/dbname -``` - -If you do not want to preselect a database, leave `dbname` empty: -``` -/ -``` -This has the same effect as an empty DSN string: -``` - -``` - -Alternatively, [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) can be used to create a DSN string by filling a struct. - -#### Password -Passwords can consist of any character. Escaping is **not** necessary. - -#### Protocol -See [net.Dial](https://golang.org/pkg/net/#Dial) for more information which networks are available. -In general you should use an Unix domain socket if available and TCP otherwise for best performance. - -#### Address -For TCP and UDP networks, addresses have the form `host[:port]`. -If `port` is omitted, the default port will be used. -If `host` is a literal IPv6 address, it must be enclosed in square brackets. -The functions [net.JoinHostPort](https://golang.org/pkg/net/#JoinHostPort) and [net.SplitHostPort](https://golang.org/pkg/net/#SplitHostPort) manipulate addresses in this form. - -For Unix domain sockets the address is the absolute path to the MySQL-Server-socket, e.g. `/var/run/mysqld/mysqld.sock` or `/tmp/mysql.sock`. - -#### Parameters -*Parameters are case-sensitive!* - -Notice that any of `true`, `TRUE`, `True` or `1` is accepted to stand for a true boolean value. Not surprisingly, false can be specified as any of: `false`, `FALSE`, `False` or `0`. - -##### `allowAllFiles` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`allowAllFiles=true` disables the file Whitelist for `LOAD DATA LOCAL INFILE` and allows *all* files. -[*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html) - -##### `allowCleartextPasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`allowCleartextPasswords=true` allows using the [cleartext client side plugin](http://dev.mysql.com/doc/en/cleartext-authentication-plugin.html) if required by an account, such as one defined with the [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html). Sending passwords in clear text may be a security problem in some configurations. To avoid problems if there is any possibility that the password would be intercepted, clients should connect to MySQL Server using a method that protects the password. Possibilities include [TLS / SSL](#tls), IPsec, or a private network. - -##### `allowNativePasswords` - -``` -Type: bool -Valid Values: true, false -Default: true -``` -`allowNativePasswords=false` disallows the usage of MySQL native password method. - -##### `allowOldPasswords` - -``` -Type: bool -Valid Values: true, false -Default: false -``` -`allowOldPasswords=true` allows the usage of the insecure old password method. This should be avoided, but is necessary in some cases. See also [the old_passwords wiki page](https://github.com/go-sql-driver/mysql/wiki/old_passwords). - -##### `charset` - -``` -Type: string -Valid Values: -Default: none -``` - -Sets the charset used for client-server interaction (`"SET NAMES "`). If multiple charsets are set (separated by a comma), the following charset is used if setting the charset failes. This enables for example support for `utf8mb4` ([introduced in MySQL 5.5.3](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)) with fallback to `utf8` for older servers (`charset=utf8mb4,utf8`). - -Usage of the `charset` parameter is discouraged because it issues additional queries to the server. -Unless you need the fallback behavior, please use `collation` instead. - -##### `collation` - -``` -Type: string -Valid Values: -Default: utf8_general_ci -``` - -Sets the collation used for client-server interaction on connection. In contrast to `charset`, `collation` does not issue additional queries. If the specified collation is unavailable on the target server, the connection will fail. - -A list of valid charsets for a server is retrievable with `SHOW COLLATION`. - -##### `clientFoundRows` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`clientFoundRows=true` causes an UPDATE to return the number of matching rows instead of the number of rows changed. - -##### `columnsWithAlias` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -When `columnsWithAlias` is true, calls to `sql.Rows.Columns()` will return the table alias and the column name separated by a dot. For example: - -``` -SELECT u.id FROM users as u -``` - -will return `u.id` instead of just `id` if `columnsWithAlias=true`. - -##### `interpolateParams` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -If `interpolateParams` is true, placeholders (`?`) in calls to `db.Query()` and `db.Exec()` are interpolated into a single query string with given parameters. This reduces the number of roundtrips, since the driver has to prepare a statement, execute it with given parameters and close the statement again with `interpolateParams=false`. - -*This can not be used together with the multibyte encodings BIG5, CP932, GB2312, GBK or SJIS. These are blacklisted as they may [introduce a SQL injection vulnerability](http://stackoverflow.com/a/12118602/3430118)!* - -##### `loc` - -``` -Type: string -Valid Values: -Default: UTC -``` - -Sets the location for time.Time values (when using `parseTime=true`). *"Local"* sets the system's location. See [time.LoadLocation](https://golang.org/pkg/time/#LoadLocation) for details. - -Note that this sets the location for time.Time values but does not change MySQL's [time_zone setting](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html). For that see the [time_zone system variable](#system-variables), which can also be set as a DSN parameter. - -Please keep in mind, that param values must be [url.QueryEscape](https://golang.org/pkg/net/url/#QueryEscape)'ed. Alternatively you can manually replace the `/` with `%2F`. For example `US/Pacific` would be `loc=US%2FPacific`. - -##### `maxAllowedPacket` -``` -Type: decimal number -Default: 4194304 -``` - -Max packet size allowed in bytes. The default value is 4 MiB and should be adjusted to match the server settings. `maxAllowedPacket=0` can be used to automatically fetch the `max_allowed_packet` variable from server *on every connection*. - -##### `multiStatements` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -Allow multiple statements in one query. While this allows batch queries, it also greatly increases the risk of SQL injections. Only the result of the first query is returned, all other results are silently discarded. - -When `multiStatements` is used, `?` parameters must only be used in the first statement. - -##### `parseTime` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - -`parseTime=true` changes the output type of `DATE` and `DATETIME` values to `time.Time` instead of `[]byte` / `string` - - -##### `readTimeout` - -``` -Type: duration -Default: 0 -``` - -I/O read timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. - -##### `rejectReadOnly` - -``` -Type: bool -Valid Values: true, false -Default: false -``` - - -`rejectReadOnly=true` causes the driver to reject read-only connections. This -is for a possible race condition during an automatic failover, where the mysql -client gets connected to a read-only replica after the failover. - -Note that this should be a fairly rare case, as an automatic failover normally -happens when the primary is down, and the race condition shouldn't happen -unless it comes back up online as soon as the failover is kicked off. On the -other hand, when this happens, a MySQL application can get stuck on a -read-only connection until restarted. It is however fairly easy to reproduce, -for example, using a manual failover on AWS Aurora's MySQL-compatible cluster. - -If you are not relying on read-only transactions to reject writes that aren't -supposed to happen, setting this on some MySQL providers (such as AWS Aurora) -is safer for failovers. - -Note that ERROR 1290 can be returned for a `read-only` server and this option will -cause a retry for that error. However the same error number is used for some -other cases. You should ensure your application will never cause an ERROR 1290 -except for `read-only` mode when enabling this option. - - -##### `timeout` - -``` -Type: duration -Default: OS default -``` - -Timeout for establishing connections, aka dial timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. - - -##### `tls` - -``` -Type: bool / string -Valid Values: true, false, skip-verify, -Default: false -``` - -`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side). Use a custom value registered with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). - - -##### `writeTimeout` - -``` -Type: duration -Default: 0 -``` - -I/O write timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. - - -##### System Variables - -Any other parameters are interpreted as system variables: - * `=`: `SET =` - * `=`: `SET =` - * `=%27%27`: `SET =''` - -Rules: -* The values for string variables must be quoted with `'`. -* The values must also be [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape)'ed! - (which implies values of string variables must be wrapped with `%27`). - -Examples: - * `autocommit=1`: `SET autocommit=1` - * [`time_zone=%27Europe%2FParis%27`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `SET time_zone='Europe/Paris'` - * [`tx_isolation=%27REPEATABLE-READ%27`](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tx_isolation): `SET tx_isolation='REPEATABLE-READ'` - - -#### Examples -``` -user@unix(/path/to/socket)/dbname -``` - -``` -root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local -``` - -``` -user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true -``` - -Treat warnings as errors by setting the system variable [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html): -``` -user:password@/dbname?sql_mode=TRADITIONAL -``` - -TCP via IPv6: -``` -user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci -``` - -TCP on a remote host, e.g. Amazon RDS: -``` -id:password@tcp(your-amazonaws-uri.com:3306)/dbname -``` - -Google Cloud SQL on App Engine (First Generation MySQL Server): -``` -user@cloudsql(project-id:instance-name)/dbname -``` - -Google Cloud SQL on App Engine (Second Generation MySQL Server): -``` -user@cloudsql(project-id:regionname:instance-name)/dbname -``` - -TCP using default port (3306) on localhost: -``` -user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped -``` - -Use the default protocol (tcp) and host (localhost:3306): -``` -user:password@/dbname -``` - -No Database preselected: -``` -user:password@/ -``` - - -### Connection pool and timeouts -The connection pool is managed by Go's database/sql package. For details on how to configure the size of the pool and how long connections stay in the pool see `*DB.SetMaxOpenConns`, `*DB.SetMaxIdleConns`, and `*DB.SetConnMaxLifetime` in the [database/sql documentation](https://golang.org/pkg/database/sql/). The read, write, and dial timeouts for each individual connection are configured with the DSN parameters [`readTimeout`](#readtimeout), [`writeTimeout`](#writetimeout), and [`timeout`](#timeout), respectively. - -## `ColumnType` Support -This driver supports the [`ColumnType` interface](https://golang.org/pkg/database/sql/#ColumnType) introduced in Go 1.8, with the exception of [`ColumnType.Length()`](https://golang.org/pkg/database/sql/#ColumnType.Length), which is currently not supported. - -## `context.Context` Support -Go 1.8 added `database/sql` support for `context.Context`. This driver supports query timeouts and cancellation via contexts. -See [context support in the database/sql package](https://golang.org/doc/go1.8#database_sql) for more details. - - -### `LOAD DATA LOCAL INFILE` support -For this feature you need direct access to the package. Therefore you must change the import path (no `_`): -```go -import "github.com/go-sql-driver/mysql" -``` - -Files must be whitelisted by registering them with `mysql.RegisterLocalFile(filepath)` (recommended) or the Whitelist check must be deactivated by using the DSN parameter `allowAllFiles=true` ([*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)). - -To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::` then. Choose different names for different handlers and `DeregisterReaderHandler` when you don't need it anymore. - -See the [godoc of Go-MySQL-Driver](https://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation") for details. - - -### `time.Time` support -The default internal output type of MySQL `DATE` and `DATETIME` values is `[]byte` which allows you to scan the value into a `[]byte`, `string` or `sql.RawBytes` variable in your program. - -However, many want to scan MySQL `DATE` and `DATETIME` values into `time.Time` variables, which is the logical opposite in Go to `DATE` and `DATETIME` in MySQL. You can do that by changing the internal output type from `[]byte` to `time.Time` with the DSN parameter `parseTime=true`. You can set the default [`time.Time` location](https://golang.org/pkg/time/#Location) with the `loc` DSN parameter. - -**Caution:** As of Go 1.1, this makes `time.Time` the only variable type you can scan `DATE` and `DATETIME` values into. This breaks for example [`sql.RawBytes` support](https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes). - -Alternatively you can use the [`NullTime`](https://godoc.org/github.com/go-sql-driver/mysql#NullTime) type as the scan destination, which works with both `time.Time` and `string` / `[]byte`. - - -### Unicode support -Since version 1.1 Go-MySQL-Driver automatically uses the collation `utf8_general_ci` by default. - -Other collations / charsets can be set using the [`collation`](#collation) DSN parameter. - -Version 1.0 of the driver recommended adding `&charset=utf8` (alias for `SET NAMES utf8`) to the DSN to enable proper UTF-8 support. This is not necessary anymore. The [`collation`](#collation) parameter should be preferred to set another collation / charset than the default. - -See http://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html for more details on MySQL's Unicode support. - -## Testing / Development -To run the driver tests you may need to adjust the configuration. See the [Testing Wiki-Page](https://github.com/go-sql-driver/mysql/wiki/Testing "Testing") for details. - -Go-MySQL-Driver is not feature-complete yet. Your help is very appreciated. -If you want to contribute, you can work on an [open issue](https://github.com/go-sql-driver/mysql/issues?state=open) or review a [pull request](https://github.com/go-sql-driver/mysql/pulls). - -See the [Contribution Guidelines](https://github.com/go-sql-driver/mysql/blob/master/CONTRIBUTING.md) for details. - ---------------------------------------- - -## License -Go-MySQL-Driver is licensed under the [Mozilla Public License Version 2.0](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) - -Mozilla summarizes the license scope as follows: -> MPL: The copyleft applies to any files containing MPLed code. - - -That means: - * You can **use** the **unchanged** source code both in private and commercially. - * When distributing, you **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0). - * You **needn't publish** the source code of your library as long as the files licensed under the MPL 2.0 are **unchanged**. - -Please read the [MPL 2.0 FAQ](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) if you have further questions regarding the license. - -You can read the full terms here: [LICENSE](https://raw.github.com/go-sql-driver/mysql/master/LICENSE). - -![Go Gopher and MySQL Dolphin](https://raw.github.com/wiki/go-sql-driver/mysql/go-mysql-driver_m.jpg "Golang Gopher transporting the MySQL Dolphin in a wheelbarrow") - diff --git a/vendor/github.com/go-stack/stack/README.md b/vendor/github.com/go-stack/stack/README.md deleted file mode 100644 index f11ccccaa43..00000000000 --- a/vendor/github.com/go-stack/stack/README.md +++ /dev/null @@ -1,38 +0,0 @@ -[![GoDoc](https://godoc.org/github.com/go-stack/stack?status.svg)](https://godoc.org/github.com/go-stack/stack) -[![Go Report Card](https://goreportcard.com/badge/go-stack/stack)](https://goreportcard.com/report/go-stack/stack) -[![TravisCI](https://travis-ci.org/go-stack/stack.svg?branch=master)](https://travis-ci.org/go-stack/stack) -[![Coverage Status](https://coveralls.io/repos/github/go-stack/stack/badge.svg?branch=master)](https://coveralls.io/github/go-stack/stack?branch=master) - -# stack - -Package stack implements utilities to capture, manipulate, and format call -stacks. It provides a simpler API than package runtime. - -The implementation takes care of the minutia and special cases of interpreting -the program counter (pc) values returned by runtime.Callers. - -## Versioning - -Package stack publishes releases via [semver](http://semver.org/) compatible Git -tags prefixed with a single 'v'. The master branch always contains the latest -release. The develop branch contains unreleased commits. - -## Formatting - -Package stack's types implement fmt.Formatter, which provides a simple and -flexible way to declaratively configure formatting when used with logging or -error tracking packages. - -```go -func DoTheThing() { - c := stack.Caller(0) - log.Print(c) // "source.go:10" - log.Printf("%+v", c) // "pkg/path/source.go:10" - log.Printf("%n", c) // "DoTheThing" - - s := stack.Trace().TrimRuntime() - log.Print(s) // "[source.go:15 caller.go:42 main.go:14]" -} -``` - -See the docs for all of the supported formatting options. diff --git a/vendor/github.com/go-xorm/builder/README.md b/vendor/github.com/go-xorm/builder/README.md deleted file mode 100644 index 1628736374d..00000000000 --- a/vendor/github.com/go-xorm/builder/README.md +++ /dev/null @@ -1,175 +0,0 @@ -# SQL builder - -[![CircleCI](https://circleci.com/gh/go-xorm/builder/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/builder/tree/master) - -Package builder is a lightweight and fast SQL builder for Go and XORM. - -Make sure you have installed Go 1.1+ and then: - - go get github.com/go-xorm/builder - -# Insert - -```Go -sql, args, err := Insert(Eq{"c": 1, "d": 2}).Into("table1").ToSQL() -``` - -# Select - -```Go -sql, args, err := Select("c, d").From("table1").Where(Eq{"a": 1}).ToSQL() - -sql, args, err = Select("c, d").From("table1").LeftJoin("table2", Eq{"table1.id": 1}.And(Lt{"table2.id": 3})). - RightJoin("table3", "table2.id = table3.tid").Where(Eq{"a": 1}).ToSQL() -``` - -# Update - -```Go -sql, args, err := Update(Eq{"a": 2}).From("table1").Where(Eq{"a": 1}).ToSQL() -``` - -# Delete - -```Go -sql, args, err := Delete(Eq{"a": 1}).From("table1").ToSQL() -``` - -# Conditions - -* `Eq` is a redefine of a map, you can give one or more conditions to `Eq` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Eq{"a":1}) -// a=? [1] -sql, args, _ := ToSQL(Eq{"b":"c"}.And(Eq{"c": 0})) -// b=? AND c=? ["c", 0] -sql, args, _ := ToSQL(Eq{"b":"c", "c":0}) -// b=? AND c=? ["c", 0] -sql, args, _ := ToSQL(Eq{"b":"c"}.Or(Eq{"b":"d"})) -// b=? OR b=? ["c", "d"] -sql, args, _ := ToSQL(Eq{"b": []string{"c", "d"}}) -// b IN (?,?) ["c", "d"] -sql, args, _ := ToSQL(Eq{"b": 1, "c":[]int{2, 3}}) -// b=? AND c IN (?,?) [1, 2, 3] -``` - -* `Neq` is the same to `Eq` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Neq{"a":1}) -// a<>? [1] -sql, args, _ := ToSQL(Neq{"b":"c"}.And(Neq{"c": 0})) -// b<>? AND c<>? ["c", 0] -sql, args, _ := ToSQL(Neq{"b":"c", "c":0}) -// b<>? AND c<>? ["c", 0] -sql, args, _ := ToSQL(Neq{"b":"c"}.Or(Neq{"b":"d"})) -// b<>? OR b<>? ["c", "d"] -sql, args, _ := ToSQL(Neq{"b": []string{"c", "d"}}) -// b NOT IN (?,?) ["c", "d"] -sql, args, _ := ToSQL(Neq{"b": 1, "c":[]int{2, 3}}) -// b<>? AND c NOT IN (?,?) [1, 2, 3] -``` - -* `Gt`, `Gte`, `Lt`, `Lte` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Gt{"a", 1}.And(Gte{"b", 2})) -// a>? AND b>=? [1, 2] -sql, args, _ := ToSQL(Lt{"a", 1}.Or(Lte{"b", 2})) -// a? [1, %c%, 2] -``` - -* `Or(conds ...Cond)`, Or can connect one or more conditions via Or - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Or(Eq{"a":1}, Like{"b", "c"}, Neq{"d", 2})) -// a=? OR b LIKE ? OR d<>? [1, %c%, 2] -sql, args, _ := ToSQL(Or(Eq{"a":1}, And(Like{"b", "c"}, Neq{"d", 2}))) -// a=? OR (b LIKE ? AND d<>?) [1, %c%, 2] -``` - -* `Between` - -```Go -import . "github.com/go-xorm/builder" - -sql, args, _ := ToSQL(Between{"a", 1, 2}) -// a BETWEEN 1 AND 2 -``` - -* Define yourself conditions - -Since `Cond` is an interface. - -```Go -type Cond interface { - WriteTo(Writer) error - And(...Cond) Cond - Or(...Cond) Cond - IsValid() bool -} -``` - -You can define yourself conditions and compose with other `Cond`. \ No newline at end of file diff --git a/vendor/github.com/go-xorm/builder/circle.yml b/vendor/github.com/go-xorm/builder/circle.yml deleted file mode 100644 index b2a8bfc9ef4..00000000000 --- a/vendor/github.com/go-xorm/builder/circle.yml +++ /dev/null @@ -1,12 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go build -v - - go get -u github.com/golang/lint/golint - -test: - override: - # './...' is a relative pattern which means all subdirectories - - golint ./... - - go test -v -race \ No newline at end of file diff --git a/vendor/github.com/go-xorm/core/.gitignore b/vendor/github.com/go-xorm/core/.gitignore deleted file mode 100644 index 98e6ef67fad..00000000000 --- a/vendor/github.com/go-xorm/core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.db diff --git a/vendor/github.com/go-xorm/core/README.md b/vendor/github.com/go-xorm/core/README.md deleted file mode 100644 index 09b72c74b39..00000000000 --- a/vendor/github.com/go-xorm/core/README.md +++ /dev/null @@ -1,116 +0,0 @@ -Core is a lightweight wrapper of sql.DB. - -[![CircleCI](https://circleci.com/gh/go-xorm/core/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/core/tree/master) - -# Open -```Go -db, _ := core.Open(db, connstr) -``` - -# SetMapper -```Go -db.SetMapper(SameMapper()) -``` - -## Scan usage - -### Scan -```Go -rows, _ := db.Query() -for rows.Next() { - rows.Scan() -} -``` - -### ScanMap -```Go -rows, _ := db.Query() -for rows.Next() { - rows.ScanMap() -``` - -### ScanSlice - -You can use `[]string`, `[][]byte`, `[]interface{}`, `[]*string`, `[]sql.NullString` to ScanSclice. Notice, slice's length should be equal or less than select columns. - -```Go -rows, _ := db.Query() -cols, _ := rows.Columns() -for rows.Next() { - var s = make([]string, len(cols)) - rows.ScanSlice(&s) -} -``` - -```Go -rows, _ := db.Query() -cols, _ := rows.Columns() -for rows.Next() { - var s = make([]*string, len(cols)) - rows.ScanSlice(&s) -} -``` - -### ScanStruct -```Go -rows, _ := db.Query() -for rows.Next() { - rows.ScanStructByName() - rows.ScanStructByIndex() -} -``` - -## Query usage -```Go -rows, err := db.Query("select * from table where name = ?", name) - -user = User{ - Name:"lunny", -} -rows, err := db.QueryStruct("select * from table where name = ?Name", - &user) - -var user = map[string]interface{}{ - "name": "lunny", -} -rows, err = db.QueryMap("select * from table where name = ?name", - &user) -``` - -## QueryRow usage -```Go -row := db.QueryRow("select * from table where name = ?", name) - -user = User{ - Name:"lunny", -} -row := db.QueryRowStruct("select * from table where name = ?Name", - &user) - -var user = map[string]interface{}{ - "name": "lunny", -} -row = db.QueryRowMap("select * from table where name = ?name", - &user) -``` - -## Exec usage -```Go -db.Exec("insert into user (`name`, title, age, alias, nick_name,created) values (?,?,?,?,?,?)", name, title, age, alias...) - -user = User{ - Name:"lunny", - Title:"test", - Age: 18, -} -result, err = db.ExecStruct("insert into user (`name`, title, age, alias, nick_name,created) values (?Name,?Title,?Age,?Alias,?NickName,?Created)", - &user) - -var user = map[string]interface{}{ - "Name": "lunny", - "Title": "test", - "Age": 18, -} -result, err = db.ExecMap("insert into user (`name`, title, age, alias, nick_name,created) values (?Name,?Title,?Age,?Alias,?NickName,?Created)", - &user) -``` \ No newline at end of file diff --git a/vendor/github.com/go-xorm/core/benchmark.sh b/vendor/github.com/go-xorm/core/benchmark.sh deleted file mode 100755 index eab9e57e9fd..00000000000 --- a/vendor/github.com/go-xorm/core/benchmark.sh +++ /dev/null @@ -1 +0,0 @@ -go test -v -bench=. -run=XXX diff --git a/vendor/github.com/go-xorm/core/circle.yml b/vendor/github.com/go-xorm/core/circle.yml deleted file mode 100644 index 006e1230bcc..00000000000 --- a/vendor/github.com/go-xorm/core/circle.yml +++ /dev/null @@ -1,14 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go build -v - -database: - override: - - mysql -u root -e "CREATE DATABASE core_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - -test: - override: - # './...' is a relative pattern which means all subdirectories - - go test -v -race \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/.gitignore b/vendor/github.com/go-xorm/xorm/.gitignore deleted file mode 100644 index b698bc6fffb..00000000000 --- a/vendor/github.com/go-xorm/xorm/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so -*.db - -# 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 - -*.log -.vendor -temp_test.go -.vscode -xorm.test -*.sqlite3 diff --git a/vendor/github.com/go-xorm/xorm/.gitmodules b/vendor/github.com/go-xorm/xorm/.gitmodules deleted file mode 100644 index 75d2c8eaf73..00000000000 --- a/vendor/github.com/go-xorm/xorm/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "docs/manual-en-US"] - path = docs/manual-en-US - url = https://github.com/go-xorm/manual-en-US.git -[submodule "docs/manual-zh-CN"] - path = docs/manual-zh-CN - url = https://github.com/go-xorm/manual-zh-CN.git diff --git a/vendor/github.com/go-xorm/xorm/.gopmfile b/vendor/github.com/go-xorm/xorm/.gopmfile deleted file mode 100644 index ecd6e20e16c..00000000000 --- a/vendor/github.com/go-xorm/xorm/.gopmfile +++ /dev/null @@ -1,2 +0,0 @@ -[target] -path = github.com/go-xorm/xorm \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/CONTRIBUTING.md b/vendor/github.com/go-xorm/xorm/CONTRIBUTING.md deleted file mode 100644 index e0f6cfcdf23..00000000000 --- a/vendor/github.com/go-xorm/xorm/CONTRIBUTING.md +++ /dev/null @@ -1,49 +0,0 @@ -## Contributing to xorm - -`xorm` has a backlog of [pull requests](https://help.github.com/articles/using-pull-requests), but contributions are still very -much welcome. You can help with patch review, submitting bug reports, -or adding new functionality. There is no formal style guide, but -please conform to the style of existing code and general Go formatting -conventions when submitting patches. - -* [fork a repo](https://help.github.com/articles/fork-a-repo) -* [creating a pull request ](https://help.github.com/articles/creating-a-pull-request) - -### Language - -Since `xorm` is a world-wide open source project, please describe your issues or code changes in English as soon as possible. - -### Sign your codes with comments -``` -// !! your comments - -e.g., - -// !lunny! this is comments made by lunny -``` - -### Patch review - -Help review existing open [pull requests](https://help.github.com/articles/using-pull-requests) by commenting on the code or -proposed functionality. - -### Bug reports - -We appreciate any bug reports, but especially ones with self-contained -(doesn't depend on code outside of xorm), minimal (can't be simplified -further) test cases. It's especially helpful if you can submit a pull -request with just the failing test case (you'll probably want to -pattern it after the tests in -[base.go](https://github.com/go-xorm/tests/blob/master/base.go) AND -[benchmark.go](https://github.com/go-xorm/tests/blob/master/benchmark.go). - -If you implements a new database interface, you maybe need to add a _test.go file. -For example, [mysql_test.go](https://github.com/go-xorm/tests/blob/master/mysql/mysql_test.go) - -### New functionality - -There are a number of pending patches for new functionality, so -additional feature patches will take a while to merge. Still, patches -are generally reviewed based on usefulness and complexity in addition -to time-in-queue, so if you have a knockout idea, take a shot. Feel -free to open an issue discussion your proposed patch beforehand. diff --git a/vendor/github.com/go-xorm/xorm/README.md b/vendor/github.com/go-xorm/xorm/README.md deleted file mode 100644 index bdcbab68cfa..00000000000 --- a/vendor/github.com/go-xorm/xorm/README.md +++ /dev/null @@ -1,279 +0,0 @@ -[中文](https://github.com/go-xorm/xorm/blob/master/README_CN.md) - -Xorm is a simple and powerful ORM for Go. - -[![CircleCI](https://circleci.com/gh/go-xorm/xorm/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/xorm/tree/master) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-xorm/xorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -# Notice - -The last master version is not backwards compatible. You should use `engine.ShowSQL()` and `engine.Logger().SetLevel()` instead of `engine.ShowSQL = `, `engine.ShowInfo = ` and so on. - -# Features - -* Struct <-> Table Mapping Support - -* Chainable APIs - -* Transaction Support - -* Both ORM and raw SQL operation Support - -* Sync database schema Support - -* Query Cache speed up - -* Database Reverse support, See [Xorm Tool README](https://github.com/go-xorm/cmd/blob/master/README.md) - -* Simple cascade loading support - -* Optimistic Locking support - -* SQL Builder support via [github.com/go-xorm/builder](https://github.com/go-xorm/builder) - -# Drivers Support - -Drivers for Go's sql package which currently support database/sql includes: - -* Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) - -* MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/godrv) - -* Postgres: [github.com/lib/pq](https://github.com/lib/pq) - -* Tidb: [github.com/pingcap/tidb](https://github.com/pingcap/tidb) - -* SQLite: [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) - -* MsSql: [github.com/denisenkom/go-mssqldb](https://github.com/denisenkom/go-mssqldb) - -* Oracle: [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) (experiment) - -# Changelog - -* **v0.6.0** - * remove support for ql - * add query condition builder support via [github.com/go-xorm/builder](https://github.com/go-xorm/builder), so `Where`, `And`, `Or` -methods can use `builder.Cond` as parameter - * add Sum, SumInt, SumInt64 and NotIn methods - * some bugs fixed - -* **v0.5.0** - * logging interface changed - * some bugs fixed - -* **v0.4.5** - * many bugs fixed - * extends support unlimited deepth - * Delete Limit support - -* **v0.4.4** - * ql database expriment support - * tidb database expriment support - * sql.NullString and etc. field support - * select ForUpdate support - * many bugs fixed - -[More changes ...](https://github.com/go-xorm/manual-en-US/tree/master/chapter-16) - -# Installation - - go get github.com/go-xorm/xorm - -# Documents - -* [Manual](http://xorm.io/docs) - -* [GoDoc](http://godoc.org/github.com/go-xorm/xorm) - -* [GoWalker](http://gowalker.org/github.com/go-xorm/xorm) - -# Quick Start - -* Create Engine - -```Go -engine, err := xorm.NewEngine(driverName, dataSourceName) -``` - -* Define a struct and Sync2 table struct to database - -```Go -type User struct { - Id int64 - Name string - Salt string - Age int - Passwd string `xorm:"varchar(200)"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` -} - -err := engine.Sync2(new(User)) -``` - -* Query a SQL string, the returned results is []map[string][]byte - -```Go -results, err := engine.Query("select * from user") -``` - -* Execute a SQL string, the returned results - -```Go -affected, err := engine.Exec("update user set age = ? where name = ?", age, name) -``` - -* Insert one or multiple records to database - -```Go -affected, err := engine.Insert(&user) -// INSERT INTO struct () values () -affected, err := engine.Insert(&user1, &user2) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values () -affected, err := engine.Insert(&users) -// INSERT INTO struct () values (),(),() -affected, err := engine.Insert(&user1, &users) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values (),(),() -``` - -* Query one record from database - -```Go -has, err := engine.Get(&user) -// SELECT * FROM user LIMIT 1 -has, err := engine.Where("name = ?", name).Desc("id").Get(&user) -// SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1 -``` - -* Query multiple records from database, also you can use join and extends - -```Go -var users []User -err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users) -// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10 - -type Detail struct { - Id int64 - UserId int64 `xorm:"index"` -} - -type UserDetail struct { - User `xorm:"extends"` - Detail `xorm:"extends"` -} - -var users []UserDetail -err := engine.Table("user").Select("user.*, detail.*") - Join("INNER", "detail", "detail.user_id = user.id"). - Where("user.name = ?", name).Limit(10, 0). - Find(&users) -// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10 -``` - -* Query multiple records and record by record handle, there are two methods Iterate and Rows - -```Go -err := engine.Iterate(&User{Name:name}, func(idx int, bean interface{}) error { - user := bean.(*User) - return nil -}) -// SELECT * FROM user - -rows, err := engine.Rows(&User{Name:name}) -// SELECT * FROM user -defer rows.Close() -bean := new(Struct) -for rows.Next() { - err = rows.Scan(bean) -} -``` - -* Update one or more records, default will update non-empty and non-zero fields except when you use Cols, AllCols and so on. - -```Go -affected, err := engine.Id(1).Update(&user) -// UPDATE user SET ... Where id = ? - -affected, err := engine.Update(&user, &User{Name:name}) -// UPDATE user SET ... Where name = ? - -var ids = []int64{1, 2, 3} -affected, err := engine.In("id", ids).Update(&user) -// UPDATE user SET ... Where id IN (?, ?, ?) - -// force update indicated columns by Cols -affected, err := engine.Id(1).Cols("age").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -// force NOT update indicated columns by Omit -affected, err := engine.Id(1).Omit("name").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -affected, err := engine.Id(1).AllCols().Update(&user) -// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ? -``` - -* Delete one or more records, Delete MUST have condition - -```Go -affected, err := engine.Where(...).Delete(&user) -// DELETE FROM user Where ... -affected, err := engine.Id(2).Delete(&user) -``` - -* Count records - -```Go -counts, err := engine.Count(&user) -// SELECT count(*) AS total FROM user -``` - -* Query conditions builder - -```Go -err := engine.Where(builder.NotIn("a", 1, 2).And(builder.In("b", "c", "d", "e"))).Find(&users) -// SELECT id, name ... FROM user WHERE a NOT IN (?, ?) AND b IN (?, ?, ?) -``` - -# Cases - -* [github.com/m3ng9i/qreader](https://github.com/m3ng9i/qreader) - -* [Wego](http://github.com/go-tango/wego) - -* [Docker.cn](https://docker.cn/) - -* [Gogs](http://try.gogits.org) - [github.com/gogits/gogs](http://github.com/gogits/gogs) - -* [Gorevel](http://gorevel.cn/) - [github.com/goofcc/gorevel](http://github.com/goofcc/gorevel) - -* [Gowalker](http://gowalker.org) - [github.com/Unknwon/gowalker](http://github.com/Unknwon/gowalker) - -* [Gobuild.io](http://gobuild.io) - [github.com/shxsun/gobuild](http://github.com/shxsun/gobuild) - -* [Sudo China](http://sudochina.com) - [github.com/insionng/toropress](http://github.com/insionng/toropress) - -* [Godaily](http://godaily.org) - [github.com/govc/godaily](http://github.com/govc/godaily) - -* [YouGam](http://www.yougam.com/) - -* [GoCMS - github.com/zzboy/GoCMS](https://github.com/zzdboy/GoCMS) - -* [GoBBS - gobbs.domolo.com](http://gobbs.domolo.com/) - -* [go-blog](http://wangcheng.me) - [github.com/easykoo/go-blog](https://github.com/easykoo/go-blog) - -# Discuss - -Please visit [Xorm on Google Groups](https://groups.google.com/forum/#!forum/xorm) - -# Contributing - -If you want to pull request, please see [CONTRIBUTING](https://github.com/go-xorm/xorm/blob/master/CONTRIBUTING.md) - -# LICENSE - - BSD License - [http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/) diff --git a/vendor/github.com/go-xorm/xorm/README_CN.md b/vendor/github.com/go-xorm/xorm/README_CN.md deleted file mode 100644 index fafef1a5d84..00000000000 --- a/vendor/github.com/go-xorm/xorm/README_CN.md +++ /dev/null @@ -1,280 +0,0 @@ -# xorm - -[English](https://github.com/go-xorm/xorm/blob/master/README.md) - -xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 - -[![CircleCI](https://circleci.com/gh/go-xorm/xorm/tree/master.svg?style=svg)](https://circleci.com/gh/go-xorm/xorm/tree/master) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-xorm/xorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -# 注意 - -最新的版本有不兼容的更新,您必须使用 `engine.ShowSQL()` 和 `engine.Logger().SetLevel()` 来替代 `engine.ShowSQL = `, `engine.ShowInfo = ` 等等。 - -## 特性 - -* 支持Struct和数据库表之间的灵活映射,并支持自动同步 - -* 事务支持 - -* 同时支持原始SQL语句和ORM操作的混合执行 - -* 使用连写来简化调用 - -* 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函数和结构体等方式作为条件 - -* 支持级联加载Struct - -* 支持缓存 - -* 支持根据数据库自动生成xorm的结构体 - -* 支持记录版本(即乐观锁) - -* 内置SQL Builder支持 - -## 驱动支持 - -目前支持的Go数据库驱动和对应的数据库如下: - -* Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) - -* MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/godrv) - -* Postgres: [github.com/lib/pq](https://github.com/lib/pq) - -* Tidb: [github.com/pingcap/tidb](https://github.com/pingcap/tidb) - -* SQLite: [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) - -* MsSql: [github.com/denisenkom/go-mssqldb](https://github.com/denisenkom/go-mssqldb) - -* MsSql: [github.com/lunny/godbc](https://github.com/lunny/godbc) - -* Oracle: [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) (试验性支持) - -## 更新日志 - -* **v0.6.0** - * 去除对 ql 的支持 - * 新增条件查询分析器 [github.com/go-xorm/builder](https://github.com/go-xorm/builder), 从因此 `Where, And, Or` 函数 -将可以用 `builder.Cond` 作为条件组合 - * 新增 Sum, SumInt, SumInt64 和 NotIn 函数 - * Bug修正 - -* **v0.5.0** - * logging接口进行不兼容改变 - * Bug修正 - -* **v0.4.5** - * bug修正 - * extends 支持无限级 - * Delete Limit 支持 - -* **v0.4.4** - * Tidb 数据库支持 - * QL 试验性支持 - * sql.NullString支持 - * ForUpdate 支持 - * bug修正 - -[更多更新日志...](https://github.com/go-xorm/manual-zh-CN/tree/master/chapter-16) - -## 安装 - - go get github.com/go-xorm/xorm - -## 文档 - -* [操作指南](http://xorm.io/docs) - -* [GoWalker代码文档](http://gowalker.org/github.com/go-xorm/xorm) - -* [Godoc代码文档](http://godoc.org/github.com/go-xorm/xorm) - -# 快速开始 - -* 第一步创建引擎,driverName, dataSourceName和database/sql接口相同 - -```Go -engine, err := xorm.NewEngine(driverName, dataSourceName) -``` - -* 定义一个和表同步的结构体,并且自动同步结构体到数据库 - -```Go -type User struct { - Id int64 - Name string - Salt string - Age int - Passwd string `xorm:"varchar(200)"` - Created time.Time `xorm:"created"` - Updated time.Time `xorm:"updated"` -} - -err := engine.Sync2(new(User)) -``` - -* 最原始的也支持SQL语句查询,返回的结果类型为 []map[string][]byte - -```Go -results, err := engine.Query("select * from user") -``` - -* 执行一个SQL语句 - -```Go -affected, err := engine.Exec("update user set age = ? where name = ?", age, name) -``` - -* 插入一条或者多条记录 - -```Go -affected, err := engine.Insert(&user) -// INSERT INTO struct () values () -affected, err := engine.Insert(&user1, &user2) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values () -affected, err := engine.Insert(&users) -// INSERT INTO struct () values (),(),() -affected, err := engine.Insert(&user1, &users) -// INSERT INTO struct1 () values () -// INSERT INTO struct2 () values (),(),() -``` - -* 查询单条记录 - -```Go -has, err := engine.Get(&user) -// SELECT * FROM user LIMIT 1 -has, err := engine.Where("name = ?", name).Desc("id").Get(&user) -// SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1 -``` - -* 查询多条记录,当然可以使用Join和extends来组合使用 - -```Go -var users []User -err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users) -// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10 - -type Detail struct { - Id int64 - UserId int64 `xorm:"index"` -} - -type UserDetail struct { - User `xorm:"extends"` - Detail `xorm:"extends"` -} - -var users []UserDetail -err := engine.Table("user").Select("user.*, detail.*") - Join("INNER", "detail", "detail.user_id = user.id"). - Where("user.name = ?", name).Limit(10, 0). - Find(&users) -// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10 -``` - -* 根据条件遍历数据库,可以有两种方式: Iterate and Rows - -```Go -err := engine.Iterate(&User{Name:name}, func(idx int, bean interface{}) error { - user := bean.(*User) - return nil -}) -// SELECT * FROM user - -rows, err := engine.Rows(&User{Name:name}) -// SELECT * FROM user -defer rows.Close() -bean := new(Struct) -for rows.Next() { - err = rows.Scan(bean) -} -``` - -* 更新数据,除非使用Cols,AllCols函数指明,默认只更新非空和非0的字段 - -```Go -affected, err := engine.Id(1).Update(&user) -// UPDATE user SET ... Where id = ? - -affected, err := engine.Update(&user, &User{Name:name}) -// UPDATE user SET ... Where name = ? - -var ids = []int64{1, 2, 3} -affected, err := engine.In(ids).Update(&user) -// UPDATE user SET ... Where id IN (?, ?, ?) - -// force update indicated columns by Cols -affected, err := engine.Id(1).Cols("age").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -// force NOT update indicated columns by Omit -affected, err := engine.Id(1).Omit("name").Update(&User{Name:name, Age: 12}) -// UPDATE user SET age = ?, updated=? Where id = ? - -affected, err := engine.Id(1).AllCols().Update(&user) -// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ? -``` - -* 删除记录,需要注意,删除必须至少有一个条件,否则会报错。要清空数据库可以用EmptyTable - -```Go -affected, err := engine.Where(...).Delete(&user) -// DELETE FROM user Where ... -``` - -* 获取记录条数 - -```Go -counts, err := engine.Count(&user) -// SELECT count(*) AS total FROM user -``` - -* 条件编辑器 - -```Go -err := engine.Where(builder.NotIn("a", 1, 2).And(builder.In("b", "c", "d", "e"))).Find(&users) -// SELECT id, name ... FROM user WHERE a NOT IN (?, ?) AND b IN (?, ?, ?) -``` - -# 案例 - -* [github.com/m3ng9i/qreader](https://github.com/m3ng9i/qreader) - -* [Wego](http://github.com/go-tango/wego) - -* [Docker.cn](https://docker.cn/) - -* [Gogs](http://try.gogits.org) - [github.com/gogits/gogs](http://github.com/gogits/gogs) - -* [Gowalker](http://gowalker.org) - [github.com/Unknwon/gowalker](http://github.com/Unknwon/gowalker) - -* [Gobuild.io](http://gobuild.io) - [github.com/shxsun/gobuild](http://github.com/shxsun/gobuild) - -* [Sudo China](http://sudochina.com) - [github.com/insionng/toropress](http://github.com/insionng/toropress) - -* [Godaily](http://godaily.org) - [github.com/govc/godaily](http://github.com/govc/godaily) - -* [YouGam](http://www.yougam.com/) - -* [GoCMS - github.com/zzboy/GoCMS](https://github.com/zzdboy/GoCMS) - -* [GoBBS - gobbs.domolo.com](http://gobbs.domolo.com/) - -* [go-blog](http://wangcheng.me) - [github.com/easykoo/go-blog](https://github.com/easykoo/go-blog) - -## 讨论 - -请加入QQ群:280360085 进行讨论。 - -## 贡献 - -如果您也想为Xorm贡献您的力量,请查看 [CONTRIBUTING](https://github.com/go-xorm/xorm/blob/master/CONTRIBUTING.md) - -## LICENSE - -BSD License -[http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/) diff --git a/vendor/github.com/go-xorm/xorm/VERSION b/vendor/github.com/go-xorm/xorm/VERSION deleted file mode 100644 index 22c1aa4d020..00000000000 --- a/vendor/github.com/go-xorm/xorm/VERSION +++ /dev/null @@ -1 +0,0 @@ -xorm v0.6.0.1022 \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/circle.yml b/vendor/github.com/go-xorm/xorm/circle.yml deleted file mode 100644 index 8faa627d102..00000000000 --- a/vendor/github.com/go-xorm/xorm/circle.yml +++ /dev/null @@ -1,25 +0,0 @@ -dependencies: - override: - # './...' is a relative pattern which means all subdirectories - - go get -t -d -v ./... - - go get -t -d -v github.com/go-xorm/tests - - go build -v - -database: - override: - - mysql -u root -e "CREATE DATABASE xorm_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - mysql -u root -e "CREATE DATABASE xorm_test3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" - - createdb -p 5432 -e -U postgres xorm_test - - createdb -p 5432 -e -U postgres xorm_test1 - - createdb -p 5432 -e -U postgres xorm_test2 - - createdb -p 5432 -e -U postgres xorm_test3 - -test: - override: - # './...' is a relative pattern which means all subdirectories - - go test -v -race - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./sqlite3.sh - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./mysql.sh - - cd /home/ubuntu/.go_workspace/src/github.com/go-xorm/tests && ./postgres.sh \ No newline at end of file diff --git a/vendor/github.com/go-xorm/xorm/gen_reserved.sh b/vendor/github.com/go-xorm/xorm/gen_reserved.sh deleted file mode 100755 index 434a1bfcb00..00000000000 --- a/vendor/github.com/go-xorm/xorm/gen_reserved.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -if [ -f $1 ];then - cat $1| awk '{printf("\""$1"\":true,\n")}' -else - echo "argument $1 if not a file!" -fi diff --git a/vendor/github.com/go-xorm/xorm/pg_reserved.txt b/vendor/github.com/go-xorm/xorm/pg_reserved.txt deleted file mode 100644 index 720ed377ba0..00000000000 --- a/vendor/github.com/go-xorm/xorm/pg_reserved.txt +++ /dev/null @@ -1,746 +0,0 @@ -A non-reserved non-reserved -ABORT non-reserved -ABS reserved reserved -ABSENT non-reserved non-reserved -ABSOLUTE non-reserved non-reserved non-reserved reserved -ACCESS non-reserved -ACCORDING non-reserved non-reserved -ACTION non-reserved non-reserved non-reserved reserved -ADA non-reserved non-reserved non-reserved -ADD non-reserved non-reserved non-reserved reserved -ADMIN non-reserved non-reserved non-reserved -AFTER non-reserved non-reserved non-reserved -AGGREGATE non-reserved -ALL reserved reserved reserved reserved -ALLOCATE reserved reserved reserved -ALSO non-reserved -ALTER non-reserved reserved reserved reserved -ALWAYS non-reserved non-reserved non-reserved -ANALYSE reserved -ANALYZE reserved -AND reserved reserved reserved reserved -ANY reserved reserved reserved reserved -ARE reserved reserved reserved -ARRAY reserved reserved reserved -ARRAY_AGG reserved reserved -ARRAY_MAX_CARDINALITY reserved -AS reserved reserved reserved reserved -ASC reserved non-reserved non-reserved reserved -ASENSITIVE reserved reserved -ASSERTION non-reserved non-reserved non-reserved reserved -ASSIGNMENT non-reserved non-reserved non-reserved -ASYMMETRIC reserved reserved reserved -AT non-reserved reserved reserved reserved -ATOMIC reserved reserved -ATTRIBUTE non-reserved non-reserved non-reserved -ATTRIBUTES non-reserved non-reserved -AUTHORIZATION reserved (can be function or type) reserved reserved reserved -AVG reserved reserved reserved -BACKWARD non-reserved -BASE64 non-reserved non-reserved -BEFORE non-reserved non-reserved non-reserved -BEGIN non-reserved reserved reserved reserved -BEGIN_FRAME reserved -BEGIN_PARTITION reserved -BERNOULLI non-reserved non-reserved -BETWEEN non-reserved (cannot be function or type) reserved reserved reserved -BIGINT non-reserved (cannot be function or type) reserved reserved -BINARY reserved (can be function or type) reserved reserved -BIT non-reserved (cannot be function or type) reserved -BIT_LENGTH reserved -BLOB reserved reserved -BLOCKED non-reserved non-reserved -BOM non-reserved non-reserved -BOOLEAN non-reserved (cannot be function or type) reserved reserved -BOTH reserved reserved reserved reserved -BREADTH non-reserved non-reserved -BY non-reserved reserved reserved reserved -C non-reserved non-reserved non-reserved -CACHE non-reserved -CALL reserved reserved -CALLED non-reserved reserved reserved -CARDINALITY reserved reserved -CASCADE non-reserved non-reserved non-reserved reserved -CASCADED non-reserved reserved reserved reserved -CASE reserved reserved reserved reserved -CAST reserved reserved reserved reserved -CATALOG non-reserved non-reserved non-reserved reserved -CATALOG_NAME non-reserved non-reserved non-reserved -CEIL reserved reserved -CEILING reserved reserved -CHAIN non-reserved non-reserved non-reserved -CHAR non-reserved (cannot be function or type) reserved reserved reserved -CHARACTER non-reserved (cannot be function or type) reserved reserved reserved -CHARACTERISTICS non-reserved non-reserved non-reserved -CHARACTERS non-reserved non-reserved -CHARACTER_LENGTH reserved reserved reserved -CHARACTER_SET_CATALOG non-reserved non-reserved non-reserved -CHARACTER_SET_NAME non-reserved non-reserved non-reserved -CHARACTER_SET_SCHEMA non-reserved non-reserved non-reserved -CHAR_LENGTH reserved reserved reserved -CHECK reserved reserved reserved reserved -CHECKPOINT non-reserved -CLASS non-reserved -CLASS_ORIGIN non-reserved non-reserved non-reserved -CLOB reserved reserved -CLOSE non-reserved reserved reserved reserved -CLUSTER non-reserved -COALESCE non-reserved (cannot be function or type) reserved reserved reserved -COBOL non-reserved non-reserved non-reserved -COLLATE reserved reserved reserved reserved -COLLATION reserved (can be function or type) non-reserved non-reserved reserved -COLLATION_CATALOG non-reserved non-reserved non-reserved -COLLATION_NAME non-reserved non-reserved non-reserved -COLLATION_SCHEMA non-reserved non-reserved non-reserved -COLLECT reserved reserved -COLUMN reserved reserved reserved reserved -COLUMNS non-reserved non-reserved -COLUMN_NAME non-reserved non-reserved non-reserved -COMMAND_FUNCTION non-reserved non-reserved non-reserved -COMMAND_FUNCTION_CODE non-reserved non-reserved -COMMENT non-reserved -COMMENTS non-reserved -COMMIT non-reserved reserved reserved reserved -COMMITTED non-reserved non-reserved non-reserved non-reserved -CONCURRENTLY reserved (can be function or type) -CONDITION reserved reserved -CONDITION_NUMBER non-reserved non-reserved non-reserved -CONFIGURATION non-reserved -CONNECT reserved reserved reserved -CONNECTION non-reserved non-reserved non-reserved reserved -CONNECTION_NAME non-reserved non-reserved non-reserved -CONSTRAINT reserved reserved reserved reserved -CONSTRAINTS non-reserved non-reserved non-reserved reserved -CONSTRAINT_CATALOG non-reserved non-reserved non-reserved -CONSTRAINT_NAME non-reserved non-reserved non-reserved -CONSTRAINT_SCHEMA non-reserved non-reserved non-reserved -CONSTRUCTOR non-reserved non-reserved -CONTAINS reserved non-reserved -CONTENT non-reserved non-reserved non-reserved -CONTINUE non-reserved non-reserved non-reserved reserved -CONTROL non-reserved non-reserved -CONVERSION non-reserved -CONVERT reserved reserved reserved -COPY non-reserved -CORR reserved reserved -CORRESPONDING reserved reserved reserved -COST non-reserved -COUNT reserved reserved reserved -COVAR_POP reserved reserved -COVAR_SAMP reserved reserved -CREATE reserved reserved reserved reserved -CROSS reserved (can be function or type) reserved reserved reserved -CSV non-reserved -CUBE reserved reserved -CUME_DIST reserved reserved -CURRENT non-reserved reserved reserved reserved -CURRENT_CATALOG reserved reserved reserved -CURRENT_DATE reserved reserved reserved reserved -CURRENT_DEFAULT_TRANSFORM_GROUP reserved reserved -CURRENT_PATH reserved reserved -CURRENT_ROLE reserved reserved reserved -CURRENT_ROW reserved -CURRENT_SCHEMA reserved (can be function or type) reserved reserved -CURRENT_TIME reserved reserved reserved reserved -CURRENT_TIMESTAMP reserved reserved reserved reserved -CURRENT_TRANSFORM_GROUP_FOR_TYPE reserved reserved -CURRENT_USER reserved reserved reserved reserved -CURSOR non-reserved reserved reserved reserved -CURSOR_NAME non-reserved non-reserved non-reserved -CYCLE non-reserved reserved reserved -DATA non-reserved non-reserved non-reserved non-reserved -DATABASE non-reserved -DATALINK reserved reserved -DATE reserved reserved reserved -DATETIME_INTERVAL_CODE non-reserved non-reserved non-reserved -DATETIME_INTERVAL_PRECISION non-reserved non-reserved non-reserved -DAY non-reserved reserved reserved reserved -DB non-reserved non-reserved -DEALLOCATE non-reserved reserved reserved reserved -DEC non-reserved (cannot be function or type) reserved reserved reserved -DECIMAL non-reserved (cannot be function or type) reserved reserved reserved -DECLARE non-reserved reserved reserved reserved -DEFAULT reserved reserved reserved reserved -DEFAULTS non-reserved non-reserved non-reserved -DEFERRABLE reserved non-reserved non-reserved reserved -DEFERRED non-reserved non-reserved non-reserved reserved -DEFINED non-reserved non-reserved -DEFINER non-reserved non-reserved non-reserved -DEGREE non-reserved non-reserved -DELETE non-reserved reserved reserved reserved -DELIMITER non-reserved -DELIMITERS non-reserved -DENSE_RANK reserved reserved -DEPTH non-reserved non-reserved -DEREF reserved reserved -DERIVED non-reserved non-reserved -DESC reserved non-reserved non-reserved reserved -DESCRIBE reserved reserved reserved -DESCRIPTOR non-reserved non-reserved reserved -DETERMINISTIC reserved reserved -DIAGNOSTICS non-reserved non-reserved reserved -DICTIONARY non-reserved -DISABLE non-reserved -DISCARD non-reserved -DISCONNECT reserved reserved reserved -DISPATCH non-reserved non-reserved -DISTINCT reserved reserved reserved reserved -DLNEWCOPY reserved reserved -DLPREVIOUSCOPY reserved reserved -DLURLCOMPLETE reserved reserved -DLURLCOMPLETEONLY reserved reserved -DLURLCOMPLETEWRITE reserved reserved -DLURLPATH reserved reserved -DLURLPATHONLY reserved reserved -DLURLPATHWRITE reserved reserved -DLURLSCHEME reserved reserved -DLURLSERVER reserved reserved -DLVALUE reserved reserved -DO reserved -DOCUMENT non-reserved non-reserved non-reserved -DOMAIN non-reserved non-reserved non-reserved reserved -DOUBLE non-reserved reserved reserved reserved -DROP non-reserved reserved reserved reserved -DYNAMIC reserved reserved -DYNAMIC_FUNCTION non-reserved non-reserved non-reserved -DYNAMIC_FUNCTION_CODE non-reserved non-reserved -EACH non-reserved reserved reserved -ELEMENT reserved reserved -ELSE reserved reserved reserved reserved -EMPTY non-reserved non-reserved -ENABLE non-reserved -ENCODING non-reserved non-reserved non-reserved -ENCRYPTED non-reserved -END reserved reserved reserved reserved -END-EXEC reserved reserved reserved -END_FRAME reserved -END_PARTITION reserved -ENFORCED non-reserved -ENUM non-reserved -EQUALS reserved non-reserved -ESCAPE non-reserved reserved reserved reserved -EVENT non-reserved -EVERY reserved reserved -EXCEPT reserved reserved reserved reserved -EXCEPTION reserved -EXCLUDE non-reserved non-reserved non-reserved -EXCLUDING non-reserved non-reserved non-reserved -EXCLUSIVE non-reserved -EXEC reserved reserved reserved -EXECUTE non-reserved reserved reserved reserved -EXISTS non-reserved (cannot be function or type) reserved reserved reserved -EXP reserved reserved -EXPLAIN non-reserved -EXPRESSION non-reserved -EXTENSION non-reserved -EXTERNAL non-reserved reserved reserved reserved -EXTRACT non-reserved (cannot be function or type) reserved reserved reserved -FALSE reserved reserved reserved reserved -FAMILY non-reserved -FETCH reserved reserved reserved reserved -FILE non-reserved non-reserved -FILTER reserved reserved -FINAL non-reserved non-reserved -FIRST non-reserved non-reserved non-reserved reserved -FIRST_VALUE reserved reserved -FLAG non-reserved non-reserved -FLOAT non-reserved (cannot be function or type) reserved reserved reserved -FLOOR reserved reserved -FOLLOWING non-reserved non-reserved non-reserved -FOR reserved reserved reserved reserved -FORCE non-reserved -FOREIGN reserved reserved reserved reserved -FORTRAN non-reserved non-reserved non-reserved -FORWARD non-reserved -FOUND non-reserved non-reserved reserved -FRAME_ROW reserved -FREE reserved reserved -FREEZE reserved (can be function or type) -FROM reserved reserved reserved reserved -FS non-reserved non-reserved -FULL reserved (can be function or type) reserved reserved reserved -FUNCTION non-reserved reserved reserved -FUNCTIONS non-reserved -FUSION reserved reserved -G non-reserved non-reserved -GENERAL non-reserved non-reserved -GENERATED non-reserved non-reserved -GET reserved reserved reserved -GLOBAL non-reserved reserved reserved reserved -GO non-reserved non-reserved reserved -GOTO non-reserved non-reserved reserved -GRANT reserved reserved reserved reserved -GRANTED non-reserved non-reserved non-reserved -GREATEST non-reserved (cannot be function or type) -GROUP reserved reserved reserved reserved -GROUPING reserved reserved -GROUPS reserved -HANDLER non-reserved -HAVING reserved reserved reserved reserved -HEADER non-reserved -HEX non-reserved non-reserved -HIERARCHY non-reserved non-reserved -HOLD non-reserved reserved reserved -HOUR non-reserved reserved reserved reserved -ID non-reserved non-reserved -IDENTITY non-reserved reserved reserved reserved -IF non-reserved -IGNORE non-reserved non-reserved -ILIKE reserved (can be function or type) -IMMEDIATE non-reserved non-reserved non-reserved reserved -IMMEDIATELY non-reserved -IMMUTABLE non-reserved -IMPLEMENTATION non-reserved non-reserved -IMPLICIT non-reserved -IMPORT reserved reserved -IN reserved reserved reserved reserved -INCLUDING non-reserved non-reserved non-reserved -INCREMENT non-reserved non-reserved non-reserved -INDENT non-reserved non-reserved -INDEX non-reserved -INDEXES non-reserved -INDICATOR reserved reserved reserved -INHERIT non-reserved -INHERITS non-reserved -INITIALLY reserved non-reserved non-reserved reserved -INLINE non-reserved -INNER reserved (can be function or type) reserved reserved reserved -INOUT non-reserved (cannot be function or type) reserved reserved -INPUT non-reserved non-reserved non-reserved reserved -INSENSITIVE non-reserved reserved reserved reserved -INSERT non-reserved reserved reserved reserved -INSTANCE non-reserved non-reserved -INSTANTIABLE non-reserved non-reserved -INSTEAD non-reserved non-reserved non-reserved -INT non-reserved (cannot be function or type) reserved reserved reserved -INTEGER non-reserved (cannot be function or type) reserved reserved reserved -INTEGRITY non-reserved non-reserved -INTERSECT reserved reserved reserved reserved -INTERSECTION reserved reserved -INTERVAL non-reserved (cannot be function or type) reserved reserved reserved -INTO reserved reserved reserved reserved -INVOKER non-reserved non-reserved non-reserved -IS reserved (can be function or type) reserved reserved reserved -ISNULL reserved (can be function or type) -ISOLATION non-reserved non-reserved non-reserved reserved -JOIN reserved (can be function or type) reserved reserved reserved -K non-reserved non-reserved -KEY non-reserved non-reserved non-reserved reserved -KEY_MEMBER non-reserved non-reserved -KEY_TYPE non-reserved non-reserved -LABEL non-reserved -LAG reserved reserved -LANGUAGE non-reserved reserved reserved reserved -LARGE non-reserved reserved reserved -LAST non-reserved non-reserved non-reserved reserved -LAST_VALUE reserved reserved -LATERAL reserved reserved reserved -LC_COLLATE non-reserved -LC_CTYPE non-reserved -LEAD reserved reserved -LEADING reserved reserved reserved reserved -LEAKPROOF non-reserved -LEAST non-reserved (cannot be function or type) -LEFT reserved (can be function or type) reserved reserved reserved -LENGTH non-reserved non-reserved non-reserved -LEVEL non-reserved non-reserved non-reserved reserved -LIBRARY non-reserved non-reserved -LIKE reserved (can be function or type) reserved reserved reserved -LIKE_REGEX reserved reserved -LIMIT reserved non-reserved non-reserved -LINK non-reserved non-reserved -LISTEN non-reserved -LN reserved reserved -LOAD non-reserved -LOCAL non-reserved reserved reserved reserved -LOCALTIME reserved reserved reserved -LOCALTIMESTAMP reserved reserved reserved -LOCATION non-reserved non-reserved non-reserved -LOCATOR non-reserved non-reserved -LOCK non-reserved -LOWER reserved reserved reserved -M non-reserved non-reserved -MAP non-reserved non-reserved -MAPPING non-reserved non-reserved non-reserved -MATCH non-reserved reserved reserved reserved -MATCHED non-reserved non-reserved -MATERIALIZED non-reserved -MAX reserved reserved reserved -MAXVALUE non-reserved non-reserved non-reserved -MAX_CARDINALITY reserved -MEMBER reserved reserved -MERGE reserved reserved -MESSAGE_LENGTH non-reserved non-reserved non-reserved -MESSAGE_OCTET_LENGTH non-reserved non-reserved non-reserved -MESSAGE_TEXT non-reserved non-reserved non-reserved -METHOD reserved reserved -MIN reserved reserved reserved -MINUTE non-reserved reserved reserved reserved -MINVALUE non-reserved non-reserved non-reserved -MOD reserved reserved -MODE non-reserved -MODIFIES reserved reserved -MODULE reserved reserved reserved -MONTH non-reserved reserved reserved reserved -MORE non-reserved non-reserved non-reserved -MOVE non-reserved -MULTISET reserved reserved -MUMPS non-reserved non-reserved non-reserved -NAME non-reserved non-reserved non-reserved non-reserved -NAMES non-reserved non-reserved non-reserved reserved -NAMESPACE non-reserved non-reserved -NATIONAL non-reserved (cannot be function or type) reserved reserved reserved -NATURAL reserved (can be function or type) reserved reserved reserved -NCHAR non-reserved (cannot be function or type) reserved reserved reserved -NCLOB reserved reserved -NESTING non-reserved non-reserved -NEW reserved reserved -NEXT non-reserved non-reserved non-reserved reserved -NFC non-reserved non-reserved -NFD non-reserved non-reserved -NFKC non-reserved non-reserved -NFKD non-reserved non-reserved -NIL non-reserved non-reserved -NO non-reserved reserved reserved reserved -NONE non-reserved (cannot be function or type) reserved reserved -NORMALIZE reserved reserved -NORMALIZED non-reserved non-reserved -NOT reserved reserved reserved reserved -NOTHING non-reserved -NOTIFY non-reserved -NOTNULL reserved (can be function or type) -NOWAIT non-reserved -NTH_VALUE reserved reserved -NTILE reserved reserved -NULL reserved reserved reserved reserved -NULLABLE non-reserved non-reserved non-reserved -NULLIF non-reserved (cannot be function or type) reserved reserved reserved -NULLS non-reserved non-reserved non-reserved -NUMBER non-reserved non-reserved non-reserved -NUMERIC non-reserved (cannot be function or type) reserved reserved reserved -OBJECT non-reserved non-reserved non-reserved -OCCURRENCES_REGEX reserved reserved -OCTETS non-reserved non-reserved -OCTET_LENGTH reserved reserved reserved -OF non-reserved reserved reserved reserved -OFF non-reserved non-reserved non-reserved -OFFSET reserved reserved reserved -OIDS non-reserved -OLD reserved reserved -ON reserved reserved reserved reserved -ONLY reserved reserved reserved reserved -OPEN reserved reserved reserved -OPERATOR non-reserved -OPTION non-reserved non-reserved non-reserved reserved -OPTIONS non-reserved non-reserved non-reserved -OR reserved reserved reserved reserved -ORDER reserved reserved reserved reserved -ORDERING non-reserved non-reserved -ORDINALITY non-reserved non-reserved -OTHERS non-reserved non-reserved -OUT non-reserved (cannot be function or type) reserved reserved -OUTER reserved (can be function or type) reserved reserved reserved -OUTPUT non-reserved non-reserved reserved -OVER reserved (can be function or type) reserved reserved -OVERLAPS reserved (can be function or type) reserved reserved reserved -OVERLAY non-reserved (cannot be function or type) reserved reserved -OVERRIDING non-reserved non-reserved -OWNED non-reserved -OWNER non-reserved -P non-reserved non-reserved -PAD non-reserved non-reserved reserved -PARAMETER reserved reserved -PARAMETER_MODE non-reserved non-reserved -PARAMETER_NAME non-reserved non-reserved -PARAMETER_ORDINAL_POSITION non-reserved non-reserved -PARAMETER_SPECIFIC_CATALOG non-reserved non-reserved -PARAMETER_SPECIFIC_NAME non-reserved non-reserved -PARAMETER_SPECIFIC_SCHEMA non-reserved non-reserved -PARSER non-reserved -PARTIAL non-reserved non-reserved non-reserved reserved -PARTITION non-reserved reserved reserved -PASCAL non-reserved non-reserved non-reserved -PASSING non-reserved non-reserved non-reserved -PASSTHROUGH non-reserved non-reserved -PASSWORD non-reserved -PATH non-reserved non-reserved -PERCENT reserved -PERCENTILE_CONT reserved reserved -PERCENTILE_DISC reserved reserved -PERCENT_RANK reserved reserved -PERIOD reserved -PERMISSION non-reserved non-reserved -PLACING reserved non-reserved non-reserved -PLANS non-reserved -PLI non-reserved non-reserved non-reserved -PORTION reserved -POSITION non-reserved (cannot be function or type) reserved reserved reserved -POSITION_REGEX reserved reserved -POWER reserved reserved -PRECEDES reserved -PRECEDING non-reserved non-reserved non-reserved -PRECISION non-reserved (cannot be function or type) reserved reserved reserved -PREPARE non-reserved reserved reserved reserved -PREPARED non-reserved -PRESERVE non-reserved non-reserved non-reserved reserved -PRIMARY reserved reserved reserved reserved -PRIOR non-reserved non-reserved non-reserved reserved -PRIVILEGES non-reserved non-reserved non-reserved reserved -PROCEDURAL non-reserved -PROCEDURE non-reserved reserved reserved reserved -PROGRAM non-reserved -PUBLIC non-reserved non-reserved reserved -QUOTE non-reserved -RANGE non-reserved reserved reserved -RANK reserved reserved -READ non-reserved non-reserved non-reserved reserved -READS reserved reserved -REAL non-reserved (cannot be function or type) reserved reserved reserved -REASSIGN non-reserved -RECHECK non-reserved -RECOVERY non-reserved non-reserved -RECURSIVE non-reserved reserved reserved -REF non-reserved reserved reserved -REFERENCES reserved reserved reserved reserved -REFERENCING reserved reserved -REFRESH non-reserved -REGR_AVGX reserved reserved -REGR_AVGY reserved reserved -REGR_COUNT reserved reserved -REGR_INTERCEPT reserved reserved -REGR_R2 reserved reserved -REGR_SLOPE reserved reserved -REGR_SXX reserved reserved -REGR_SXY reserved reserved -REGR_SYY reserved reserved -REINDEX non-reserved -RELATIVE non-reserved non-reserved non-reserved reserved -RELEASE non-reserved reserved reserved -RENAME non-reserved -REPEATABLE non-reserved non-reserved non-reserved non-reserved -REPLACE non-reserved -REPLICA non-reserved -REQUIRING non-reserved non-reserved -RESET non-reserved -RESPECT non-reserved non-reserved -RESTART non-reserved non-reserved non-reserved -RESTORE non-reserved non-reserved -RESTRICT non-reserved non-reserved non-reserved reserved -RESULT reserved reserved -RETURN reserved reserved -RETURNED_CARDINALITY non-reserved non-reserved -RETURNED_LENGTH non-reserved non-reserved non-reserved -RETURNED_OCTET_LENGTH non-reserved non-reserved non-reserved -RETURNED_SQLSTATE non-reserved non-reserved non-reserved -RETURNING reserved non-reserved non-reserved -RETURNS non-reserved reserved reserved -REVOKE non-reserved reserved reserved reserved -RIGHT reserved (can be function or type) reserved reserved reserved -ROLE non-reserved non-reserved non-reserved -ROLLBACK non-reserved reserved reserved reserved -ROLLUP reserved reserved -ROUTINE non-reserved non-reserved -ROUTINE_CATALOG non-reserved non-reserved -ROUTINE_NAME non-reserved non-reserved -ROUTINE_SCHEMA non-reserved non-reserved -ROW non-reserved (cannot be function or type) reserved reserved -ROWS non-reserved reserved reserved reserved -ROW_COUNT non-reserved non-reserved non-reserved -ROW_NUMBER reserved reserved -RULE non-reserved -SAVEPOINT non-reserved reserved reserved -SCALE non-reserved non-reserved non-reserved -SCHEMA non-reserved non-reserved non-reserved reserved -SCHEMA_NAME non-reserved non-reserved non-reserved -SCOPE reserved reserved -SCOPE_CATALOG non-reserved non-reserved -SCOPE_NAME non-reserved non-reserved -SCOPE_SCHEMA non-reserved non-reserved -SCROLL non-reserved reserved reserved reserved -SEARCH non-reserved reserved reserved -SECOND non-reserved reserved reserved reserved -SECTION non-reserved non-reserved reserved -SECURITY non-reserved non-reserved non-reserved -SELECT reserved reserved reserved reserved -SELECTIVE non-reserved non-reserved -SELF non-reserved non-reserved -SENSITIVE reserved reserved -SEQUENCE non-reserved non-reserved non-reserved -SEQUENCES non-reserved -SERIALIZABLE non-reserved non-reserved non-reserved non-reserved -SERVER non-reserved non-reserved non-reserved -SERVER_NAME non-reserved non-reserved non-reserved -SESSION non-reserved non-reserved non-reserved reserved -SESSION_USER reserved reserved reserved reserved -SET non-reserved reserved reserved reserved -SETOF non-reserved (cannot be function or type) -SETS non-reserved non-reserved -SHARE non-reserved -SHOW non-reserved -SIMILAR reserved (can be function or type) reserved reserved -SIMPLE non-reserved non-reserved non-reserved -SIZE non-reserved non-reserved reserved -SMALLINT non-reserved (cannot be function or type) reserved reserved reserved -SNAPSHOT non-reserved -SOME reserved reserved reserved reserved -SOURCE non-reserved non-reserved -SPACE non-reserved non-reserved reserved -SPECIFIC reserved reserved -SPECIFICTYPE reserved reserved -SPECIFIC_NAME non-reserved non-reserved -SQL reserved reserved reserved -SQLCODE reserved -SQLERROR reserved -SQLEXCEPTION reserved reserved -SQLSTATE reserved reserved reserved -SQLWARNING reserved reserved -SQRT reserved reserved -STABLE non-reserved -STANDALONE non-reserved non-reserved non-reserved -START non-reserved reserved reserved -STATE non-reserved non-reserved -STATEMENT non-reserved non-reserved non-reserved -STATIC reserved reserved -STATISTICS non-reserved -STDDEV_POP reserved reserved -STDDEV_SAMP reserved reserved -STDIN non-reserved -STDOUT non-reserved -STORAGE non-reserved -STRICT non-reserved -STRIP non-reserved non-reserved non-reserved -STRUCTURE non-reserved non-reserved -STYLE non-reserved non-reserved -SUBCLASS_ORIGIN non-reserved non-reserved non-reserved -SUBMULTISET reserved reserved -SUBSTRING non-reserved (cannot be function or type) reserved reserved reserved -SUBSTRING_REGEX reserved reserved -SUCCEEDS reserved -SUM reserved reserved reserved -SYMMETRIC reserved reserved reserved -SYSID non-reserved -SYSTEM non-reserved reserved reserved -SYSTEM_TIME reserved -SYSTEM_USER reserved reserved reserved -T non-reserved non-reserved -TABLE reserved reserved reserved reserved -TABLES non-reserved -TABLESAMPLE reserved reserved -TABLESPACE non-reserved -TABLE_NAME non-reserved non-reserved non-reserved -TEMP non-reserved -TEMPLATE non-reserved -TEMPORARY non-reserved non-reserved non-reserved reserved -TEXT non-reserved -THEN reserved reserved reserved reserved -TIES non-reserved non-reserved -TIME non-reserved (cannot be function or type) reserved reserved reserved -TIMESTAMP non-reserved (cannot be function or type) reserved reserved reserved -TIMEZONE_HOUR reserved reserved reserved -TIMEZONE_MINUTE reserved reserved reserved -TO reserved reserved reserved reserved -TOKEN non-reserved non-reserved -TOP_LEVEL_COUNT non-reserved non-reserved -TRAILING reserved reserved reserved reserved -TRANSACTION non-reserved non-reserved non-reserved reserved -TRANSACTIONS_COMMITTED non-reserved non-reserved -TRANSACTIONS_ROLLED_BACK non-reserved non-reserved -TRANSACTION_ACTIVE non-reserved non-reserved -TRANSFORM non-reserved non-reserved -TRANSFORMS non-reserved non-reserved -TRANSLATE reserved reserved reserved -TRANSLATE_REGEX reserved reserved -TRANSLATION reserved reserved reserved -TREAT non-reserved (cannot be function or type) reserved reserved -TRIGGER non-reserved reserved reserved -TRIGGER_CATALOG non-reserved non-reserved -TRIGGER_NAME non-reserved non-reserved -TRIGGER_SCHEMA non-reserved non-reserved -TRIM non-reserved (cannot be function or type) reserved reserved reserved -TRIM_ARRAY reserved reserved -TRUE reserved reserved reserved reserved -TRUNCATE non-reserved reserved reserved -TRUSTED non-reserved -TYPE non-reserved non-reserved non-reserved non-reserved -TYPES non-reserved -UESCAPE reserved reserved -UNBOUNDED non-reserved non-reserved non-reserved -UNCOMMITTED non-reserved non-reserved non-reserved non-reserved -UNDER non-reserved non-reserved -UNENCRYPTED non-reserved -UNION reserved reserved reserved reserved -UNIQUE reserved reserved reserved reserved -UNKNOWN non-reserved reserved reserved reserved -UNLINK non-reserved non-reserved -UNLISTEN non-reserved -UNLOGGED non-reserved -UNNAMED non-reserved non-reserved non-reserved -UNNEST reserved reserved -UNTIL non-reserved -UNTYPED non-reserved non-reserved -UPDATE non-reserved reserved reserved reserved -UPPER reserved reserved reserved -URI non-reserved non-reserved -USAGE non-reserved non-reserved reserved -USER reserved reserved reserved reserved -USER_DEFINED_TYPE_CATALOG non-reserved non-reserved -USER_DEFINED_TYPE_CODE non-reserved non-reserved -USER_DEFINED_TYPE_NAME non-reserved non-reserved -USER_DEFINED_TYPE_SCHEMA non-reserved non-reserved -USING reserved reserved reserved reserved -VACUUM non-reserved -VALID non-reserved non-reserved non-reserved -VALIDATE non-reserved -VALIDATOR non-reserved -VALUE non-reserved reserved reserved reserved -VALUES non-reserved (cannot be function or type) reserved reserved reserved -VALUE_OF reserved -VARBINARY reserved reserved -VARCHAR non-reserved (cannot be function or type) reserved reserved reserved -VARIADIC reserved -VARYING non-reserved reserved reserved reserved -VAR_POP reserved reserved -VAR_SAMP reserved reserved -VERBOSE reserved (can be function or type) -VERSION non-reserved non-reserved non-reserved -VERSIONING reserved -VIEW non-reserved non-reserved non-reserved reserved -VOLATILE non-reserved -WHEN reserved reserved reserved reserved -WHENEVER reserved reserved reserved -WHERE reserved reserved reserved reserved -WHITESPACE non-reserved non-reserved non-reserved -WIDTH_BUCKET reserved reserved -WINDOW reserved reserved reserved -WITH reserved reserved reserved reserved -WITHIN reserved reserved -WITHOUT non-reserved reserved reserved -WORK non-reserved non-reserved non-reserved reserved -WRAPPER non-reserved non-reserved non-reserved -WRITE non-reserved non-reserved non-reserved reserved -XML non-reserved reserved reserved -XMLAGG reserved reserved -XMLATTRIBUTES non-reserved (cannot be function or type) reserved reserved -XMLBINARY reserved reserved -XMLCAST reserved reserved -XMLCOMMENT reserved reserved -XMLCONCAT non-reserved (cannot be function or type) reserved reserved -XMLDECLARATION non-reserved non-reserved -XMLDOCUMENT reserved reserved -XMLELEMENT non-reserved (cannot be function or type) reserved reserved -XMLEXISTS non-reserved (cannot be function or type) reserved reserved -XMLFOREST non-reserved (cannot be function or type) reserved reserved -XMLITERATE reserved reserved -XMLNAMESPACES reserved reserved -XMLPARSE non-reserved (cannot be function or type) reserved reserved -XMLPI non-reserved (cannot be function or type) reserved reserved -XMLQUERY reserved reserved -XMLROOT non-reserved (cannot be function or type) -XMLSCHEMA non-reserved non-reserved -XMLSERIALIZE non-reserved (cannot be function or type) reserved reserved -XMLTABLE reserved reserved -XMLTEXT reserved reserved -XMLVALIDATE reserved reserved -YEAR non-reserved reserved reserved reserved -YES non-reserved non-reserved non-reserved -ZONE non-reserved non-reserved non-reserved reserved \ No newline at end of file diff --git a/vendor/github.com/golang/protobuf/.gitignore b/vendor/github.com/golang/protobuf/.gitignore deleted file mode 100644 index 8f5b596b147..00000000000 --- a/vendor/github.com/golang/protobuf/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -.DS_Store -*.[568ao] -*.ao -*.so -*.pyc -._* -.nfs.* -[568a].out -*~ -*.orig -core -_obj -_test -_testmain.go -protoc-gen-go/testdata/multi/*.pb.go -_conformance/_conformance diff --git a/vendor/github.com/golang/protobuf/Make.protobuf b/vendor/github.com/golang/protobuf/Make.protobuf deleted file mode 100644 index 15071de1011..00000000000 --- a/vendor/github.com/golang/protobuf/Make.protobuf +++ /dev/null @@ -1,40 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# 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. - -# Includable Makefile to add a rule for generating .pb.go files from .proto files -# (Google protocol buffer descriptions). -# Typical use if myproto.proto is a file in package mypackage in this directory: -# -# include $(GOROOT)/src/pkg/github.com/golang/protobuf/Make.protobuf - -%.pb.go: %.proto - protoc --go_out=. $< - diff --git a/vendor/github.com/golang/protobuf/Makefile b/vendor/github.com/golang/protobuf/Makefile deleted file mode 100644 index a1421d8b731..00000000000 --- a/vendor/github.com/golang/protobuf/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# 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. - - -all: install - -install: - go install ./proto ./jsonpb ./ptypes - go install ./protoc-gen-go - -test: - go test ./proto ./jsonpb ./ptypes - make -C protoc-gen-go/testdata test - -clean: - go clean ./... - -nuke: - go clean -i ./... - -regenerate: - make -C protoc-gen-go/descriptor regenerate - make -C protoc-gen-go/plugin regenerate - make -C protoc-gen-go/testdata regenerate - make -C proto/testdata regenerate - make -C jsonpb/jsonpb_test_proto regenerate - make -C _conformance regenerate diff --git a/vendor/github.com/golang/protobuf/README.md b/vendor/github.com/golang/protobuf/README.md deleted file mode 100644 index 9c4c815c023..00000000000 --- a/vendor/github.com/golang/protobuf/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# Go support for Protocol Buffers - -[![Build Status](https://travis-ci.org/golang/protobuf.svg?branch=master)](https://travis-ci.org/golang/protobuf) -[![GoDoc](https://godoc.org/github.com/golang/protobuf?status.svg)](https://godoc.org/github.com/golang/protobuf) - -Google's data interchange format. -Copyright 2010 The Go Authors. -https://github.com/golang/protobuf - -This package and the code it generates requires at least Go 1.4. - -This software implements Go bindings for protocol buffers. For -information about protocol buffers themselves, see - https://developers.google.com/protocol-buffers/ - -## Installation ## - -To use this software, you must: -- Install the standard C++ implementation of protocol buffers from - https://developers.google.com/protocol-buffers/ -- Of course, install the Go compiler and tools from - https://golang.org/ - See - https://golang.org/doc/install - for details or, if you are using gccgo, follow the instructions at - https://golang.org/doc/install/gccgo -- Grab the code from the repository and install the proto package. - The simplest way is to run `go get -u github.com/golang/protobuf/protoc-gen-go`. - The compiler plugin, protoc-gen-go, will be installed in $GOBIN, - defaulting to $GOPATH/bin. It must be in your $PATH for the protocol - compiler, protoc, to find it. - -This software has two parts: a 'protocol compiler plugin' that -generates Go source files that, once compiled, can access and manage -protocol buffers; and a library that implements run-time support for -encoding (marshaling), decoding (unmarshaling), and accessing protocol -buffers. - -There is support for gRPC in Go using protocol buffers. -See the note at the bottom of this file for details. - -There are no insertion points in the plugin. - - -## Using protocol buffers with Go ## - -Once the software is installed, there are two steps to using it. -First you must compile the protocol buffer definitions and then import -them, with the support library, into your program. - -To compile the protocol buffer definition, run protoc with the --go_out -parameter set to the directory you want to output the Go code to. - - protoc --go_out=. *.proto - -The generated files will be suffixed .pb.go. See the Test code below -for an example using such a file. - - -The package comment for the proto library contains text describing -the interface provided in Go for protocol buffers. Here is an edited -version. - -========== - -The proto package converts data structures to and from the -wire format of protocol buffers. It works in concert with the -Go source code generated for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - Helpers for getting values are superseded by the - GetFoo methods and their use is deprecated. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed with the enum's type name. Enum types have - a String method, and a Enum method to assist in message construction. - - Nested groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Enum types do not get an Enum method. - -Consider file test.proto, containing - -```proto - syntax = "proto2"; - package example; - - enum FOO { X = 17; }; - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - } -``` - -To create and play with a Test object from the example package, - -```go - package main - - import ( - "log" - - "github.com/golang/protobuf/proto" - "path/to/example" - ) - - func main() { - test := &example.Test { - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &example.Test_OptionalGroup { - RequiredField: proto.String("good bye"), - }, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &example.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // etc. - } -``` - -## Parameters ## - -To pass extra parameters to the plugin, use a comma-separated -parameter list separated from the output directory by a colon: - - - protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto - - -- `import_prefix=xxx` - a prefix that is added onto the beginning of - all imports. Useful for things like generating protos in a - subdirectory, or regenerating vendored protobufs in-place. -- `import_path=foo/bar` - used as the package if no input files - declare `go_package`. If it contains slashes, everything up to the - rightmost slash is ignored. -- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to - load. The only plugin in this repo is `grpc`. -- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is - associated with Go package quux/shme. This is subject to the - import_prefix parameter. - -## gRPC Support ## - -If a proto file specifies RPC services, protoc-gen-go can be instructed to -generate code compatible with gRPC (http://www.grpc.io/). To do this, pass -the `plugins` parameter to protoc-gen-go; the usual way is to insert it into -the --go_out argument to protoc: - - protoc --go_out=plugins=grpc:. *.proto - -## Compatibility ## - -The library and the generated code are expected to be stable over time. -However, we reserve the right to make breaking changes without notice for the -following reasons: - -- Security. A security issue in the specification or implementation may come to - light whose resolution requires breaking compatibility. We reserve the right - to address such security issues. -- Unspecified behavior. There are some aspects of the Protocol Buffers - specification that are undefined. Programs that depend on such unspecified - behavior may break in future releases. -- Specification errors or changes. If it becomes necessary to address an - inconsistency, incompleteness, or change in the Protocol Buffers - specification, resolving the issue could affect the meaning or legality of - existing programs. We reserve the right to address such issues, including - updating the implementations. -- Bugs. If the library has a bug that violates the specification, a program - that depends on the buggy behavior may break if the bug is fixed. We reserve - the right to fix such bugs. -- Adding methods or fields to generated structs. These may conflict with field - names that already exist in a schema, causing applications to break. When the - code generator encounters a field in the schema that would collide with a - generated field or method name, the code generator will append an underscore - to the generated field or method name. -- Adding, removing, or changing methods or fields in generated structs that - start with `XXX`. These parts of the generated code are exported out of - necessity, but should not be considered part of the public API. -- Adding, removing, or changing unexported symbols in generated code. - -Any breaking changes outside of these will be announced 6 months in advance to -protobuf@googlegroups.com. - -You should, whenever possible, use generated code created by the `protoc-gen-go` -tool built at the same commit as the `proto` package. The `proto` package -declares package-level constants in the form `ProtoPackageIsVersionX`. -Application code and generated code may depend on one of these constants to -ensure that compilation will fail if the available version of the proto library -is too old. Whenever we make a change to the generated code that requires newer -library support, in the same commit we will increment the version number of the -generated code and declare a new package-level constant whose name incorporates -the latest version number. Removing a compatibility constant is considered a -breaking change and would be subject to the announcement policy stated above. - -The `protoc-gen-go/generator` package exposes a plugin interface, -which is used by the gRPC code generation. This interface is not -supported and is subject to incompatible changes without notice. diff --git a/vendor/github.com/golang/protobuf/proto/Makefile b/vendor/github.com/golang/protobuf/proto/Makefile deleted file mode 100644 index e2e0651a934..00000000000 --- a/vendor/github.com/golang/protobuf/proto/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# 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. - -install: - go install - -test: install generate-test-pbs - go test - - -generate-test-pbs: - make install - make -C testdata - protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto - make diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.proto b/vendor/github.com/golang/protobuf/ptypes/any/any.proto deleted file mode 100644 index c7486676231..00000000000 --- a/vendor/github.com/golang/protobuf/ptypes/any/any.proto +++ /dev/null @@ -1,149 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// 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. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option go_package = "github.com/golang/protobuf/ptypes/any"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "AnyProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -message Any { - // A URL/resource name whose content describes the type of the - // serialized protocol buffer message. - // - // For URLs which use the scheme `http`, `https`, or no scheme, the - // following restrictions and interpretations apply: - // - // * If no scheme is provided, `https` is assumed. - // * The last segment of the URL's path must represent the fully - // qualified name of the type (as in `path/google.protobuf.Duration`). - // The name should be in a canonical form (e.g., leading "." is - // not accepted). - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - string type_url = 1; - - // Must be a valid serialized protocol buffer of the above specified type. - bytes value = 2; -} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto b/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto deleted file mode 100644 index 975fce41aae..00000000000 --- a/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto +++ /dev/null @@ -1,117 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// 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. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/duration"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "DurationProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// A Duration represents a signed, fixed-length span of time represented -// as a count of seconds and fractions of seconds at nanosecond -// resolution. It is independent of any calendar and concepts like "day" -// or "month". It is related to Timestamp in that the difference between -// two Timestamp values is a Duration and it can be added or subtracted -// from a Timestamp. Range is approximately +-10,000 years. -// -// # Examples -// -// Example 1: Compute Duration from two Timestamps in pseudo code. -// -// Timestamp start = ...; -// Timestamp end = ...; -// Duration duration = ...; -// -// duration.seconds = end.seconds - start.seconds; -// duration.nanos = end.nanos - start.nanos; -// -// if (duration.seconds < 0 && duration.nanos > 0) { -// duration.seconds += 1; -// duration.nanos -= 1000000000; -// } else if (durations.seconds > 0 && duration.nanos < 0) { -// duration.seconds -= 1; -// duration.nanos += 1000000000; -// } -// -// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. -// -// Timestamp start = ...; -// Duration duration = ...; -// Timestamp end = ...; -// -// end.seconds = start.seconds + duration.seconds; -// end.nanos = start.nanos + duration.nanos; -// -// if (end.nanos < 0) { -// end.seconds -= 1; -// end.nanos += 1000000000; -// } else if (end.nanos >= 1000000000) { -// end.seconds += 1; -// end.nanos -= 1000000000; -// } -// -// Example 3: Compute Duration from datetime.timedelta in Python. -// -// td = datetime.timedelta(days=3, minutes=10) -// duration = Duration() -// duration.FromTimedelta(td) -// -// # JSON Mapping -// -// In JSON format, the Duration type is encoded as a string rather than an -// object, where the string ends in the suffix "s" (indicating seconds) and -// is preceded by the number of seconds, with nanoseconds expressed as -// fractional seconds. For example, 3 seconds with 0 nanoseconds should be -// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should -// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 -// microsecond should be expressed in JSON format as "3.000001s". -// -// -message Duration { - - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. Note: these bounds are computed from: - // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years - int64 seconds = 1; - - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - int32 nanos = 2; -} diff --git a/vendor/github.com/golang/protobuf/ptypes/regen.sh b/vendor/github.com/golang/protobuf/ptypes/regen.sh deleted file mode 100755 index b50a9414ac2..00000000000 --- a/vendor/github.com/golang/protobuf/ptypes/regen.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -e -# -# This script fetches and rebuilds the "well-known types" protocol buffers. -# To run this you will need protoc and goprotobuf installed; -# see https://github.com/golang/protobuf for instructions. -# You also need Go and Git installed. - -PKG=github.com/golang/protobuf/ptypes -UPSTREAM=https://github.com/google/protobuf -UPSTREAM_SUBDIR=src/google/protobuf -PROTO_FILES=(any duration empty struct timestamp wrappers) - -function die() { - echo 1>&2 $* - exit 1 -} - -# Sanity check that the right tools are accessible. -for tool in go git protoc protoc-gen-go; do - q=$(which $tool) || die "didn't find $tool" - echo 1>&2 "$tool: $q" -done - -tmpdir=$(mktemp -d -t regen-wkt.XXXXXX) -trap 'rm -rf $tmpdir' EXIT - -echo -n 1>&2 "finding package dir... " -pkgdir=$(go list -f '{{.Dir}}' $PKG) -echo 1>&2 $pkgdir -base=$(echo $pkgdir | sed "s,/$PKG\$,,") -echo 1>&2 "base: $base" -cd "$base" - -echo 1>&2 "fetching latest protos... " -git clone -q $UPSTREAM $tmpdir - -for file in ${PROTO_FILES[@]}; do - echo 1>&2 "* $file" - protoc --go_out=. -I$tmpdir/src $tmpdir/src/google/protobuf/$file.proto || die - cp $tmpdir/src/google/protobuf/$file.proto $PKG/$file -done - -echo 1>&2 "All OK" diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto deleted file mode 100644 index b7cbd17502f..00000000000 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto +++ /dev/null @@ -1,133 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// 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. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/timestamp"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "TimestampProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// A Timestamp represents a point in time independent of any time zone -// or calendar, represented as seconds and fractions of seconds at -// nanosecond resolution in UTC Epoch time. It is encoded using the -// Proleptic Gregorian Calendar which extends the Gregorian calendar -// backwards to year one. It is encoded assuming all minutes are 60 -// seconds long, i.e. leap seconds are "smeared" so that no leap second -// table is needed for interpretation. Range is from -// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. -// By restricting to that range, we ensure that we can convert to -// and from RFC 3339 date strings. -// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). -// -// # Examples -// -// Example 1: Compute Timestamp from POSIX `time()`. -// -// Timestamp timestamp; -// timestamp.set_seconds(time(NULL)); -// timestamp.set_nanos(0); -// -// Example 2: Compute Timestamp from POSIX `gettimeofday()`. -// -// struct timeval tv; -// gettimeofday(&tv, NULL); -// -// Timestamp timestamp; -// timestamp.set_seconds(tv.tv_sec); -// timestamp.set_nanos(tv.tv_usec * 1000); -// -// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. -// -// FILETIME ft; -// GetSystemTimeAsFileTime(&ft); -// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; -// -// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z -// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. -// Timestamp timestamp; -// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); -// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); -// -// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. -// -// long millis = System.currentTimeMillis(); -// -// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) -// .setNanos((int) ((millis % 1000) * 1000000)).build(); -// -// -// Example 5: Compute Timestamp from current time in Python. -// -// timestamp = Timestamp() -// timestamp.GetCurrentTime() -// -// # JSON Mapping -// -// In JSON format, the Timestamp type is encoded as a string in the -// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the -// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" -// where {year} is always expressed using four digits while {month}, {day}, -// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional -// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), -// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone -// is required, though only UTC (as indicated by "Z") is presently supported. -// -// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past -// 01:30 UTC on January 15, 2017. -// -// In JavaScript, one can convert a Date object to this format using the -// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] -// method. In Python, a standard `datetime.datetime` object can be converted -// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) -// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one -// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( -// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()) -// to obtain a formatter capable of generating timestamps in this format. -// -// -message Timestamp { - - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - int64 seconds = 1; - - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - int32 nanos = 2; -} diff --git a/vendor/github.com/gopherjs/gopherjs/.gitignore b/vendor/github.com/gopherjs/gopherjs/.gitignore deleted file mode 100644 index e0870976009..00000000000 --- a/vendor/github.com/gopherjs/gopherjs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/node-syscall/build -/node_modules diff --git a/vendor/github.com/gopherjs/gopherjs/README.md b/vendor/github.com/gopherjs/gopherjs/README.md deleted file mode 100644 index b10362e83e6..00000000000 --- a/vendor/github.com/gopherjs/gopherjs/README.md +++ /dev/null @@ -1,140 +0,0 @@ -GopherJS - A compiler from Go to JavaScript -------------------------------------------- - -[![Sourcegraph](https://sourcegraph.com/github.com/gopherjs/gopherjs/-/badge.svg)](https://sourcegraph.com/github.com/gopherjs/gopherjs?badge) -[![Circle CI](https://circleci.com/gh/gopherjs/gopherjs.svg?style=svg)](https://circleci.com/gh/gopherjs/gopherjs) - -GopherJS compiles Go code ([golang.org](https://golang.org/)) to pure JavaScript code. Its main purpose is to give you the opportunity to write front-end code in Go which will still run in all browsers. - -### Playground -Give GopherJS a try on the [GopherJS Playground](http://gopherjs.github.io/playground/). - -### What is supported? -Nearly everything, including Goroutines ([compatibility table](https://github.com/gopherjs/gopherjs/blob/master/doc/packages.md)). Performance is quite good in most cases, see [HTML5 game engine benchmark](https://ajhager.github.io/engi/demos/botmark.html). Cgo is not supported. Using a vendored copy of GopherJS is currently not supported, see [#415](https://github.com/gopherjs/gopherjs/issues/415). - -### Installation and Usage -Get or update GopherJS and dependencies with: - -``` -go get -u github.com/gopherjs/gopherjs -``` - -Now you can use `gopherjs build [package]`, `gopherjs build [files]` or `gopherjs install [package]` which behave similar to the `go` tool. For `main` packages, these commands create a `.js` file and `.js.map` source map in the current directory or in `$GOPATH/bin`. The generated JavaScript file can be used as usual in a website. Use `gopherjs help [command]` to get a list of possible command line flags, e.g. for minification and automatically watching for changes. - -*Note: GopherJS will try to write compiled object files of the core packages to your $GOROOT/pkg directory. If that fails, it will fall back to $GOPATH/pkg.* - -#### gopherjs run, gopherjs test - -If you want to use `gopherjs run` or `gopherjs test` to run the generated code locally, install Node.js 4.x (or newer), and the `source-map-support` module: - -``` -npm install --global source-map-support -``` - -For system calls (file system access, etc.), see [this page](https://github.com/gopherjs/gopherjs/blob/master/doc/syscalls.md). - -#### gopherjs serve - -`gopherjs serve` is a useful command you can use during development. It will start an HTTP server serving on ":8080" by default, then dynamically compile your Go packages with GopherJS and serve them. - -For example, navigating to `http://localhost:8080/example.com/user/project/` should compile and run the Go package `example.com/user/project`. The generated JavaScript output will be served at `http://localhost:8080/example.com/user/project/project.js` (the .js file name will be equal to the base directory name). If the directory contains `index.html` it will be served, otherwise a minimal `index.html` that includes `` will be provided, causing the JavaScript to be executed. All other static files will be served too. - -Refreshing in the browser will rebuild the served files if needed. Compilation errors will be displayed in terminal, and in browser console. Additionally, it will serve $GOROOT and $GOPATH for sourcemaps. - -If you include an argument, it will be the root from which everything is served. For example, if you run `gopherjs serve github.com/user/project` then the generated JavaScript for the package github.com/user/project/mypkg will be served at http://localhost:8080/mypkg/mypkg.js. - -### Performance Tips - -- Use the `-m` command line flag to generate minified code. -- Apply gzip compression (https://en.wikipedia.org/wiki/HTTP_compression). -- Use `int` instead of `(u)int8/16/32/64`. -- Use `float64` instead of `float32`. - -### Community -- [#gopherjs Channel on Gophers Slack](https://gophers.slack.com/messages/gopherjs/) (invites to Gophers Slack are available [here](http://blog.gopheracademy.com/gophers-slack-community/#how-can-i-be-invited-to-join:2facdc921b2310f18cb851c36fa92369)) -- [Bindings to JavaScript APIs and libraries](https://github.com/gopherjs/gopherjs/wiki/bindings) -- [GopherJS Blog](https://medium.com/gopherjs) -- [GopherJS on Twitter](https://twitter.com/GopherJS) - -### Getting started - -#### Interacting with the DOM -The package `github.com/gopherjs/gopherjs/js` (see [documentation](https://godoc.org/github.com/gopherjs/gopherjs/js)) provides functions for interacting with native JavaScript APIs. For example the line - -```js -document.write("Hello world!"); -``` - -would look like this in Go: - -```go -js.Global.Get("document").Call("write", "Hello world!") -``` - -You may also want use the [DOM bindings](http://dominik.honnef.co/go/js/dom), the [jQuery bindings](https://github.com/gopherjs/jquery) (see [TodoMVC Example](https://github.com/gopherjs/todomvc)) or the [AngularJS bindings](https://github.com/wvell/go-angularjs). Those are some of the [bindings to JavaScript APIs and libraries](https://github.com/gopherjs/gopherjs/wiki/bindings) by community members. - -#### Providing library functions for use in other JavaScript code -Set a global variable to a map that contains the functions: - -```go -package main - -import "github.com/gopherjs/gopherjs/js" - -func main() { - js.Global.Set("pet", map[string]interface{}{ - "New": New, - }) -} - -type Pet struct { - name string -} - -func New(name string) *js.Object { - return js.MakeWrapper(&Pet{name}) -} - -func (p *Pet) Name() string { - return p.name -} - -func (p *Pet) SetName(name string) { - p.name = name -} -``` - -For more details see [Jason Stone's blog post](http://legacytotheedge.blogspot.de/2014/03/gopherjs-go-to-javascript-transpiler.html) about GopherJS. - -### Architecture - -#### General -GopherJS emulates a 32-bit environment. This means that `int`, `uint` and `uintptr` have a precision of 32 bits. However, the explicit 64-bit integer types `int64` and `uint64` are supported. The `GOARCH` value of GopherJS is "js". You may use it as a build constraint: `// +build js`. - -#### Application Lifecycle - -The `main` function is executed as usual after all `init` functions have run. JavaScript callbacks can also invoke Go functions, even after the `main` function has exited. Therefore the end of the `main` function should not be regarded as the end of the application and does not end the execution of other goroutines. - -In the browser, calling `os.Exit` (e.g. indirectly by `log.Fatal`) also does not terminate the execution of the program. For convenience, it calls `runtime.Goexit` to immediately terminate the calling goroutine. - -#### Goroutines -Goroutines are fully supported by GopherJS. The only restriction is that you need to start a new goroutine if you want to use blocking code called from external JavaScript: - -```go -js.Global.Get("myButton").Call("addEventListener", "click", func() { - go func() { - [...] - someBlockingFunction() - [...] - }() -}) -``` - -How it works: - -JavaScript has no concept of concurrency (except web workers, but those are too strictly separated to be used for goroutines). Because of that, instructions in JavaScript are never blocking. A blocking call would effectively freeze the responsiveness of your web page, so calls with callback arguments are used instead. - -GopherJS does some heavy lifting to work around this restriction: Whenever an instruction is blocking (e.g. communicating with a channel that isn't ready), the whole stack will unwind (= all functions return) and the goroutine will be put to sleep. Then another goroutine which is ready to resume gets picked and its stack with all local variables will be restored. - -### GopherJS Development -If you're looking to make changes to the GopherJS compiler, see [Developer Guidelines](https://github.com/gopherjs/gopherjs/wiki/Developer-Guidelines) for additional developer information. diff --git a/vendor/github.com/gopherjs/gopherjs/tool.go b/vendor/github.com/gopherjs/gopherjs/tool.go deleted file mode 100644 index 38f9cad5089..00000000000 --- a/vendor/github.com/gopherjs/gopherjs/tool.go +++ /dev/null @@ -1,941 +0,0 @@ -package main - -import ( - "bytes" - "errors" - "fmt" - "go/ast" - "go/build" - "go/doc" - "go/parser" - "go/scanner" - "go/token" - "go/types" - "io" - "io/ioutil" - "net" - "net/http" - "os" - "os/exec" - "path" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - "syscall" - "text/template" - "time" - "unicode" - "unicode/utf8" - - gbuild "github.com/gopherjs/gopherjs/build" - "github.com/gopherjs/gopherjs/compiler" - "github.com/gopherjs/gopherjs/internal/sysutil" - "github.com/kisielk/gotool" - "github.com/neelance/sourcemap" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "golang.org/x/crypto/ssh/terminal" -) - -var currentDirectory string - -func init() { - var err error - currentDirectory, err = os.Getwd() - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - currentDirectory, err = filepath.EvalSymlinks(currentDirectory) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - gopaths := filepath.SplitList(build.Default.GOPATH) - if len(gopaths) == 0 { - fmt.Fprintf(os.Stderr, "$GOPATH not set. For more details see: go help gopath\n") - os.Exit(1) - } -} - -func main() { - var ( - options = &gbuild.Options{CreateMapFile: true} - pkgObj string - tags string - ) - - flagVerbose := pflag.NewFlagSet("", 0) - flagVerbose.BoolVarP(&options.Verbose, "verbose", "v", false, "print the names of packages as they are compiled") - flagQuiet := pflag.NewFlagSet("", 0) - flagQuiet.BoolVarP(&options.Quiet, "quiet", "q", false, "suppress non-fatal warnings") - - compilerFlags := pflag.NewFlagSet("", 0) - compilerFlags.BoolVarP(&options.Minify, "minify", "m", false, "minify generated code") - compilerFlags.BoolVar(&options.Color, "color", terminal.IsTerminal(int(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb", "colored output") - compilerFlags.StringVar(&tags, "tags", "", "a list of build tags to consider satisfied during the build") - compilerFlags.BoolVar(&options.MapToLocalDisk, "localmap", false, "use local paths for sourcemap") - - flagWatch := pflag.NewFlagSet("", 0) - flagWatch.BoolVarP(&options.Watch, "watch", "w", false, "watch for changes to the source files") - - cmdBuild := &cobra.Command{ - Use: "build [packages]", - Short: "compile packages and dependencies", - } - cmdBuild.Flags().StringVarP(&pkgObj, "output", "o", "", "output file") - cmdBuild.Flags().AddFlagSet(flagVerbose) - cmdBuild.Flags().AddFlagSet(flagQuiet) - cmdBuild.Flags().AddFlagSet(compilerFlags) - cmdBuild.Flags().AddFlagSet(flagWatch) - cmdBuild.Run = func(cmd *cobra.Command, args []string) { - options.BuildTags = strings.Fields(tags) - for { - s := gbuild.NewSession(options) - - err := func() error { - // Handle "gopherjs build [files]" ad-hoc package mode. - if len(args) > 0 && (strings.HasSuffix(args[0], ".go") || strings.HasSuffix(args[0], ".inc.js")) { - for _, arg := range args { - if !strings.HasSuffix(arg, ".go") && !strings.HasSuffix(arg, ".inc.js") { - return fmt.Errorf("named files must be .go or .inc.js files") - } - } - if pkgObj == "" { - basename := filepath.Base(args[0]) - pkgObj = basename[:len(basename)-3] + ".js" - } - names := make([]string, len(args)) - for i, name := range args { - name = filepath.ToSlash(name) - names[i] = name - if s.Watcher != nil { - s.Watcher.Add(name) - } - } - err := s.BuildFiles(args, pkgObj, currentDirectory) - return err - } - - // Expand import path patterns. - patternContext := gbuild.NewBuildContext("", options.BuildTags) - pkgs := (&gotool.Context{BuildContext: *patternContext}).ImportPaths(args) - - for _, pkgPath := range pkgs { - if s.Watcher != nil { - pkg, err := gbuild.NewBuildContext(s.InstallSuffix(), options.BuildTags).Import(pkgPath, "", build.FindOnly) - if err != nil { - return err - } - s.Watcher.Add(pkg.Dir) - } - pkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags) - if err != nil { - return err - } - archive, err := s.BuildPackage(pkg) - if err != nil { - return err - } - if len(pkgs) == 1 { // Only consider writing output if single package specified. - if pkgObj == "" { - pkgObj = filepath.Base(pkg.Dir) + ".js" - } - if pkg.IsCommand() && !pkg.UpToDate { - if err := s.WriteCommandPackage(archive, pkgObj); err != nil { - return err - } - } - } - } - return nil - }() - exitCode := handleError(err, options, nil) - - if s.Watcher == nil { - os.Exit(exitCode) - } - s.WaitForChange() - } - } - - cmdInstall := &cobra.Command{ - Use: "install [packages]", - Short: "compile and install packages and dependencies", - } - cmdInstall.Flags().AddFlagSet(flagVerbose) - cmdInstall.Flags().AddFlagSet(flagQuiet) - cmdInstall.Flags().AddFlagSet(compilerFlags) - cmdInstall.Flags().AddFlagSet(flagWatch) - cmdInstall.Run = func(cmd *cobra.Command, args []string) { - options.BuildTags = strings.Fields(tags) - for { - s := gbuild.NewSession(options) - - err := func() error { - // Expand import path patterns. - patternContext := gbuild.NewBuildContext("", options.BuildTags) - pkgs := (&gotool.Context{BuildContext: *patternContext}).ImportPaths(args) - - if cmd.Name() == "get" { - goGet := exec.Command("go", append([]string{"get", "-d", "-tags=js"}, pkgs...)...) - goGet.Stdout = os.Stdout - goGet.Stderr = os.Stderr - if err := goGet.Run(); err != nil { - return err - } - } - for _, pkgPath := range pkgs { - pkg, err := gbuild.Import(pkgPath, 0, s.InstallSuffix(), options.BuildTags) - if s.Watcher != nil && pkg != nil { // add watch even on error - s.Watcher.Add(pkg.Dir) - } - if err != nil { - return err - } - - archive, err := s.BuildPackage(pkg) - if err != nil { - return err - } - - if pkg.IsCommand() && !pkg.UpToDate { - if err := s.WriteCommandPackage(archive, pkg.PkgObj); err != nil { - return err - } - } - } - return nil - }() - exitCode := handleError(err, options, nil) - - if s.Watcher == nil { - os.Exit(exitCode) - } - s.WaitForChange() - } - } - - cmdDoc := &cobra.Command{ - Use: "doc [arguments]", - Short: "display documentation for the requested, package, method or symbol", - } - cmdDoc.Run = func(cmd *cobra.Command, args []string) { - goDoc := exec.Command("go", append([]string{"doc"}, args...)...) - goDoc.Stdout = os.Stdout - goDoc.Stderr = os.Stderr - goDoc.Env = append(os.Environ(), "GOARCH=js") - err := goDoc.Run() - exitCode := handleError(err, options, nil) - os.Exit(exitCode) - } - - cmdGet := &cobra.Command{ - Use: "get [packages]", - Short: "download and install packages and dependencies", - } - cmdGet.Flags().AddFlagSet(flagVerbose) - cmdGet.Flags().AddFlagSet(flagQuiet) - cmdGet.Flags().AddFlagSet(compilerFlags) - cmdGet.Run = cmdInstall.Run - - cmdRun := &cobra.Command{ - Use: "run [gofiles...] [arguments...]", - Short: "compile and run Go program", - } - cmdRun.Flags().AddFlagSet(flagVerbose) - cmdRun.Flags().AddFlagSet(flagQuiet) - cmdRun.Flags().AddFlagSet(compilerFlags) - cmdRun.Run = func(cmd *cobra.Command, args []string) { - err := func() error { - lastSourceArg := 0 - for { - if lastSourceArg == len(args) || !(strings.HasSuffix(args[lastSourceArg], ".go") || strings.HasSuffix(args[lastSourceArg], ".inc.js")) { - break - } - lastSourceArg++ - } - if lastSourceArg == 0 { - return fmt.Errorf("gopherjs run: no go files listed") - } - - tempfile, err := ioutil.TempFile(currentDirectory, filepath.Base(args[0])+".") - if err != nil && strings.HasPrefix(currentDirectory, runtime.GOROOT()) { - tempfile, err = ioutil.TempFile("", filepath.Base(args[0])+".") - } - if err != nil { - return err - } - defer func() { - tempfile.Close() - os.Remove(tempfile.Name()) - os.Remove(tempfile.Name() + ".map") - }() - s := gbuild.NewSession(options) - if err := s.BuildFiles(args[:lastSourceArg], tempfile.Name(), currentDirectory); err != nil { - return err - } - if err := runNode(tempfile.Name(), args[lastSourceArg:], "", options.Quiet); err != nil { - return err - } - return nil - }() - exitCode := handleError(err, options, nil) - - os.Exit(exitCode) - } - - cmdTest := &cobra.Command{ - Use: "test [packages]", - Short: "test packages", - } - bench := cmdTest.Flags().String("bench", "", "Run benchmarks matching the regular expression. By default, no benchmarks run. To run all benchmarks, use '--bench=.'.") - benchtime := cmdTest.Flags().String("benchtime", "", "Run enough iterations of each benchmark to take t, specified as a time.Duration (for example, -benchtime 1h30s). The default is 1 second (1s).") - count := cmdTest.Flags().String("count", "", "Run each test and benchmark n times (default 1). Examples are always run once.") - run := cmdTest.Flags().String("run", "", "Run only those tests and examples matching the regular expression.") - short := cmdTest.Flags().Bool("short", false, "Tell long-running tests to shorten their run time.") - verbose := cmdTest.Flags().BoolP("verbose", "v", false, "Log all tests as they are run. Also print all text from Log and Logf calls even if the test succeeds.") - compileOnly := cmdTest.Flags().BoolP("compileonly", "c", false, "Compile the test binary to pkg.test.js but do not run it (where pkg is the last element of the package's import path). The file name can be changed with the -o flag.") - outputFilename := cmdTest.Flags().StringP("output", "o", "", "Compile the test binary to the named file. The test still runs (unless -c is specified).") - cmdTest.Flags().AddFlagSet(compilerFlags) - cmdTest.Run = func(cmd *cobra.Command, args []string) { - options.BuildTags = strings.Fields(tags) - err := func() error { - // Expand import path patterns. - patternContext := gbuild.NewBuildContext("", options.BuildTags) - args = (&gotool.Context{BuildContext: *patternContext}).ImportPaths(args) - - pkgs := make([]*gbuild.PackageData, len(args)) - for i, pkgPath := range args { - var err error - pkgs[i], err = gbuild.Import(pkgPath, 0, "", options.BuildTags) - if err != nil { - return err - } - } - - var exitErr error - for _, pkg := range pkgs { - if len(pkg.TestGoFiles) == 0 && len(pkg.XTestGoFiles) == 0 { - fmt.Printf("? \t%s\t[no test files]\n", pkg.ImportPath) - continue - } - s := gbuild.NewSession(options) - - tests := &testFuncs{Package: pkg.Package} - collectTests := func(testPkg *gbuild.PackageData, testPkgName string, needVar *bool) error { - if testPkgName == "_test" { - for _, file := range pkg.TestGoFiles { - if err := tests.load(filepath.Join(pkg.Package.Dir, file), testPkgName, &tests.ImportTest, &tests.NeedTest); err != nil { - return err - } - } - } else { - for _, file := range pkg.XTestGoFiles { - if err := tests.load(filepath.Join(pkg.Package.Dir, file), "_xtest", &tests.ImportXtest, &tests.NeedXtest); err != nil { - return err - } - } - } - _, err := s.BuildPackage(testPkg) - return err - } - - if err := collectTests(&gbuild.PackageData{ - Package: &build.Package{ - ImportPath: pkg.ImportPath, - Dir: pkg.Dir, - GoFiles: append(pkg.GoFiles, pkg.TestGoFiles...), - Imports: append(pkg.Imports, pkg.TestImports...), - }, - IsTest: true, - JSFiles: pkg.JSFiles, - }, "_test", &tests.NeedTest); err != nil { - return err - } - - if err := collectTests(&gbuild.PackageData{ - Package: &build.Package{ - ImportPath: pkg.ImportPath + "_test", - Dir: pkg.Dir, - GoFiles: pkg.XTestGoFiles, - Imports: pkg.XTestImports, - }, - IsTest: true, - }, "_xtest", &tests.NeedXtest); err != nil { - return err - } - - buf := new(bytes.Buffer) - if err := testmainTmpl.Execute(buf, tests); err != nil { - return err - } - - fset := token.NewFileSet() - mainFile, err := parser.ParseFile(fset, "_testmain.go", buf, 0) - if err != nil { - return err - } - - importContext := &compiler.ImportContext{ - Packages: s.Types, - Import: func(path string) (*compiler.Archive, error) { - if path == pkg.ImportPath || path == pkg.ImportPath+"_test" { - return s.Archives[path], nil - } - return s.BuildImportPath(path) - }, - } - mainPkgArchive, err := compiler.Compile("main", []*ast.File{mainFile}, fset, importContext, options.Minify) - if err != nil { - return err - } - - if *compileOnly && *outputFilename == "" { - *outputFilename = pkg.Package.Name + "_test.js" - } - - var outfile *os.File - if *outputFilename != "" { - outfile, err = os.Create(*outputFilename) - if err != nil { - return err - } - } else { - outfile, err = ioutil.TempFile(currentDirectory, "test.") - if err != nil { - return err - } - } - defer func() { - outfile.Close() - if *outputFilename == "" { - os.Remove(outfile.Name()) - os.Remove(outfile.Name() + ".map") - } - }() - - if err := s.WriteCommandPackage(mainPkgArchive, outfile.Name()); err != nil { - return err - } - - if *compileOnly { - continue - } - - var args []string - if *bench != "" { - args = append(args, "-test.bench", *bench) - } - if *benchtime != "" { - args = append(args, "-test.benchtime", *benchtime) - } - if *count != "" { - args = append(args, "-test.count", *count) - } - if *run != "" { - args = append(args, "-test.run", *run) - } - if *short { - args = append(args, "-test.short") - } - if *verbose { - args = append(args, "-test.v") - } - status := "ok " - start := time.Now() - if err := runNode(outfile.Name(), args, pkg.Dir, options.Quiet); err != nil { - if _, ok := err.(*exec.ExitError); !ok { - return err - } - exitErr = err - status = "FAIL" - } - fmt.Printf("%s\t%s\t%.3fs\n", status, pkg.ImportPath, time.Since(start).Seconds()) - } - return exitErr - }() - exitCode := handleError(err, options, nil) - - os.Exit(exitCode) - } - - cmdServe := &cobra.Command{ - Use: "serve [root]", - Short: "compile on-the-fly and serve", - } - cmdServe.Flags().AddFlagSet(flagVerbose) - cmdServe.Flags().AddFlagSet(flagQuiet) - cmdServe.Flags().AddFlagSet(compilerFlags) - var addr string - cmdServe.Flags().StringVarP(&addr, "http", "", ":8080", "HTTP bind address to serve") - cmdServe.Run = func(cmd *cobra.Command, args []string) { - options.BuildTags = strings.Fields(tags) - dirs := append(filepath.SplitList(build.Default.GOPATH), build.Default.GOROOT) - var root string - - if len(args) > 1 { - cmdServe.HelpFunc()(cmd, args) - os.Exit(1) - } - - if len(args) == 1 { - root = args[0] - } - - sourceFiles := http.FileServer(serveCommandFileSystem{ - serveRoot: root, - options: options, - dirs: dirs, - sourceMaps: make(map[string][]byte), - }) - - ln, err := net.Listen("tcp", addr) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if tcpAddr := ln.Addr().(*net.TCPAddr); tcpAddr.IP.Equal(net.IPv4zero) || tcpAddr.IP.Equal(net.IPv6zero) { // Any available addresses. - fmt.Printf("serving at http://localhost:%d and on port %d of any available addresses\n", tcpAddr.Port, tcpAddr.Port) - } else { // Specific address. - fmt.Printf("serving at http://%s\n", tcpAddr) - } - fmt.Fprintln(os.Stderr, http.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}, sourceFiles)) - } - - cmdVersion := &cobra.Command{ - Use: "version", - Short: "print GopherJS compiler version", - } - cmdVersion.Run = func(cmd *cobra.Command, args []string) { - if len(args) > 0 { - cmdServe.HelpFunc()(cmd, args) - os.Exit(1) - } - - fmt.Printf("GopherJS %s\n", compiler.Version) - } - - rootCmd := &cobra.Command{ - Use: "gopherjs", - Long: "GopherJS is a tool for compiling Go source code to JavaScript.", - } - rootCmd.AddCommand(cmdBuild, cmdGet, cmdInstall, cmdRun, cmdTest, cmdServe, cmdVersion, cmdDoc) - err := rootCmd.Execute() - if err != nil { - os.Exit(2) - } -} - -// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted -// connections. It's used by ListenAndServe and ListenAndServeTLS so -// dead TCP connections (e.g. closing laptop mid-download) eventually -// go away. -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 -} - -type serveCommandFileSystem struct { - serveRoot string - options *gbuild.Options - dirs []string - sourceMaps map[string][]byte -} - -func (fs serveCommandFileSystem) Open(requestName string) (http.File, error) { - name := path.Join(fs.serveRoot, requestName[1:]) // requestName[0] == '/' - - dir, file := path.Split(name) - base := path.Base(dir) // base is parent folder name, which becomes the output file name. - - isPkg := file == base+".js" - isMap := file == base+".js.map" - isIndex := file == "index.html" - - if isPkg || isMap || isIndex { - // If we're going to be serving our special files, make sure there's a Go command in this folder. - s := gbuild.NewSession(fs.options) - pkg, err := gbuild.Import(path.Dir(name), 0, s.InstallSuffix(), fs.options.BuildTags) - if err != nil || pkg.Name != "main" { - isPkg = false - isMap = false - isIndex = false - } - - switch { - case isPkg: - buf := new(bytes.Buffer) - browserErrors := new(bytes.Buffer) - err := func() error { - archive, err := s.BuildPackage(pkg) - if err != nil { - return err - } - - sourceMapFilter := &compiler.SourceMapFilter{Writer: buf} - m := &sourcemap.Map{File: base + ".js"} - sourceMapFilter.MappingCallback = gbuild.NewMappingCallback(m, fs.options.GOROOT, fs.options.GOPATH, fs.options.MapToLocalDisk) - - deps, err := compiler.ImportDependencies(archive, s.BuildImportPath) - if err != nil { - return err - } - if err := compiler.WriteProgramCode(deps, sourceMapFilter); err != nil { - return err - } - - mapBuf := new(bytes.Buffer) - m.WriteTo(mapBuf) - buf.WriteString("//# sourceMappingURL=" + base + ".js.map\n") - fs.sourceMaps[name+".map"] = mapBuf.Bytes() - - return nil - }() - handleError(err, fs.options, browserErrors) - if err != nil { - buf = browserErrors - } - return newFakeFile(base+".js", buf.Bytes()), nil - - case isMap: - if content, ok := fs.sourceMaps[name]; ok { - return newFakeFile(base+".js.map", content), nil - } - } - } - - for _, d := range fs.dirs { - dir := http.Dir(filepath.Join(d, "src")) - - f, err := dir.Open(name) - if err == nil { - return f, nil - } - - // source maps are served outside of serveRoot - f, err = dir.Open(requestName) - if err == nil { - return f, nil - } - } - - if isIndex { - // If there was no index.html file in any dirs, supply our own. - return newFakeFile("index.html", []byte(``)), nil - } - - return nil, os.ErrNotExist -} - -type fakeFile struct { - name string - size int - io.ReadSeeker -} - -func newFakeFile(name string, content []byte) *fakeFile { - return &fakeFile{name: name, size: len(content), ReadSeeker: bytes.NewReader(content)} -} - -func (f *fakeFile) Close() error { - return nil -} - -func (f *fakeFile) Readdir(count int) ([]os.FileInfo, error) { - return nil, os.ErrInvalid -} - -func (f *fakeFile) Stat() (os.FileInfo, error) { - return f, nil -} - -func (f *fakeFile) Name() string { - return f.name -} - -func (f *fakeFile) Size() int64 { - return int64(f.size) -} - -func (f *fakeFile) Mode() os.FileMode { - return 0 -} - -func (f *fakeFile) ModTime() time.Time { - return time.Time{} -} - -func (f *fakeFile) IsDir() bool { - return false -} - -func (f *fakeFile) Sys() interface{} { - return nil -} - -// handleError handles err and returns an appropriate exit code. -// If browserErrors is non-nil, errors are written for presentation in browser. -func handleError(err error, options *gbuild.Options, browserErrors *bytes.Buffer) int { - switch err := err.(type) { - case nil: - return 0 - case compiler.ErrorList: - for _, entry := range err { - printError(entry, options, browserErrors) - } - return 1 - case *exec.ExitError: - return err.Sys().(syscall.WaitStatus).ExitStatus() - default: - printError(err, options, browserErrors) - return 1 - } -} - -// printError prints err to Stderr with options. If browserErrors is non-nil, errors are also written for presentation in browser. -func printError(err error, options *gbuild.Options, browserErrors *bytes.Buffer) { - e := sprintError(err) - options.PrintError("%s\n", e) - if browserErrors != nil { - fmt.Fprintln(browserErrors, `console.error("`+template.JSEscapeString(e)+`");`) - } -} - -// sprintError returns an annotated error string without trailing newline. -func sprintError(err error) string { - makeRel := func(name string) string { - if relname, err := filepath.Rel(currentDirectory, name); err == nil { - return relname - } - return name - } - - switch e := err.(type) { - case *scanner.Error: - return fmt.Sprintf("%s:%d:%d: %s", makeRel(e.Pos.Filename), e.Pos.Line, e.Pos.Column, e.Msg) - case types.Error: - pos := e.Fset.Position(e.Pos) - return fmt.Sprintf("%s:%d:%d: %s", makeRel(pos.Filename), pos.Line, pos.Column, e.Msg) - default: - return fmt.Sprintf("%s", e) - } -} - -func runNode(script string, args []string, dir string, quiet bool) error { - var allArgs []string - if b, _ := strconv.ParseBool(os.Getenv("SOURCE_MAP_SUPPORT")); os.Getenv("SOURCE_MAP_SUPPORT") == "" || b { - allArgs = []string{"--require", "source-map-support/register"} - if err := exec.Command("node", "--require", "source-map-support/register", "--eval", "").Run(); err != nil { - if !quiet { - fmt.Fprintln(os.Stderr, "gopherjs: Source maps disabled. Install source-map-support module for nice stack traces. See https://github.com/gopherjs/gopherjs#gopherjs-run-gopherjs-test.") - } - allArgs = []string{} - } - } - - if runtime.GOOS != "windows" { - // We've seen issues with stack space limits causing - // recursion-heavy standard library tests to fail (e.g., see - // https://github.com/gopherjs/gopherjs/pull/669#issuecomment-319319483). - // - // There are two separate limits in non-Windows environments: - // - // - OS process limit - // - Node.js (V8) limit - // - // GopherJS fetches the current OS process limit, and sets the - // Node.js limit to the same value. So both limits are kept in sync - // and can be controlled by setting OS process limit. E.g.: - // - // ulimit -s 10000 && gopherjs test - // - cur, err := sysutil.RlimitStack() - if err != nil { - return fmt.Errorf("failed to get stack size limit: %v", err) - } - allArgs = append(allArgs, fmt.Sprintf("--stack_size=%v", cur/1000)) // Convert from bytes to KB. - } - - allArgs = append(allArgs, script) - allArgs = append(allArgs, args...) - - node := exec.Command("node", allArgs...) - node.Dir = dir - node.Stdin = os.Stdin - node.Stdout = os.Stdout - node.Stderr = os.Stderr - err := node.Run() - if _, ok := err.(*exec.ExitError); err != nil && !ok { - err = fmt.Errorf("could not run Node.js: %s", err.Error()) - } - return err -} - -type testFuncs struct { - Tests []testFunc - Benchmarks []testFunc - Examples []testFunc - TestMain *testFunc - Package *build.Package - ImportTest bool - NeedTest bool - ImportXtest bool - NeedXtest bool -} - -type testFunc struct { - Package string // imported package name (_test or _xtest) - Name string // function name - Output string // output, for examples - Unordered bool // output is allowed to be unordered. -} - -var testFileSet = token.NewFileSet() - -func (t *testFuncs) load(filename, pkg string, doImport, seen *bool) error { - f, err := parser.ParseFile(testFileSet, filename, nil, parser.ParseComments) - if err != nil { - return err - } - for _, d := range f.Decls { - n, ok := d.(*ast.FuncDecl) - if !ok { - continue - } - if n.Recv != nil { - continue - } - name := n.Name.String() - switch { - case isTestMain(n): - if t.TestMain != nil { - return errors.New("multiple definitions of TestMain") - } - t.TestMain = &testFunc{pkg, name, "", false} - *doImport, *seen = true, true - case isTest(name, "Test"): - t.Tests = append(t.Tests, testFunc{pkg, name, "", false}) - *doImport, *seen = true, true - case isTest(name, "Benchmark"): - t.Benchmarks = append(t.Benchmarks, testFunc{pkg, name, "", false}) - *doImport, *seen = true, true - } - } - ex := doc.Examples(f) - sort.Sort(byOrder(ex)) - for _, e := range ex { - *doImport = true // import test file whether executed or not - if e.Output == "" && !e.EmptyOutput { - // Don't run examples with no output. - continue - } - t.Examples = append(t.Examples, testFunc{pkg, "Example" + e.Name, e.Output, e.Unordered}) - *seen = true - } - - return nil -} - -type byOrder []*doc.Example - -func (x byOrder) Len() int { return len(x) } -func (x byOrder) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byOrder) Less(i, j int) bool { return x[i].Order < x[j].Order } - -// isTestMain tells whether fn is a TestMain(m *testing.M) function. -func isTestMain(fn *ast.FuncDecl) bool { - if fn.Name.String() != "TestMain" || - fn.Type.Results != nil && len(fn.Type.Results.List) > 0 || - fn.Type.Params == nil || - len(fn.Type.Params.List) != 1 || - len(fn.Type.Params.List[0].Names) > 1 { - return false - } - ptr, ok := fn.Type.Params.List[0].Type.(*ast.StarExpr) - if !ok { - return false - } - // We can't easily check that the type is *testing.M - // because we don't know how testing has been imported, - // but at least check that it's *M or *something.M. - if name, ok := ptr.X.(*ast.Ident); ok && name.Name == "M" { - return true - } - if sel, ok := ptr.X.(*ast.SelectorExpr); ok && sel.Sel.Name == "M" { - return true - } - return false -} - -// 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 - } - rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) - return !unicode.IsLower(rune) -} - -var testmainTmpl = template.Must(template.New("main").Parse(` -package main - -import ( -{{if not .TestMain}} - "os" -{{end}} - "testing" - "testing/internal/testdeps" - -{{if .ImportTest}} - {{if .NeedTest}}_test{{else}}_{{end}} {{.Package.ImportPath | printf "%q"}} -{{end}} -{{if .ImportXtest}} - {{if .NeedXtest}}_xtest{{else}}_{{end}} {{.Package.ImportPath | printf "%s_test" | printf "%q"}} -{{end}} -) - -var tests = []testing.InternalTest{ -{{range .Tests}} - {"{{.Name}}", {{.Package}}.{{.Name}}}, -{{end}} -} - -var benchmarks = []testing.InternalBenchmark{ -{{range .Benchmarks}} - {"{{.Name}}", {{.Package}}.{{.Name}}}, -{{end}} -} - -var examples = []testing.InternalExample{ -{{range .Examples}} - {"{{.Name}}", {{.Package}}.{{.Name}}, {{.Output | printf "%q"}}, {{.Unordered}}}, -{{end}} -} - -func main() { - m := testing.MainStart(testdeps.TestDeps{}, tests, benchmarks, examples) -{{with .TestMain}} - {{.Package}}.{{.Name}}(m) -{{else}} - os.Exit(m.Run()) -{{end}} -} - -`)) diff --git a/vendor/github.com/gorilla/websocket/.gitignore b/vendor/github.com/gorilla/websocket/.gitignore deleted file mode 100644 index ac710204fa1..00000000000 --- a/vendor/github.com/gorilla/websocket/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# 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 - -.idea/ -*.iml \ No newline at end of file diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md deleted file mode 100644 index 33c3d2be3e3..00000000000 --- a/vendor/github.com/gorilla/websocket/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Gorilla WebSocket - -Gorilla WebSocket is a [Go](http://golang.org/) implementation of the -[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. - -[![Build Status](https://travis-ci.org/gorilla/websocket.svg?branch=master)](https://travis-ci.org/gorilla/websocket) -[![GoDoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) - -### Documentation - -* [API Reference](http://godoc.org/github.com/gorilla/websocket) -* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat) -* [Command example](https://github.com/gorilla/websocket/tree/master/examples/command) -* [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo) -* [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch) - -### Status - -The Gorilla WebSocket package provides a complete and tested implementation of -the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. The -package API is stable. - -### Installation - - go get github.com/gorilla/websocket - -### Protocol Compliance - -The Gorilla WebSocket package passes the server tests in the [Autobahn Test -Suite](http://autobahn.ws/testsuite) using the application in the [examples/autobahn -subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). - -### Gorilla WebSocket compared with other packages - - - - - - - - - - - - - - - - - - -
github.com/gorillagolang.org/x/net
RFC 6455 Features
Passes Autobahn Test SuiteYesNo
Receive fragmented messageYesNo, see note 1
Send close messageYesNo
Send pings and receive pongsYesNo
Get the type of a received data messageYesYes, see note 2
Other Features
Compression ExtensionsExperimentalNo
Read message using io.ReaderYesNo, see note 3
Write message using io.WriteCloserYesNo, see note 3
- -Notes: - -1. Large messages are fragmented in [Chrome's new WebSocket implementation](http://www.ietf.org/mail-archive/web/hybi/current/msg10503.html). -2. The application can get the type of a received data message by implementing - a [Codec marshal](http://godoc.org/golang.org/x/net/websocket#Codec.Marshal) - function. -3. The go.net io.Reader and io.Writer operate across WebSocket frame boundaries. - Read returns when the input buffer is full or a frame boundary is - encountered. Each call to Write sends a single frame message. The Gorilla - io.Reader and io.WriteCloser operate on a single WebSocket message. - diff --git a/vendor/github.com/gosimple/slug/.gitignore b/vendor/github.com/gosimple/slug/.gitignore deleted file mode 100644 index 25d190e2bc7..00000000000 --- a/vendor/github.com/gosimple/slug/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_* -cover*.out diff --git a/vendor/github.com/gosimple/slug/README.md b/vendor/github.com/gosimple/slug/README.md deleted file mode 100644 index b1f16b281dc..00000000000 --- a/vendor/github.com/gosimple/slug/README.md +++ /dev/null @@ -1,54 +0,0 @@ -slug -==== - -Package `slug` generate slug from unicode string, URL-friendly slugify with -multiple languages support. - -[![GoDoc](https://godoc.org/github.com/gosimple/slug?status.png)](https://godoc.org/github.com/gosimple/slug) -[![Build Status](https://drone.io/github.com/gosimple/slug/status.png)](https://drone.io/github.com/gosimple/slug/latest) - -[Documentation online](http://godoc.org/github.com/gosimple/slug) - -## Example - - package main - - import( - "github.com/gosimple/slug" - "fmt" - ) - - func main () { - text := slug.Make("Hellö Wörld хелло ворлд") - fmt.Println(text) // Will print: "hello-world-khello-vorld" - - someText := slug.Make("影師") - fmt.Println(someText) // Will print: "ying-shi" - - enText := slug.MakeLang("This & that", "en") - fmt.Println(enText) // Will print: "this-and-that" - - deText := slug.MakeLang("Diese & Dass", "de") - fmt.Println(deText) // Will print: "diese-und-dass" - - slug.CustomSub = map[string]string{ - "water": "sand", - } - textSub := slug.Make("water is hot") - fmt.Println(textSub) // Will print: "sand-is-hot" - } - -### Requests or bugs? - - -## Installation - - go get -u github.com/gosimple/slug - -## License - -The source files are distributed under the -[Mozilla Public License, version 2.0](http://mozilla.org/MPL/2.0/), -unless otherwise noted. -Please read the [FAQ](http://www.mozilla.org/MPL/2.0/FAQ.html) -if you have further questions regarding the license. diff --git a/vendor/github.com/gosimple/slug/slug_test.go b/vendor/github.com/gosimple/slug/slug_test.go deleted file mode 100644 index e5570d74fb4..00000000000 --- a/vendor/github.com/gosimple/slug/slug_test.go +++ /dev/null @@ -1,421 +0,0 @@ -// Copyright 2013 by Dobrosław Żybort. All rights reserved. -// 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/. - -package slug - -import ( - "testing" -) - -//============================================================================= - -func TestSlugMake(t *testing.T) { - var testCases = []struct { - in string - want string - }{ - {"DOBROSLAWZYBORT", "dobroslawzybort"}, - {"Dobroslaw Zybort", "dobroslaw-zybort"}, - {" Dobroslaw Zybort ?", "dobroslaw-zybort"}, - {"Dobrosław Żybort", "dobroslaw-zybort"}, - {"Ala ma 6 kotów.", "ala-ma-6-kotow"}, - - {"áÁàÀãÃâÂäÄąĄą̊Ą̊", "aaaaaaaaaaaaaa"}, - {"ćĆĉĈçÇ", "cccccc"}, - {"éÉèÈẽẼêÊëËęĘ", "eeeeeeeeeeee"}, - {"íÍìÌĩĨîÎïÏįĮ", "iiiiiiiiiiii"}, - {"łŁ", "ll"}, - {"ńŃ", "nn"}, - {"óÓòÒõÕôÔöÖǫǪǭǬø", "ooooooooooooooo"}, - {"śŚ", "ss"}, - {"úÚùÙũŨûÛüÜųŲ", "uuuuuuuuuuuu"}, - {"y̨Y̨", "yy"}, - {"źŹżŹ", "zzzz"}, - {"·/,:;`˜'\"", ""}, - {"2000–2013", "2000-2013"}, - {"style—not", "style-not"}, - {"test_slug", "test_slug"}, - {"Æ", "ae"}, - {"Ich heiße", "ich-heisse"}, - - {"This & that", "this-and-that"}, - {"fácil €", "facil-eu"}, - {"smile ☺", "smile"}, - {"Hellö Wörld хелло ворлд", "hello-world-khello-vorld"}, - {"\"C'est déjà l’été.\"", "cest-deja-lete"}, - {"jaja---lol-méméméoo--a", "jaja-lol-mememeoo-a"}, - {"影師", "ying-shi"}, - } - - for index, st := range testCases { - got := Make(st.in) - if got != st.want { - t.Errorf( - "%d. Make(%#v) = %#v; want %#v", - index, st.in, got, st.want) - } - } -} - -func TestSlugMakeLang(t *testing.T) { - var testCases = []struct { - lang string - in string - want string - }{ - {"en", "This & that", "this-and-that"}, - {"de", "This & that", "this-und-that"}, - {"pl", "This & that", "this-i-that"}, - {"es", "This & that", "this-y-that"}, - {"gr", "This & that", "this-kai-that"}, - {"test", "This & that", "this-and-that"}, // unknown lang, fallback to "en" - } - - for index, smlt := range testCases { - got := MakeLang(smlt.in, smlt.lang) - if got != smlt.want { - t.Errorf( - "%d. MakeLang(%#v, %#v) = %#v; want %#v", - index, smlt.in, smlt.lang, got, smlt.want) - } - } -} - -func TestSlugMakeUserSubstituteLang(t *testing.T) { - var testCases = []struct { - cSub map[string]string - lang string - in string - want string - }{ - {map[string]string{"'": " "}, "en", "That's great", "that-s-great"}, - {map[string]string{"&": "or"}, "en", "This & that", "this-or-that"}, // by default "&" => "and" - {map[string]string{"&": "or"}, "de", "This & that", "this-or-that"}, // by default "&" => "und" - {map[string]string{"&": "or", "@": "the"}, "de", "@ This & that", "the-this-or-that"}, // by default "&" => "und", "@" => "an" - } - - for index, smust := range testCases { - CustomSub = smust.cSub - got := MakeLang(smust.in, smust.lang) - if got != smust.want { - t.Errorf( - "%d. %#v; MakeLang(%#v, %#v) = %#v; want %#v", - index, smust.cSub, smust.in, smust.lang, - got, smust.want) - - } - } -} - -func TestSlugMakeSubstituteOrderLang(t *testing.T) { - // Always substitute runes first - var testCases = []struct { - rSub map[rune]string - sSub map[string]string - in string - want string - }{ - {map[rune]string{'o': "left"}, map[string]string{"o": "right"}, "o o", "left-left"}, - {map[rune]string{'o': "left", 'a': "r"}, map[string]string{"o": "right"}, "o a o", "left-r-left"}, - {map[rune]string{'o': "left"}, map[string]string{"o": "right", "a": "r"}, "a o a o", "r-left-r-left"}, - {map[rune]string{'&': "down"}, map[string]string{"&": "up"}, "&", "down"}, - } - - for index, smsot := range testCases { - CustomRuneSub = smsot.rSub - CustomSub = smsot.sSub - got := Make(smsot.in) - if got != smsot.want { - t.Errorf( - "%d. %#v; %#v; Make(%#v) = %#v; want %#v", - index, smsot.rSub, smsot.sSub, smsot.in, - got, smsot.want) - - } - } -} - -func TestSubstituteLang(t *testing.T) { - var testCases = []struct { - cSub map[string]string - in string - want string - }{ - {map[string]string{"o": "no"}, "o o o", "no no no"}, - {map[string]string{"o": "no", "a": "or"}, "o a o", "no nor no"}, - {map[string]string{"a": "or", "o": "no"}, "o a o", "no nor no"}, - {map[string]string{"'": " "}, "That's great", "That s great"}, - } - - for index, sst := range testCases { - got := Substitute(sst.in, sst.cSub) - if got != sst.want { - t.Errorf( - "%d. Substitute(%#v, %#v) = %#v; want %#v", - index, sst.in, sst.cSub, got, sst.want) - } - } -} - -func TestSubstituteRuneLang(t *testing.T) { - var testCases = []struct { - cSub map[rune]string - in string - want string - }{ - {map[rune]string{'o': "no"}, "o o o", "no no no"}, - {map[rune]string{'o': "no", 'a': "or"}, "o a o", "no or no"}, - {map[rune]string{'a': "or", 'o': "no"}, "o a o", "no or no"}, - {map[rune]string{'\'': " "}, "That's great", "That s great"}, - } - - for index, ssrt := range testCases { - got := SubstituteRune(ssrt.in, ssrt.cSub) - if got != ssrt.want { - t.Errorf( - "%d. SubstituteRune(%#v, %#v) = %#v; want %#v", - index, ssrt.in, ssrt.cSub, got, ssrt.want) - } - } -} - -func TestSlugMakeSmartTruncate(t *testing.T) { - var testCases = []struct { - in string - maxLength int - want string - }{ - {"DOBROSLAWZYBORT", 100, "dobroslawzybort"}, - {"Dobroslaw Zybort", 100, "dobroslaw-zybort"}, - {"Dobroslaw Zybort", 12, "dobroslaw"}, - {" Dobroslaw Zybort ?", 12, "dobroslaw"}, - {"Ala ma 6 kotów.", 10, "ala-ma-6"}, - {"Dobrosław Żybort", 5, "dobro"}, - } - - for index, smstt := range testCases { - MaxLength = smstt.maxLength - got := Make(smstt.in) - if got != smstt.want { - t.Errorf( - "%d. MaxLength = %v; Make(%#v) = %#v; want %#v", - index, smstt.maxLength, smstt.in, got, smstt.want) - } - } -} - -func TestIsSlug(t *testing.T) { - MaxLength = 0 - type args struct { - text string - } - tests := []struct { - name string - args args - want bool - }{ - {"some", args{"some"}, true}, - {"with -", args{"some-more"}, true}, - {"with _", args{"some_more"}, true}, - {"with numbers", args{"number-2"}, true}, - {"empty string", args{""}, false}, - {"upper case", args{"Some-more"}, false}, - {"space", args{"some more"}, false}, - {"starts with '-'", args{"-some"}, false}, - {"ends with '-'", args{"some-"}, false}, - {"starts with '_'", args{"_some"}, false}, - {"ends with '_'", args{"some_"}, false}, - {"outside ASCII", args{"Dobrosław Żybort"}, false}, - {"outside ASCII –", args{"2000–2013"}, false}, - {"smile ☺", args{"smile ☺"}, false}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := IsSlug(tt.args.text); got != tt.want { - t.Errorf("IsSlug() = %v, want %v", got, tt.want) - } - }) - } - - t.Run("MaxLength", func(t *testing.T) { - MaxLength = 4 - if got := IsSlug("012345"); got != false { - t.Errorf("IsSlug() = %v, want %v", got, false) - } - MaxLength = 0 - }) -} - -func BenchmarkMakeShortAscii(b *testing.B) { - b.ReportAllocs() - for n := 0; n < b.N; n++ { - Make("Hello world") - } -} -func BenchmarkMakeShort(b *testing.B) { - b.ReportAllocs() - for n := 0; n < b.N; n++ { - Make("хелло ворлд") - } -} - -func BenchmarkMakeShortSymbols(b *testing.B) { - b.ReportAllocs() - for n := 0; n < b.N; n++ { - Make("·/,:;`˜'\" &€£¥") - } -} - -func BenchmarkMakeMediumAscii(b *testing.B) { - b.ReportAllocs() - for n := 0; n < b.N; n++ { - Make("ABCDE FGHIJ KLMNO PQRST UWXYZ ABCDE FGHIJ KLMNO PQRST UWXYZ ABCDE") - } -} - -func BenchmarkMakeMedium(b *testing.B) { - b.ReportAllocs() - for n := 0; n < b.N; n++ { - Make("ヲァィゥェ ォャュョッ ーアイウエ オカキクケ コサシスセ ソタチツテ トナニヌネ ノハヒフヘ ホマミムメ モヤユヨラ リルレロワ") - } -} - -func BenchmarkMakeLongAscii(b *testing.B) { - longStr := "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi " + - "pulvinar sodales ultrices. Nulla facilisi. Sed at vestibulum erat. Ut " + - "sit amet urna posuere, sagittis eros ac, varius nisi. Morbi ullamcorper " + - "odio at nunc pulvinar mattis. Vestibulum rutrum, ante eu dictum mattis, " + - "elit risus finibus nunc, consectetur facilisis eros leo ut sapien. Sed " + - "pulvinar volutpat mi. Cras semper mi ac eros accumsan, at feugiat massa " + - "elementum. Morbi eget dolor sit amet purus condimentum egestas non ut " + - "sapien. Duis feugiat magna vitae nisi lobortis, quis finibus sem " + - "sollicitudin. Pellentesque eleifend blandit ipsum, ut porta arcu " + - "ultricies et. Fusce vel ipsum porta, placerat diam ac, consectetur " + - "magna. Nulla in porta sem. Suspendisse commodo, felis in molestie " + - "ultricies, arcu ipsum aliquet turpis, elementum dapibus ipsum lorem a " + - "nisl. Etiam varius imperdiet placerat. Aliquam euismod lacus arcu, " + - "ultrices hendrerit est pellentesque vel. Aliquam sit amet laoreet leo. " + - "Integer eros libero, mollis sed posuere." - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - Make(longStr) - } -} - -func BenchmarkSubstituteRuneShort(b *testing.B) { - shortStr := "Hello/Hi world" - subs := map[rune]string{'o': "no", '/': "slash"} - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - SubstituteRune(shortStr, subs) - } -} - -func BenchmarkSubstituteRuneLong(b *testing.B) { - longStr := "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi " + - "pulvinar sodales ultrices. Nulla facilisi. Sed at vestibulum erat. Ut " + - "sit amet urna posuere, sagittis eros ac, varius nisi. Morbi ullamcorper " + - "odio at nunc pulvinar mattis. Vestibulum rutrum, ante eu dictum mattis, " + - "elit risus finibus nunc, consectetur facilisis eros leo ut sapien. Sed " + - "pulvinar volutpat mi. Cras semper mi ac eros accumsan, at feugiat massa " + - "elementum. Morbi eget dolor sit amet purus condimentum egestas non ut " + - "sapien. Duis feugiat magna vitae nisi lobortis, quis finibus sem " + - "sollicitudin. Pellentesque eleifend blandit ipsum, ut porta arcu " + - "ultricies et. Fusce vel ipsum porta, placerat diam ac, consectetur " + - "magna. Nulla in porta sem. Suspendisse commodo, felis in molestie " + - "ultricies, arcu ipsum aliquet turpis, elementum dapibus ipsum lorem a " + - "nisl. Etiam varius imperdiet placerat. Aliquam euismod lacus arcu, " + - "ultrices hendrerit est pellentesque vel. Aliquam sit amet laoreet leo. " + - "Integer eros libero, mollis sed posuere." - subs := map[rune]string{ - 'o': "no", - '/': "slash", - 'i': "done", - 'E': "es", - 'a': "ASD", - '1': "one", - 'l': "onetwo", - } - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - SubstituteRune(longStr, subs) - } -} - -func BenchmarkSmartTruncateShort(b *testing.B) { - shortStr := "Hello-world" - MaxLength = 8 - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - smartTruncate(shortStr) - } -} - -func BenchmarkSmartTruncateLong(b *testing.B) { - longStr := "Lorem-ipsum-dolor-sit-amet,-consectetur-adipiscing-elit.-Morbi-" + - "pulvinar-sodales-ultrices.-Nulla-facilisi.-Sed-at-vestibulum-erat.-Ut-" + - "sit-amet-urna-posuere,-sagittis-eros-ac,-varius-nisi.-Morbi-ullamcorper-" + - "odio-at-nunc-pulvinar-mattis.-Vestibulum-rutrum,-ante-eu-dictum-mattis,-" + - "elit-risus-finibus-nunc,-consectetur-facilisis-eros-leo-ut-sapien.-Sed-" + - "pulvinar-volutpat-mi.-Cras-semper-mi-ac-eros-accumsan,-at-feugiat-massa-" + - "elementum.-Morbi-eget-dolor-sit-amet-purus-condimentum-egestas-non-ut-" + - "sapien.-Duis-feugiat-magna-vitae-nisi-lobortis,-quis-finibus-sem-" + - "sollicitudin.-Pellentesque-eleifend-blandit-ipsum,-ut-porta-arcu-" + - "ultricies-et.-Fusce-vel-ipsum-porta,-placerat-diam-ac,-consectetur-" + - "magna.-Nulla-in-porta-sem.-Suspendisse-commodo,-felis-in-molestie-" + - "ultricies,-arcu-ipsum-aliquet-turpis,-elementum-dapibus-ipsum-lorem-a-" + - "nisl.-Etiam-varius-imperdiet-placerat.-Aliquam-euismod-lacus-arcu,-" + - "ultrices-hendrerit-est-pellentesque-vel.-Aliquam-sit-amet-laoreet-leo.-" + - "Integer-eros-libero,-mollis-sed-posuere." - MaxLength = 256 - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - smartTruncate(longStr) - } -} - -func BenchmarkIsSlugShort(b *testing.B) { - shortStr := "hello-world" - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - IsSlug(shortStr) - } -} - -func BenchmarkIsSlugLong(b *testing.B) { - longStr := "lorem-ipsum-dolor-sit-amet-consectetur-adipiscing-elit-morbi-" + - "pulvinar-sodales-ultrices-nulla-facilisi-sed-at-vestibulum-erat-ut-" + - "sit-amet-urna-posuere-sagittis-eros-ac-varius-nisi-morbi-ullamcorper-" + - "odio-at-nunc-pulvinar-mattis-vestibulum-rutrum-ante-eu-dictum-mattis,-" + - "elit-risus-finibus-nunc-consectetur-facilisis-eros-leo-ut-sapien-sed-" + - "pulvinar-volutpat-mi-cras-semper-mi-ac-eros-accumsan-at-feugiat-massa-" + - "elementum-morbi-eget-dolor-sit-amet-purus-condimentum-egestas-non-ut-" + - "sapien-duis-feugiat-magna-vitae-nisi-lobortis-quis-finibus-sem-" + - "sollicitudin-pellentesque-eleifend-blandit-ipsum-ut-porta-arcu-" + - "ultricies-et-fusce-vel-ipsum-porta-placerat-diam-ac-consectetur-" + - "magna-nulla-in-porta-sem-suspendisse-commodo-felis-in-molestie-" + - "ultricies-arcu-ipsum-aliquet-turpis-elementum-dapibus-ipsum-lorem-a-" + - "nisl-etiam-varius-imperdiet-placerat-aliquam-euismod-lacus-arcu-" + - "ultrices-hendrerit-est-pellentesque-vel-aliquam-sit-amet-laoreet-leo-" + - "integer-eros-libero-mollis-sed-posuere" - - b.ReportAllocs() - b.ResetTimer() - for n := 0; n < b.N; n++ { - IsSlug(longStr) - } -} diff --git a/vendor/github.com/grafana/grafana_plugin_model/.gitignore b/vendor/github.com/grafana/grafana_plugin_model/.gitignore deleted file mode 100644 index a1338d68517..00000000000 --- a/vendor/github.com/grafana/grafana_plugin_model/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ diff --git a/vendor/github.com/grafana/grafana_plugin_model/Gopkg.lock b/vendor/github.com/grafana/grafana_plugin_model/Gopkg.lock deleted file mode 100644 index fee5fb34d63..00000000000 --- a/vendor/github.com/grafana/grafana_plugin_model/Gopkg.lock +++ /dev/null @@ -1,62 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - name = "github.com/golang/protobuf" - packages = ["proto","ptypes","ptypes/any","ptypes/duration","ptypes/timestamp"] - revision = "1e59b77b52bf8e4b449a57e6f79f21226d571845" - -[[projects]] - branch = "master" - name = "github.com/hashicorp/go-hclog" - packages = ["."] - revision = "ca137eb4b4389c9bc6f1a6d887f056bf16c00510" - -[[projects]] - name = "github.com/hashicorp/go-plugin" - packages = ["."] - revision = "3e6d191694b5a3a2b99755f31b47fa209e4bcd09" - -[[projects]] - branch = "master" - name = "github.com/hashicorp/yamux" - packages = ["."] - revision = "683f49123a33db61abfb241b7ac5e4af4dc54d55" - -[[projects]] - branch = "master" - name = "github.com/mitchellh/go-testing-interface" - packages = ["."] - revision = "a61a99592b77c9ba629d254a693acffaeb4b7e28" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = ["context","http2","http2/hpack","idna","internal/timeseries","lex/httplex","trace"] - revision = "5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec" - -[[projects]] - branch = "master" - name = "golang.org/x/text" - packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"] - revision = "e19ae1496984b1c655b8044a65c0300a3c878dd3" - -[[projects]] - branch = "master" - name = "google.golang.org/genproto" - packages = ["googleapis/rpc/status"] - revision = "a8101f21cf983e773d0c1133ebc5424792003214" - -[[projects]] - name = "google.golang.org/grpc" - packages = [".","balancer","balancer/base","balancer/roundrobin","codes","connectivity","credentials","encoding","grpclb/grpc_lb_v1/messages","grpclog","health","health/grpc_health_v1","internal","keepalive","metadata","naming","peer","resolver","resolver/dns","resolver/passthrough","stats","status","tap","transport"] - revision = "7cea4cc846bcf00cbb27595b07da5de875ef7de9" - version = "v1.9.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "e779369e64c163fd0c1182f5eaca3a9ac0bb899fbf00abb1d921d2ac3a5c4320" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/grafana/grafana_plugin_model/Gopkg.toml b/vendor/github.com/grafana/grafana_plugin_model/Gopkg.toml deleted file mode 100644 index bf85536f303..00000000000 --- a/vendor/github.com/grafana/grafana_plugin_model/Gopkg.toml +++ /dev/null @@ -1,38 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - -[[constraint]] - branch = "master" - name = "github.com/golang/protobuf" - -[[constraint]] - name = "github.com/hashicorp/go-plugin" - revision = "3e6d191694b5a3a2b99755f31b47fa209e4bcd09" - -[[constraint]] - branch = "master" - name = "golang.org/x/net" - -[[constraint]] - name = "google.golang.org/grpc" - version = "1.9.1" diff --git a/vendor/github.com/grafana/grafana_plugin_model/Makefile b/vendor/github.com/grafana/grafana_plugin_model/Makefile deleted file mode 100644 index 95bb4fe5f1a..00000000000 --- a/vendor/github.com/grafana/grafana_plugin_model/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: clean golang - -clean: - rm -rf go/datasource/*.pb.go - -golang: - protoc -I . datasource.proto --go_out=plugins=grpc:go/datasource/. \ No newline at end of file diff --git a/vendor/github.com/grafana/grafana_plugin_model/README.md b/vendor/github.com/grafana/grafana_plugin_model/README.md deleted file mode 100644 index dffff7e3f47..00000000000 --- a/vendor/github.com/grafana/grafana_plugin_model/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Models for Grafana backend plugins - -# Building - -`make` \ No newline at end of file diff --git a/vendor/github.com/grafana/grafana_plugin_model/datasource.proto b/vendor/github.com/grafana/grafana_plugin_model/datasource.proto deleted file mode 100644 index d95f8c8e590..00000000000 --- a/vendor/github.com/grafana/grafana_plugin_model/datasource.proto +++ /dev/null @@ -1,98 +0,0 @@ -syntax = "proto3"; -option go_package = "datasource"; - -package models; - -message DatasourceRequest { - TimeRange timeRange = 1; - DatasourceInfo datasource = 2; - repeated Query queries = 3; -} - -message Query { - string refId = 1; - int64 maxDataPoints = 2; - int64 intervalMs = 3; - string modelJson = 4; -} - -message TimeRange { - string fromRaw = 1; - string toRaw = 2; - int64 fromEpochMs = 3; - int64 toEpochMs = 4; -} - -message DatasourceResponse { - repeated QueryResult results = 1; -} - -message QueryResult { - string error = 1; - string refId = 2; - string metaJson = 3; - repeated TimeSeries series = 4; - repeated Table tables = 5; -} - -message Table { - repeated TableColumn columns = 1; - repeated TableRow rows = 2; -} - -message TableColumn { - string name = 1; -} - -message TableRow { - repeated RowValue values = 1; -} - -message RowValue { - enum Kind { - // Field type null. - TYPE_NULL = 0; - // Field type double. - TYPE_DOUBLE = 1; - // Field type int64. - TYPE_INT64 = 2; - // Field type bool. - TYPE_BOOL = 3; - // Field type string. - TYPE_STRING = 4; - // Field type bytes. - TYPE_BYTES = 5; - }; - - Kind kind = 1; - double doubleValue = 2; - int64 int64Value = 3; - bool boolValue = 4; - string stringValue = 5; - bytes bytesValue = 6; -} - -message DatasourceInfo { - int64 id = 1; - int64 orgId = 2; - string name = 3; - string type = 4; - string url = 5; - string jsonData = 6; - map decryptedSecureJsonData = 7; -} - -message TimeSeries { - string name = 1; - map tags = 2; - repeated Point points = 3; -} - -message Point { - int64 timestamp = 1; - double value = 2; -} - -service DatasourcePlugin { - rpc Query(DatasourceRequest) returns (DatasourceResponse); -} diff --git a/vendor/github.com/hashicorp/go-hclog/README.md b/vendor/github.com/hashicorp/go-hclog/README.md deleted file mode 100644 index 614342b2d87..00000000000 --- a/vendor/github.com/hashicorp/go-hclog/README.md +++ /dev/null @@ -1,123 +0,0 @@ -# go-hclog - -[![Go Documentation](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)][godocs] - -[godocs]: https://godoc.org/github.com/hashicorp/go-hclog - -`go-hclog` is a package for Go that provides a simple key/value logging -interface for use in development and production environments. - -It provides logging levels that provide decreased output based upon the -desired amount of output, unlike the standard library `log` package. - -It does not provide `Printf` style logging, only key/value logging that is -exposed as arguments to the logging functions for simplicity. - -It provides a human readable output mode for use in development as well as -JSON output mode for production. - -## Stability Note - -While this library is fully open source and HashiCorp will be maintaining it -(since we are and will be making extensive use of it), the API and output -format is subject to minor changes as we fully bake and vet it in our projects. -This notice will be removed once it's fully integrated into our major projects -and no further changes are anticipated. - -## Installation and Docs - -Install using `go get github.com/hashicorp/go-hclog`. - -Full documentation is available at -http://godoc.org/github.com/hashicorp/go-hclog - -## Usage - -### Use the global logger - -```go -hclog.Default().Info("hello world") -``` - -```text -2017-07-05T16:15:55.167-0700 [INFO ] hello world -``` - -(Note timestamps are removed in future examples for brevity.) - -### Create a new logger - -```go -appLogger := hclog.New(&hclog.LoggerOptions{ - Name: "my-app", - Level: hclog.LevelFromString("DEBUG"), -}) -``` - -### Emit an Info level message with 2 key/value pairs - -```go -input := "5.5" -_, err := strconv.ParseInt(input, 10, 32) -if err != nil { - appLogger.Info("Invalid input for ParseInt", "input", input, "error", err) -} -``` - -```text -... [INFO ] my-app: Invalid input for ParseInt: input=5.5 error="strconv.ParseInt: parsing "5.5": invalid syntax" -``` - -### Create a new Logger for a major subsystem - -```go -subsystemLogger := appLogger.Named("transport") -subsystemLogger.Info("we are transporting something") -``` - -```text -... [INFO ] my-app.transport: we are transporting something -``` - -Notice that logs emitted by `subsystemLogger` contain `my-app.transport`, -reflecting both the application and subsystem names. - -### Create a new Logger with fixed key/value pairs - -Using `With()` will include a specific key-value pair in all messages emitted -by that logger. - -```go -requestID := "5fb446b6-6eba-821d-df1b-cd7501b6a363" -requestLogger := subsystemLogger.With("request", requestID) -requestLogger.Info("we are transporting a request") -``` - -```text -... [INFO ] my-app.transport: we are transporting a request: request=5fb446b6-6eba-821d-df1b-cd7501b6a363 -``` - -This allows sub Loggers to be context specific without having to thread that -into all the callers. - -### Use this with code that uses the standard library logger - -If you want to use the standard library's `log.Logger` interface you can wrap -`hclog.Logger` by calling the `StandardLogger()` method. This allows you to use -it with the familiar `Println()`, `Printf()`, etc. For example: - -```go -stdLogger := appLogger.StandardLogger(&hclog.StandardLoggerOptions{ - InferLevels: true, -}) -// Printf() is provided by stdlib log.Logger interface, not hclog.Logger -stdLogger.Printf("[DEBUG] %+v", stdLogger) -``` - -```text -... [DEBUG] my-app: &{mu:{state:0 sema:0} prefix: flag:0 out:0xc42000a0a0 buf:[]} -``` - -Notice that if `appLogger` is initialized with the `INFO` log level _and_ you -specify `InferLevels: true`, you will not see any output here. You must change -`appLogger` to `DEBUG` to see output. See the docs for more information. diff --git a/vendor/github.com/hashicorp/go-plugin/.gitignore b/vendor/github.com/hashicorp/go-plugin/.gitignore deleted file mode 100644 index e43b0f98895..00000000000 --- a/vendor/github.com/hashicorp/go-plugin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/vendor/github.com/hashicorp/go-plugin/README.md b/vendor/github.com/hashicorp/go-plugin/README.md deleted file mode 100644 index 78d354ed23f..00000000000 --- a/vendor/github.com/hashicorp/go-plugin/README.md +++ /dev/null @@ -1,168 +0,0 @@ -# Go Plugin System over RPC - -`go-plugin` is a Go (golang) plugin system over RPC. It is the plugin system -that has been in use by HashiCorp tooling for over 4 years. While initially -created for [Packer](https://www.packer.io), it is additionally in use by -[Terraform](https://www.terraform.io), [Nomad](https://www.nomadproject.io), and -[Vault](https://www.vaultproject.io). - -While the plugin system is over RPC, it is currently only designed to work -over a local [reliable] network. Plugins over a real network are not supported -and will lead to unexpected behavior. - -This plugin system has been used on millions of machines across many different -projects and has proven to be battle hardened and ready for production use. - -## Features - -The HashiCorp plugin system supports a number of features: - -**Plugins are Go interface implementations.** This makes writing and consuming -plugins feel very natural. To a plugin author: you just implement an -interface as if it were going to run in the same process. For a plugin user: -you just use and call functions on an interface as if it were in the same -process. This plugin system handles the communication in between. - -**Cross-language support.** Plugins can be written (and consumed) by -almost every major language. This library supports serving plugins via -[gRPC](http://www.grpc.io). gRPC-based plugins enable plugins to be written -in any language. - -**Complex arguments and return values are supported.** This library -provides APIs for handling complex arguments and return values such -as interfaces, `io.Reader/Writer`, etc. We do this by giving you a library -(`MuxBroker`) for creating new connections between the client/server to -serve additional interfaces or transfer raw data. - -**Bidirectional communication.** Because the plugin system supports -complex arguments, the host process can send it interface implementations -and the plugin can call back into the host process. - -**Built-in Logging.** Any plugins that use the `log` standard library -will have log data automatically sent to the host process. The host -process will mirror this output prefixed with the path to the plugin -binary. This makes debugging with plugins simple. If the host system -uses [hclog](https://github.com/hashicorp/go-hclog) then the log data -will be structured. If the plugin also uses hclog, logs from the plugin -will be sent to the host hclog and be structured. - -**Protocol Versioning.** A very basic "protocol version" is supported that -can be incremented to invalidate any previous plugins. This is useful when -interface signatures are changing, protocol level changes are necessary, -etc. When a protocol version is incompatible, a human friendly error -message is shown to the end user. - -**Stdout/Stderr Syncing.** While plugins are subprocesses, they can continue -to use stdout/stderr as usual and the output will get mirrored back to -the host process. The host process can control what `io.Writer` these -streams go to to prevent this from happening. - -**TTY Preservation.** Plugin subprocesses are connected to the identical -stdin file descriptor as the host process, allowing software that requires -a TTY to work. For example, a plugin can execute `ssh` and even though there -are multiple subprocesses and RPC happening, it will look and act perfectly -to the end user. - -**Host upgrade while a plugin is running.** Plugins can be "reattached" -so that the host process can be upgraded while the plugin is still running. -This requires the host/plugin to know this is possible and daemonize -properly. `NewClient` takes a `ReattachConfig` to determine if and how to -reattach. - -**Cryptographically Secure Plugins.** Plugins can be verified with an expected -checksum and RPC communications can be configured to use TLS. The host process -must be properly secured to protect this configuration. - -## Architecture - -The HashiCorp plugin system works by launching subprocesses and communicating -over RPC (using standard `net/rpc` or [gRPC](http://www.grpc.io). A single -connection is made between any plugin and the host process. For net/rpc-based -plugins, we use a [connection multiplexing](https://github.com/hashicorp/yamux) -library to multiplex any other connections on top. For gRPC-based plugins, -the HTTP2 protocol handles multiplexing. - -This architecture has a number of benefits: - - * Plugins can't crash your host process: A panic in a plugin doesn't - panic the plugin user. - - * Plugins are very easy to write: just write a Go application and `go build`. - Or use any other language to write a gRPC server with a tiny amount of - boilerplate to support go-plugin. - - * Plugins are very easy to install: just put the binary in a location where - the host will find it (depends on the host but this library also provides - helpers), and the plugin host handles the rest. - - * Plugins can be relatively secure: The plugin only has access to the - interfaces and args given to it, not to the entire memory space of the - process. Additionally, go-plugin can communicate with the plugin over - TLS. - -## Usage - -To use the plugin system, you must take the following steps. These are -high-level steps that must be done. Examples are available in the -`examples/` directory. - - 1. Choose the interface(s) you want to expose for plugins. - - 2. For each interface, implement an implementation of that interface - that communicates over a `net/rpc` connection or other a - [gRPC](http://www.grpc.io) connection or both. You'll have to implement - both a client and server implementation. - - 3. Create a `Plugin` implementation that knows how to create the RPC - client/server for a given plugin type. - - 4. Plugin authors call `plugin.Serve` to serve a plugin from the - `main` function. - - 5. Plugin users use `plugin.Client` to launch a subprocess and request - an interface implementation over RPC. - -That's it! In practice, step 2 is the most tedious and time consuming step. -Even so, it isn't very difficult and you can see examples in the `examples/` -directory as well as throughout our various open source projects. - -For complete API documentation, see [GoDoc](https://godoc.org/github.com/hashicorp/go-plugin). - -## Roadmap - -Our plugin system is constantly evolving. As we use the plugin system for -new projects or for new features in existing projects, we constantly find -improvements we can make. - -At this point in time, the roadmap for the plugin system is: - -**Semantic Versioning.** Plugins will be able to implement a semantic version. -This plugin system will give host processes a system for constraining -versions. This is in addition to the protocol versioning already present -which is more for larger underlying changes. - -**Plugin fetching.** We will integrate with [go-getter](https://github.com/hashicorp/go-getter) -to support automatic download + install of plugins. Paired with cryptographically -secure plugins (above), we can make this a safe operation for an amazing -user experience. - -## What About Shared Libraries? - -When we started using plugins (late 2012, early 2013), plugins over RPC -were the only option since Go didn't support dynamic library loading. Today, -Go still doesn't support dynamic library loading, but they do intend to. -Since 2012, our plugin system has stabilized from millions of users using it, -and has many benefits we've come to value greatly. - -For example, we intend to use this plugin system in -[Vault](https://www.vaultproject.io), and dynamic library loading will -simply never be acceptable in Vault for security reasons. That is an extreme -example, but we believe our library system has more upsides than downsides -over dynamic library loading and since we've had it built and tested for years, -we'll likely continue to use it. - -Shared libraries have one major advantage over our system which is much -higher performance. In real world scenarios across our various tools, -we've never required any more performance out of our plugin system and it -has seen very high throughput, so this isn't a concern for us at the moment. - diff --git a/vendor/github.com/hashicorp/go-version/.travis.yml b/vendor/github.com/hashicorp/go-version/.travis.yml deleted file mode 100644 index 3f45b1e8d57..00000000000 --- a/vendor/github.com/hashicorp/go-version/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -go: - - 1.0 - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.9 - -script: - - go test diff --git a/vendor/github.com/hashicorp/go-version/README.md b/vendor/github.com/hashicorp/go-version/README.md deleted file mode 100644 index 6f3a15ce772..00000000000 --- a/vendor/github.com/hashicorp/go-version/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Versioning Library for Go -[![Build Status](https://travis-ci.org/hashicorp/go-version.svg?branch=master)](https://travis-ci.org/hashicorp/go-version) - -go-version is a library for parsing versions and version constraints, -and verifying versions against a set of constraints. go-version -can sort a collection of versions properly, handles prerelease/beta -versions, can increment versions, etc. - -Versions used with go-version must follow [SemVer](http://semver.org/). - -## Installation and Usage - -Package documentation can be found on -[GoDoc](http://godoc.org/github.com/hashicorp/go-version). - -Installation can be done with a normal `go get`: - -``` -$ go get github.com/hashicorp/go-version -``` - -#### Version Parsing and Comparison - -```go -v1, err := version.NewVersion("1.2") -v2, err := version.NewVersion("1.5+metadata") - -// Comparison example. There is also GreaterThan, Equal, and just -// a simple Compare that returns an int allowing easy >=, <=, etc. -if v1.LessThan(v2) { - fmt.Printf("%s is less than %s", v1, v2) -} -``` - -#### Version Constraints - -```go -v1, err := version.NewVersion("1.2") - -// Constraints example. -constraints, err := version.NewConstraint(">= 1.0, < 1.4") -if constraints.Check(v1) { - fmt.Printf("%s satisfies constraints %s", v1, constraints) -} -``` - -#### Version Sorting - -```go -versionsRaw := []string{"1.1", "0.7.1", "1.4-beta", "1.4", "2"} -versions := make([]*version.Version, len(versionsRaw)) -for i, raw := range versionsRaw { - v, _ := version.NewVersion(raw) - versions[i] = v -} - -// After this, the versions are properly sorted -sort.Sort(version.Collection(versions)) -``` - -## Issues and Contributing - -If you find an issue with this library, please report an issue. If you'd -like, we welcome any contributions. Fork this library and submit a pull -request. diff --git a/vendor/github.com/hashicorp/yamux/.gitignore b/vendor/github.com/hashicorp/yamux/.gitignore deleted file mode 100644 index 836562412fe..00000000000 --- a/vendor/github.com/hashicorp/yamux/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# 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/hashicorp/yamux/README.md b/vendor/github.com/hashicorp/yamux/README.md deleted file mode 100644 index d4db7fc99be..00000000000 --- a/vendor/github.com/hashicorp/yamux/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Yamux - -Yamux (Yet another Multiplexer) is a multiplexing library for Golang. -It relies on an underlying connection to provide reliability -and ordering, such as TCP or Unix domain sockets, and provides -stream-oriented multiplexing. It is inspired by SPDY but is not -interoperable with it. - -Yamux features include: - -* Bi-directional streams - * Streams can be opened by either client or server - * Useful for NAT traversal - * Server-side push support -* Flow control - * Avoid starvation - * Back-pressure to prevent overwhelming a receiver -* Keep Alives - * Enables persistent connections over a load balancer -* Efficient - * Enables thousands of logical streams with low overhead - -## Documentation - -For complete documentation, see the associated [Godoc](http://godoc.org/github.com/hashicorp/yamux). - -## Specification - -The full specification for Yamux is provided in the `spec.md` file. -It can be used as a guide to implementors of interoperable libraries. - -## Usage - -Using Yamux is remarkably simple: - -```go - -func client() { - // Get a TCP connection - conn, err := net.Dial(...) - if err != nil { - panic(err) - } - - // Setup client side of yamux - session, err := yamux.Client(conn, nil) - if err != nil { - panic(err) - } - - // Open a new stream - stream, err := session.Open() - if err != nil { - panic(err) - } - - // Stream implements net.Conn - stream.Write([]byte("ping")) -} - -func server() { - // Accept a TCP connection - conn, err := listener.Accept() - if err != nil { - panic(err) - } - - // Setup server side of yamux - session, err := yamux.Server(conn, nil) - if err != nil { - panic(err) - } - - // Accept a stream - stream, err := session.Accept() - if err != nil { - panic(err) - } - - // Listen for a message - buf := make([]byte, 4) - stream.Read(buf) -} - -``` - diff --git a/vendor/github.com/hashicorp/yamux/spec.md b/vendor/github.com/hashicorp/yamux/spec.md deleted file mode 100644 index 183d797bdea..00000000000 --- a/vendor/github.com/hashicorp/yamux/spec.md +++ /dev/null @@ -1,140 +0,0 @@ -# Specification - -We use this document to detail the internal specification of Yamux. -This is used both as a guide for implementing Yamux, but also for -alternative interoperable libraries to be built. - -# Framing - -Yamux uses a streaming connection underneath, but imposes a message -framing so that it can be shared between many logical streams. Each -frame contains a header like: - -* Version (8 bits) -* Type (8 bits) -* Flags (16 bits) -* StreamID (32 bits) -* Length (32 bits) - -This means that each header has a 12 byte overhead. -All fields are encoded in network order (big endian). -Each field is described below: - -## Version Field - -The version field is used for future backward compatibility. At the -current time, the field is always set to 0, to indicate the initial -version. - -## Type Field - -The type field is used to switch the frame message type. The following -message types are supported: - -* 0x0 Data - Used to transmit data. May transmit zero length payloads - depending on the flags. - -* 0x1 Window Update - Used to updated the senders receive window size. - This is used to implement per-session flow control. - -* 0x2 Ping - Used to measure RTT. It can also be used to heart-beat - and do keep-alives over TCP. - -* 0x3 Go Away - Used to close a session. - -## Flag Field - -The flags field is used to provide additional information related -to the message type. The following flags are supported: - -* 0x1 SYN - Signals the start of a new stream. May be sent with a data or - window update message. Also sent with a ping to indicate outbound. - -* 0x2 ACK - Acknowledges the start of a new stream. May be sent with a data - or window update message. Also sent with a ping to indicate response. - -* 0x4 FIN - Performs a half-close of a stream. May be sent with a data - message or window update. - -* 0x8 RST - Reset a stream immediately. May be sent with a data or - window update message. - -## StreamID Field - -The StreamID field is used to identify the logical stream the frame -is addressing. The client side should use odd ID's, and the server even. -This prevents any collisions. Additionally, the 0 ID is reserved to represent -the session. - -Both Ping and Go Away messages should always use the 0 StreamID. - -## Length Field - -The meaning of the length field depends on the message type: - -* Data - provides the length of bytes following the header -* Window update - provides a delta update to the window size -* Ping - Contains an opaque value, echoed back -* Go Away - Contains an error code - -# Message Flow - -There is no explicit connection setup, as Yamux relies on an underlying -transport to be provided. However, there is a distinction between client -and server side of the connection. - -## Opening a stream - -To open a stream, an initial data or window update frame is sent -with a new StreamID. The SYN flag should be set to signal a new stream. - -The receiver must then reply with either a data or window update frame -with the StreamID along with the ACK flag to accept the stream or with -the RST flag to reject the stream. - -Because we are relying on the reliable stream underneath, a connection -can begin sending data once the SYN flag is sent. The corresponding -ACK does not need to be received. This is particularly well suited -for an RPC system where a client wants to open a stream and immediately -fire a request without waiting for the RTT of the ACK. - -This does introduce the possibility of a connection being rejected -after data has been sent already. This is a slight semantic difference -from TCP, where the conection cannot be refused after it is opened. -Clients should be prepared to handle this by checking for an error -that indicates a RST was received. - -## Closing a stream - -To close a stream, either side sends a data or window update frame -along with the FIN flag. This does a half-close indicating the sender -will send no further data. - -Once both sides have closed the connection, the stream is closed. - -Alternatively, if an error occurs, the RST flag can be used to -hard close a stream immediately. - -## Flow Control - -When Yamux is initially starts each stream with a 256KB window size. -There is no window size for the session. - -To prevent the streams from stalling, window update frames should be -sent regularly. Yamux can be configured to provide a larger limit for -windows sizes. Both sides assume the initial 256KB window, but can -immediately send a window update as part of the SYN/ACK indicating a -larger window. - -Both sides should track the number of bytes sent in Data frames -only, as only they are tracked as part of the window size. - -## Session termination - -When a session is being terminated, the Go Away message should -be sent. The Length should be set to one of the following to -provide an error code: - -* 0x0 Normal termination -* 0x1 Protocol error -* 0x2 Internal error diff --git a/vendor/github.com/inconshreveable/log15/.mailmap b/vendor/github.com/inconshreveable/log15/.mailmap deleted file mode 100644 index 6db63a4f46d..00000000000 --- a/vendor/github.com/inconshreveable/log15/.mailmap +++ /dev/null @@ -1,26 +0,0 @@ -Aaron L -Alan Shreve -Andy Walker -Andy Watson -Chris Hines Chris Hines -Ciaran Downey -Dmitry Chestnykh -Evan Shaw -Gonzalo Serrano -Jeremy -Jonathan Rudenberg -Kevin Burke -Marc Abramowitz -Nathan Baulch -NotZippy -Péter Szilágyi -Robert Egorov -Robert Starbuck -Robert Zaremba -Spencer Nelson -Tomasz Grodzki -Trevor Gattis -Vincent Vanackere -Will McGovern -Carl Veazey -Kang Seong-Min diff --git a/vendor/github.com/inconshreveable/log15/README.md b/vendor/github.com/inconshreveable/log15/README.md deleted file mode 100644 index 1727b6c493c..00000000000 --- a/vendor/github.com/inconshreveable/log15/README.md +++ /dev/null @@ -1,84 +0,0 @@ -![obligatory xkcd](http://imgs.xkcd.com/comics/standards.png) - -# log15 [![godoc reference](https://godoc.org/github.com/inconshreveable/log15?status.png)](https://godoc.org/github.com/inconshreveable/log15) [![Build Status](https://travis-ci.org/inconshreveable/log15.svg?branch=master)](https://travis-ci.org/inconshreveable/log15) - -Package log15 provides an opinionated, simple toolkit for best-practice logging in Go (golang) that is both human and machine readable. It is modeled after the Go standard library's [`io`](http://golang.org/pkg/io/) and [`net/http`](http://golang.org/pkg/net/http/) packages and is an alternative to the standard library's [`log`](http://golang.org/pkg/log/) package. - -## Features -- A simple, easy-to-understand API -- Promotes structured logging by encouraging use of key/value pairs -- Child loggers which inherit and add their own private context -- Lazy evaluation of expensive operations -- Simple Handler interface allowing for construction of flexible, custom logging configurations with a tiny API. -- Color terminal support -- Built-in support for logging to files, streams, syslog, and the network -- Support for forking records to multiple handlers, buffering records for output, failing over from failed handler writes, + more - -## Versioning -The API of the master branch of log15 should always be considered unstable. If you want to rely on a stable API, -you must vendor the library. - -## Importing - -```go -import log "github.com/inconshreveable/log15" -``` - -## Examples - -```go -// all loggers can have key/value context -srvlog := log.New("module", "app/server") - -// all log messages can have key/value context -srvlog.Warn("abnormal conn rate", "rate", curRate, "low", lowRate, "high", highRate) - -// child loggers with inherited context -connlog := srvlog.New("raddr", c.RemoteAddr()) -connlog.Info("connection open") - -// lazy evaluation -connlog.Debug("ping remote", "latency", log.Lazy{pingRemote}) - -// flexible configuration -srvlog.SetHandler(log.MultiHandler( - log.StreamHandler(os.Stderr, log.LogfmtFormat()), - log.LvlFilterHandler( - log.LvlError, - log.Must.FileHandler("errors.json", log.JsonFormat())))) -``` - -Will result in output that looks like this: - -``` -WARN[06-17|21:58:10] abnormal conn rate module=app/server rate=0.500 low=0.100 high=0.800 -INFO[06-17|21:58:10] connection open module=app/server raddr=10.0.0.1 -``` - -## Breaking API Changes -The following commits broke API stability. This reference is intended to help you understand the consequences of updating to a newer version -of log15. - -- 57a084d014d4150152b19e4e531399a7145d1540 - Added a `Get()` method to the `Logger` interface to retrieve the current handler -- 93404652ee366648fa622b64d1e2b67d75a3094a - `Record` field `Call` changed to `stack.Call` with switch to `github.com/go-stack/stack` -- a5e7613673c73281f58e15a87d2cf0cf111e8152 - Restored `syslog.Priority` argument to the `SyslogXxx` handler constructors - -## FAQ - -### The varargs style is brittle and error prone! Can I have type safety please? -Yes. Use `log.Ctx`: - -```go -srvlog := log.New(log.Ctx{"module": "app/server"}) -srvlog.Warn("abnormal conn rate", log.Ctx{"rate": curRate, "low": lowRate, "high": highRate}) -``` - -### Regenerating the CONTRIBUTORS file - -``` -go get -u github.com/kevinburke/write_mailmap -write_mailmap > CONTRIBUTORS -``` - -## License -Apache diff --git a/vendor/github.com/inconshreveable/log15/term/LICENSE b/vendor/github.com/inconshreveable/log15/term/LICENSE new file mode 100644 index 00000000000..f090cb42f37 --- /dev/null +++ b/vendor/github.com/inconshreveable/log15/term/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Simon Eskildsen + +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/jmespath/go-jmespath/.gitignore b/vendor/github.com/jmespath/go-jmespath/.gitignore deleted file mode 100644 index 531fcc11c70..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -jpgo -jmespath-fuzz.zip -cpu.out -go-jmespath.test diff --git a/vendor/github.com/jmespath/go-jmespath/.travis.yml b/vendor/github.com/jmespath/go-jmespath/.travis.yml deleted file mode 100644 index 1f98077570d..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go - -sudo: false - -go: - - 1.4 - -install: go get -v -t ./... -script: make test diff --git a/vendor/github.com/jmespath/go-jmespath/Makefile b/vendor/github.com/jmespath/go-jmespath/Makefile deleted file mode 100644 index a828d2848f0..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/Makefile +++ /dev/null @@ -1,44 +0,0 @@ - -CMD = jpgo - -help: - @echo "Please use \`make ' where is one of" - @echo " test to run all the tests" - @echo " build to build the library and jp executable" - @echo " generate to run codegen" - - -generate: - go generate ./... - -build: - rm -f $(CMD) - go build ./... - rm -f cmd/$(CMD)/$(CMD) && cd cmd/$(CMD)/ && go build ./... - mv cmd/$(CMD)/$(CMD) . - -test: - go test -v ./... - -check: - go vet ./... - @echo "golint ./..." - @lint=`golint ./...`; \ - lint=`echo "$$lint" | grep -v "astnodetype_string.go" | grep -v "toktype_string.go"`; \ - echo "$$lint"; \ - if [ "$$lint" != "" ]; then exit 1; fi - -htmlc: - go test -coverprofile="/tmp/jpcov" && go tool cover -html="/tmp/jpcov" && unlink /tmp/jpcov - -buildfuzz: - go-fuzz-build github.com/jmespath/go-jmespath/fuzz - -fuzz: buildfuzz - go-fuzz -bin=./jmespath-fuzz.zip -workdir=fuzz/testdata - -bench: - go test -bench . -cpuprofile cpu.out - -pprof-cpu: - go tool pprof ./go-jmespath.test ./cpu.out diff --git a/vendor/github.com/jmespath/go-jmespath/README.md b/vendor/github.com/jmespath/go-jmespath/README.md deleted file mode 100644 index 187ef676dc9..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# go-jmespath - A JMESPath implementation in Go - -[![Build Status](https://img.shields.io/travis/jmespath/go-jmespath.svg)](https://travis-ci.org/jmespath/go-jmespath) - - - -See http://jmespath.org for more info. diff --git a/vendor/github.com/jmespath/go-jmespath/compliance_test.go b/vendor/github.com/jmespath/go-jmespath/compliance_test.go deleted file mode 100644 index 4ee9c959dc6..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/compliance_test.go +++ /dev/null @@ -1,123 +0,0 @@ -package jmespath - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" -) - -type TestSuite struct { - Given interface{} - TestCases []TestCase `json:"cases"` - Comment string -} -type TestCase struct { - Comment string - Expression string - Result interface{} - Error string -} - -var whiteListed = []string{ - "compliance/basic.json", - "compliance/current.json", - "compliance/escape.json", - "compliance/filters.json", - "compliance/functions.json", - "compliance/identifiers.json", - "compliance/indices.json", - "compliance/literal.json", - "compliance/multiselect.json", - "compliance/ormatch.json", - "compliance/pipe.json", - "compliance/slice.json", - "compliance/syntax.json", - "compliance/unicode.json", - "compliance/wildcard.json", - "compliance/boolean.json", -} - -func allowed(path string) bool { - for _, el := range whiteListed { - if el == path { - return true - } - } - return false -} - -func TestCompliance(t *testing.T) { - assert := assert.New(t) - - var complianceFiles []string - err := filepath.Walk("compliance", func(path string, _ os.FileInfo, _ error) error { - //if strings.HasSuffix(path, ".json") { - if allowed(path) { - complianceFiles = append(complianceFiles, path) - } - return nil - }) - if assert.Nil(err) { - for _, filename := range complianceFiles { - runComplianceTest(assert, filename) - } - } -} - -func runComplianceTest(assert *assert.Assertions, filename string) { - var testSuites []TestSuite - data, err := ioutil.ReadFile(filename) - if assert.Nil(err) { - err := json.Unmarshal(data, &testSuites) - if assert.Nil(err) { - for _, testsuite := range testSuites { - runTestSuite(assert, testsuite, filename) - } - } - } -} - -func runTestSuite(assert *assert.Assertions, testsuite TestSuite, filename string) { - for _, testcase := range testsuite.TestCases { - if testcase.Error != "" { - // This is a test case that verifies we error out properly. - runSyntaxTestCase(assert, testsuite.Given, testcase, filename) - } else { - runTestCase(assert, testsuite.Given, testcase, filename) - } - } -} - -func runSyntaxTestCase(assert *assert.Assertions, given interface{}, testcase TestCase, filename string) { - // Anything with an .Error means that we expect that JMESPath should return - // an error when we try to evaluate the expression. - _, err := Search(testcase.Expression, given) - assert.NotNil(err, fmt.Sprintf("Expression: %s", testcase.Expression)) -} - -func runTestCase(assert *assert.Assertions, given interface{}, testcase TestCase, filename string) { - lexer := NewLexer() - var err error - _, err = lexer.tokenize(testcase.Expression) - if err != nil { - errMsg := fmt.Sprintf("(%s) Could not lex expression: %s -- %s", filename, testcase.Expression, err.Error()) - assert.Fail(errMsg) - return - } - parser := NewParser() - _, err = parser.Parse(testcase.Expression) - if err != nil { - errMsg := fmt.Sprintf("(%s) Could not parse expression: %s -- %s", filename, testcase.Expression, err.Error()) - assert.Fail(errMsg) - return - } - actual, err := Search(testcase.Expression, given) - if assert.Nil(err, fmt.Sprintf("Expression: %s", testcase.Expression)) { - assert.Equal(testcase.Result, actual, fmt.Sprintf("Expression: %s", testcase.Expression)) - } -} diff --git a/vendor/github.com/jmespath/go-jmespath/interpreter_test.go b/vendor/github.com/jmespath/go-jmespath/interpreter_test.go deleted file mode 100644 index 11c6d0aa01c..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/interpreter_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package jmespath - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -type scalars struct { - Foo string - Bar string -} - -type sliceType struct { - A string - B []scalars - C []*scalars -} - -type benchmarkStruct struct { - Fooasdfasdfasdfasdf string -} - -type benchmarkNested struct { - Fooasdfasdfasdfasdf nestedA -} - -type nestedA struct { - Fooasdfasdfasdfasdf nestedB -} - -type nestedB struct { - Fooasdfasdfasdfasdf nestedC -} - -type nestedC struct { - Fooasdfasdfasdfasdf string -} - -type nestedSlice struct { - A []sliceType -} - -func TestCanSupportEmptyInterface(t *testing.T) { - assert := assert.New(t) - data := make(map[string]interface{}) - data["foo"] = "bar" - result, err := Search("foo", data) - assert.Nil(err) - assert.Equal("bar", result) -} - -func TestCanSupportUserDefinedStructsValue(t *testing.T) { - assert := assert.New(t) - s := scalars{Foo: "one", Bar: "bar"} - result, err := Search("Foo", s) - assert.Nil(err) - assert.Equal("one", result) -} - -func TestCanSupportUserDefinedStructsRef(t *testing.T) { - assert := assert.New(t) - s := scalars{Foo: "one", Bar: "bar"} - result, err := Search("Foo", &s) - assert.Nil(err) - assert.Equal("one", result) -} - -func TestCanSupportStructWithSliceAll(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", B: []scalars{{"f1", "b1"}, {"correct", "b2"}}} - result, err := Search("B[].Foo", data) - assert.Nil(err) - assert.Equal([]interface{}{"f1", "correct"}, result) -} - -func TestCanSupportStructWithSlicingExpression(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", B: []scalars{{"f1", "b1"}, {"correct", "b2"}}} - result, err := Search("B[:].Foo", data) - assert.Nil(err) - assert.Equal([]interface{}{"f1", "correct"}, result) -} - -func TestCanSupportStructWithFilterProjection(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", B: []scalars{{"f1", "b1"}, {"correct", "b2"}}} - result, err := Search("B[? `true` ].Foo", data) - assert.Nil(err) - assert.Equal([]interface{}{"f1", "correct"}, result) -} - -func TestCanSupportStructWithSlice(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", B: []scalars{{"f1", "b1"}, {"correct", "b2"}}} - result, err := Search("B[-1].Foo", data) - assert.Nil(err) - assert.Equal("correct", result) -} - -func TestCanSupportStructWithOrExpressions(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", C: nil} - result, err := Search("C || A", data) - assert.Nil(err) - assert.Equal("foo", result) -} - -func TestCanSupportStructWithSlicePointer(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", C: []*scalars{{"f1", "b1"}, {"correct", "b2"}}} - result, err := Search("C[-1].Foo", data) - assert.Nil(err) - assert.Equal("correct", result) -} - -func TestWillAutomaticallyCapitalizeFieldNames(t *testing.T) { - assert := assert.New(t) - s := scalars{Foo: "one", Bar: "bar"} - // Note that there's a lower cased "foo" instead of "Foo", - // but it should still correspond to the Foo field in the - // scalars struct - result, err := Search("foo", &s) - assert.Nil(err) - assert.Equal("one", result) -} - -func TestCanSupportStructWithSliceLowerCased(t *testing.T) { - assert := assert.New(t) - data := sliceType{A: "foo", B: []scalars{{"f1", "b1"}, {"correct", "b2"}}} - result, err := Search("b[-1].foo", data) - assert.Nil(err) - assert.Equal("correct", result) -} - -func TestCanSupportStructWithNestedPointers(t *testing.T) { - assert := assert.New(t) - data := struct{ A *struct{ B int } }{} - result, err := Search("A.B", data) - assert.Nil(err) - assert.Nil(result) -} - -func TestCanSupportFlattenNestedSlice(t *testing.T) { - assert := assert.New(t) - data := nestedSlice{A: []sliceType{ - {B: []scalars{{Foo: "f1a"}, {Foo: "f1b"}}}, - {B: []scalars{{Foo: "f2a"}, {Foo: "f2b"}}}, - }} - result, err := Search("A[].B[].Foo", data) - assert.Nil(err) - assert.Equal([]interface{}{"f1a", "f1b", "f2a", "f2b"}, result) -} - -func TestCanSupportFlattenNestedEmptySlice(t *testing.T) { - assert := assert.New(t) - data := nestedSlice{A: []sliceType{ - {}, {B: []scalars{{Foo: "a"}}}, - }} - result, err := Search("A[].B[].Foo", data) - assert.Nil(err) - assert.Equal([]interface{}{"a"}, result) -} - -func TestCanSupportProjectionsWithStructs(t *testing.T) { - assert := assert.New(t) - data := nestedSlice{A: []sliceType{ - {A: "first"}, {A: "second"}, {A: "third"}, - }} - result, err := Search("A[*].A", data) - assert.Nil(err) - assert.Equal([]interface{}{"first", "second", "third"}, result) -} - -func TestCanSupportSliceOfStructsWithFunctions(t *testing.T) { - assert := assert.New(t) - data := []scalars{scalars{"a1", "b1"}, scalars{"a2", "b2"}} - result, err := Search("length(@)", data) - assert.Nil(err) - assert.Equal(result.(float64), 2.0) -} - -func BenchmarkInterpretSingleFieldStruct(b *testing.B) { - intr := newInterpreter() - parser := NewParser() - ast, _ := parser.Parse("fooasdfasdfasdfasdf") - data := benchmarkStruct{"foobarbazqux"} - for i := 0; i < b.N; i++ { - intr.Execute(ast, &data) - } -} - -func BenchmarkInterpretNestedStruct(b *testing.B) { - intr := newInterpreter() - parser := NewParser() - ast, _ := parser.Parse("fooasdfasdfasdfasdf.fooasdfasdfasdfasdf.fooasdfasdfasdfasdf.fooasdfasdfasdfasdf") - data := benchmarkNested{ - nestedA{ - nestedB{ - nestedC{"foobarbazqux"}, - }, - }, - } - for i := 0; i < b.N; i++ { - intr.Execute(ast, &data) - } -} - -func BenchmarkInterpretNestedMaps(b *testing.B) { - jsonData := []byte(`{"fooasdfasdfasdfasdf": {"fooasdfasdfasdfasdf": {"fooasdfasdfasdfasdf": {"fooasdfasdfasdfasdf": "foobarbazqux"}}}}`) - var data interface{} - json.Unmarshal(jsonData, &data) - - intr := newInterpreter() - parser := NewParser() - ast, _ := parser.Parse("fooasdfasdfasdfasdf.fooasdfasdfasdfasdf.fooasdfasdfasdfasdf.fooasdfasdfasdfasdf") - for i := 0; i < b.N; i++ { - intr.Execute(ast, data) - } -} diff --git a/vendor/github.com/jmespath/go-jmespath/lexer_test.go b/vendor/github.com/jmespath/go-jmespath/lexer_test.go deleted file mode 100644 index d13a042da46..00000000000 --- a/vendor/github.com/jmespath/go-jmespath/lexer_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package jmespath - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" -) - -var lexingTests = []struct { - expression string - expected []token -}{ - {"*", []token{{tStar, "*", 0, 1}}}, - {".", []token{{tDot, ".", 0, 1}}}, - {"[?", []token{{tFilter, "[?", 0, 2}}}, - {"[]", []token{{tFlatten, "[]", 0, 2}}}, - {"(", []token{{tLparen, "(", 0, 1}}}, - {")", []token{{tRparen, ")", 0, 1}}}, - {"[", []token{{tLbracket, "[", 0, 1}}}, - {"]", []token{{tRbracket, "]", 0, 1}}}, - {"{", []token{{tLbrace, "{", 0, 1}}}, - {"}", []token{{tRbrace, "}", 0, 1}}}, - {"||", []token{{tOr, "||", 0, 2}}}, - {"|", []token{{tPipe, "|", 0, 1}}}, - {"29", []token{{tNumber, "29", 0, 2}}}, - {"2", []token{{tNumber, "2", 0, 1}}}, - {"0", []token{{tNumber, "0", 0, 1}}}, - {"-20", []token{{tNumber, "-20", 0, 3}}}, - {"foo", []token{{tUnquotedIdentifier, "foo", 0, 3}}}, - {`"bar"`, []token{{tQuotedIdentifier, "bar", 0, 3}}}, - // Escaping the delimiter - {`"bar\"baz"`, []token{{tQuotedIdentifier, `bar"baz`, 0, 7}}}, - {",", []token{{tComma, ",", 0, 1}}}, - {":", []token{{tColon, ":", 0, 1}}}, - {"<", []token{{tLT, "<", 0, 1}}}, - {"<=", []token{{tLTE, "<=", 0, 2}}}, - {">", []token{{tGT, ">", 0, 1}}}, - {">=", []token{{tGTE, ">=", 0, 2}}}, - {"==", []token{{tEQ, "==", 0, 2}}}, - {"!=", []token{{tNE, "!=", 0, 2}}}, - {"`[0, 1, 2]`", []token{{tJSONLiteral, "[0, 1, 2]", 1, 9}}}, - {"'foo'", []token{{tStringLiteral, "foo", 1, 3}}}, - {"'a'", []token{{tStringLiteral, "a", 1, 1}}}, - {`'foo\'bar'`, []token{{tStringLiteral, "foo'bar", 1, 7}}}, - {"@", []token{{tCurrent, "@", 0, 1}}}, - {"&", []token{{tExpref, "&", 0, 1}}}, - // Quoted identifier unicode escape sequences - {`"\u2713"`, []token{{tQuotedIdentifier, "✓", 0, 3}}}, - {`"\\"`, []token{{tQuotedIdentifier, `\`, 0, 1}}}, - {"`\"foo\"`", []token{{tJSONLiteral, "\"foo\"", 1, 5}}}, - // Combinations of tokens. - {"foo.bar", []token{ - {tUnquotedIdentifier, "foo", 0, 3}, - {tDot, ".", 3, 1}, - {tUnquotedIdentifier, "bar", 4, 3}, - }}, - {"foo[0]", []token{ - {tUnquotedIdentifier, "foo", 0, 3}, - {tLbracket, "[", 3, 1}, - {tNumber, "0", 4, 1}, - {tRbracket, "]", 5, 1}, - }}, - {"foo[?a We wouldn't even be having this discussion if thread local storage wasn't -> useful. But every feature comes at a cost, and in my opinion the cost of -> threadlocals far outweighs their benefits. They're just not a good fit for -> Go. - -So, yeah, that makes sense. That's a pretty good reason for why the language -won't support a specific and (relatively) unuseful feature that requires some -runtime changes, just for the sake of a little bit of log improvement. - -But does Go require runtime changes? - -### How it works ### - -Go has pretty fantastic introspective and reflective features, but one thing Go -doesn't give you is any kind of access to the stack pointer, or frame pointer, -or goroutine id, or anything contextual about your current stack. It gives you -access to your list of callers, but only along with program counters, which are -fixed at compile time. - -But it does give you the stack. - -So, we define 16 special functions and embed base-16 tags into the stack using -the call order of those 16 functions. Then, we can read our tags back out of -the stack looking at the callers list. - -We then use these tags as an index into a traditional map for implementing -this library. - -### What are people saying? ### - -"Wow, that's horrifying." - -"This is the most terrible thing I have seen in a very long time." - -"Where is it getting a context from? Is this serializing all the requests? -What the heck is the client being bound to? What are these tags? Why does he -need callers? Oh god no. No no no." - -### Docs ### - -Please see the docs at http://godoc.org/github.com/jtolds/gls - -### Related ### - -If you're okay relying on the string format of the current runtime stacktrace -including a unique goroutine id (not guaranteed by the spec or anything, but -very unlikely to change within a Go release), you might be able to squeeze -out a bit more performance by using this similar library, inspired by some -code Brad Fitzpatrick wrote for debugging his HTTP/2 library: -https://github.com/tylerb/gls (in contrast, jtolds/gls doesn't require -any knowledge of the string format of the runtime stacktrace, which -probably adds unnecessary overhead). diff --git a/vendor/github.com/jtolds/gls/context_test.go b/vendor/github.com/jtolds/gls/context_test.go deleted file mode 100644 index 2fa426cb5dc..00000000000 --- a/vendor/github.com/jtolds/gls/context_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package gls_test - -import ( - "fmt" - "sync" - "testing" - - "github.com/jtolds/gls" -) - -func TestContexts(t *testing.T) { - mgr1 := gls.NewContextManager() - mgr2 := gls.NewContextManager() - - CheckVal := func(mgr *gls.ContextManager, key, exp_val string) { - val, ok := mgr.GetValue(key) - if len(exp_val) == 0 { - if ok { - t.Fatalf("expected no value for key %s, got %s", key, val) - } - return - } - if !ok { - t.Fatalf("expected value %s for key %s, got no value", - exp_val, key) - } - if exp_val != val { - t.Fatalf("expected value %s for key %s, got %s", exp_val, key, - val) - } - - } - - Check := func(exp_m1v1, exp_m1v2, exp_m2v1, exp_m2v2 string) { - CheckVal(mgr1, "key1", exp_m1v1) - CheckVal(mgr1, "key2", exp_m1v2) - CheckVal(mgr2, "key1", exp_m2v1) - CheckVal(mgr2, "key2", exp_m2v2) - } - - Check("", "", "", "") - mgr2.SetValues(gls.Values{"key1": "val1c"}, func() { - Check("", "", "val1c", "") - mgr1.SetValues(gls.Values{"key1": "val1a"}, func() { - Check("val1a", "", "val1c", "") - mgr1.SetValues(gls.Values{"key2": "val1b"}, func() { - Check("val1a", "val1b", "val1c", "") - var wg sync.WaitGroup - wg.Add(2) - go func() { - defer wg.Done() - Check("", "", "", "") - }() - gls.Go(func() { - defer wg.Done() - Check("val1a", "val1b", "val1c", "") - }) - wg.Wait() - Check("val1a", "val1b", "val1c", "") - }) - Check("val1a", "", "val1c", "") - }) - Check("", "", "val1c", "") - }) - Check("", "", "", "") -} - -func ExampleContextManager_SetValues() { - var ( - mgr = gls.NewContextManager() - request_id_key = gls.GenSym() - ) - - MyLog := func() { - if request_id, ok := mgr.GetValue(request_id_key); ok { - fmt.Println("My request id is:", request_id) - } else { - fmt.Println("No request id found") - } - } - - mgr.SetValues(gls.Values{request_id_key: "12345"}, func() { - MyLog() - }) - MyLog() - - // Output: My request id is: 12345 - // No request id found -} - -func ExampleGo() { - var ( - mgr = gls.NewContextManager() - request_id_key = gls.GenSym() - ) - - MyLog := func() { - if request_id, ok := mgr.GetValue(request_id_key); ok { - fmt.Println("My request id is:", request_id) - } else { - fmt.Println("No request id found") - } - } - - mgr.SetValues(gls.Values{request_id_key: "12345"}, func() { - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - MyLog() - }() - wg.Wait() - wg.Add(1) - gls.Go(func() { - defer wg.Done() - MyLog() - }) - wg.Wait() - }) - - // Output: No request id found - // My request id is: 12345 -} - -func BenchmarkGetValue(b *testing.B) { - mgr := gls.NewContextManager() - mgr.SetValues(gls.Values{"test_key": "test_val"}, func() { - b.ResetTimer() - for i := 0; i < b.N; i++ { - val, ok := mgr.GetValue("test_key") - if !ok || val != "test_val" { - b.FailNow() - } - } - }) -} - -func BenchmarkSetValues(b *testing.B) { - mgr := gls.NewContextManager() - for i := 0; i < b.N/2; i++ { - mgr.SetValues(gls.Values{"test_key": "test_val"}, func() { - mgr.SetValues(gls.Values{"test_key2": "test_val2"}, func() {}) - }) - } -} diff --git a/vendor/github.com/klauspost/compress/.gitignore b/vendor/github.com/klauspost/compress/.gitignore deleted file mode 100644 index daf913b1b34..00000000000 --- a/vendor/github.com/klauspost/compress/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# 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 -*.prof diff --git a/vendor/github.com/klauspost/compress/README.md b/vendor/github.com/klauspost/compress/README.md deleted file mode 100644 index 25c8e2b4d53..00000000000 --- a/vendor/github.com/klauspost/compress/README.md +++ /dev/null @@ -1,289 +0,0 @@ -# compress - -This package is based on an optimized Deflate function, which is used by gzip/zip/zlib packages. - -It offers slightly better compression at lower compression settings, and up to 3x faster encoding at highest compression level. - -* [High Throughput Benchmark](http://blog.klauspost.com/go-gzipdeflate-benchmarks/). -* [Small Payload/Webserver Benchmarks](http://blog.klauspost.com/gzip-performance-for-go-webservers/). -* [Linear Time Compression](http://blog.klauspost.com/constant-time-gzipzip-compression/). -* [Re-balancing Deflate Compression Levels](https://blog.klauspost.com/rebalancing-deflate-compression-levels/) - -[![Build Status](https://travis-ci.org/klauspost/compress.svg?branch=master)](https://travis-ci.org/klauspost/compress) - -# changelog -* Jan 14, 2017: Reduce stack pressure due to array copies. See [Issue #18625(https://github.com/golang/go/issues/18625). -* Oct 25, 2016: Level 2-4 have been rewritten and now offers significantly better performance than before. -* Oct 20, 2016: Port zlib changes from Go 1.7 to fix zlib writer issue. Please update. -* Oct 16, 2016: Go 1.7 changes merged. Apples to apples this package is a few percent faster, but has a significantly better balance between speed and compression per level. -* Mar 24, 2016: Always attempt Huffman encoding on level 4-7. This improves base 64 encoded data compression. -* Mar 24, 2016: Small speedup for level 1-3. -* Feb 19, 2016: Faster bit writer, level -2 is 15% faster, level 1 is 4% faster. -* Feb 19, 2016: Handle small payloads faster in level 1-3. -* Feb 19, 2016: Added faster level 2 + 3 compression modes. -* Feb 19, 2016: [Rebalanced compression levels](https://blog.klauspost.com/rebalancing-deflate-compression-levels/), so there is a more even progresssion in terms of compression. New default level is 5. -* Feb 14, 2016: Snappy: Merge upstream changes. -* Feb 14, 2016: Snappy: Fix aggressive skipping. -* Feb 14, 2016: Snappy: Update benchmark. -* Feb 13, 2016: Deflate: Fixed assembler problem that could lead to sub-optimal compression. -* Feb 12, 2016: Snappy: Added AMD64 SSE 4.2 optimizations to matching, which makes easy to compress material run faster. Typical speedup is around 25%. -* Feb 9, 2016: Added Snappy package fork. This version is 5-7% faster, much more on hard to compress content. -* Jan 30, 2016: Optimize level 1 to 3 by not considering static dictionary or storing uncompressed. ~4-5% speedup. -* Jan 16, 2016: Optimization on deflate level 1,2,3 compression. -* Jan 8 2016: Merge [CL 18317](https://go-review.googlesource.com/#/c/18317): fix reading, writing of zip64 archives. -* Dec 8 2015: Make level 1 and -2 deterministic even if write size differs. -* Dec 8 2015: Split encoding functions, so hashing and matching can potentially be inlined. 1-3% faster on AMD64. 5% faster on other platforms. -* Dec 8 2015: Fixed rare [one byte out-of bounds read](https://github.com/klauspost/compress/issues/20). Please update! -* Nov 23 2015: Optimization on token writer. ~2-4% faster. Contributed by [@dsnet](https://github.com/dsnet). -* Nov 20 2015: Small optimization to bit writer on 64 bit systems. -* Nov 17 2015: Fixed out-of-bound errors if the underlying Writer returned an error. See [#15](https://github.com/klauspost/compress/issues/15). -* Nov 12 2015: Added [io.WriterTo](https://golang.org/pkg/io/#WriterTo) support to gzip/inflate. -* Nov 11 2015: Merged [CL 16669](https://go-review.googlesource.com/#/c/16669/4): archive/zip: enable overriding (de)compressors per file -* Oct 15 2015: Added skipping on uncompressible data. Random data speed up >5x. - -# usage - -The packages are drop-in replacements for standard libraries. Simply replace the import path to use them: - -| old import | new import | -|--------------------|-----------------------------------------| -| `compress/gzip` | `github.com/klauspost/compress/gzip` | -| `compress/zlib` | `github.com/klauspost/compress/zlib` | -| `archive/zip` | `github.com/klauspost/compress/zip` | -| `compress/deflate` | `github.com/klauspost/compress/deflate` | - -You may also be interested in [pgzip](https://github.com/klauspost/pgzip), which is a drop in replacement for gzip, which support multithreaded compression on big files and the optimized [crc32](https://github.com/klauspost/crc32) package used by these packages. - -The packages contains the same as the standard library, so you can use the godoc for that: [gzip](http://golang.org/pkg/compress/gzip/), [zip](http://golang.org/pkg/archive/zip/), [zlib](http://golang.org/pkg/compress/zlib/), [flate](http://golang.org/pkg/compress/flate/). - -Currently there is only minor speedup on decompression (mostly CRC32 calculation). - -# deflate optimizations - -* Minimum matches are 4 bytes, this leads to fewer searches and better compression. (In Go 1.7) -* Stronger hash (iSCSI CRC32) for matches on x64 with SSE 4.2 support. This leads to fewer hash collisions. (Go 1.7 also has improved hashes) -* Literal byte matching using SSE 4.2 for faster match comparisons. (not in Go) -* Bulk hashing on matches. (In Go 1.7) -* Much faster dictionary indexing with `NewWriterDict()`/`Reset()`. (In Go 1.7) -* Make Bit Coder faster by assuming we are on a 64 bit CPU. (In Go 1.7) -* Level 1 compression replaced by converted "Snappy" algorithm. (In Go 1.7) -* Uncompressible content is detected and skipped faster. (Only in BestSpeed in Go) -* A lot of branching eliminated by having two encoders for levels 4-6 and 7-9. (not in Go) -* All heap memory allocations eliminated. (In Go 1.7) - -``` -benchmark old ns/op new ns/op delta -BenchmarkEncodeDigitsSpeed1e4-4 554029 265175 -52.14% -BenchmarkEncodeDigitsSpeed1e5-4 3908558 2416595 -38.17% -BenchmarkEncodeDigitsSpeed1e6-4 37546692 24875330 -33.75% -BenchmarkEncodeDigitsDefault1e4-4 781510 486322 -37.77% -BenchmarkEncodeDigitsDefault1e5-4 15530248 6740175 -56.60% -BenchmarkEncodeDigitsDefault1e6-4 174915710 76498625 -56.27% -BenchmarkEncodeDigitsCompress1e4-4 769995 485652 -36.93% -BenchmarkEncodeDigitsCompress1e5-4 15450113 6929589 -55.15% -BenchmarkEncodeDigitsCompress1e6-4 175114660 73348495 -58.11% -BenchmarkEncodeTwainSpeed1e4-4 560122 275977 -50.73% -BenchmarkEncodeTwainSpeed1e5-4 3740978 2506095 -33.01% -BenchmarkEncodeTwainSpeed1e6-4 35542802 21904440 -38.37% -BenchmarkEncodeTwainDefault1e4-4 828534 549026 -33.74% -BenchmarkEncodeTwainDefault1e5-4 13667153 7528455 -44.92% -BenchmarkEncodeTwainDefault1e6-4 141191770 79952170 -43.37% -BenchmarkEncodeTwainCompress1e4-4 830050 545694 -34.26% -BenchmarkEncodeTwainCompress1e5-4 16620852 8460600 -49.10% -BenchmarkEncodeTwainCompress1e6-4 193326820 90808750 -53.03% - -benchmark old MB/s new MB/s speedup -BenchmarkEncodeDigitsSpeed1e4-4 18.05 37.71 2.09x -BenchmarkEncodeDigitsSpeed1e5-4 25.58 41.38 1.62x -BenchmarkEncodeDigitsSpeed1e6-4 26.63 40.20 1.51x -BenchmarkEncodeDigitsDefault1e4-4 12.80 20.56 1.61x -BenchmarkEncodeDigitsDefault1e5-4 6.44 14.84 2.30x -BenchmarkEncodeDigitsDefault1e6-4 5.72 13.07 2.28x -BenchmarkEncodeDigitsCompress1e4-4 12.99 20.59 1.59x -BenchmarkEncodeDigitsCompress1e5-4 6.47 14.43 2.23x -BenchmarkEncodeDigitsCompress1e6-4 5.71 13.63 2.39x -BenchmarkEncodeTwainSpeed1e4-4 17.85 36.23 2.03x -BenchmarkEncodeTwainSpeed1e5-4 26.73 39.90 1.49x -BenchmarkEncodeTwainSpeed1e6-4 28.14 45.65 1.62x -BenchmarkEncodeTwainDefault1e4-4 12.07 18.21 1.51x -BenchmarkEncodeTwainDefault1e5-4 7.32 13.28 1.81x -BenchmarkEncodeTwainDefault1e6-4 7.08 12.51 1.77x -BenchmarkEncodeTwainCompress1e4-4 12.05 18.33 1.52x -BenchmarkEncodeTwainCompress1e5-4 6.02 11.82 1.96x -BenchmarkEncodeTwainCompress1e6-4 5.17 11.01 2.13x -``` -* "Speed" is compression level 1 -* "Default" is compression level 6 -* "Compress" is compression level 9 -* Test files are [Digits](https://github.com/klauspost/compress/blob/master/testdata/e.txt) (no matches) and [Twain](https://github.com/klauspost/compress/blob/master/testdata/Mark.Twain-Tom.Sawyer.txt) (plain text) . - -As can be seen it shows a very good speedup all across the line. - -`Twain` is a much more realistic benchmark, and will be closer to JSON/HTML performance. Here speed is equivalent or faster, up to 2 times. - -**Without assembly**. This is what you can expect on systems that does not have amd64 and SSE 4: -``` -benchmark old ns/op new ns/op delta -BenchmarkEncodeDigitsSpeed1e4-4 554029 249558 -54.96% -BenchmarkEncodeDigitsSpeed1e5-4 3908558 2295216 -41.28% -BenchmarkEncodeDigitsSpeed1e6-4 37546692 22594905 -39.82% -BenchmarkEncodeDigitsDefault1e4-4 781510 579850 -25.80% -BenchmarkEncodeDigitsDefault1e5-4 15530248 10096561 -34.99% -BenchmarkEncodeDigitsDefault1e6-4 174915710 111470780 -36.27% -BenchmarkEncodeDigitsCompress1e4-4 769995 579708 -24.71% -BenchmarkEncodeDigitsCompress1e5-4 15450113 10266373 -33.55% -BenchmarkEncodeDigitsCompress1e6-4 175114660 110170120 -37.09% -BenchmarkEncodeTwainSpeed1e4-4 560122 260679 -53.46% -BenchmarkEncodeTwainSpeed1e5-4 3740978 2097372 -43.94% -BenchmarkEncodeTwainSpeed1e6-4 35542802 20353449 -42.74% -BenchmarkEncodeTwainDefault1e4-4 828534 646016 -22.03% -BenchmarkEncodeTwainDefault1e5-4 13667153 10056369 -26.42% -BenchmarkEncodeTwainDefault1e6-4 141191770 105268770 -25.44% -BenchmarkEncodeTwainCompress1e4-4 830050 642401 -22.61% -BenchmarkEncodeTwainCompress1e5-4 16620852 11157081 -32.87% -BenchmarkEncodeTwainCompress1e6-4 193326820 121780770 -37.01% - -benchmark old MB/s new MB/s speedup -BenchmarkEncodeDigitsSpeed1e4-4 18.05 40.07 2.22x -BenchmarkEncodeDigitsSpeed1e5-4 25.58 43.57 1.70x -BenchmarkEncodeDigitsSpeed1e6-4 26.63 44.26 1.66x -BenchmarkEncodeDigitsDefault1e4-4 12.80 17.25 1.35x -BenchmarkEncodeDigitsDefault1e5-4 6.44 9.90 1.54x -BenchmarkEncodeDigitsDefault1e6-4 5.72 8.97 1.57x -BenchmarkEncodeDigitsCompress1e4-4 12.99 17.25 1.33x -BenchmarkEncodeDigitsCompress1e5-4 6.47 9.74 1.51x -BenchmarkEncodeDigitsCompress1e6-4 5.71 9.08 1.59x -BenchmarkEncodeTwainSpeed1e4-4 17.85 38.36 2.15x -BenchmarkEncodeTwainSpeed1e5-4 26.73 47.68 1.78x -BenchmarkEncodeTwainSpeed1e6-4 28.14 49.13 1.75x -BenchmarkEncodeTwainDefault1e4-4 12.07 15.48 1.28x -BenchmarkEncodeTwainDefault1e5-4 7.32 9.94 1.36x -BenchmarkEncodeTwainDefault1e6-4 7.08 9.50 1.34x -BenchmarkEncodeTwainCompress1e4-4 12.05 15.57 1.29x -BenchmarkEncodeTwainCompress1e5-4 6.02 8.96 1.49x -BenchmarkEncodeTwainCompress1e6-4 5.17 8.21 1.59x -``` -So even without the assembly optimizations there is a general speedup across the board. - -## level 1-3 "snappy" compression - -Levels 1 "Best Speed", 2 and 3 are completely replaced by a converted version of the algorithm found in Snappy, modified to be fully -compatible with the deflate bitstream (and thus still compatible with all existing zlib/gzip libraries and tools). -This version is considerably faster than the "old" deflate at level 1. It does however come at a compression loss, usually in the order of 3-4% compared to the old level 1. However, the speed is usually 1.75 times that of the fastest deflate mode. - -In my previous experiments the most common case for "level 1" was that it provided no significant speedup, only lower compression compared to level 2 and sometimes even 3. However, the modified Snappy algorithm provides a very good sweet spot. Usually about 75% faster and with only little compression loss. Therefore I decided to *replace* level 1 with this mode entirely. - -Input is split into blocks of 64kb of, and they are encoded independently (no backreferences across blocks) for the best speed. Contrary to Snappy the output is entropy-encoded, so you will almost always see better compression than Snappy. But Snappy is still about twice as fast as Snappy in deflate mode. - -Level 2 and 3 have also been replaced. Level 2 is capable is matching between blocks and level 3 checks up to two hashes for matches it will try. - -## compression levels - -This table shows the compression at each level, and the percentage of the output size compared to output -at the similar level with the standard library. Compression data is `Twain`, see above. - -(Not up-to-date after rebalancing) - -| Level | Bytes | % size | -|-------|--------|--------| -| 1 | 194622 | 103.7% | -| 2 | 174684 | 96.85% | -| 3 | 170301 | 98.45% | -| 4 | 165253 | 97.69% | -| 5 | 161274 | 98.65% | -| 6 | 160464 | 99.71% | -| 7 | 160304 | 99.87% | -| 8 | 160279 | 99.99% | -| 9 | 160279 | 99.99% | - -To interpret and example, this version of deflate compresses input of 407287 bytes to 161274 bytes at level 5, which is 98.6% of the size of what the standard library produces; 161274 bytes. - -This means that from level 4 you can expect a compression level increase of a few percent. Level 1 is about 3% worse, as descibed above. - -# linear time compression (huffman only) - -This compression library adds a special compression level, named `ConstantCompression`, which allows near linear time compression. This is done by completely disabling matching of previous data, and only reduce the number of bits to represent each character. - -This means that often used characters, like 'e' and ' ' (space) in text use the fewest bits to represent, and rare characters like '¤' takes more bits to represent. For more information see [wikipedia](https://en.wikipedia.org/wiki/Huffman_coding) or this nice [video](https://youtu.be/ZdooBTdW5bM). - -Since this type of compression has much less variance, the compression speed is mostly unaffected by the input data, and is usually more than *180MB/s* for a single core. - -The downside is that the compression ratio is usually considerably worse than even the fastest conventional compression. The compression raio can never be better than 8:1 (12.5%). - -The linear time compression can be used as a "better than nothing" mode, where you cannot risk the encoder to slow down on some content. For comparison, the size of the "Twain" text is *233460 bytes* (+29% vs. level 1) and encode speed is 144MB/s (4.5x level 1). So in this case you trade a 30% size increase for a 4 times speedup. - -For more information see my blog post on [Fast Linear Time Compression](http://blog.klauspost.com/constant-time-gzipzip-compression/). - -This is implemented on Go 1.7 as "Huffman Only" mode, though not exposed for gzip. - - -# gzip/zip optimizations - * Uses the faster deflate - * Uses SSE 4.2 CRC32 calculations. - -Speed increase is up to 3x of the standard library, but usually around 2x. - -This is close to a real world benchmark as you will get. A 2.3MB JSON file. (NOTE: not up-to-date) - -``` -benchmark old ns/op new ns/op delta -BenchmarkGzipL1-4 95212470 59938275 -37.05% -BenchmarkGzipL2-4 102069730 76349195 -25.20% -BenchmarkGzipL3-4 115472770 82492215 -28.56% -BenchmarkGzipL4-4 153197780 107570890 -29.78% -BenchmarkGzipL5-4 203930260 134387930 -34.10% -BenchmarkGzipL6-4 233172100 145495400 -37.60% -BenchmarkGzipL7-4 297190260 197926950 -33.40% -BenchmarkGzipL8-4 512819750 376244733 -26.63% -BenchmarkGzipL9-4 563366800 403266833 -28.42% - -benchmark old MB/s new MB/s speedup -BenchmarkGzipL1-4 52.11 82.78 1.59x -BenchmarkGzipL2-4 48.61 64.99 1.34x -BenchmarkGzipL3-4 42.97 60.15 1.40x -BenchmarkGzipL4-4 32.39 46.13 1.42x -BenchmarkGzipL5-4 24.33 36.92 1.52x -BenchmarkGzipL6-4 21.28 34.10 1.60x -BenchmarkGzipL7-4 16.70 25.07 1.50x -BenchmarkGzipL8-4 9.68 13.19 1.36x -BenchmarkGzipL9-4 8.81 12.30 1.40x -``` - -Multithreaded compression using [pgzip](https://github.com/klauspost/pgzip) comparison, Quadcore, CPU = 8: - -(Not updated, old numbers) - -``` -benchmark old ns/op new ns/op delta -BenchmarkGzipL1 96155500 25981486 -72.98% -BenchmarkGzipL2 101905830 24601408 -75.86% -BenchmarkGzipL3 113506490 26321506 -76.81% -BenchmarkGzipL4 143708220 31761818 -77.90% -BenchmarkGzipL5 188210770 39602266 -78.96% -BenchmarkGzipL6 209812000 40402313 -80.74% -BenchmarkGzipL7 270015440 56103210 -79.22% -BenchmarkGzipL8 461359700 91255220 -80.22% -BenchmarkGzipL9 498361833 88755075 -82.19% - -benchmark old MB/s new MB/s speedup -BenchmarkGzipL1 51.60 190.97 3.70x -BenchmarkGzipL2 48.69 201.69 4.14x -BenchmarkGzipL3 43.71 188.51 4.31x -BenchmarkGzipL4 34.53 156.22 4.52x -BenchmarkGzipL5 26.36 125.29 4.75x -BenchmarkGzipL6 23.65 122.81 5.19x -BenchmarkGzipL7 18.38 88.44 4.81x -BenchmarkGzipL8 10.75 54.37 5.06x -BenchmarkGzipL9 9.96 55.90 5.61x -``` - -# snappy package - -The standard snappy package has now been improved. This repo contains a copy of the snappy repo. - -I would advise to use the standard package: https://github.com/golang/snappy - - -# license - -This code is licensed under the same conditions as the original Go code. See LICENSE file. diff --git a/vendor/github.com/klauspost/compress/snappy/AUTHORS b/vendor/github.com/klauspost/compress/snappy/AUTHORS new file mode 100644 index 00000000000..fd1c6f67b36 --- /dev/null +++ b/vendor/github.com/klauspost/compress/snappy/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of Snappy-Go authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Damian Gryski +Google Inc. +Jan Mercl <0xjnml@gmail.com> +Rodolfo Carvalho +Sebastien Binet diff --git a/vendor/github.com/klauspost/compress/snappy/CONTRIBUTORS b/vendor/github.com/klauspost/compress/snappy/CONTRIBUTORS new file mode 100644 index 00000000000..a29b1339882 --- /dev/null +++ b/vendor/github.com/klauspost/compress/snappy/CONTRIBUTORS @@ -0,0 +1,37 @@ +# This is the official list of people who can contribute +# (and typically have contributed) code to the Snappy-Go repository. +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, Google employees are listed here +# but not in AUTHORS, because Google holds the copyright. +# +# The submission process automatically checks to make sure +# that people submitting code are listed in this file (by email address). +# +# Names should be added to this file only after verifying that +# the individual or the individual's organization has agreed to +# the appropriate Contributor License Agreement, found here: +# +# http://code.google.com/legal/individual-cla-v1.0.html +# http://code.google.com/legal/corporate-cla-v1.0.html +# +# The agreement for individuals can be filled out on the web. +# +# When adding J Random Contributor's name to this file, +# either J's name or J's organization's name should be +# added to the AUTHORS file, depending on whether the +# individual or corporate CLA was used. + +# Names should be added to this file like so: +# Name + +# Please keep the list sorted. + +Damian Gryski +Jan Mercl <0xjnml@gmail.com> +Kai Backman +Marc-Antoine Ruel +Nigel Tao +Rob Pike +Rodolfo Carvalho +Russ Cox +Sebastien Binet diff --git a/vendor/github.com/klauspost/compress/snappy/LICENSE b/vendor/github.com/klauspost/compress/snappy/LICENSE new file mode 100644 index 00000000000..7e69e1a2f61 --- /dev/null +++ b/vendor/github.com/klauspost/compress/snappy/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2011 The Snappy-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/github.com/klauspost/cpuid/.gitignore b/vendor/github.com/klauspost/cpuid/.gitignore deleted file mode 100644 index daf913b1b34..00000000000 --- a/vendor/github.com/klauspost/cpuid/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# 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 -*.prof diff --git a/vendor/github.com/klauspost/cpuid/.travis.yml b/vendor/github.com/klauspost/cpuid/.travis.yml deleted file mode 100644 index 2332ea6d707..00000000000 --- a/vendor/github.com/klauspost/cpuid/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: go - -sudo: false - -os: - - linux - - osx -go: - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - master - -script: - - go vet ./... - - go test -v ./... - - go test -race ./... - - diff <(gofmt -d .) <("") - -matrix: - allow_failures: - - go: 'master' - fast_finish: true diff --git a/vendor/github.com/klauspost/cpuid/README.md b/vendor/github.com/klauspost/cpuid/README.md deleted file mode 100644 index b2b6bee879a..00000000000 --- a/vendor/github.com/klauspost/cpuid/README.md +++ /dev/null @@ -1,145 +0,0 @@ -# cpuid -Package cpuid provides information about the CPU running the current program. - -CPU features are detected on startup, and kept for fast access through the life of the application. -Currently x86 / x64 (AMD64) is supported, and no external C (cgo) code is used, which should make the library very easy to use. - -You can access the CPU information by accessing the shared CPU variable of the cpuid library. - -Package home: https://github.com/klauspost/cpuid - -[![GoDoc][1]][2] [![Build Status][3]][4] - -[1]: https://godoc.org/github.com/klauspost/cpuid?status.svg -[2]: https://godoc.org/github.com/klauspost/cpuid -[3]: https://travis-ci.org/klauspost/cpuid.svg -[4]: https://travis-ci.org/klauspost/cpuid - -# features -## CPU Instructions -* **CMOV** (i686 CMOV) -* **NX** (NX (No-Execute) bit) -* **AMD3DNOW** (AMD 3DNOW) -* **AMD3DNOWEXT** (AMD 3DNowExt) -* **MMX** (standard MMX) -* **MMXEXT** (SSE integer functions or AMD MMX ext) -* **SSE** (SSE functions) -* **SSE2** (P4 SSE functions) -* **SSE3** (Prescott SSE3 functions) -* **SSSE3** (Conroe SSSE3 functions) -* **SSE4** (Penryn SSE4.1 functions) -* **SSE4A** (AMD Barcelona microarchitecture SSE4a instructions) -* **SSE42** (Nehalem SSE4.2 functions) -* **AVX** (AVX functions) -* **AVX2** (AVX2 functions) -* **FMA3** (Intel FMA 3) -* **FMA4** (Bulldozer FMA4 functions) -* **XOP** (Bulldozer XOP functions) -* **F16C** (Half-precision floating-point conversion) -* **BMI1** (Bit Manipulation Instruction Set 1) -* **BMI2** (Bit Manipulation Instruction Set 2) -* **TBM** (AMD Trailing Bit Manipulation) -* **LZCNT** (LZCNT instruction) -* **POPCNT** (POPCNT instruction) -* **AESNI** (Advanced Encryption Standard New Instructions) -* **CLMUL** (Carry-less Multiplication) -* **HTT** (Hyperthreading (enabled)) -* **HLE** (Hardware Lock Elision) -* **RTM** (Restricted Transactional Memory) -* **RDRAND** (RDRAND instruction is available) -* **RDSEED** (RDSEED instruction is available) -* **ADX** (Intel ADX (Multi-Precision Add-Carry Instruction Extensions)) -* **SHA** (Intel SHA Extensions) -* **AVX512F** (AVX-512 Foundation) -* **AVX512DQ** (AVX-512 Doubleword and Quadword Instructions) -* **AVX512IFMA** (AVX-512 Integer Fused Multiply-Add Instructions) -* **AVX512PF** (AVX-512 Prefetch Instructions) -* **AVX512ER** (AVX-512 Exponential and Reciprocal Instructions) -* **AVX512CD** (AVX-512 Conflict Detection Instructions) -* **AVX512BW** (AVX-512 Byte and Word Instructions) -* **AVX512VL** (AVX-512 Vector Length Extensions) -* **AVX512VBMI** (AVX-512 Vector Bit Manipulation Instructions) -* **MPX** (Intel MPX (Memory Protection Extensions)) -* **ERMS** (Enhanced REP MOVSB/STOSB) -* **RDTSCP** (RDTSCP Instruction) -* **CX16** (CMPXCHG16B Instruction) -* **SGX** (Software Guard Extensions, with activation details) - -## Performance -* **RDTSCP()** Returns current cycle count. Can be used for benchmarking. -* **SSE2SLOW** (SSE2 is supported, but usually not faster) -* **SSE3SLOW** (SSE3 is supported, but usually not faster) -* **ATOM** (Atom processor, some SSSE3 instructions are slower) -* **Cache line** (Probable size of a cache line). -* **L1, L2, L3 Cache size** on newer Intel/AMD CPUs. - -## Cpu Vendor/VM -* **Intel** -* **AMD** -* **VIA** -* **Transmeta** -* **NSC** -* **KVM** (Kernel-based Virtual Machine) -* **MSVM** (Microsoft Hyper-V or Windows Virtual PC) -* **VMware** -* **XenHVM** - -# installing - -```go get github.com/klauspost/cpuid``` - -# example - -```Go -package main - -import ( - "fmt" - "github.com/klauspost/cpuid" -) - -func main() { - // Print basic CPU information: - fmt.Println("Name:", cpuid.CPU.BrandName) - fmt.Println("PhysicalCores:", cpuid.CPU.PhysicalCores) - fmt.Println("ThreadsPerCore:", cpuid.CPU.ThreadsPerCore) - fmt.Println("LogicalCores:", cpuid.CPU.LogicalCores) - fmt.Println("Family", cpuid.CPU.Family, "Model:", cpuid.CPU.Model) - fmt.Println("Features:", cpuid.CPU.Features) - fmt.Println("Cacheline bytes:", cpuid.CPU.CacheLine) - fmt.Println("L1 Data Cache:", cpuid.CPU.Cache.L1D, "bytes") - fmt.Println("L1 Instruction Cache:", cpuid.CPU.Cache.L1D, "bytes") - fmt.Println("L2 Cache:", cpuid.CPU.Cache.L2, "bytes") - fmt.Println("L3 Cache:", cpuid.CPU.Cache.L3, "bytes") - - // Test if we have a specific feature: - if cpuid.CPU.SSE() { - fmt.Println("We have Streaming SIMD Extensions") - } -} -``` - -Sample output: -``` ->go run main.go -Name: Intel(R) Core(TM) i5-2540M CPU @ 2.60GHz -PhysicalCores: 2 -ThreadsPerCore: 2 -LogicalCores: 4 -Family 6 Model: 42 -Features: CMOV,MMX,MMXEXT,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AESNI,CLMUL -Cacheline bytes: 64 -We have Streaming SIMD Extensions -``` - -# private package - -In the "private" folder you can find an autogenerated version of the library you can include in your own packages. - -For this purpose all exports are removed, and functions and constants are lowercased. - -This is not a recommended way of using the library, but provided for convenience, if it is difficult for you to use external packages. - -# license - -This code is published under an MIT license. See LICENSE file for more information. diff --git a/vendor/github.com/klauspost/crc32/.gitignore b/vendor/github.com/klauspost/crc32/.gitignore deleted file mode 100644 index daf913b1b34..00000000000 --- a/vendor/github.com/klauspost/crc32/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# 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 -*.prof diff --git a/vendor/github.com/klauspost/crc32/README.md b/vendor/github.com/klauspost/crc32/README.md deleted file mode 100644 index 029625d3609..00000000000 --- a/vendor/github.com/klauspost/crc32/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# crc32 -CRC32 hash with x64 optimizations - -This package is a drop-in replacement for the standard library `hash/crc32` package, that features SSE 4.2 optimizations on x64 platforms, for a 10x speedup. - -[![Build Status](https://travis-ci.org/klauspost/crc32.svg?branch=master)](https://travis-ci.org/klauspost/crc32) - -# usage - -Install using `go get github.com/klauspost/crc32`. This library is based on Go 1.5 code and requires Go 1.3 or newer. - -Replace `import "hash/crc32"` with `import "github.com/klauspost/crc32"` and you are good to go. - -# changes -* Oct 20, 2016: Changes have been merged to upstream Go. Package updated to match. -* Dec 4, 2015: Uses the "slice-by-8" trick more extensively, which gives a 1.5 to 2.5x speedup if assembler is unavailable. - - -# performance - -For *Go 1.7* performance is equivalent to the standard library. So if you use this package for Go 1.7 you can switch back. - - -For IEEE tables (the most common), there is approximately a factor 10 speedup with "CLMUL" (Carryless multiplication) instruction: -``` -benchmark old ns/op new ns/op delta -BenchmarkCrc32KB 99955 10258 -89.74% - -benchmark old MB/s new MB/s speedup -BenchmarkCrc32KB 327.83 3194.20 9.74x -``` - -For other tables and "CLMUL" capable machines the performance is the same as the standard library. - -Here are some detailed benchmarks, comparing to go 1.5 standard library with and without assembler enabled. - -``` -Std: Standard Go 1.5 library -Crc: Indicates IEEE type CRC. -40B: Size of each slice encoded. -NoAsm: Assembler was disabled (ie. not an AMD64 or SSE 4.2+ capable machine). -Castagnoli: Castagnoli CRC type. - -BenchmarkStdCrc40B-4 10000000 158 ns/op 252.88 MB/s -BenchmarkCrc40BNoAsm-4 20000000 105 ns/op 377.38 MB/s (slice8) -BenchmarkCrc40B-4 20000000 105 ns/op 378.77 MB/s (slice8) - -BenchmarkStdCrc1KB-4 500000 3604 ns/op 284.10 MB/s -BenchmarkCrc1KBNoAsm-4 1000000 1463 ns/op 699.79 MB/s (slice8) -BenchmarkCrc1KB-4 3000000 396 ns/op 2583.69 MB/s (asm) - -BenchmarkStdCrc8KB-4 200000 11417 ns/op 717.48 MB/s (slice8) -BenchmarkCrc8KBNoAsm-4 200000 11317 ns/op 723.85 MB/s (slice8) -BenchmarkCrc8KB-4 500000 2919 ns/op 2805.73 MB/s (asm) - -BenchmarkStdCrc32KB-4 30000 45749 ns/op 716.24 MB/s (slice8) -BenchmarkCrc32KBNoAsm-4 30000 45109 ns/op 726.42 MB/s (slice8) -BenchmarkCrc32KB-4 100000 11497 ns/op 2850.09 MB/s (asm) - -BenchmarkStdNoAsmCastagnol40B-4 10000000 161 ns/op 246.94 MB/s -BenchmarkStdCastagnoli40B-4 50000000 28.4 ns/op 1410.69 MB/s (asm) -BenchmarkCastagnoli40BNoAsm-4 20000000 100 ns/op 398.01 MB/s (slice8) -BenchmarkCastagnoli40B-4 50000000 28.2 ns/op 1419.54 MB/s (asm) - -BenchmarkStdNoAsmCastagnoli1KB-4 500000 3622 ns/op 282.67 MB/s -BenchmarkStdCastagnoli1KB-4 10000000 144 ns/op 7099.78 MB/s (asm) -BenchmarkCastagnoli1KBNoAsm-4 1000000 1475 ns/op 694.14 MB/s (slice8) -BenchmarkCastagnoli1KB-4 10000000 146 ns/op 6993.35 MB/s (asm) - -BenchmarkStdNoAsmCastagnoli8KB-4 50000 28781 ns/op 284.63 MB/s -BenchmarkStdCastagnoli8KB-4 1000000 1029 ns/op 7957.89 MB/s (asm) -BenchmarkCastagnoli8KBNoAsm-4 200000 11410 ns/op 717.94 MB/s (slice8) -BenchmarkCastagnoli8KB-4 1000000 1000 ns/op 8188.71 MB/s (asm) - -BenchmarkStdNoAsmCastagnoli32KB-4 10000 115426 ns/op 283.89 MB/s -BenchmarkStdCastagnoli32KB-4 300000 4065 ns/op 8059.13 MB/s (asm) -BenchmarkCastagnoli32KBNoAsm-4 30000 45171 ns/op 725.41 MB/s (slice8) -BenchmarkCastagnoli32KB-4 500000 4077 ns/op 8035.89 MB/s (asm) -``` - -The IEEE assembler optimizations has been submitted and will be part of the Go 1.6 standard library. - -However, the improved use of slice-by-8 has not, but will probably be submitted for Go 1.7. - -# license - -Standard Go license. Changes are Copyright (c) 2015 Klaus Post under same conditions. diff --git a/vendor/github.com/kr/pretty/.gitignore b/vendor/github.com/kr/pretty/.gitignore deleted file mode 100644 index 1f0a99f2f2b..00000000000 --- a/vendor/github.com/kr/pretty/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -[568].out -_go* -_test* -_obj diff --git a/vendor/github.com/kr/pretty/Readme b/vendor/github.com/kr/pretty/Readme deleted file mode 100644 index c589fc622b3..00000000000 --- a/vendor/github.com/kr/pretty/Readme +++ /dev/null @@ -1,9 +0,0 @@ -package pretty - - import "github.com/kr/pretty" - - Package pretty provides pretty-printing for Go values. - -Documentation - - http://godoc.org/github.com/kr/pretty diff --git a/vendor/github.com/kr/pretty/diff_test.go b/vendor/github.com/kr/pretty/diff_test.go deleted file mode 100644 index a951e4b6c3f..00000000000 --- a/vendor/github.com/kr/pretty/diff_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package pretty - -import ( - "bytes" - "fmt" - "log" - "reflect" - "testing" - "unsafe" -) - -var ( - _ Logfer = (*testing.T)(nil) - _ Logfer = (*testing.B)(nil) - _ Printfer = (*log.Logger)(nil) -) - -type difftest struct { - a interface{} - b interface{} - exp []string -} - -type S struct { - A int - S *S - I interface{} - C []int -} - -type ( - N struct{ N int } - E interface{} -) - -var ( - c0 = make(chan int) - c1 = make(chan int) - f0 = func() {} - f1 = func() {} - i0 = 0 - i1 = 1 -) - -var diffs = []difftest{ - {a: nil, b: nil}, - {a: S{A: 1}, b: S{A: 1}}, - - {0, "", []string{`int != string`}}, - {0, 1, []string{`0 != 1`}}, - {S{}, new(S), []string{`pretty.S != *pretty.S`}}, - {"a", "b", []string{`"a" != "b"`}}, - {S{}, S{A: 1}, []string{`A: 0 != 1`}}, - {new(S), &S{A: 1}, []string{`A: 0 != 1`}}, - {S{S: new(S)}, S{S: &S{A: 1}}, []string{`S.A: 0 != 1`}}, - {S{}, S{I: 0}, []string{`I: nil != int(0)`}}, - {S{I: 1}, S{I: "x"}, []string{`I: int != string`}}, - {S{}, S{C: []int{1}}, []string{`C: []int[0] != []int[1]`}}, - {S{C: []int{}}, S{C: []int{1}}, []string{`C: []int[0] != []int[1]`}}, - {S{C: []int{1, 2, 3}}, S{C: []int{1, 2, 4}}, []string{`C[2]: 3 != 4`}}, - {S{}, S{A: 1, S: new(S)}, []string{`A: 0 != 1`, `S: nil != &pretty.S{}`}}, - - // unexported fields of every reflect.Kind (both equal and unequal) - {struct{ x bool }{false}, struct{ x bool }{false}, nil}, - {struct{ x bool }{false}, struct{ x bool }{true}, []string{`x: false != true`}}, - {struct{ x int }{0}, struct{ x int }{0}, nil}, - {struct{ x int }{0}, struct{ x int }{1}, []string{`x: 0 != 1`}}, - {struct{ x int8 }{0}, struct{ x int8 }{0}, nil}, - {struct{ x int8 }{0}, struct{ x int8 }{1}, []string{`x: 0 != 1`}}, - {struct{ x int16 }{0}, struct{ x int16 }{0}, nil}, - {struct{ x int16 }{0}, struct{ x int16 }{1}, []string{`x: 0 != 1`}}, - {struct{ x int32 }{0}, struct{ x int32 }{0}, nil}, - {struct{ x int32 }{0}, struct{ x int32 }{1}, []string{`x: 0 != 1`}}, - {struct{ x int64 }{0}, struct{ x int64 }{0}, nil}, - {struct{ x int64 }{0}, struct{ x int64 }{1}, []string{`x: 0 != 1`}}, - {struct{ x uint }{0}, struct{ x uint }{0}, nil}, - {struct{ x uint }{0}, struct{ x uint }{1}, []string{`x: 0 != 1`}}, - {struct{ x uint8 }{0}, struct{ x uint8 }{0}, nil}, - {struct{ x uint8 }{0}, struct{ x uint8 }{1}, []string{`x: 0 != 1`}}, - {struct{ x uint16 }{0}, struct{ x uint16 }{0}, nil}, - {struct{ x uint16 }{0}, struct{ x uint16 }{1}, []string{`x: 0 != 1`}}, - {struct{ x uint32 }{0}, struct{ x uint32 }{0}, nil}, - {struct{ x uint32 }{0}, struct{ x uint32 }{1}, []string{`x: 0 != 1`}}, - {struct{ x uint64 }{0}, struct{ x uint64 }{0}, nil}, - {struct{ x uint64 }{0}, struct{ x uint64 }{1}, []string{`x: 0 != 1`}}, - {struct{ x uintptr }{0}, struct{ x uintptr }{0}, nil}, - {struct{ x uintptr }{0}, struct{ x uintptr }{1}, []string{`x: 0 != 1`}}, - {struct{ x float32 }{0}, struct{ x float32 }{0}, nil}, - {struct{ x float32 }{0}, struct{ x float32 }{1}, []string{`x: 0 != 1`}}, - {struct{ x float64 }{0}, struct{ x float64 }{0}, nil}, - {struct{ x float64 }{0}, struct{ x float64 }{1}, []string{`x: 0 != 1`}}, - {struct{ x complex64 }{0}, struct{ x complex64 }{0}, nil}, - {struct{ x complex64 }{0}, struct{ x complex64 }{1}, []string{`x: (0+0i) != (1+0i)`}}, - {struct{ x complex128 }{0}, struct{ x complex128 }{0}, nil}, - {struct{ x complex128 }{0}, struct{ x complex128 }{1}, []string{`x: (0+0i) != (1+0i)`}}, - {struct{ x [1]int }{[1]int{0}}, struct{ x [1]int }{[1]int{0}}, nil}, - {struct{ x [1]int }{[1]int{0}}, struct{ x [1]int }{[1]int{1}}, []string{`x[0]: 0 != 1`}}, - {struct{ x chan int }{c0}, struct{ x chan int }{c0}, nil}, - {struct{ x chan int }{c0}, struct{ x chan int }{c1}, []string{fmt.Sprintf("x: %p != %p", c0, c1)}}, - {struct{ x func() }{f0}, struct{ x func() }{f0}, nil}, - {struct{ x func() }{f0}, struct{ x func() }{f1}, []string{fmt.Sprintf("x: %p != %p", f0, f1)}}, - {struct{ x interface{} }{0}, struct{ x interface{} }{0}, nil}, - {struct{ x interface{} }{0}, struct{ x interface{} }{1}, []string{`x: 0 != 1`}}, - {struct{ x interface{} }{0}, struct{ x interface{} }{""}, []string{`x: int != string`}}, - {struct{ x interface{} }{0}, struct{ x interface{} }{nil}, []string{`x: int(0) != nil`}}, - {struct{ x interface{} }{nil}, struct{ x interface{} }{0}, []string{`x: nil != int(0)`}}, - {struct{ x map[int]int }{map[int]int{0: 0}}, struct{ x map[int]int }{map[int]int{0: 0}}, nil}, - {struct{ x map[int]int }{map[int]int{0: 0}}, struct{ x map[int]int }{map[int]int{0: 1}}, []string{`x[0]: 0 != 1`}}, - {struct{ x *int }{new(int)}, struct{ x *int }{new(int)}, nil}, - {struct{ x *int }{&i0}, struct{ x *int }{&i1}, []string{`x: 0 != 1`}}, - {struct{ x *int }{nil}, struct{ x *int }{&i0}, []string{`x: nil != &int(0)`}}, - {struct{ x *int }{&i0}, struct{ x *int }{nil}, []string{`x: &int(0) != nil`}}, - {struct{ x []int }{[]int{0}}, struct{ x []int }{[]int{0}}, nil}, - {struct{ x []int }{[]int{0}}, struct{ x []int }{[]int{1}}, []string{`x[0]: 0 != 1`}}, - {struct{ x string }{"a"}, struct{ x string }{"a"}, nil}, - {struct{ x string }{"a"}, struct{ x string }{"b"}, []string{`x: "a" != "b"`}}, - {struct{ x N }{N{0}}, struct{ x N }{N{0}}, nil}, - {struct{ x N }{N{0}}, struct{ x N }{N{1}}, []string{`x.N: 0 != 1`}}, - { - struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(0))}, - struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(0))}, - nil, - }, - { - struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(0))}, - struct{ x unsafe.Pointer }{unsafe.Pointer(uintptr(1))}, - []string{`x: 0x0 != 0x1`}, - }, -} - -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 TestKeyEqual(t *testing.T) { - var emptyInterfaceZero interface{} = 0 - - cases := []interface{}{ - new(bool), - new(int), - new(int8), - new(int16), - new(int32), - new(int64), - new(uint), - new(uint8), - new(uint16), - new(uint32), - new(uint64), - new(uintptr), - new(float32), - new(float64), - new(complex64), - new(complex128), - new([1]int), - new(chan int), - new(unsafe.Pointer), - new(interface{}), - &emptyInterfaceZero, - new(*int), - new(string), - new(struct{ int }), - } - - for _, test := range cases { - rv := reflect.ValueOf(test).Elem() - if !keyEqual(rv, rv) { - t.Errorf("keyEqual(%s, %s) = false want true", rv.Type(), rv.Type()) - } - } -} - -func TestFdiff(t *testing.T) { - var buf bytes.Buffer - Fdiff(&buf, 0, 1) - want := "0 != 1\n" - if got := buf.String(); got != want { - t.Errorf("Fdiff(0, 1) = %q want %q", got, want) - } -} - -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 deleted file mode 100644 index ecf40f3fcc6..00000000000 --- a/vendor/github.com/kr/pretty/example_test.go +++ /dev/null @@ -1,20 +0,0 @@ -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_test.go b/vendor/github.com/kr/pretty/formatter_test.go deleted file mode 100644 index c8c0b51531b..00000000000 --- a/vendor/github.com/kr/pretty/formatter_test.go +++ /dev/null @@ -1,288 +0,0 @@ -package pretty - -import ( - "fmt" - "io" - "strings" - "testing" - "unsafe" -) - -type test struct { - v interface{} - s string -} - -type passtest struct { - v interface{} - f, 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)) -} - -type Stringer struct { i int } - -func (s *Stringer) String() string { return "foo" } - -var long = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" - -var passthrough = []passtest{ - {1, "%d", "1"}, - {"a", "%s", "a"}, - {&Stringer{}, "%s", "foo"}, -} - -func TestPassthrough(t *testing.T) { - for _, tt := range passthrough { - s := fmt.Sprintf(tt.f, 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) - } - } -} - -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/text/Readme b/vendor/github.com/kr/text/Readme deleted file mode 100644 index 7e6e7c0687b..00000000000 --- a/vendor/github.com/kr/text/Readme +++ /dev/null @@ -1,3 +0,0 @@ -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/indent_test.go b/vendor/github.com/kr/text/indent_test.go deleted file mode 100644 index 5c723eee855..00000000000 --- a/vendor/github.com/kr/text/indent_test.go +++ /dev/null @@ -1,119 +0,0 @@ -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/wrap_test.go b/vendor/github.com/kr/text/wrap_test.go deleted file mode 100644 index 634b6e8ebb9..00000000000 --- a/vendor/github.com/kr/text/wrap_test.go +++ /dev/null @@ -1,62 +0,0 @@ -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/lib/pq/.gitignore b/vendor/github.com/lib/pq/.gitignore deleted file mode 100644 index 0f1d00e1196..00000000000 --- a/vendor/github.com/lib/pq/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.db -*.test -*~ -*.swp diff --git a/vendor/github.com/lib/pq/.travis.sh b/vendor/github.com/lib/pq/.travis.sh deleted file mode 100755 index ead01df739b..00000000000 --- a/vendor/github.com/lib/pq/.travis.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash - -set -eu - -client_configure() { - sudo chmod 600 $PQSSLCERTTEST_PATH/postgresql.key -} - -pgdg_repository() { - local sourcelist='sources.list.d/postgresql.list' - - curl -sS 'https://www.postgresql.org/media/keys/ACCC4CF8.asc' | sudo apt-key add - - echo deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main $PGVERSION | sudo tee "/etc/apt/$sourcelist" - sudo apt-get -o Dir::Etc::sourcelist="$sourcelist" -o Dir::Etc::sourceparts='-' -o APT::Get::List-Cleanup='0' update -} - -postgresql_configure() { - sudo tee /etc/postgresql/$PGVERSION/main/pg_hba.conf > /dev/null <<-config - local all all trust - hostnossl all pqgossltest 127.0.0.1/32 reject - hostnossl all pqgosslcert 127.0.0.1/32 reject - hostssl all pqgossltest 127.0.0.1/32 trust - hostssl all pqgosslcert 127.0.0.1/32 cert - host all all 127.0.0.1/32 trust - hostnossl all pqgossltest ::1/128 reject - hostnossl all pqgosslcert ::1/128 reject - hostssl all pqgossltest ::1/128 trust - hostssl all pqgosslcert ::1/128 cert - host all all ::1/128 trust - config - - xargs sudo install -o postgres -g postgres -m 600 -t /var/lib/postgresql/$PGVERSION/main/ <<-certificates - certs/root.crt - certs/server.crt - certs/server.key - certificates - - sort -VCu <<-versions || - $PGVERSION - 9.2 - versions - sudo tee -a /etc/postgresql/$PGVERSION/main/postgresql.conf > /dev/null <<-config - ssl_ca_file = 'root.crt' - ssl_cert_file = 'server.crt' - ssl_key_file = 'server.key' - config - - echo 127.0.0.1 postgres | sudo tee -a /etc/hosts > /dev/null - - sudo service postgresql restart -} - -postgresql_install() { - xargs sudo apt-get -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confnew' install <<-packages - postgresql-$PGVERSION - postgresql-server-dev-$PGVERSION - postgresql-contrib-$PGVERSION - packages -} - -postgresql_uninstall() { - sudo service postgresql stop - xargs sudo apt-get -y --purge remove <<-packages - libpq-dev - libpq5 - postgresql - postgresql-client-common - postgresql-common - packages - sudo rm -rf /var/lib/postgresql -} - -megacheck_install() { - # Megacheck is Go 1.6+, so skip if Go 1.5. - if [[ "$(go version)" =~ "go1.5" ]] - then - echo "megacheck not supported, skipping installation" - return 0 - fi - # Lock megacheck version at $MEGACHECK_VERSION to prevent spontaneous - # new error messages in old code. - go get -d honnef.co/go/tools/... - git -C $GOPATH/src/honnef.co/go/tools/ checkout $MEGACHECK_VERSION - go install honnef.co/go/tools/cmd/megacheck - megacheck --version -} - -golint_install() { - # Golint is Go 1.6+, so skip if Go 1.5. - if [[ "$(go version)" =~ "go1.5" ]] - then - echo "golint not supported, skipping installation" - return 0 - fi - go get github.com/golang/lint/golint -} - -$1 diff --git a/vendor/github.com/lib/pq/CONTRIBUTING.md b/vendor/github.com/lib/pq/CONTRIBUTING.md deleted file mode 100644 index 84c937f1561..00000000000 --- a/vendor/github.com/lib/pq/CONTRIBUTING.md +++ /dev/null @@ -1,29 +0,0 @@ -## Contributing to pq - -`pq` has a backlog of pull requests, but contributions are still very -much welcome. You can help with patch review, submitting bug reports, -or adding new functionality. There is no formal style guide, but -please conform to the style of existing code and general Go formatting -conventions when submitting patches. - -### Patch review - -Help review existing open pull requests by commenting on the code or -proposed functionality. - -### Bug reports - -We appreciate any bug reports, but especially ones with self-contained -(doesn't depend on code outside of pq), minimal (can't be simplified -further) test cases. It's especially helpful if you can submit a pull -request with just the failing test case (you'll probably want to -pattern it after the tests in -[conn_test.go](https://github.com/lib/pq/blob/master/conn_test.go). - -### New functionality - -There are a number of pending patches for new functionality, so -additional feature patches will take a while to merge. Still, patches -are generally reviewed based on usefulness and complexity in addition -to time-in-queue, so if you have a knockout idea, take a shot. Feel -free to open an issue discussion your proposed patch beforehand. diff --git a/vendor/github.com/lib/pq/README.md b/vendor/github.com/lib/pq/README.md deleted file mode 100644 index 781c89eea69..00000000000 --- a/vendor/github.com/lib/pq/README.md +++ /dev/null @@ -1,106 +0,0 @@ -# pq - A pure Go postgres driver for Go's database/sql package - -[![GoDoc](https://godoc.org/github.com/lib/pq?status.svg)](https://godoc.org/github.com/lib/pq) -[![Build Status](https://travis-ci.org/lib/pq.svg?branch=master)](https://travis-ci.org/lib/pq) - -## Install - - go get github.com/lib/pq - -## Docs - -For detailed documentation and basic usage examples, please see the package -documentation at . - -## Tests - -`go test` is used for testing. A running PostgreSQL server is -required, with the ability to log in. The default database to connect -to test with is "pqgotest," but it can be overridden using environment -variables. - -Example: - - PGHOST=/run/postgresql go test github.com/lib/pq - -Optionally, a benchmark suite can be run as part of the tests: - - PGHOST=/run/postgresql go test -bench . - -## Features - -* SSL -* Handles bad connections for `database/sql` -* Scan `time.Time` correctly (i.e. `timestamp[tz]`, `time[tz]`, `date`) -* Scan binary blobs correctly (i.e. `bytea`) -* Package for `hstore` support -* COPY FROM support -* pq.ParseURL for converting urls to connection strings for sql.Open. -* Many libpq compatible environment variables -* Unix socket support -* Notifications: `LISTEN`/`NOTIFY` -* pgpass support - -## Future / Things you can help with - -* Better COPY FROM / COPY TO (see discussion in #181) - -## Thank you (alphabetical) - -Some of these contributors are from the original library `bmizerany/pq.go` whose -code still exists in here. - -* Andy Balholm (andybalholm) -* Ben Berkert (benburkert) -* Benjamin Heatwole (bheatwole) -* Bill Mill (llimllib) -* Bjørn Madsen (aeons) -* Blake Gentry (bgentry) -* Brad Fitzpatrick (bradfitz) -* Charlie Melbye (cmelbye) -* Chris Bandy (cbandy) -* Chris Gilling (cgilling) -* Chris Walsh (cwds) -* Dan Sosedoff (sosedoff) -* Daniel Farina (fdr) -* Eric Chlebek (echlebek) -* Eric Garrido (minusnine) -* Eric Urban (hydrogen18) -* Everyone at The Go Team -* Evan Shaw (edsrzf) -* Ewan Chou (coocood) -* Fazal Majid (fazalmajid) -* Federico Romero (federomero) -* Fumin (fumin) -* Gary Burd (garyburd) -* Heroku (heroku) -* James Pozdena (jpoz) -* Jason McVetta (jmcvetta) -* Jeremy Jay (pbnjay) -* Joakim Sernbrant (serbaut) -* John Gallagher (jgallagher) -* Jonathan Rudenberg (titanous) -* Joël Stemmer (jstemmer) -* Kamil Kisiel (kisielk) -* Kelly Dunn (kellydunn) -* Keith Rarick (kr) -* Kir Shatrov (kirs) -* Lann Martin (lann) -* Maciek Sakrejda (uhoh-itsmaciek) -* Marc Brinkmann (mbr) -* Marko Tiikkaja (johto) -* Matt Newberry (MattNewberry) -* Matt Robenolt (mattrobenolt) -* Martin Olsen (martinolsen) -* Mike Lewis (mikelikespie) -* Nicolas Patry (Narsil) -* Oliver Tonnhofer (olt) -* Patrick Hayes (phayes) -* Paul Hammond (paulhammond) -* Ryan Smith (ryandotsmith) -* Samuel Stauffer (samuel) -* Timothée Peignier (cyberdelia) -* Travis Cline (tmc) -* TruongSinh Tran-Nguyen (truongsinh) -* Yaismel Miranda (ympons) -* notedit (notedit) diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md deleted file mode 100644 index 56729a92ca6..00000000000 --- a/vendor/github.com/mattn/go-colorable/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# go-colorable - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) -[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) - -Colorable writer for windows. - -For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) -This package is possible to handle escape sequence for ansi color on windows. - -## Too Bad! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) - - -## So Good! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) - -## Usage - -```go -logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) -logrus.SetOutput(colorable.NewColorableStdout()) - -logrus.Info("succeeded") -logrus.Warn("not correct") -logrus.Error("something error") -logrus.Fatal("panic") -``` - -You can compile above code on non-windows OSs. - -## Installation - -``` -$ go get github.com/mattn/go-colorable -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md deleted file mode 100644 index 1e69004bb03..00000000000 --- a/vendor/github.com/mattn/go-isatty/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# go-isatty - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { - fmt.Println("Is Cygwin/MSYS2 Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -## License - -MIT - -## Author - -Yasuhiro Matsumoto (a.k.a mattn) - -## Thanks - -* k-takata: base idea for IsCygwinTerminal - - https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-sqlite3/.gitignore b/vendor/github.com/mattn/go-sqlite3/.gitignore deleted file mode 100644 index 8a0e48d1aaf..00000000000 --- a/vendor/github.com/mattn/go-sqlite3/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.db -*.exe -*.dll -*.o diff --git a/vendor/github.com/mattn/go-sqlite3/.travis.yml b/vendor/github.com/mattn/go-sqlite3/.travis.yml deleted file mode 100644 index 46e70cb0bfa..00000000000 --- a/vendor/github.com/mattn/go-sqlite3/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go -sudo: required -dist: trusty -env: - - GOTAGS= - - GOTAGS=libsqlite3 - - GOTAGS=trace - - GOTAGS=vtable -go: - - 1.7.x - - 1.8.x - - 1.9.x - - master -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -repotoken 3qJVUE0iQwqnCbmNcDsjYu1nh4J4KIFXx - - go test -race -v . -tags "$GOTAGS" diff --git a/vendor/github.com/mattn/go-sqlite3/README.md b/vendor/github.com/mattn/go-sqlite3/README.md deleted file mode 100644 index ad00f10dadc..00000000000 --- a/vendor/github.com/mattn/go-sqlite3/README.md +++ /dev/null @@ -1,97 +0,0 @@ -go-sqlite3 -========== - -[![GoDoc Reference](https://godoc.org/github.com/mattn/go-sqlite3?status.svg)](http://godoc.org/github.com/mattn/go-sqlite3) -[![Build Status](https://travis-ci.org/mattn/go-sqlite3.svg?branch=master)](https://travis-ci.org/mattn/go-sqlite3) -[![Coverage Status](https://coveralls.io/repos/mattn/go-sqlite3/badge.svg?branch=master)](https://coveralls.io/r/mattn/go-sqlite3?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/mattn/go-sqlite3)](https://goreportcard.com/report/github.com/mattn/go-sqlite3) - -Description ------------ - -sqlite3 driver conforming to the built-in database/sql interface - -Installation ------------- - -This package can be installed with the go get command: - - go get github.com/mattn/go-sqlite3 - -_go-sqlite3_ is *cgo* package. -If you want to build your app using go-sqlite3, you need gcc. -However, if you install _go-sqlite3_ with `go install github.com/mattn/go-sqlite3`, you don't need gcc to build your app anymore. - -Documentation -------------- - -API documentation can be found here: http://godoc.org/github.com/mattn/go-sqlite3 - -Examples can be found under the `./_example` directory - -FAQ ---- - -* Want to build go-sqlite3 with libsqlite3 on my linux. - - Use `go build --tags "libsqlite3 linux"` - -* Want to build go-sqlite3 with libsqlite3 on OS X. - - Install sqlite3 from homebrew: `brew install sqlite3` - - Use `go build --tags "libsqlite3 darwin"` - -* Want to build go-sqlite3 with icu extension. - - Use `go build --tags "icu"` - - Available extensions: `json1`, `fts5`, `icu` - -* Can't build go-sqlite3 on windows 64bit. - - > Probably, you are using go 1.0, go1.0 has a problem when it comes to compiling/linking on windows 64bit. - > See: [#27](https://github.com/mattn/go-sqlite3/issues/27) - -* Getting insert error while query is opened. - - > You can pass some arguments into the connection string, for example, a URI. - > See: [#39](https://github.com/mattn/go-sqlite3/issues/39) - -* Do you want to cross compile? mingw on Linux or Mac? - - > See: [#106](https://github.com/mattn/go-sqlite3/issues/106) - > See also: http://www.limitlessfx.com/cross-compile-golang-app-for-windows-from-linux.html - -* Want to get time.Time with current locale - - Use `_loc=auto` in SQLite3 filename schema like `file:foo.db?_loc=auto`. - -* Can I use this in multiple routines concurrently? - - Yes for readonly. But, No for writable. See [#50](https://github.com/mattn/go-sqlite3/issues/50), [#51](https://github.com/mattn/go-sqlite3/issues/51), [#209](https://github.com/mattn/go-sqlite3/issues/209). - -* Why is it racy if I use a `sql.Open("sqlite3", ":memory:")` database? - - Each connection to :memory: opens a brand new in-memory sql database, so if - the stdlib's sql engine happens to open another connection and you've only - specified ":memory:", that connection will see a brand new database. A - workaround is to use "file::memory:?mode=memory&cache=shared". Every - connection to this string will point to the same in-memory database. See - [#204](https://github.com/mattn/go-sqlite3/issues/204) for more info. - -License -------- - -MIT: http://mattn.mit-license.org/2012 - -sqlite3-binding.c, sqlite3-binding.h, sqlite3ext.h - -The -binding suffix was added to avoid build failures under gccgo. - -In this repository, those files are an amalgamation of code that was copied from SQLite3. The license of that code is the same as the license of SQLite3. - -Author ------- - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/README.md b/vendor/github.com/matttproud/golang_protobuf_extensions/README.md deleted file mode 100644 index 751ee69673f..00000000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Overview -This repository provides various Protocol Buffer extensions for the Go -language (golang), namely support for record length-delimited message -streaming. - -| Java | Go | -| ------------------------------ | --------------------- | -| MessageLite#parseDelimitedFrom | pbutil.ReadDelimited | -| MessageLite#writeDelimitedTo | pbutil.WriteDelimited | - -Because [Code Review 9102043](https://codereview.appspot.com/9102043/) is -destined to never be merged into mainline (i.e., never be promoted to formal -[goprotobuf features](https://github.com/golang/protobuf)), this repository -will live here in the wild. - -# Documentation -We have [generated Go Doc documentation](http://godoc.org/github.com/matttproud/golang_protobuf_extensions/pbutil) here. - -# Testing -[![Build Status](https://travis-ci.org/matttproud/golang_protobuf_extensions.png?branch=master)](https://travis-ci.org/matttproud/golang_protobuf_extensions) diff --git a/vendor/github.com/mitchellh/go-testing-interface/README.md b/vendor/github.com/mitchellh/go-testing-interface/README.md deleted file mode 100644 index 26781bbae88..00000000000 --- a/vendor/github.com/mitchellh/go-testing-interface/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# go-testing-interface - -go-testing-interface is a Go library that exports an interface that -`*testing.T` implements as well as a runtime version you can use in its -place. - -The purpose of this library is so that you can export test helpers as a -public API without depending on the "testing" package, since you can't -create a `*testing.T` struct manually. This lets you, for example, use the -public testing APIs to generate mock data at runtime, rather than just at -test time. - -## Usage & Example - -For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/go-testing-interface). - -Given a test helper written using `go-testing-interface` like this: - - import "github.com/mitchellh/go-testing-interface" - - func TestHelper(t testing.T) { - t.Fatal("I failed") - } - -You can call the test helper in a real test easily: - - import "testing" - - func TestThing(t *testing.T) { - TestHelper(t) - } - -You can also call the test helper at runtime if needed: - - import "github.com/mitchellh/go-testing-interface" - - func main() { - TestHelper(&testing.RuntimeT{}) - } - -## Why?! - -**Why would I call a test helper that takes a *testing.T at runtime?** - -You probably shouldn't. The only use case I've seen (and I've had) for this -is to implement a "dev mode" for a service where the test helpers are used -to populate mock data, create a mock DB, perhaps run service dependencies -in-memory, etc. - -Outside of a "dev mode", I've never seen a use case for this and I think -there shouldn't be one since the point of the `testing.T` interface is that -you can fail immediately. diff --git a/vendor/github.com/opentracing/opentracing-go/.gitignore b/vendor/github.com/opentracing/opentracing-go/.gitignore deleted file mode 100644 index 565f0f7322f..00000000000 --- a/vendor/github.com/opentracing/opentracing-go/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# IntelliJ project files -.idea/ -opentracing-go.iml -opentracing-go.ipr -opentracing-go.iws - -# Test results -*.cov -*.html -test.log - -# Build dir -build/ diff --git a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md deleted file mode 100644 index 1fc9fdf7f36..00000000000 --- a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -Changes by Version -================== - -1.1.0 (unreleased) -------------------- - -- Deprecate InitGlobalTracer() in favor of SetGlobalTracer() - - -1.0.0 (2016-09-26) -------------------- - -- This release implements OpenTracing Specification 1.0 (http://opentracing.io/spec) - diff --git a/vendor/github.com/opentracing/opentracing-go/Makefile b/vendor/github.com/opentracing/opentracing-go/Makefile deleted file mode 100644 index 2f491f1574f..00000000000 --- a/vendor/github.com/opentracing/opentracing-go/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -PACKAGES := . ./mocktracer/... ./ext/... - -.DEFAULT_GOAL := test-and-lint - -.PHONE: test-and-lint - -test-and-lint: test lint - -.PHONY: test -test: - go test -v -cover ./... - -cover: - @rm -rf cover-all.out - $(foreach pkg, $(PACKAGES), $(MAKE) cover-pkg PKG=$(pkg) || true;) - @grep mode: cover.out > coverage.out - @cat cover-all.out >> coverage.out - go tool cover -html=coverage.out -o cover.html - @rm -rf cover.out cover-all.out coverage.out - -cover-pkg: - go test -coverprofile cover.out $(PKG) - @grep -v mode: cover.out >> cover-all.out - -.PHONY: lint -lint: - go fmt ./... - golint ./... - @# Run again with magic to exit non-zero if golint outputs anything. - @! (golint ./... | read dummy) - go vet ./... - diff --git a/vendor/github.com/opentracing/opentracing-go/README.md b/vendor/github.com/opentracing/opentracing-go/README.md deleted file mode 100644 index 1fb77d227fe..00000000000 --- a/vendor/github.com/opentracing/opentracing-go/README.md +++ /dev/null @@ -1,147 +0,0 @@ -[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/opentracing/public) [![Build Status](https://travis-ci.org/opentracing/opentracing-go.svg?branch=master)](https://travis-ci.org/opentracing/opentracing-go) [![GoDoc](https://godoc.org/github.com/opentracing/opentracing-go?status.svg)](http://godoc.org/github.com/opentracing/opentracing-go) - -# OpenTracing API for Go - -This package is a Go platform API for OpenTracing. - -## Required Reading - -In order to understand the Go platform API, one must first be familiar with the -[OpenTracing project](http://opentracing.io) and -[terminology](http://opentracing.io/documentation/pages/spec.html) more specifically. - -## API overview for those adding instrumentation - -Everyday consumers of this `opentracing` package really only need to worry -about a couple of key abstractions: the `StartSpan` function, the `Span` -interface, and binding a `Tracer` at `main()`-time. Here are code snippets -demonstrating some important use cases. - -#### Singleton initialization - -The simplest starting point is `./default_tracer.go`. As early as possible, call - -```go - import "github.com/opentracing/opentracing-go" - import ".../some_tracing_impl" - - func main() { - opentracing.InitGlobalTracer( - // tracing impl specific: - some_tracing_impl.New(...), - ) - ... - } -``` - -##### Non-Singleton initialization - -If you prefer direct control to singletons, manage ownership of the -`opentracing.Tracer` implementation explicitly. - -#### Creating a Span given an existing Go `context.Context` - -If you use `context.Context` in your application, OpenTracing's Go library will -happily rely on it for `Span` propagation. To start a new (blocking child) -`Span`, you can use `StartSpanFromContext`. - -```go - func xyz(ctx context.Context, ...) { - ... - span, ctx := opentracing.StartSpanFromContext(ctx, "operation_name") - defer span.Finish() - span.LogFields( - log.String("event", "soft error"), - log.String("type", "cache timeout"), - log.Int("waited.millis", 1500)) - ... - } -``` - -#### Starting an empty trace by creating a "root span" - -It's always possible to create a "root" `Span` with no parent or other causal -reference. - -```go - func xyz() { - ... - sp := opentracing.StartSpan("operation_name") - defer sp.Finish() - ... - } -``` - -#### Creating a (child) Span given an existing (parent) Span - -```go - func xyz(parentSpan opentracing.Span, ...) { - ... - sp := opentracing.StartSpan( - "operation_name", - opentracing.ChildOf(parentSpan.Context())) - defer sp.Finish() - ... - } -``` - -#### Serializing to the wire - -```go - func makeSomeRequest(ctx context.Context) ... { - if span := opentracing.SpanFromContext(ctx); span != nil { - httpClient := &http.Client{} - httpReq, _ := http.NewRequest("GET", "http://myservice/", nil) - - // Transmit the span's TraceContext as HTTP headers on our - // outbound request. - opentracing.GlobalTracer().Inject( - span.Context(), - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(httpReq.Header)) - - resp, err := httpClient.Do(httpReq) - ... - } - ... - } -``` - -#### Deserializing from the wire - -```go - http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { - var serverSpan opentracing.Span - appSpecificOperationName := ... - wireContext, err := opentracing.GlobalTracer().Extract( - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(req.Header)) - if err != nil { - // Optionally record something about err here - } - - // Create the span referring to the RPC client if available. - // If wireContext == nil, a root span will be created. - serverSpan = opentracing.StartSpan( - appSpecificOperationName, - ext.RPCServerOption(wireContext)) - - defer serverSpan.Finish() - - ctx := opentracing.ContextWithSpan(context.Background(), serverSpan) - ... - } -``` - -#### Goroutine-safety - -The entire public API is goroutine-safe and does not require external -synchronization. - -## API pointers for those implementing a tracing system - -Tracing system implementors may be able to reuse or copy-paste-modify the `basictracer` package, found [here](https://github.com/opentracing/basictracer-go). In particular, see `basictracer.New(...)`. - -## API compatibility - -For the time being, "mild" backwards-incompatible changes may be made without changing the major version number. As OpenTracing and `opentracing-go` mature, backwards compatibility will become more of a priority. diff --git a/vendor/github.com/patrickmn/go-cache/README.md b/vendor/github.com/patrickmn/go-cache/README.md deleted file mode 100644 index c5789cc66cc..00000000000 --- a/vendor/github.com/patrickmn/go-cache/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# go-cache - -go-cache is an in-memory key:value store/cache similar to memcached that is -suitable for applications running on a single machine. Its major advantage is -that, being essentially a thread-safe `map[string]interface{}` with expiration -times, it doesn't need to serialize or transmit its contents over the network. - -Any object can be stored, for a given duration or forever, and the cache can be -safely used by multiple goroutines. - -Although go-cache isn't meant to be used as a persistent datastore, the entire -cache can be saved to and loaded from a file (using `c.Items()` to retrieve the -items map to serialize, and `NewFrom()` to create a cache from a deserialized -one) to recover from downtime quickly. (See the docs for `NewFrom()` for caveats.) - -### Installation - -`go get github.com/patrickmn/go-cache` - -### Usage - -```go -import ( - "fmt" - "github.com/patrickmn/go-cache" - "time" -) - -func main() { - // Create a cache with a default expiration time of 5 minutes, and which - // purges expired items every 10 minutes - c := cache.New(5*time.Minute, 10*time.Minute) - - // Set the value of the key "foo" to "bar", with the default expiration time - c.Set("foo", "bar", cache.DefaultExpiration) - - // Set the value of the key "baz" to 42, with no expiration time - // (the item won't be removed until it is re-set, or removed using - // c.Delete("baz") - c.Set("baz", 42, cache.NoExpiration) - - // Get the string associated with the key "foo" from the cache - foo, found := c.Get("foo") - if found { - fmt.Println(foo) - } - - // Since Go is statically typed, and cache values can be anything, type - // assertion is needed when values are being passed to functions that don't - // take arbitrary types, (i.e. interface{}). The simplest way to do this for - // values which will only be used once--e.g. for passing to another - // function--is: - foo, found := c.Get("foo") - if found { - MyFunction(foo.(string)) - } - - // This gets tedious if the value is used several times in the same function. - // You might do either of the following instead: - if x, found := c.Get("foo"); found { - foo := x.(string) - // ... - } - // or - var foo string - if x, found := c.Get("foo"); found { - foo = x.(string) - } - // ... - // foo can then be passed around freely as a string - - // Want performance? Store pointers! - c.Set("foo", &MyStruct, cache.DefaultExpiration) - if x, found := c.Get("foo"); found { - foo := x.(*MyStruct) - // ... - } -} -``` - -### Reference - -`godoc` or [http://godoc.org/github.com/patrickmn/go-cache](http://godoc.org/github.com/patrickmn/go-cache) diff --git a/vendor/github.com/prometheus/client_golang/.gitignore b/vendor/github.com/prometheus/client_golang/.gitignore deleted file mode 100644 index f6fc2e8eb2e..00000000000 --- a/vendor/github.com/prometheus/client_golang/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# 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 - -*~ -*# -.build diff --git a/vendor/github.com/prometheus/client_golang/CHANGELOG.md b/vendor/github.com/prometheus/client_golang/CHANGELOG.md deleted file mode 100644 index 330788a4ee4..00000000000 --- a/vendor/github.com/prometheus/client_golang/CHANGELOG.md +++ /dev/null @@ -1,109 +0,0 @@ -## 0.8.0 / 2016-08-17 -* [CHANGE] Registry is doing more consistency checks. This might break - existing setups that used to export inconsistent metrics. -* [CHANGE] Pushing to Pushgateway moved to package `push` and changed to allow - arbitrary grouping. -* [CHANGE] Removed `SelfCollector`. -* [CHANGE] Removed `PanicOnCollectError` and `EnableCollectChecks` methods. -* [CHANGE] Moved packages to the prometheus/common repo: `text`, `model`, - `extraction`. -* [CHANGE] Deprecated a number of functions. -* [FEATURE] Allow custom registries. Added `Registerer` and `Gatherer` - interfaces. -* [FEATURE] Separated HTTP exposition, allowing custom HTTP handlers (package - `promhttp`) and enabling the creation of other exposition mechanisms. -* [FEATURE] `MustRegister` is variadic now, allowing registration of many - collectors in one call. -* [FEATURE] Added HTTP API v1 package. -* [ENHANCEMENT] Numerous documentation improvements. -* [ENHANCEMENT] Improved metric sorting. -* [ENHANCEMENT] Inlined fnv64a hashing for improved performance. -* [ENHANCEMENT] Several test improvements. -* [BUGFIX] Handle collisions in MetricVec. - -## 0.7.0 / 2015-07-27 -* [CHANGE] Rename ExporterLabelPrefix to ExportedLabelPrefix. -* [BUGFIX] Closed gaps in metric consistency check. -* [BUGFIX] Validate LabelName/LabelSet on JSON unmarshaling. -* [ENHANCEMENT] Document the possibility to create "empty" metrics in - a metric vector. -* [ENHANCEMENT] Fix and clarify various doc comments and the README.md. -* [ENHANCEMENT] (Kind of) solve "The Proxy Problem" of http.InstrumentHandler. -* [ENHANCEMENT] Change responseWriterDelegator.written to int64. - -## 0.6.0 / 2015-06-01 -* [CHANGE] Rename process_goroutines to go_goroutines. -* [ENHANCEMENT] Validate label names during YAML decoding. -* [ENHANCEMENT] Add LabelName regular expression. -* [BUGFIX] Ensure alignment of struct members for 32-bit systems. - -## 0.5.0 / 2015-05-06 -* [BUGFIX] Removed a weakness in the fingerprinting aka signature code. - This makes fingerprinting slower and more allocation-heavy, but the - weakness was too severe to be tolerated. -* [CHANGE] As a result of the above, Metric.Fingerprint is now returning - a different fingerprint. To keep the same fingerprint, the new method - Metric.FastFingerprint was introduced, which will be used by the - Prometheus server for storage purposes (implying that a collision - detection has to be added, too). -* [ENHANCEMENT] The Metric.Equal and Metric.Before do not depend on - fingerprinting anymore, removing the possibility of an undetected - fingerprint collision. -* [FEATURE] The Go collector in the exposition library includes garbage - collection stats. -* [FEATURE] The exposition library allows to create constant "throw-away" - summaries and histograms. -* [CHANGE] A number of new reserved labels and prefixes. - -## 0.4.0 / 2015-04-08 -* [CHANGE] Return NaN when Summaries have no observations yet. -* [BUGFIX] Properly handle Summary decay upon Write(). -* [BUGFIX] Fix the documentation link to the consumption library. -* [FEATURE] Allow the metric family injection hook to merge with existing - metric families. -* [ENHANCEMENT] Removed cgo dependency and conditional compilation of procfs. -* [MAINTENANCE] Adjusted to changes in matttproud/golang_protobuf_extensions. - -## 0.3.2 / 2015-03-11 -* [BUGFIX] Fixed the receiver type of COWMetric.Set(). This method is - only used by the Prometheus server internally. -* [CLEANUP] Added licenses of vendored code left out by godep. - -## 0.3.1 / 2015-03-04 -* [ENHANCEMENT] Switched fingerprinting functions from own free list to - sync.Pool. -* [CHANGE] Makefile uses Go 1.4.2 now (only relevant for examples and tests). - -## 0.3.0 / 2015-03-03 -* [CHANGE] Changed the fingerprinting for metrics. THIS WILL INVALIDATE ALL - PERSISTED FINGERPRINTS. IF YOU COMPILE THE PROMETHEUS SERVER WITH THIS - VERSION, YOU HAVE TO WIPE THE PREVIOUSLY CREATED STORAGE. -* [CHANGE] LabelValuesToSignature removed. (Nobody had used it, and it was - arguably broken.) -* [CHANGE] Vendored dependencies. Those are only used by the Makefile. If - client_golang is used as a library, the vendoring will stay out of your way. -* [BUGFIX] Remove a weakness in the fingerprinting for metrics. (This made - the fingerprinting change above necessary.) -* [FEATURE] Added new fingerprinting functions SignatureForLabels and - SignatureWithoutLabels to be used by the Prometheus server. These functions - require fewer allocations than the ones currently used by the server. - -## 0.2.0 / 2015-02-23 -* [FEATURE] Introduce new Histagram metric type. -* [CHANGE] Ignore process collector errors for now (better error handling - pending). -* [CHANGE] Use clear error interface for process pidFn. -* [BUGFIX] Fix Go download links for several archs and OSes. -* [ENHANCEMENT] Massively improve Gauge and Counter performance. -* [ENHANCEMENT] Catch illegal label names for summaries in histograms. -* [ENHANCEMENT] Reduce allocations during fingerprinting. -* [ENHANCEMENT] Remove cgo dependency. procfs package will only be included if - both cgo is available and the build is for an OS with procfs. -* [CLEANUP] Clean up code style issues. -* [CLEANUP] Mark slow test as such and exclude them from travis. -* [CLEANUP] Update protobuf library package name. -* [CLEANUP] Updated vendoring of beorn7/perks. - -## 0.1.0 / 2015-02-02 -* [CLEANUP] Introduced semantic versioning and changelog. From now on, - changes will be reported in this file. diff --git a/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md b/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md deleted file mode 100644 index 40503edbf18..00000000000 --- a/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/client_golang/MAINTAINERS.md b/vendor/github.com/prometheus/client_golang/MAINTAINERS.md deleted file mode 100644 index 3ede55fe186..00000000000 --- a/vendor/github.com/prometheus/client_golang/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Björn Rabenstein diff --git a/vendor/github.com/prometheus/client_golang/README.md b/vendor/github.com/prometheus/client_golang/README.md deleted file mode 100644 index 479290d27b3..00000000000 --- a/vendor/github.com/prometheus/client_golang/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Prometheus Go client library - -[![Build Status](https://travis-ci.org/prometheus/client_golang.svg?branch=master)](https://travis-ci.org/prometheus/client_golang) -[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/client_golang)](https://goreportcard.com/report/github.com/prometheus/client_golang) - -This is the [Go](http://golang.org) client library for -[Prometheus](http://prometheus.io). It has two separate parts, one for -instrumenting application code, and one for creating clients that talk to the -Prometheus HTTP API. - -## Instrumenting applications - -[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/prometheus)](http://gocover.io/github.com/prometheus/client_golang/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus) - -The -[`prometheus` directory](https://github.com/prometheus/client_golang/tree/master/prometheus) -contains the instrumentation library. See the -[best practices section](http://prometheus.io/docs/practices/naming/) of the -Prometheus documentation to learn more about instrumenting applications. - -The -[`examples` directory](https://github.com/prometheus/client_golang/tree/master/examples) -contains simple examples of instrumented code. - -## Client for the Prometheus HTTP API - -[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/api/prometheus)](http://gocover.io/github.com/prometheus/client_golang/api/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/api/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/api/prometheus) - -The -[`api/prometheus` directory](https://github.com/prometheus/client_golang/tree/master/api/prometheus) -contains the client for the -[Prometheus HTTP API](http://prometheus.io/docs/querying/api/). It allows you -to write Go applications that query time series data from a Prometheus -server. It is still in alpha stage. - -## Where is `model`, `extraction`, and `text`? - -The `model` packages has been moved to -[`prometheus/common/model`](https://github.com/prometheus/common/tree/master/model). - -The `extraction` and `text` packages are now contained in -[`prometheus/common/expfmt`](https://github.com/prometheus/common/tree/master/expfmt). - -## Contributing and community - -See the [contributing guidelines](CONTRIBUTING.md) and the -[Community section](http://prometheus.io/community/) of the homepage. diff --git a/vendor/github.com/prometheus/client_golang/VERSION b/vendor/github.com/prometheus/client_golang/VERSION deleted file mode 100644 index a3df0a6959e..00000000000 --- a/vendor/github.com/prometheus/client_golang/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.8.0 diff --git a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/vendor/github.com/prometheus/client_golang/prometheus/.gitignore deleted file mode 100644 index 3460f0346d9..00000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore +++ /dev/null @@ -1 +0,0 @@ -command-line-arguments.test diff --git a/vendor/github.com/prometheus/client_golang/prometheus/README.md b/vendor/github.com/prometheus/client_golang/prometheus/README.md deleted file mode 100644 index 44986bff06b..00000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/README.md +++ /dev/null @@ -1 +0,0 @@ -See [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus). diff --git a/vendor/github.com/prometheus/client_model/.gitignore b/vendor/github.com/prometheus/client_model/.gitignore deleted file mode 100644 index 2f7896d1d13..00000000000 --- a/vendor/github.com/prometheus/client_model/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target/ diff --git a/vendor/github.com/prometheus/client_model/CONTRIBUTING.md b/vendor/github.com/prometheus/client_model/CONTRIBUTING.md deleted file mode 100644 index 40503edbf18..00000000000 --- a/vendor/github.com/prometheus/client_model/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/client_model/MAINTAINERS.md b/vendor/github.com/prometheus/client_model/MAINTAINERS.md deleted file mode 100644 index 3ede55fe186..00000000000 --- a/vendor/github.com/prometheus/client_model/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Björn Rabenstein diff --git a/vendor/github.com/prometheus/client_model/Makefile b/vendor/github.com/prometheus/client_model/Makefile deleted file mode 100644 index e147c69dacc..00000000000 --- a/vendor/github.com/prometheus/client_model/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2013 Prometheus Team -# 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. - -KEY_ID ?= _DEFINE_ME_ - -all: cpp go java python ruby - -SUFFIXES: - -cpp: cpp/metrics.pb.cc cpp/metrics.pb.h - -cpp/metrics.pb.cc: metrics.proto - protoc $< --cpp_out=cpp/ - -cpp/metrics.pb.h: metrics.proto - protoc $< --cpp_out=cpp/ - -go: go/metrics.pb.go - -go/metrics.pb.go: metrics.proto - protoc $< --go_out=go/ - -java: src/main/java/io/prometheus/client/Metrics.java pom.xml - mvn clean compile package - -src/main/java/io/prometheus/client/Metrics.java: metrics.proto - protoc $< --java_out=src/main/java - -python: python/prometheus/client/model/metrics_pb2.py - -python/prometheus/client/model/metrics_pb2.py: metrics.proto - mkdir -p python/prometheus/client/model - protoc $< --python_out=python/prometheus/client/model - -ruby: - $(MAKE) -C ruby build - -clean: - -rm -rf cpp/* - -rm -rf go/* - -rm -rf java/* - -rm -rf python/* - -$(MAKE) -C ruby clean - -mvn clean - -maven-deploy-snapshot: java - mvn clean deploy -Dgpg.keyname=$(KEY_ID) -DperformRelease=true - -maven-deploy-release: java - mvn clean release:clean release:prepare release:perform -Dgpg.keyname=$(KEY_ID) -DperformRelease=true - -.PHONY: all clean cpp go java maven-deploy-snapshot maven-deploy-release python ruby diff --git a/vendor/github.com/prometheus/client_model/README.md b/vendor/github.com/prometheus/client_model/README.md deleted file mode 100644 index a710042db5e..00000000000 --- a/vendor/github.com/prometheus/client_model/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -Under most circumstances, manually downloading this repository should never -be required. - -# Prerequisites -# Base -* [Google Protocol Buffers](https://developers.google.com/protocol-buffers) - -## Java -* [Apache Maven](http://maven.apache.org) -* [Prometheus Maven Repository](https://github.com/prometheus/io.prometheus-maven-repository) checked out into ../io.prometheus-maven-repository - -## Go -* [Go](http://golang.org) -* [goprotobuf](https://code.google.com/p/goprotobuf) - -## Ruby -* [Ruby](https://www.ruby-lang.org) -* [bundler](https://rubygems.org/gems/bundler) - -# Building - $ make - -# Getting Started - * The Go source code is periodically indexed: [Go Protocol Buffer Model](http://godoc.org/github.com/prometheus/client_model/go). - * All of the core developers are accessible via the [Prometheus Developers Mailinglist](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/vendor/github.com/prometheus/client_model/metrics.proto b/vendor/github.com/prometheus/client_model/metrics.proto deleted file mode 100644 index 0b84af92006..00000000000 --- a/vendor/github.com/prometheus/client_model/metrics.proto +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 Prometheus Team -// 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. - -syntax = "proto2"; - -package io.prometheus.client; -option java_package = "io.prometheus.client"; - -message LabelPair { - optional string name = 1; - optional string value = 2; -} - -enum MetricType { - COUNTER = 0; - GAUGE = 1; - SUMMARY = 2; - UNTYPED = 3; - HISTOGRAM = 4; -} - -message Gauge { - optional double value = 1; -} - -message Counter { - optional double value = 1; -} - -message Quantile { - optional double quantile = 1; - optional double value = 2; -} - -message Summary { - optional uint64 sample_count = 1; - optional double sample_sum = 2; - repeated Quantile quantile = 3; -} - -message Untyped { - optional double value = 1; -} - -message Histogram { - optional uint64 sample_count = 1; - optional double sample_sum = 2; - repeated Bucket bucket = 3; // Ordered in increasing order of upper_bound, +Inf bucket is optional. -} - -message Bucket { - optional uint64 cumulative_count = 1; // Cumulative in increasing order. - optional double upper_bound = 2; // Inclusive. -} - -message Metric { - repeated LabelPair label = 1; - optional Gauge gauge = 2; - optional Counter counter = 3; - optional Summary summary = 4; - optional Untyped untyped = 5; - optional Histogram histogram = 7; - optional int64 timestamp_ms = 6; -} - -message MetricFamily { - optional string name = 1; - optional string help = 2; - optional MetricType type = 3; - repeated Metric metric = 4; -} diff --git a/vendor/github.com/prometheus/client_model/ruby/LICENSE b/vendor/github.com/prometheus/client_model/ruby/LICENSE new file mode 100644 index 00000000000..11069edd790 --- /dev/null +++ b/vendor/github.com/prometheus/client_model/ruby/LICENSE @@ -0,0 +1,201 @@ + 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/prometheus/common/CONTRIBUTING.md b/vendor/github.com/prometheus/common/CONTRIBUTING.md deleted file mode 100644 index 40503edbf18..00000000000 --- a/vendor/github.com/prometheus/common/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/common/MAINTAINERS.md b/vendor/github.com/prometheus/common/MAINTAINERS.md deleted file mode 100644 index 1b315216165..00000000000 --- a/vendor/github.com/prometheus/common/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Fabian Reinartz diff --git a/vendor/github.com/prometheus/common/README.md b/vendor/github.com/prometheus/common/README.md deleted file mode 100644 index 11a584945d5..00000000000 --- a/vendor/github.com/prometheus/common/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Common -[![Build Status](https://travis-ci.org/prometheus/common.svg)](https://travis-ci.org/prometheus/common) - -This repository contains Go libraries that are shared across Prometheus -components and libraries. - -* **config**: Common configuration structures -* **expfmt**: Decoding and encoding for the exposition format -* **log**: A logging wrapper around [logrus](https://github.com/sirupsen/logrus) -* **model**: Shared data structures -* **route**: A routing wrapper around [httprouter](https://github.com/julienschmidt/httprouter) using `context.Context` -* **version**: Version informations and metric diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt deleted file mode 100644 index 7723656d58d..00000000000 --- a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt +++ /dev/null @@ -1,67 +0,0 @@ -PACKAGE - -package goautoneg -import "bitbucket.org/ww/goautoneg" - -HTTP Content-Type Autonegotiation. - -The functions in this package implement the behaviour specified in -http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - -Copyright (c) 2011, Open Knowledge Foundation Ltd. -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 Open Knowledge Foundation Ltd. 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. - - -FUNCTIONS - -func Negotiate(header string, alternatives []string) (content_type string) -Negotiate the most appropriate content_type given the accept header -and a list of alternatives. - -func ParseAccept(header string) (accept []Accept) -Parse an Accept Header string returning a sorted list -of clauses - - -TYPES - -type Accept struct { - Type, SubType string - Q float32 - Params map[string]string -} -Structure to represent a clause in an HTTP Accept Header - - -SUBDIRECTORIES - - .hg diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md deleted file mode 100644 index 40503edbf18..00000000000 --- a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md deleted file mode 100644 index 35993c41c27..00000000000 --- a/vendor/github.com/prometheus/procfs/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Tobias Schmidt diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile deleted file mode 100644 index dd48afdcd45..00000000000 --- a/vendor/github.com/prometheus/procfs/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -ci: fmt lint test - -fmt: - ! gofmt -l *.go | read nothing - go vet - -lint: - go get github.com/golang/lint/golint - golint *.go - -test: sysfs/fixtures/.unpacked - go test -v ./... - -sysfs/fixtures/.unpacked: sysfs/fixtures.ttar - ./ttar -C sysfs -x -f sysfs/fixtures.ttar - touch $@ - -.PHONY: fmt lint test ci diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md deleted file mode 100644 index 2095494719b..00000000000 --- a/vendor/github.com/prometheus/procfs/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# procfs - -This procfs package provides functions to retrieve system, kernel and process -metrics from the pseudo-filesystem proc. - -*WARNING*: This package is a work in progress. Its API may still break in -backwards-incompatible ways without warnings. Use it at your own risk. - -[![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) -[![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) -[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/exe b/vendor/github.com/prometheus/procfs/fixtures/26231/exe new file mode 120000 index 00000000000..a91bec4dac3 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/exe @@ -0,0 +1 @@ +/usr/bin/vim \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 new file mode 120000 index 00000000000..da9c5dff3e0 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/0 @@ -0,0 +1 @@ +../../symlinktargets/abc \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 new file mode 120000 index 00000000000..ca47b50ca5e --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/1 @@ -0,0 +1 @@ +../../symlinktargets/def \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 new file mode 120000 index 00000000000..c086831683e --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/10 @@ -0,0 +1 @@ +../../symlinktargets/xyz \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 new file mode 120000 index 00000000000..66731c06890 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/2 @@ -0,0 +1 @@ +../../symlinktargets/ghi \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 new file mode 120000 index 00000000000..0135dce35f9 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/fd/3 @@ -0,0 +1 @@ +../../symlinktargets/uvw \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/ns/mnt b/vendor/github.com/prometheus/procfs/fixtures/26231/ns/mnt new file mode 120000 index 00000000000..9c52ca21160 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/ns/mnt @@ -0,0 +1 @@ +mnt:[4026531840] \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26231/ns/net b/vendor/github.com/prometheus/procfs/fixtures/26231/ns/net new file mode 120000 index 00000000000..1f0f795941d --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26231/ns/net @@ -0,0 +1 @@ +net:[4026531993] \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 new file mode 120000 index 00000000000..da9c5dff3e0 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/0 @@ -0,0 +1 @@ +../../symlinktargets/abc \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 new file mode 120000 index 00000000000..ca47b50ca5e --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/1 @@ -0,0 +1 @@ +../../symlinktargets/def \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 new file mode 120000 index 00000000000..66731c06890 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/2 @@ -0,0 +1 @@ +../../symlinktargets/ghi \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 new file mode 120000 index 00000000000..0135dce35f9 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/3 @@ -0,0 +1 @@ +../../symlinktargets/uvw \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 new file mode 120000 index 00000000000..c086831683e --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/26232/fd/4 @@ -0,0 +1 @@ +../../symlinktargets/xyz \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/fixtures/self b/vendor/github.com/prometheus/procfs/fixtures/self new file mode 120000 index 00000000000..1eeedea3d22 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/self @@ -0,0 +1 @@ +26231 \ No newline at end of file diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar deleted file mode 100755 index 8227a4a376c..00000000000 --- a/vendor/github.com/prometheus/procfs/ttar +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/env bash -# Purpose: plain text tar format -# Limitations: - only suitable for text files, directories, and symlinks -# - stores only filename, content, and mode -# - not designed for untrusted input - -# Note: must work with bash version 3.2 (macOS) - -set -o errexit -o nounset - -# Sanitize environment (for instance, standard sorting of glob matches) -export LC_ALL=C - -path="" -CMD="" - -function usage { - bname=$(basename "$0") - cat << USAGE -Usage: $bname [-C ] -c -f (create archive) - $bname -t -f (list archive contents) - $bname [-C ] -x -f (extract archive) - -Options: - -C (change directory) - -Example: Change to sysfs directory, create ttar file from fixtures directory - $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ -USAGE -exit "$1" -} - -function vecho { - if [ "${VERBOSE:-}" == "yes" ]; then - echo >&7 "$@" - fi -} - -function set_cmd { - if [ -n "$CMD" ]; then - echo "ERROR: more than one command given" - echo - usage 2 - fi - CMD=$1 -} - -while getopts :cf:htxvC: opt; do - case $opt in - c) - set_cmd "create" - ;; - f) - ARCHIVE=$OPTARG - ;; - h) - usage 0 - ;; - t) - set_cmd "list" - ;; - x) - set_cmd "extract" - ;; - v) - VERBOSE=yes - exec 7>&1 - ;; - C) - CDIR=$OPTARG - ;; - *) - echo >&2 "ERROR: invalid option -$OPTARG" - echo - usage 1 - ;; - esac -done - -# Remove processed options from arguments -shift $(( OPTIND - 1 )); - -if [ "${CMD:-}" == "" ]; then - echo >&2 "ERROR: no command given" - echo - usage 1 -elif [ "${ARCHIVE:-}" == "" ]; then - echo >&2 "ERROR: no archive name given" - echo - usage 1 -fi - -function list { - local path="" - local size=0 - local line_no=0 - local ttar_file=$1 - if [ -n "${2:-}" ]; then - echo >&2 "ERROR: too many arguments." - echo - usage 1 - fi - if [ ! -e "$ttar_file" ]; then - echo >&2 "ERROR: file not found ($ttar_file)" - echo - usage 1 - fi - while read -r line; do - line_no=$(( line_no + 1 )) - if [ $size -gt 0 ]; then - size=$(( size - 1 )) - continue - fi - if [[ $line =~ ^Path:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - elif [[ $line =~ ^Lines:\ (.*)$ ]]; then - size=${BASH_REMATCH[1]} - echo "$path" - elif [[ $line =~ ^Directory:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - echo "$path/" - elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then - echo "$path -> ${BASH_REMATCH[1]}" - fi - done < "$ttar_file" -} - -function extract { - local path="" - local size=0 - local line_no=0 - local ttar_file=$1 - if [ -n "${2:-}" ]; then - echo >&2 "ERROR: too many arguments." - echo - usage 1 - fi - if [ ! -e "$ttar_file" ]; then - echo >&2 "ERROR: file not found ($ttar_file)" - echo - usage 1 - fi - while IFS= read -r line; do - line_no=$(( line_no + 1 )) - if [ "$size" -gt 0 ]; then - echo "$line" >> "$path" - size=$(( size - 1 )) - continue - fi - if [[ $line =~ ^Path:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - if [ -e "$path" ] || [ -L "$path" ]; then - rm "$path" - fi - elif [[ $line =~ ^Lines:\ (.*)$ ]]; then - size=${BASH_REMATCH[1]} - # Create file even if it is zero-length. - touch "$path" - vecho " $path" - elif [[ $line =~ ^Mode:\ (.*)$ ]]; then - mode=${BASH_REMATCH[1]} - chmod "$mode" "$path" - vecho "$mode" - elif [[ $line =~ ^Directory:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - mkdir -p "$path" - vecho " $path/" - elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then - ln -s "${BASH_REMATCH[1]}" "$path" - vecho " $path -> ${BASH_REMATCH[1]}" - elif [[ $line =~ ^# ]]; then - # Ignore comments between files - continue - else - echo >&2 "ERROR: Unknown keyword on line $line_no: $line" - exit 1 - fi - done < "$ttar_file" -} - -function div { - echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \ - "- - - - - -" -} - -function get_mode { - local mfile=$1 - if [ -z "${STAT_OPTION:-}" ]; then - if stat -c '%a' "$mfile" >/dev/null 2>&1; then - STAT_OPTION='-c' - STAT_FORMAT='%a' - else - STAT_OPTION='-f' - STAT_FORMAT='%A' - fi - fi - stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile" -} - -function _create { - shopt -s nullglob - local mode - while (( "$#" )); do - file=$1 - if [ -L "$file" ]; then - echo "Path: $file" - symlinkTo=$(readlink "$file") - echo "SymlinkTo: $symlinkTo" - vecho " $file -> $symlinkTo" - div - elif [ -d "$file" ]; then - # Strip trailing slash (if there is one) - file=${file%/} - echo "Directory: $file" - mode=$(get_mode "$file") - echo "Mode: $mode" - vecho "$mode $file/" - div - # Find all files and dirs, including hidden/dot files - for x in "$file/"{*,.[^.]*}; do - _create "$x" - done - elif [ -f "$file" ]; then - echo "Path: $file" - lines=$(wc -l "$file"|awk '{print $1}') - echo "Lines: $lines" - cat "$file" - mode=$(get_mode "$file") - echo "Mode: $mode" - vecho "$mode $file" - div - else - echo >&2 "ERROR: file not found ($file in $(pwd))" - exit 2 - fi - shift - done -} - -function create { - ttar_file=$1 - shift - if [ -z "${1:-}" ]; then - echo >&2 "ERROR: missing arguments." - echo - usage 1 - fi - if [ -e "$ttar_file" ]; then - rm "$ttar_file" - fi - exec > "$ttar_file" - _create "$@" -} - -if [ -n "${CDIR:-}" ]; then - if [[ "$ARCHIVE" != /* ]]; then - # Relative path: preserve the archive's location before changing - # directory - ARCHIVE="$(pwd)/$ARCHIVE" - fi - cd "$CDIR" -fi - -"$CMD" "$ARCHIVE" "$@" diff --git a/vendor/github.com/rainycape/unidecode/.gitignore b/vendor/github.com/rainycape/unidecode/.gitignore deleted file mode 100644 index 836562412fe..00000000000 --- a/vendor/github.com/rainycape/unidecode/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# 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/rainycape/unidecode/README.md b/vendor/github.com/rainycape/unidecode/README.md deleted file mode 100644 index 9a109bcfdb2..00000000000 --- a/vendor/github.com/rainycape/unidecode/README.md +++ /dev/null @@ -1,6 +0,0 @@ -unidecode -========= - -Unicode transliterator in Golang - Replaces non-ASCII characters with their ASCII approximations. - -[![GoDoc](https://godoc.org/github.com/rainycape/unidecode?status.svg)](https://godoc.org/github.com/rainycape/unidecode) diff --git a/vendor/github.com/rainycape/unidecode/table.txt b/vendor/github.com/rainycape/unidecode/table.txt deleted file mode 100644 index 9f5d59fe15d..00000000000 --- a/vendor/github.com/rainycape/unidecode/table.txt +++ /dev/null @@ -1,46731 +0,0 @@ -/* x000 */ -0x0000: "\x00" -0x0001: "\x01" -0x0002: "\x02" -0x0003: "\x03" -0x0004: "\x04" -0x0005: "\x05" -0x0006: "\x06" -0x0007: "\x07" -0x0008: "\x08" -0x0009: "\t" -0x000a: "\n" -0x000b: "\x0b" -0x000c: "\x0c" -0x000d: "\r" -0x000e: "\x0e" -0x000f: "\x0f" -0x0010: "\x10" -0x0011: "\x11" -0x0012: "\x12" -0x0013: "\x13" -0x0014: "\x14" -0x0015: "\x15" -0x0016: "\x16" -0x0017: "\x17" -0x0018: "\x18" -0x0019: "\x19" -0x001a: "\x1a" -0x001b: "\x1b" -0x001c: "\x1c" -0x001d: "\x1d" -0x001e: "\x1e" -0x001f: "\x1f" -0x0020: " " -0x0021: "!" -0x0022: "\"" -0x0023: "#" -0x0024: "$" -0x0025: "%" -0x0026: "&" -0x0027: "'" -0x0028: "(" -0x0029: ")" -0x002a: "*" -0x002b: "+" -0x002c: "," -0x002d: "-" -0x002e: "." -0x002f: "/" -0x0030: "0" -0x0031: "1" -0x0032: "2" -0x0033: "3" -0x0034: "4" -0x0035: "5" -0x0036: "6" -0x0037: "7" -0x0038: "8" -0x0039: "9" -0x003a: ":" -0x003b: ";" -0x003c: "<" -0x003d: "=" -0x003e: ">" -0x003f: "?" -0x0040: "@" -0x0041: "A" -0x0042: "B" -0x0043: "C" -0x0044: "D" -0x0045: "E" -0x0046: "F" -0x0047: "G" -0x0048: "H" -0x0049: "I" -0x004a: "J" -0x004b: "K" -0x004c: "L" -0x004d: "M" -0x004e: "N" -0x004f: "O" -0x0050: "P" -0x0051: "Q" -0x0052: "R" -0x0053: "S" -0x0054: "T" -0x0055: "U" -0x0056: "V" -0x0057: "W" -0x0058: "X" -0x0059: "Y" -0x005a: "Z" -0x005b: "]" -0x005c: "\\" -0x005d: "]" -0x005e: "^" -0x005f: "_" -0x0060: "`" -0x0061: "a" -0x0062: "b" -0x0063: "c" -0x0064: "d" -0x0065: "e" -0x0066: "f" -0x0067: "g" -0x0068: "h" -0x0069: "i" -0x006a: "j" -0x006b: "k" -0x006c: "l" -0x006d: "m" -0x006e: "n" -0x006f: "o" -0x0070: "p" -0x0071: "q" -0x0072: "r" -0x0073: "s" -0x0074: "t" -0x0075: "u" -0x0076: "v" -0x0077: "w" -0x0078: "x" -0x0079: "y" -0x007a: "z" -0x007b: "{" -0x007c: "|" -0x007d: "}" -0x007e: "~" -0x007f: "\x7f" -0x0080: "" -0x0081: "" -0x0082: "" -0x0083: "" -0x0084: "" -0x0085: "" -0x0086: "" -0x0087: "" -0x0088: "" -0x0089: "" -0x008a: "" -0x008b: "" -0x008c: "" -0x008d: "" -0x008e: "" -0x008f: "" -0x0090: "" -0x0091: "" -0x0092: "" -0x0093: "" -0x0094: "" -0x0095: "" -0x0096: "" -0x0097: "" -0x0098: "" -0x0099: "" -0x009a: "" -0x009b: "" -0x009c: "" -0x009d: "" -0x009e: "" -0x009f: "" -0x00a0: " " -0x00a1: "!" -0x00a2: "C/" -0x00a3: "PS" -0x00a4: "$?" -0x00a5: "Y=" -0x00a6: "|" -0x00a7: "SS" -0x00a8: "\"" -0x00a9: "(c)" -0x00aa: "a" -0x00ab: "<<" -0x00ac: "!" -0x00ad: "" -0x00ae: "(r)" -0x00af: "-" -0x00b0: "deg" -0x00b1: "+-" -0x00b2: "2" -0x00b3: "3" -0x00b4: "'" -0x00b5: "u" -0x00b6: "P" -0x00b7: "*" -0x00b8: "," -0x00b9: "1" -0x00ba: "o" -0x00bb: ">>" -0x00bc: "1/4" -0x00bd: "1/2" -0x00be: "3/4" -0x00bf: "?" -0x00c0: "A" -0x00c1: "A" -0x00c2: "A" -0x00c3: "A" -0x00c4: "A" -0x00c5: "A" -0x00c6: "AE" -0x00c7: "C" -0x00c8: "E" -0x00c9: "E" -0x00ca: "E" -0x00cb: "E" -0x00cc: "I" -0x00cd: "I" -0x00ce: "I" -0x00cf: "I" -0x00d0: "D" -0x00d1: "N" -0x00d2: "O" -0x00d3: "O" -0x00d4: "O" -0x00d5: "O" -0x00d6: "O" -0x00d7: "x" -0x00d8: "O" -0x00d9: "U" -0x00da: "U" -0x00db: "U" -0x00dc: "U" -0x00dd: "Y" -0x00de: "Th" -0x00df: "ss" -0x00e0: "a" -0x00e1: "a" -0x00e2: "a" -0x00e3: "a" -0x00e4: "a" -0x00e5: "a" -0x00e6: "ae" -0x00e7: "c" -0x00e8: "e" -0x00e9: "e" -0x00ea: "e" -0x00eb: "e" -0x00ec: "i" -0x00ed: "i" -0x00ee: "i" -0x00ef: "i" -0x00f0: "d" -0x00f1: "n" -0x00f2: "o" -0x00f3: "o" -0x00f4: "o" -0x00f5: "o" -0x00f6: "o" -0x00f7: "/" -0x00f8: "o" -0x00f9: "u" -0x00fa: "u" -0x00fb: "u" -0x00fc: "u" -0x00fd: "y" -0x00fe: "th" -0x00ff: "y" -/* x001 */ -0x0100: "A" -0x0101: "a" -0x0102: "A" -0x0103: "a" -0x0104: "A" -0x0105: "a" -0x0106: "C" -0x0107: "c" -0x0108: "C" -0x0109: "c" -0x010a: "C" -0x010b: "c" -0x010c: "C" -0x010d: "c" -0x010e: "D" -0x010f: "d" -0x0110: "D" -0x0111: "d" -0x0112: "E" -0x0113: "e" -0x0114: "E" -0x0115: "e" -0x0116: "E" -0x0117: "e" -0x0118: "E" -0x0119: "e" -0x011a: "E" -0x011b: "e" -0x011c: "G" -0x011d: "g" -0x011e: "G" -0x011f: "g" -0x0120: "G" -0x0121: "g" -0x0122: "G" -0x0123: "g" -0x0124: "H" -0x0125: "h" -0x0126: "H" -0x0127: "h" -0x0128: "I" -0x0129: "i" -0x012a: "I" -0x012b: "i" -0x012c: "I" -0x012d: "i" -0x012e: "I" -0x012f: "i" -0x0130: "I" -0x0131: "i" -0x0132: "IJ" -0x0133: "ij" -0x0134: "J" -0x0135: "j" -0x0136: "K" -0x0137: "k" -0x0138: "k" -0x0139: "L" -0x013a: "l" -0x013b: "L" -0x013c: "l" -0x013d: "L" -0x013e: "l" -0x013f: "L" -0x0140: "l" -0x0141: "L" -0x0142: "l" -0x0143: "N" -0x0144: "n" -0x0145: "N" -0x0146: "n" -0x0147: "N" -0x0148: "n" -0x0149: "'n" -0x014a: "ng" -0x014b: "NG" -0x014c: "O" -0x014d: "o" -0x014e: "O" -0x014f: "o" -0x0150: "O" -0x0151: "o" -0x0152: "OE" -0x0153: "oe" -0x0154: "R" -0x0155: "r" -0x0156: "R" -0x0157: "r" -0x0158: "R" -0x0159: "r" -0x015a: "S" -0x015b: "s" -0x015c: "S" -0x015d: "s" -0x015e: "S" -0x015f: "s" -0x0160: "S" -0x0161: "s" -0x0162: "T" -0x0163: "t" -0x0164: "T" -0x0165: "t" -0x0166: "T" -0x0167: "t" -0x0168: "U" -0x0169: "u" -0x016a: "U" -0x016b: "u" -0x016c: "U" -0x016d: "u" -0x016e: "U" -0x016f: "u" -0x0170: "U" -0x0171: "u" -0x0172: "U" -0x0173: "u" -0x0174: "W" -0x0175: "w" -0x0176: "Y" -0x0177: "y" -0x0178: "Y" -0x0179: "Z" -0x017a: "z" -0x017b: "Z" -0x017c: "z" -0x017d: "Z" -0x017e: "z" -0x017f: "s" -0x0180: "b" -0x0181: "B" -0x0182: "B" -0x0183: "b" -0x0184: "6" -0x0185: "6" -0x0186: "O" -0x0187: "C" -0x0188: "c" -0x0189: "D" -0x018a: "D" -0x018b: "D" -0x018c: "d" -0x018d: "d" -0x018e: "3" -0x018f: "@" -0x0190: "E" -0x0191: "F" -0x0192: "f" -0x0193: "G" -0x0194: "G" -0x0195: "hv" -0x0196: "I" -0x0197: "I" -0x0198: "K" -0x0199: "k" -0x019a: "l" -0x019b: "l" -0x019c: "W" -0x019d: "N" -0x019e: "n" -0x019f: "O" -0x01a0: "O" -0x01a1: "o" -0x01a2: "OI" -0x01a3: "oi" -0x01a4: "P" -0x01a5: "p" -0x01a6: "YR" -0x01a7: "2" -0x01a8: "2" -0x01a9: "SH" -0x01aa: "sh" -0x01ab: "t" -0x01ac: "T" -0x01ad: "t" -0x01ae: "T" -0x01af: "U" -0x01b0: "u" -0x01b1: "Y" -0x01b2: "V" -0x01b3: "Y" -0x01b4: "y" -0x01b5: "Z" -0x01b6: "z" -0x01b7: "ZH" -0x01b8: "ZH" -0x01b9: "zh" -0x01ba: "zh" -0x01bb: "2" -0x01bc: "5" -0x01bd: "5" -0x01be: "ts" -0x01bf: "w" -0x01c0: "|" -0x01c1: "||" -0x01c2: "|=" -0x01c3: "!" -0x01c4: "DZ" -0x01c5: "Dz" -0x01c6: "dz" -0x01c7: "LJ" -0x01c8: "Lj" -0x01c9: "lj" -0x01ca: "NJ" -0x01cb: "Nj" -0x01cc: "nj" -0x01cd: "A" -0x01ce: "a" -0x01cf: "I" -0x01d0: "i" -0x01d1: "O" -0x01d2: "o" -0x01d3: "U" -0x01d4: "u" -0x01d5: "U" -0x01d6: "u" -0x01d7: "U" -0x01d8: "u" -0x01d9: "U" -0x01da: "u" -0x01db: "U" -0x01dc: "u" -0x01dd: "@" -0x01de: "A" -0x01df: "a" -0x01e0: "A" -0x01e1: "a" -0x01e2: "AE" -0x01e3: "ae" -0x01e4: "G" -0x01e5: "g" -0x01e6: "G" -0x01e7: "g" -0x01e8: "K" -0x01e9: "k" -0x01ea: "O" -0x01eb: "o" -0x01ec: "O" -0x01ed: "o" -0x01ee: "ZH" -0x01ef: "zh" -0x01f0: "j" -0x01f1: "DZ" -0x01f2: "Dz" -0x01f3: "dz" -0x01f4: "G" -0x01f5: "g" -0x01f6: "HV" -0x01f7: "W" -0x01f8: "N" -0x01f9: "n" -0x01fa: "A" -0x01fb: "a" -0x01fc: "AE" -0x01fd: "ae" -0x01fe: "O" -0x01ff: "o" -/* x002 */ -0x0200: "A" -0x0201: "a" -0x0202: "A" -0x0203: "a" -0x0204: "E" -0x0205: "e" -0x0206: "E" -0x0207: "e" -0x0208: "I" -0x0209: "i" -0x020a: "I" -0x020b: "i" -0x020c: "O" -0x020d: "o" -0x020e: "O" -0x020f: "o" -0x0210: "R" -0x0211: "r" -0x0212: "R" -0x0213: "r" -0x0214: "U" -0x0215: "u" -0x0216: "U" -0x0217: "u" -0x0218: "S" -0x0219: "s" -0x021a: "T" -0x021b: "t" -0x021c: "Y" -0x021d: "y" -0x021e: "H" -0x021f: "h" -0x0220: "N" -0x0221: "d" -0x0222: "OU" -0x0223: "ou" -0x0224: "Z" -0x0225: "z" -0x0226: "A" -0x0227: "a" -0x0228: "E" -0x0229: "e" -0x022a: "O" -0x022b: "o" -0x022c: "O" -0x022d: "o" -0x022e: "O" -0x022f: "o" -0x0230: "O" -0x0231: "o" -0x0232: "Y" -0x0233: "y" -0x0234: "l" -0x0235: "n" -0x0236: "t" -0x0237: "j" -0x0238: "db" -0x0239: "qp" -0x023a: "A" -0x023b: "C" -0x023c: "c" -0x023d: "L" -0x023e: "T" -0x023f: "s" -0x0240: "z" -0x0241: "[?]" -0x0242: "[?]" -0x0243: "B" -0x0244: "U" -0x0245: "^" -0x0246: "E" -0x0247: "e" -0x0248: "J" -0x0249: "j" -0x024a: "q" -0x024b: "q" -0x024c: "R" -0x024d: "r" -0x024e: "Y" -0x024f: "y" -0x0250: "a" -0x0251: "a" -0x0252: "a" -0x0253: "b" -0x0254: "o" -0x0255: "c" -0x0256: "d" -0x0257: "d" -0x0258: "e" -0x0259: "@" -0x025a: "@" -0x025b: "e" -0x025c: "e" -0x025d: "e" -0x025e: "e" -0x025f: "j" -0x0260: "g" -0x0261: "g" -0x0262: "g" -0x0263: "g" -0x0264: "u" -0x0265: "Y" -0x0266: "h" -0x0267: "h" -0x0268: "i" -0x0269: "i" -0x026a: "I" -0x026b: "l" -0x026c: "l" -0x026d: "l" -0x026e: "lZ" -0x026f: "W" -0x0270: "W" -0x0271: "m" -0x0272: "n" -0x0273: "n" -0x0274: "n" -0x0275: "o" -0x0276: "OE" -0x0277: "O" -0x0278: "F" -0x0279: "r" -0x027a: "r" -0x027b: "r" -0x027c: "r" -0x027d: "r" -0x027e: "r" -0x027f: "r" -0x0280: "R" -0x0281: "R" -0x0282: "s" -0x0283: "S" -0x0284: "j" -0x0285: "S" -0x0286: "S" -0x0287: "t" -0x0288: "t" -0x0289: "u" -0x028a: "U" -0x028b: "v" -0x028c: "^" -0x028d: "w" -0x028e: "y" -0x028f: "Y" -0x0290: "z" -0x0291: "z" -0x0292: "Z" -0x0293: "Z" -0x0294: "?" -0x0295: "?" -0x0296: "?" -0x0297: "C" -0x0298: "@" -0x0299: "B" -0x029a: "E" -0x029b: "G" -0x029c: "H" -0x029d: "j" -0x029e: "k" -0x029f: "L" -0x02a0: "q" -0x02a1: "?" -0x02a2: "?" -0x02a3: "dz" -0x02a4: "dZ" -0x02a5: "dz" -0x02a6: "ts" -0x02a7: "tS" -0x02a8: "tC" -0x02a9: "fN" -0x02aa: "ls" -0x02ab: "lz" -0x02ac: "WW" -0x02ad: "]]" -0x02ae: "h" -0x02af: "h" -0x02b0: "k" -0x02b1: "h" -0x02b2: "j" -0x02b3: "r" -0x02b4: "r" -0x02b5: "r" -0x02b6: "r" -0x02b7: "w" -0x02b8: "y" -0x02b9: "'" -0x02ba: "\"" -0x02bb: "`" -0x02bc: "'" -0x02bd: "`" -0x02be: "`" -0x02bf: "'" -0x02c0: "?" -0x02c1: "?" -0x02c2: "<" -0x02c3: ">" -0x02c4: "^" -0x02c5: "V" -0x02c6: "^" -0x02c7: "V" -0x02c8: "'" -0x02c9: "-" -0x02ca: "/" -0x02cb: "\\" -0x02cc: "," -0x02cd: "_" -0x02ce: "\\" -0x02cf: "/" -0x02d0: ":" -0x02d1: "." -0x02d2: "`" -0x02d3: "'" -0x02d4: "^" -0x02d5: "V" -0x02d6: "+" -0x02d7: "-" -0x02d8: "V" -0x02d9: "." -0x02da: "@" -0x02db: "," -0x02dc: "~" -0x02dd: "\"" -0x02de: "R" -0x02df: "X" -0x02e0: "G" -0x02e1: "l" -0x02e2: "s" -0x02e3: "x" -0x02e4: "?" -0x02e5: "" -0x02e6: "" -0x02e7: "" -0x02e8: "" -0x02e9: "" -0x02ea: "" -0x02eb: "" -0x02ec: "V" -0x02ed: "=" -0x02ee: "\"" -0x02ef: "[?]" -0x02f0: "[?]" -0x02f1: "[?]" -0x02f2: "[?]" -0x02f3: "[?]" -0x02f4: "[?]" -0x02f5: "[?]" -0x02f6: "[?]" -0x02f7: "[?]" -0x02f8: "[?]" -0x02f9: "[?]" -0x02fa: "[?]" -0x02fb: "[?]" -0x02fc: "[?]" -0x02fd: "[?]" -0x02fe: "[?]" -/* x003 */ -0x0300: "" -0x0301: "" -0x0302: "" -0x0303: "" -0x0304: "" -0x0305: "" -0x0306: "" -0x0307: "" -0x0308: "" -0x0309: "" -0x030a: "" -0x030b: "" -0x030c: "" -0x030d: "" -0x030e: "" -0x030f: "" -0x0310: "" -0x0311: "" -0x0312: "" -0x0313: "" -0x0314: "" -0x0315: "" -0x0316: "" -0x0317: "" -0x0318: "" -0x0319: "" -0x031a: "" -0x031b: "" -0x031c: "" -0x031d: "" -0x031e: "" -0x031f: "" -0x0320: "" -0x0321: "" -0x0322: "" -0x0323: "" -0x0324: "" -0x0325: "" -0x0326: "" -0x0327: "" -0x0328: "" -0x0329: "" -0x032a: "" -0x032b: "" -0x032c: "" -0x032d: "" -0x032e: "" -0x032f: "" -0x0330: "" -0x0331: "" -0x0332: "" -0x0333: "" -0x0334: "" -0x0335: "" -0x0336: "" -0x0337: "" -0x0338: "" -0x0339: "" -0x033a: "" -0x033b: "" -0x033c: "" -0x033d: "" -0x033e: "" -0x033f: "" -0x0340: "" -0x0341: "" -0x0342: "" -0x0343: "" -0x0344: "" -0x0345: "" -0x0346: "" -0x0347: "" -0x0348: "" -0x0349: "" -0x034a: "" -0x034b: "" -0x034c: "" -0x034d: "" -0x034e: "" -0x034f: "[?]" -0x0350: "[?]" -0x0351: "[?]" -0x0352: "[?]" -0x0353: "[?]" -0x0354: "[?]" -0x0355: "[?]" -0x0356: "[?]" -0x0357: "[?]" -0x0358: "[?]" -0x0359: "[?]" -0x035a: "[?]" -0x035b: "[?]" -0x035c: "[?]" -0x035d: "[?]" -0x035e: "[?]" -0x035f: "[?]" -0x0360: "" -0x0361: "" -0x0362: "" -0x0363: "a" -0x0364: "e" -0x0365: "i" -0x0366: "o" -0x0367: "u" -0x0368: "c" -0x0369: "d" -0x036a: "h" -0x036b: "m" -0x036c: "r" -0x036d: "t" -0x036e: "v" -0x036f: "x" -0x0370: "[?]" -0x0371: "[?]" -0x0372: "[?]" -0x0373: "[?]" -0x0374: "'" -0x0375: "," -0x0376: "[?]" -0x0377: "[?]" -0x0378: "[?]" -0x0379: "[?]" -0x037a: "" -0x037b: "[?]" -0x037c: "[?]" -0x037d: "[?]" -0x037e: "?" -0x037f: "[?]" -0x0380: "[?]" -0x0381: "[?]" -0x0382: "[?]" -0x0383: "[?]" -0x0384: "" -0x0385: "" -0x0386: "A" -0x0387: ";" -0x0388: "E" -0x0389: "E" -0x038a: "I" -0x038b: "[?]" -0x038c: "O" -0x038d: "[?]" -0x038e: "U" -0x038f: "O" -0x0390: "I" -0x0391: "A" -0x0392: "B" -0x0393: "G" -0x0394: "D" -0x0395: "E" -0x0396: "Z" -0x0397: "E" -0x0398: "Th" -0x0399: "I" -0x039a: "K" -0x039b: "L" -0x039c: "M" -0x039d: "N" -0x039e: "Ks" -0x039f: "O" -0x03a0: "P" -0x03a1: "R" -0x03a2: "[?]" -0x03a3: "S" -0x03a4: "T" -0x03a5: "U" -0x03a6: "Ph" -0x03a7: "Kh" -0x03a8: "Ps" -0x03a9: "O" -0x03aa: "I" -0x03ab: "U" -0x03ac: "a" -0x03ad: "e" -0x03ae: "e" -0x03af: "i" -0x03b0: "u" -0x03b1: "a" -0x03b2: "b" -0x03b3: "g" -0x03b4: "d" -0x03b5: "e" -0x03b6: "z" -0x03b7: "e" -0x03b8: "th" -0x03b9: "i" -0x03ba: "k" -0x03bb: "l" -0x03bc: "m" -0x03bd: "n" -0x03be: "x" -0x03bf: "o" -0x03c0: "p" -0x03c1: "r" -0x03c2: "s" -0x03c3: "s" -0x03c4: "t" -0x03c5: "u" -0x03c6: "ph" -0x03c7: "kh" -0x03c8: "ps" -0x03c9: "o" -0x03ca: "i" -0x03cb: "u" -0x03cc: "o" -0x03cd: "u" -0x03ce: "o" -0x03cf: "[?]" -0x03d0: "b" -0x03d1: "th" -0x03d2: "U" -0x03d3: "U" -0x03d4: "U" -0x03d5: "ph" -0x03d6: "p" -0x03d7: "&" -0x03d8: "[?]" -0x03d9: "[?]" -0x03da: "St" -0x03db: "st" -0x03dc: "W" -0x03dd: "w" -0x03de: "Q" -0x03df: "q" -0x03e0: "Sp" -0x03e1: "sp" -0x03e2: "Sh" -0x03e3: "sh" -0x03e4: "F" -0x03e5: "f" -0x03e6: "Kh" -0x03e7: "kh" -0x03e8: "H" -0x03e9: "h" -0x03ea: "G" -0x03eb: "g" -0x03ec: "CH" -0x03ed: "ch" -0x03ee: "Ti" -0x03ef: "ti" -0x03f0: "k" -0x03f1: "r" -0x03f2: "c" -0x03f3: "j" -0x03f4: "[?]" -0x03f5: "[?]" -0x03f6: "[?]" -0x03f7: "[?]" -0x03f8: "[?]" -0x03f9: "[?]" -0x03fa: "[?]" -0x03fb: "[?]" -0x03fc: "[?]" -0x03fd: "[?]" -0x03fe: "[?]" -/* x004 */ -0x0400: "Ie" -0x0401: "Io" -0x0402: "Dj" -0x0403: "Gj" -0x0404: "Ie" -0x0405: "Dz" -0x0406: "I" -0x0407: "Yi" -0x0408: "J" -0x0409: "Lj" -0x040a: "Nj" -0x040b: "Tsh" -0x040c: "Kj" -0x040d: "I" -0x040e: "U" -0x040f: "Dzh" -0x0410: "A" -0x0411: "B" -0x0412: "V" -0x0413: "G" -0x0414: "D" -0x0415: "E" -0x0416: "Zh" -0x0417: "Z" -0x0418: "I" -0x0419: "I" -0x041a: "K" -0x041b: "L" -0x041c: "M" -0x041d: "N" -0x041e: "O" -0x041f: "P" -0x0420: "R" -0x0421: "S" -0x0422: "T" -0x0423: "U" -0x0424: "F" -0x0425: "Kh" -0x0426: "Ts" -0x0427: "Ch" -0x0428: "Sh" -0x0429: "Shch" -0x042a: "'" -0x042b: "Y" -0x042c: "'" -0x042d: "E" -0x042e: "Iu" -0x042f: "Ia" -0x0430: "a" -0x0431: "b" -0x0432: "v" -0x0433: "g" -0x0434: "d" -0x0435: "e" -0x0436: "zh" -0x0437: "z" -0x0438: "i" -0x0439: "i" -0x043a: "k" -0x043b: "l" -0x043c: "m" -0x043d: "n" -0x043e: "o" -0x043f: "p" -0x0440: "r" -0x0441: "s" -0x0442: "t" -0x0443: "u" -0x0444: "f" -0x0445: "kh" -0x0446: "ts" -0x0447: "ch" -0x0448: "sh" -0x0449: "shch" -0x044a: "'" -0x044b: "y" -0x044c: "'" -0x044d: "e" -0x044e: "iu" -0x044f: "ia" -0x0450: "ie" -0x0451: "io" -0x0452: "dj" -0x0453: "gj" -0x0454: "ie" -0x0455: "dz" -0x0456: "i" -0x0457: "yi" -0x0458: "j" -0x0459: "lj" -0x045a: "nj" -0x045b: "tsh" -0x045c: "kj" -0x045d: "i" -0x045e: "u" -0x045f: "dzh" -0x0460: "O" -0x0461: "o" -0x0462: "E" -0x0463: "e" -0x0464: "Ie" -0x0465: "ie" -0x0466: "E" -0x0467: "e" -0x0468: "Ie" -0x0469: "ie" -0x046a: "O" -0x046b: "o" -0x046c: "Io" -0x046d: "io" -0x046e: "Ks" -0x046f: "ks" -0x0470: "Ps" -0x0471: "ps" -0x0472: "F" -0x0473: "f" -0x0474: "Y" -0x0475: "y" -0x0476: "Y" -0x0477: "y" -0x0478: "u" -0x0479: "u" -0x047a: "O" -0x047b: "o" -0x047c: "O" -0x047d: "o" -0x047e: "Ot" -0x047f: "ot" -0x0480: "Q" -0x0481: "q" -0x0482: "*1000*" -0x0483: "" -0x0484: "" -0x0485: "" -0x0486: "" -0x0487: "[?]" -0x0488: "*100.000*" -0x0489: "*1.000.000*" -0x048a: "[?]" -0x048b: "[?]" -0x048c: "\"" -0x048d: "\"" -0x048e: "R'" -0x048f: "r'" -0x0490: "G'" -0x0491: "g'" -0x0492: "G'" -0x0493: "g'" -0x0494: "G'" -0x0495: "g'" -0x0496: "Zh'" -0x0497: "zh'" -0x0498: "Z'" -0x0499: "z'" -0x049a: "K'" -0x049b: "k'" -0x049c: "K'" -0x049d: "k'" -0x049e: "K'" -0x049f: "k'" -0x04a0: "K'" -0x04a1: "k'" -0x04a2: "N'" -0x04a3: "n'" -0x04a4: "Ng" -0x04a5: "ng" -0x04a6: "P'" -0x04a7: "p'" -0x04a8: "Kh" -0x04a9: "kh" -0x04aa: "S'" -0x04ab: "s'" -0x04ac: "T'" -0x04ad: "t'" -0x04ae: "U" -0x04af: "u" -0x04b0: "U'" -0x04b1: "u'" -0x04b2: "Kh'" -0x04b3: "kh'" -0x04b4: "Tts" -0x04b5: "tts" -0x04b6: "Ch'" -0x04b7: "ch'" -0x04b8: "Ch'" -0x04b9: "ch'" -0x04ba: "H" -0x04bb: "h" -0x04bc: "Ch" -0x04bd: "ch" -0x04be: "Ch'" -0x04bf: "ch'" -0x04c0: "`" -0x04c1: "Zh" -0x04c2: "zh" -0x04c3: "K'" -0x04c4: "k'" -0x04c5: "[?]" -0x04c6: "[?]" -0x04c7: "N'" -0x04c8: "n'" -0x04c9: "[?]" -0x04ca: "[?]" -0x04cb: "Ch" -0x04cc: "ch" -0x04cd: "[?]" -0x04ce: "[?]" -0x04cf: "[?]" -0x04d0: "a" -0x04d1: "a" -0x04d2: "A" -0x04d3: "a" -0x04d4: "Ae" -0x04d5: "ae" -0x04d6: "Ie" -0x04d7: "ie" -0x04d8: "@" -0x04d9: "@" -0x04da: "@" -0x04db: "@" -0x04dc: "Zh" -0x04dd: "zh" -0x04de: "Z" -0x04df: "z" -0x04e0: "Dz" -0x04e1: "dz" -0x04e2: "I" -0x04e3: "i" -0x04e4: "I" -0x04e5: "i" -0x04e6: "O" -0x04e7: "o" -0x04e8: "O" -0x04e9: "o" -0x04ea: "O" -0x04eb: "o" -0x04ec: "E" -0x04ed: "e" -0x04ee: "U" -0x04ef: "u" -0x04f0: "U" -0x04f1: "u" -0x04f2: "U" -0x04f3: "u" -0x04f4: "Ch" -0x04f5: "ch" -0x04f6: "[?]" -0x04f7: "[?]" -0x04f8: "Y" -0x04f9: "y" -0x04fa: "[?]" -0x04fb: "[?]" -0x04fc: "[?]" -0x04fd: "[?]" -0x04fe: "[?]" -/* x005 */ -0x0500: "[?]" -0x0501: "[?]" -0x0502: "[?]" -0x0503: "[?]" -0x0504: "[?]" -0x0505: "[?]" -0x0506: "[?]" -0x0507: "[?]" -0x0508: "[?]" -0x0509: "[?]" -0x050a: "[?]" -0x050b: "[?]" -0x050c: "[?]" -0x050d: "[?]" -0x050e: "[?]" -0x050f: "[?]" -0x0510: "[?]" -0x0511: "[?]" -0x0512: "[?]" -0x0513: "[?]" -0x0514: "[?]" -0x0515: "[?]" -0x0516: "[?]" -0x0517: "[?]" -0x0518: "[?]" -0x0519: "[?]" -0x051a: "[?]" -0x051b: "[?]" -0x051c: "[?]" -0x051d: "[?]" -0x051e: "[?]" -0x051f: "[?]" -0x0520: "[?]" -0x0521: "[?]" -0x0522: "[?]" -0x0523: "[?]" -0x0524: "[?]" -0x0525: "[?]" -0x0526: "[?]" -0x0527: "[?]" -0x0528: "[?]" -0x0529: "[?]" -0x052a: "[?]" -0x052b: "[?]" -0x052c: "[?]" -0x052d: "[?]" -0x052e: "[?]" -0x052f: "[?]" -0x0530: "[?]" -0x0531: "A" -0x0532: "B" -0x0533: "G" -0x0534: "D" -0x0535: "E" -0x0536: "Z" -0x0537: "E" -0x0538: "E" -0x0539: "T`" -0x053a: "Zh" -0x053b: "I" -0x053c: "L" -0x053d: "Kh" -0x053e: "Ts" -0x053f: "K" -0x0540: "H" -0x0541: "Dz" -0x0542: "Gh" -0x0543: "Ch" -0x0544: "M" -0x0545: "Y" -0x0546: "N" -0x0547: "Sh" -0x0548: "O" -0x0549: "Ch`" -0x054a: "P" -0x054b: "J" -0x054c: "Rh" -0x054d: "S" -0x054e: "V" -0x054f: "T" -0x0550: "R" -0x0551: "Ts`" -0x0552: "W" -0x0553: "P`" -0x0554: "K`" -0x0555: "O" -0x0556: "F" -0x0557: "[?]" -0x0558: "[?]" -0x0559: "<" -0x055a: "'" -0x055b: "/" -0x055c: "!" -0x055d: "," -0x055e: "?" -0x055f: "." -0x0560: "[?]" -0x0561: "a" -0x0562: "b" -0x0563: "g" -0x0564: "d" -0x0565: "e" -0x0566: "z" -0x0567: "e" -0x0568: "e" -0x0569: "t`" -0x056a: "zh" -0x056b: "i" -0x056c: "l" -0x056d: "kh" -0x056e: "ts" -0x056f: "k" -0x0570: "h" -0x0571: "dz" -0x0572: "gh" -0x0573: "ch" -0x0574: "m" -0x0575: "y" -0x0576: "n" -0x0577: "sh" -0x0578: "o" -0x0579: "ch`" -0x057a: "p" -0x057b: "j" -0x057c: "rh" -0x057d: "s" -0x057e: "v" -0x057f: "t" -0x0580: "r" -0x0581: "ts`" -0x0582: "w" -0x0583: "p`" -0x0584: "k`" -0x0585: "o" -0x0586: "f" -0x0587: "ew" -0x0588: "[?]" -0x0589: "." -0x058a: "-" -0x058b: "[?]" -0x058c: "[?]" -0x058d: "[?]" -0x058e: "[?]" -0x058f: "[?]" -0x0590: "[?]" -0x0591: "" -0x0592: "" -0x0593: "" -0x0594: "" -0x0595: "" -0x0596: "" -0x0597: "" -0x0598: "" -0x0599: "" -0x059a: "" -0x059b: "" -0x059c: "" -0x059d: "" -0x059e: "" -0x059f: "" -0x05a0: "" -0x05a1: "" -0x05a2: "[?]" -0x05a3: "" -0x05a4: "" -0x05a5: "" -0x05a6: "" -0x05a7: "" -0x05a8: "" -0x05a9: "" -0x05aa: "" -0x05ab: "" -0x05ac: "" -0x05ad: "" -0x05ae: "" -0x05af: "" -0x05b0: "@" -0x05b1: "e" -0x05b2: "a" -0x05b3: "o" -0x05b4: "i" -0x05b5: "e" -0x05b6: "e" -0x05b7: "a" -0x05b8: "a" -0x05b9: "o" -0x05ba: "[?]" -0x05bb: "u" -0x05bc: "'" -0x05bd: "" -0x05be: "" -0x05bf: "" -0x05c0: "" -0x05c1: "" -0x05c2: "" -0x05c3: ":" -0x05c4: "" -0x05c5: "[?]" -0x05c6: "[?]" -0x05c7: "[?]" -0x05c8: "[?]" -0x05c9: "[?]" -0x05ca: "[?]" -0x05cb: "[?]" -0x05cc: "[?]" -0x05cd: "[?]" -0x05ce: "[?]" -0x05cf: "[?]" -0x05d0: "" -0x05d1: "b" -0x05d2: "g" -0x05d3: "d" -0x05d4: "h" -0x05d5: "v" -0x05d6: "z" -0x05d7: "kh" -0x05d8: "t" -0x05d9: "y" -0x05da: "k" -0x05db: "k" -0x05dc: "l" -0x05dd: "m" -0x05de: "m" -0x05df: "n" -0x05e0: "n" -0x05e1: "s" -0x05e2: "`" -0x05e3: "p" -0x05e4: "p" -0x05e5: "ts" -0x05e6: "ts" -0x05e7: "q" -0x05e8: "r" -0x05e9: "sh" -0x05ea: "t" -0x05eb: "[?]" -0x05ec: "[?]" -0x05ed: "[?]" -0x05ee: "[?]" -0x05ef: "[?]" -0x05f0: "V" -0x05f1: "oy" -0x05f2: "i" -0x05f3: "'" -0x05f4: "\"" -0x05f5: "[?]" -0x05f6: "[?]" -0x05f7: "[?]" -0x05f8: "[?]" -0x05f9: "[?]" -0x05fa: "[?]" -0x05fb: "[?]" -0x05fc: "[?]" -0x05fd: "[?]" -0x05fe: "[?]" -/* x006 */ -0x0600: "[?]" -0x0601: "[?]" -0x0602: "[?]" -0x0603: "[?]" -0x0604: "[?]" -0x0605: "[?]" -0x0606: "[?]" -0x0607: "[?]" -0x0608: "[?]" -0x0609: "[?]" -0x060a: "[?]" -0x060b: "[?]" -0x060c: "," -0x060d: "[?]" -0x060e: "[?]" -0x060f: "[?]" -0x0610: "[?]" -0x0611: "[?]" -0x0612: "[?]" -0x0613: "[?]" -0x0614: "[?]" -0x0615: "[?]" -0x0616: "[?]" -0x0617: "[?]" -0x0618: "[?]" -0x0619: "[?]" -0x061a: "[?]" -0x061b: ";" -0x061c: "[?]" -0x061d: "[?]" -0x061e: "[?]" -0x061f: "?" -0x0620: "[?]" -0x0621: "" -0x0622: "a" -0x0623: "'" -0x0624: "w'" -0x0625: "" -0x0626: "y'" -0x0627: "" -0x0628: "b" -0x0629: "@" -0x062a: "t" -0x062b: "th" -0x062c: "j" -0x062d: "H" -0x062e: "kh" -0x062f: "d" -0x0630: "dh" -0x0631: "r" -0x0632: "z" -0x0633: "s" -0x0634: "sh" -0x0635: "S" -0x0636: "D" -0x0637: "T" -0x0638: "Z" -0x0639: "`" -0x063a: "G" -0x063b: "[?]" -0x063c: "[?]" -0x063d: "[?]" -0x063e: "[?]" -0x063f: "[?]" -0x0640: "" -0x0641: "f" -0x0642: "q" -0x0643: "k" -0x0644: "l" -0x0645: "m" -0x0646: "n" -0x0647: "h" -0x0648: "w" -0x0649: "~" -0x064a: "y" -0x064b: "an" -0x064c: "un" -0x064d: "in" -0x064e: "a" -0x064f: "u" -0x0650: "i" -0x0651: "W" -0x0652: "" -0x0653: "" -0x0654: "'" -0x0655: "'" -0x0656: "[?]" -0x0657: "[?]" -0x0658: "[?]" -0x0659: "[?]" -0x065a: "[?]" -0x065b: "[?]" -0x065c: "[?]" -0x065d: "[?]" -0x065e: "[?]" -0x065f: "[?]" -0x0660: "0" -0x0661: "1" -0x0662: "2" -0x0663: "3" -0x0664: "4" -0x0665: "5" -0x0666: "6" -0x0667: "7" -0x0668: "8" -0x0669: "9" -0x066a: "%" -0x066b: "." -0x066c: "," -0x066d: "*" -0x066e: "[?]" -0x066f: "[?]" -0x0670: "" -0x0671: "'" -0x0672: "'" -0x0673: "'" -0x0674: "" -0x0675: "'" -0x0676: "'w" -0x0677: "'u" -0x0678: "'y" -0x0679: "tt" -0x067a: "tth" -0x067b: "b" -0x067c: "t" -0x067d: "T" -0x067e: "p" -0x067f: "th" -0x0680: "bh" -0x0681: "'h" -0x0682: "H" -0x0683: "ny" -0x0684: "dy" -0x0685: "H" -0x0686: "ch" -0x0687: "cch" -0x0688: "dd" -0x0689: "D" -0x068a: "D" -0x068b: "Dt" -0x068c: "dh" -0x068d: "ddh" -0x068e: "d" -0x068f: "D" -0x0690: "D" -0x0691: "rr" -0x0692: "R" -0x0693: "R" -0x0694: "R" -0x0695: "R" -0x0696: "R" -0x0697: "R" -0x0698: "j" -0x0699: "R" -0x069a: "S" -0x069b: "S" -0x069c: "S" -0x069d: "S" -0x069e: "S" -0x069f: "T" -0x06a0: "GH" -0x06a1: "F" -0x06a2: "F" -0x06a3: "F" -0x06a4: "v" -0x06a5: "f" -0x06a6: "ph" -0x06a7: "Q" -0x06a8: "Q" -0x06a9: "kh" -0x06aa: "k" -0x06ab: "K" -0x06ac: "K" -0x06ad: "ng" -0x06ae: "K" -0x06af: "g" -0x06b0: "G" -0x06b1: "N" -0x06b2: "G" -0x06b3: "G" -0x06b4: "G" -0x06b5: "L" -0x06b6: "L" -0x06b7: "L" -0x06b8: "L" -0x06b9: "N" -0x06ba: "N" -0x06bb: "N" -0x06bc: "N" -0x06bd: "N" -0x06be: "h" -0x06bf: "Ch" -0x06c0: "hy" -0x06c1: "h" -0x06c2: "H" -0x06c3: "@" -0x06c4: "W" -0x06c5: "oe" -0x06c6: "oe" -0x06c7: "u" -0x06c8: "yu" -0x06c9: "yu" -0x06ca: "W" -0x06cb: "v" -0x06cc: "y" -0x06cd: "Y" -0x06ce: "Y" -0x06cf: "W" -0x06d0: "" -0x06d1: "" -0x06d2: "y" -0x06d3: "y'" -0x06d4: "." -0x06d5: "ae" -0x06d6: "" -0x06d7: "" -0x06d8: "" -0x06d9: "" -0x06da: "" -0x06db: "" -0x06dc: "" -0x06dd: "@" -0x06de: "#" -0x06df: "" -0x06e0: "" -0x06e1: "" -0x06e2: "" -0x06e3: "" -0x06e4: "" -0x06e5: "" -0x06e6: "" -0x06e7: "" -0x06e8: "" -0x06e9: "^" -0x06ea: "" -0x06eb: "" -0x06ec: "" -0x06ed: "" -0x06ee: "[?]" -0x06ef: "[?]" -0x06f0: "0" -0x06f1: "1" -0x06f2: "2" -0x06f3: "3" -0x06f4: "4" -0x06f5: "5" -0x06f6: "6" -0x06f7: "7" -0x06f8: "8" -0x06f9: "9" -0x06fa: "Sh" -0x06fb: "D" -0x06fc: "Gh" -0x06fd: "&" -0x06fe: "+m" -/* x007 */ -0x0700: "//" -0x0701: "/" -0x0702: "," -0x0703: "!" -0x0704: "!" -0x0705: "-" -0x0706: "," -0x0707: "," -0x0708: ";" -0x0709: "?" -0x070a: "~" -0x070b: "{" -0x070c: "}" -0x070d: "*" -0x070e: "[?]" -0x070f: "" -0x0710: "'" -0x0711: "" -0x0712: "b" -0x0713: "g" -0x0714: "g" -0x0715: "d" -0x0716: "d" -0x0717: "h" -0x0718: "w" -0x0719: "z" -0x071a: "H" -0x071b: "t" -0x071c: "t" -0x071d: "y" -0x071e: "yh" -0x071f: "k" -0x0720: "l" -0x0721: "m" -0x0722: "n" -0x0723: "s" -0x0724: "s" -0x0725: "`" -0x0726: "p" -0x0727: "p" -0x0728: "S" -0x0729: "q" -0x072a: "r" -0x072b: "sh" -0x072c: "t" -0x072d: "[?]" -0x072e: "[?]" -0x072f: "[?]" -0x0730: "a" -0x0731: "a" -0x0732: "a" -0x0733: "A" -0x0734: "A" -0x0735: "A" -0x0736: "e" -0x0737: "e" -0x0738: "e" -0x0739: "E" -0x073a: "i" -0x073b: "i" -0x073c: "u" -0x073d: "u" -0x073e: "u" -0x073f: "o" -0x0740: "" -0x0741: "`" -0x0742: "'" -0x0743: "" -0x0744: "" -0x0745: "X" -0x0746: "Q" -0x0747: "@" -0x0748: "@" -0x0749: "|" -0x074a: "+" -0x074b: "[?]" -0x074c: "[?]" -0x074d: "[?]" -0x074e: "[?]" -0x074f: "[?]" -0x0750: "[?]" -0x0751: "[?]" -0x0752: "[?]" -0x0753: "[?]" -0x0754: "[?]" -0x0755: "[?]" -0x0756: "[?]" -0x0757: "[?]" -0x0758: "[?]" -0x0759: "[?]" -0x075a: "[?]" -0x075b: "[?]" -0x075c: "[?]" -0x075d: "[?]" -0x075e: "[?]" -0x075f: "[?]" -0x0760: "[?]" -0x0761: "[?]" -0x0762: "[?]" -0x0763: "[?]" -0x0764: "[?]" -0x0765: "[?]" -0x0766: "[?]" -0x0767: "[?]" -0x0768: "[?]" -0x0769: "[?]" -0x076a: "[?]" -0x076b: "[?]" -0x076c: "[?]" -0x076d: "[?]" -0x076e: "[?]" -0x076f: "[?]" -0x0770: "[?]" -0x0771: "[?]" -0x0772: "[?]" -0x0773: "[?]" -0x0774: "[?]" -0x0775: "[?]" -0x0776: "[?]" -0x0777: "[?]" -0x0778: "[?]" -0x0779: "[?]" -0x077a: "[?]" -0x077b: "[?]" -0x077c: "[?]" -0x077d: "[?]" -0x077e: "[?]" -0x077f: "[?]" -0x0780: "h" -0x0781: "sh" -0x0782: "n" -0x0783: "r" -0x0784: "b" -0x0785: "L" -0x0786: "k" -0x0787: "'" -0x0788: "v" -0x0789: "m" -0x078a: "f" -0x078b: "dh" -0x078c: "th" -0x078d: "l" -0x078e: "g" -0x078f: "ny" -0x0790: "s" -0x0791: "d" -0x0792: "z" -0x0793: "t" -0x0794: "y" -0x0795: "p" -0x0796: "j" -0x0797: "ch" -0x0798: "tt" -0x0799: "hh" -0x079a: "kh" -0x079b: "th" -0x079c: "z" -0x079d: "sh" -0x079e: "s" -0x079f: "d" -0x07a0: "t" -0x07a1: "z" -0x07a2: "`" -0x07a3: "gh" -0x07a4: "q" -0x07a5: "w" -0x07a6: "a" -0x07a7: "aa" -0x07a8: "i" -0x07a9: "ee" -0x07aa: "u" -0x07ab: "oo" -0x07ac: "e" -0x07ad: "ey" -0x07ae: "o" -0x07af: "oa" -0x07b0: "" -0x07b1: "[?]" -0x07b2: "[?]" -0x07b3: "[?]" -0x07b4: "[?]" -0x07b5: "[?]" -0x07b6: "[?]" -0x07b7: "[?]" -0x07b8: "[?]" -0x07b9: "[?]" -0x07ba: "[?]" -0x07bb: "[?]" -0x07bc: "[?]" -0x07bd: "[?]" -0x07be: "[?]" -0x07bf: "[?]" -0x07c0: "[?]" -0x07c1: "[?]" -0x07c2: "[?]" -0x07c3: "[?]" -0x07c4: "[?]" -0x07c5: "[?]" -0x07c6: "[?]" -0x07c7: "[?]" -0x07c8: "[?]" -0x07c9: "[?]" -0x07ca: "[?]" -0x07cb: "[?]" -0x07cc: "[?]" -0x07cd: "[?]" -0x07ce: "[?]" -0x07cf: "[?]" -0x07d0: "[?]" -0x07d1: "[?]" -0x07d2: "[?]" -0x07d3: "[?]" -0x07d4: "[?]" -0x07d5: "[?]" -0x07d6: "[?]" -0x07d7: "[?]" -0x07d8: "[?]" -0x07d9: "[?]" -0x07da: "[?]" -0x07db: "[?]" -0x07dc: "[?]" -0x07dd: "[?]" -0x07de: "[?]" -0x07df: "[?]" -0x07e0: "[?]" -0x07e1: "[?]" -0x07e2: "[?]" -0x07e3: "[?]" -0x07e4: "[?]" -0x07e5: "[?]" -0x07e6: "[?]" -0x07e7: "[?]" -0x07e8: "[?]" -0x07e9: "[?]" -0x07ea: "[?]" -0x07eb: "[?]" -0x07ec: "[?]" -0x07ed: "[?]" -0x07ee: "[?]" -0x07ef: "[?]" -0x07f0: "[?]" -0x07f1: "[?]" -0x07f2: "[?]" -0x07f3: "[?]" -0x07f4: "[?]" -0x07f5: "[?]" -0x07f6: "[?]" -0x07f7: "[?]" -0x07f8: "[?]" -0x07f9: "[?]" -0x07fa: "[?]" -0x07fb: "[?]" -0x07fc: "[?]" -0x07fd: "[?]" -0x07fe: "[?]" -/* x009 */ -0x0900: "[?]" -0x0901: "N" -0x0902: "N" -0x0903: "H" -0x0904: "[?]" -0x0905: "a" -0x0906: "aa" -0x0907: "i" -0x0908: "ii" -0x0909: "u" -0x090a: "uu" -0x090b: "R" -0x090c: "L" -0x090d: "eN" -0x090e: "e" -0x090f: "e" -0x0910: "ai" -0x0911: "oN" -0x0912: "o" -0x0913: "o" -0x0914: "au" -0x0915: "k" -0x0916: "kh" -0x0917: "g" -0x0918: "gh" -0x0919: "ng" -0x091a: "c" -0x091b: "ch" -0x091c: "j" -0x091d: "jh" -0x091e: "ny" -0x091f: "tt" -0x0920: "tth" -0x0921: "dd" -0x0922: "ddh" -0x0923: "nn" -0x0924: "t" -0x0925: "th" -0x0926: "d" -0x0927: "dh" -0x0928: "n" -0x0929: "nnn" -0x092a: "p" -0x092b: "ph" -0x092c: "b" -0x092d: "bh" -0x092e: "m" -0x092f: "y" -0x0930: "r" -0x0931: "rr" -0x0932: "l" -0x0933: "l" -0x0934: "lll" -0x0935: "v" -0x0936: "sh" -0x0937: "ss" -0x0938: "s" -0x0939: "h" -0x093a: "[?]" -0x093b: "[?]" -0x093c: "'" -0x093d: "'" -0x093e: "aa" -0x093f: "i" -0x0940: "ii" -0x0941: "u" -0x0942: "uu" -0x0943: "R" -0x0944: "RR" -0x0945: "eN" -0x0946: "e" -0x0947: "e" -0x0948: "ai" -0x0949: "oN" -0x094a: "o" -0x094b: "o" -0x094c: "au" -0x094d: "" -0x094e: "[?]" -0x094f: "[?]" -0x0950: "AUM" -0x0951: "'" -0x0952: "'" -0x0953: "`" -0x0954: "'" -0x0955: "[?]" -0x0956: "[?]" -0x0957: "[?]" -0x0958: "q" -0x0959: "khh" -0x095a: "ghh" -0x095b: "z" -0x095c: "dddh" -0x095d: "rh" -0x095e: "f" -0x095f: "yy" -0x0960: "RR" -0x0961: "LL" -0x0962: "L" -0x0963: "LL" -0x0964: " / " -0x0965: " // " -0x0966: "0" -0x0967: "1" -0x0968: "2" -0x0969: "3" -0x096a: "4" -0x096b: "5" -0x096c: "6" -0x096d: "7" -0x096e: "8" -0x096f: "9" -0x0970: "." -0x0971: "[?]" -0x0972: "[?]" -0x0973: "[?]" -0x0974: "[?]" -0x0975: "[?]" -0x0976: "[?]" -0x0977: "[?]" -0x0978: "[?]" -0x0979: "[?]" -0x097a: "[?]" -0x097b: "[?]" -0x097c: "[?]" -0x097d: "[?]" -0x097e: "[?]" -0x097f: "[?]" -0x0980: "[?]" -0x0981: "N" -0x0982: "N" -0x0983: "H" -0x0984: "[?]" -0x0985: "a" -0x0986: "aa" -0x0987: "i" -0x0988: "ii" -0x0989: "u" -0x098a: "uu" -0x098b: "R" -0x098c: "RR" -0x098d: "[?]" -0x098e: "[?]" -0x098f: "e" -0x0990: "ai" -0x0991: "[?]" -0x0992: "[?]" -0x0993: "o" -0x0994: "au" -0x0995: "k" -0x0996: "kh" -0x0997: "g" -0x0998: "gh" -0x0999: "ng" -0x099a: "c" -0x099b: "ch" -0x099c: "j" -0x099d: "jh" -0x099e: "ny" -0x099f: "tt" -0x09a0: "tth" -0x09a1: "dd" -0x09a2: "ddh" -0x09a3: "nn" -0x09a4: "t" -0x09a5: "th" -0x09a6: "d" -0x09a7: "dh" -0x09a8: "n" -0x09a9: "[?]" -0x09aa: "p" -0x09ab: "ph" -0x09ac: "b" -0x09ad: "bh" -0x09ae: "m" -0x09af: "y" -0x09b0: "r" -0x09b1: "[?]" -0x09b2: "l" -0x09b3: "[?]" -0x09b4: "[?]" -0x09b5: "[?]" -0x09b6: "sh" -0x09b7: "ss" -0x09b8: "s" -0x09b9: "h" -0x09ba: "[?]" -0x09bb: "[?]" -0x09bc: "'" -0x09bd: "[?]" -0x09be: "aa" -0x09bf: "i" -0x09c0: "ii" -0x09c1: "u" -0x09c2: "uu" -0x09c3: "R" -0x09c4: "RR" -0x09c5: "[?]" -0x09c6: "[?]" -0x09c7: "e" -0x09c8: "ai" -0x09c9: "[?]" -0x09ca: "[?]" -0x09cb: "o" -0x09cc: "au" -0x09cd: "" -0x09ce: "[?]" -0x09cf: "[?]" -0x09d0: "[?]" -0x09d1: "[?]" -0x09d2: "[?]" -0x09d3: "[?]" -0x09d4: "[?]" -0x09d5: "[?]" -0x09d6: "[?]" -0x09d7: "+" -0x09d8: "[?]" -0x09d9: "[?]" -0x09da: "[?]" -0x09db: "[?]" -0x09dc: "rr" -0x09dd: "rh" -0x09de: "[?]" -0x09df: "yy" -0x09e0: "RR" -0x09e1: "LL" -0x09e2: "L" -0x09e3: "LL" -0x09e4: "[?]" -0x09e5: "[?]" -0x09e6: "0" -0x09e7: "1" -0x09e8: "2" -0x09e9: "3" -0x09ea: "4" -0x09eb: "5" -0x09ec: "6" -0x09ed: "7" -0x09ee: "8" -0x09ef: "9" -0x09f0: "r'" -0x09f1: "r`" -0x09f2: "Rs" -0x09f3: "Rs" -0x09f4: "1/" -0x09f5: "2/" -0x09f6: "3/" -0x09f7: "4/" -0x09f8: " 1 - 1/" -0x09f9: "/16" -0x09fa: "" -0x09fb: "[?]" -0x09fc: "[?]" -0x09fd: "[?]" -0x09fe: "[?]" -/* x00a */ -0x0a00: "[?]" -0x0a01: "[?]" -0x0a02: "N" -0x0a03: "[?]" -0x0a04: "[?]" -0x0a05: "a" -0x0a06: "aa" -0x0a07: "i" -0x0a08: "ii" -0x0a09: "u" -0x0a0a: "uu" -0x0a0b: "[?]" -0x0a0c: "[?]" -0x0a0d: "[?]" -0x0a0e: "[?]" -0x0a0f: "ee" -0x0a10: "ai" -0x0a11: "[?]" -0x0a12: "[?]" -0x0a13: "oo" -0x0a14: "au" -0x0a15: "k" -0x0a16: "kh" -0x0a17: "g" -0x0a18: "gh" -0x0a19: "ng" -0x0a1a: "c" -0x0a1b: "ch" -0x0a1c: "j" -0x0a1d: "jh" -0x0a1e: "ny" -0x0a1f: "tt" -0x0a20: "tth" -0x0a21: "dd" -0x0a22: "ddh" -0x0a23: "nn" -0x0a24: "t" -0x0a25: "th" -0x0a26: "d" -0x0a27: "dh" -0x0a28: "n" -0x0a29: "[?]" -0x0a2a: "p" -0x0a2b: "ph" -0x0a2c: "b" -0x0a2d: "bb" -0x0a2e: "m" -0x0a2f: "y" -0x0a30: "r" -0x0a31: "[?]" -0x0a32: "l" -0x0a33: "ll" -0x0a34: "[?]" -0x0a35: "v" -0x0a36: "sh" -0x0a37: "[?]" -0x0a38: "s" -0x0a39: "h" -0x0a3a: "[?]" -0x0a3b: "[?]" -0x0a3c: "'" -0x0a3d: "[?]" -0x0a3e: "aa" -0x0a3f: "i" -0x0a40: "ii" -0x0a41: "u" -0x0a42: "uu" -0x0a43: "[?]" -0x0a44: "[?]" -0x0a45: "[?]" -0x0a46: "[?]" -0x0a47: "ee" -0x0a48: "ai" -0x0a49: "[?]" -0x0a4a: "[?]" -0x0a4b: "oo" -0x0a4c: "au" -0x0a4d: "" -0x0a4e: "[?]" -0x0a4f: "[?]" -0x0a50: "[?]" -0x0a51: "[?]" -0x0a52: "[?]" -0x0a53: "[?]" -0x0a54: "[?]" -0x0a55: "[?]" -0x0a56: "[?]" -0x0a57: "[?]" -0x0a58: "[?]" -0x0a59: "khh" -0x0a5a: "ghh" -0x0a5b: "z" -0x0a5c: "rr" -0x0a5d: "[?]" -0x0a5e: "f" -0x0a5f: "[?]" -0x0a60: "[?]" -0x0a61: "[?]" -0x0a62: "[?]" -0x0a63: "[?]" -0x0a64: "[?]" -0x0a65: "[?]" -0x0a66: "0" -0x0a67: "1" -0x0a68: "2" -0x0a69: "3" -0x0a6a: "4" -0x0a6b: "5" -0x0a6c: "6" -0x0a6d: "7" -0x0a6e: "8" -0x0a6f: "9" -0x0a70: "N" -0x0a71: "H" -0x0a72: "" -0x0a73: "" -0x0a74: "G.E.O." -0x0a75: "[?]" -0x0a76: "[?]" -0x0a77: "[?]" -0x0a78: "[?]" -0x0a79: "[?]" -0x0a7a: "[?]" -0x0a7b: "[?]" -0x0a7c: "[?]" -0x0a7d: "[?]" -0x0a7e: "[?]" -0x0a7f: "[?]" -0x0a80: "[?]" -0x0a81: "N" -0x0a82: "N" -0x0a83: "H" -0x0a84: "[?]" -0x0a85: "a" -0x0a86: "aa" -0x0a87: "i" -0x0a88: "ii" -0x0a89: "u" -0x0a8a: "uu" -0x0a8b: "R" -0x0a8c: "[?]" -0x0a8d: "eN" -0x0a8e: "[?]" -0x0a8f: "e" -0x0a90: "ai" -0x0a91: "oN" -0x0a92: "[?]" -0x0a93: "o" -0x0a94: "au" -0x0a95: "k" -0x0a96: "kh" -0x0a97: "g" -0x0a98: "gh" -0x0a99: "ng" -0x0a9a: "c" -0x0a9b: "ch" -0x0a9c: "j" -0x0a9d: "jh" -0x0a9e: "ny" -0x0a9f: "tt" -0x0aa0: "tth" -0x0aa1: "dd" -0x0aa2: "ddh" -0x0aa3: "nn" -0x0aa4: "t" -0x0aa5: "th" -0x0aa6: "d" -0x0aa7: "dh" -0x0aa8: "n" -0x0aa9: "[?]" -0x0aaa: "p" -0x0aab: "ph" -0x0aac: "b" -0x0aad: "bh" -0x0aae: "m" -0x0aaf: "ya" -0x0ab0: "r" -0x0ab1: "[?]" -0x0ab2: "l" -0x0ab3: "ll" -0x0ab4: "[?]" -0x0ab5: "v" -0x0ab6: "sh" -0x0ab7: "ss" -0x0ab8: "s" -0x0ab9: "h" -0x0aba: "[?]" -0x0abb: "[?]" -0x0abc: "'" -0x0abd: "'" -0x0abe: "aa" -0x0abf: "i" -0x0ac0: "ii" -0x0ac1: "u" -0x0ac2: "uu" -0x0ac3: "R" -0x0ac4: "RR" -0x0ac5: "eN" -0x0ac6: "[?]" -0x0ac7: "e" -0x0ac8: "ai" -0x0ac9: "oN" -0x0aca: "[?]" -0x0acb: "o" -0x0acc: "au" -0x0acd: "" -0x0ace: "[?]" -0x0acf: "[?]" -0x0ad0: "AUM" -0x0ad1: "[?]" -0x0ad2: "[?]" -0x0ad3: "[?]" -0x0ad4: "[?]" -0x0ad5: "[?]" -0x0ad6: "[?]" -0x0ad7: "[?]" -0x0ad8: "[?]" -0x0ad9: "[?]" -0x0ada: "[?]" -0x0adb: "[?]" -0x0adc: "[?]" -0x0add: "[?]" -0x0ade: "[?]" -0x0adf: "[?]" -0x0ae0: "RR" -0x0ae1: "[?]" -0x0ae2: "[?]" -0x0ae3: "[?]" -0x0ae4: "[?]" -0x0ae5: "[?]" -0x0ae6: "0" -0x0ae7: "1" -0x0ae8: "2" -0x0ae9: "3" -0x0aea: "4" -0x0aeb: "5" -0x0aec: "6" -0x0aed: "7" -0x0aee: "8" -0x0aef: "9" -0x0af0: "[?]" -0x0af1: "[?]" -0x0af2: "[?]" -0x0af3: "[?]" -0x0af4: "[?]" -0x0af5: "[?]" -0x0af6: "[?]" -0x0af7: "[?]" -0x0af8: "[?]" -0x0af9: "[?]" -0x0afa: "[?]" -0x0afb: "[?]" -0x0afc: "[?]" -0x0afd: "[?]" -0x0afe: "[?]" -/* x00b */ -0x0b00: "[?]" -0x0b01: "N" -0x0b02: "N" -0x0b03: "H" -0x0b04: "[?]" -0x0b05: "a" -0x0b06: "aa" -0x0b07: "i" -0x0b08: "ii" -0x0b09: "u" -0x0b0a: "uu" -0x0b0b: "R" -0x0b0c: "L" -0x0b0d: "[?]" -0x0b0e: "[?]" -0x0b0f: "e" -0x0b10: "ai" -0x0b11: "[?]" -0x0b12: "[?]" -0x0b13: "o" -0x0b14: "au" -0x0b15: "k" -0x0b16: "kh" -0x0b17: "g" -0x0b18: "gh" -0x0b19: "ng" -0x0b1a: "c" -0x0b1b: "ch" -0x0b1c: "j" -0x0b1d: "jh" -0x0b1e: "ny" -0x0b1f: "tt" -0x0b20: "tth" -0x0b21: "dd" -0x0b22: "ddh" -0x0b23: "nn" -0x0b24: "t" -0x0b25: "th" -0x0b26: "d" -0x0b27: "dh" -0x0b28: "n" -0x0b29: "[?]" -0x0b2a: "p" -0x0b2b: "ph" -0x0b2c: "b" -0x0b2d: "bh" -0x0b2e: "m" -0x0b2f: "y" -0x0b30: "r" -0x0b31: "[?]" -0x0b32: "l" -0x0b33: "ll" -0x0b34: "[?]" -0x0b35: "" -0x0b36: "sh" -0x0b37: "ss" -0x0b38: "s" -0x0b39: "h" -0x0b3a: "[?]" -0x0b3b: "[?]" -0x0b3c: "'" -0x0b3d: "'" -0x0b3e: "aa" -0x0b3f: "i" -0x0b40: "ii" -0x0b41: "u" -0x0b42: "uu" -0x0b43: "R" -0x0b44: "[?]" -0x0b45: "[?]" -0x0b46: "[?]" -0x0b47: "e" -0x0b48: "ai" -0x0b49: "[?]" -0x0b4a: "[?]" -0x0b4b: "o" -0x0b4c: "au" -0x0b4d: "" -0x0b4e: "[?]" -0x0b4f: "[?]" -0x0b50: "[?]" -0x0b51: "[?]" -0x0b52: "[?]" -0x0b53: "[?]" -0x0b54: "[?]" -0x0b55: "[?]" -0x0b56: "+" -0x0b57: "+" -0x0b58: "[?]" -0x0b59: "[?]" -0x0b5a: "[?]" -0x0b5b: "[?]" -0x0b5c: "rr" -0x0b5d: "rh" -0x0b5e: "[?]" -0x0b5f: "yy" -0x0b60: "RR" -0x0b61: "LL" -0x0b62: "[?]" -0x0b63: "[?]" -0x0b64: "[?]" -0x0b65: "[?]" -0x0b66: "0" -0x0b67: "1" -0x0b68: "2" -0x0b69: "3" -0x0b6a: "4" -0x0b6b: "5" -0x0b6c: "6" -0x0b6d: "7" -0x0b6e: "8" -0x0b6f: "9" -0x0b70: "" -0x0b71: "[?]" -0x0b72: "[?]" -0x0b73: "[?]" -0x0b74: "[?]" -0x0b75: "[?]" -0x0b76: "[?]" -0x0b77: "[?]" -0x0b78: "[?]" -0x0b79: "[?]" -0x0b7a: "[?]" -0x0b7b: "[?]" -0x0b7c: "[?]" -0x0b7d: "[?]" -0x0b7e: "[?]" -0x0b7f: "[?]" -0x0b80: "[?]" -0x0b81: "[?]" -0x0b82: "N" -0x0b83: "H" -0x0b84: "[?]" -0x0b85: "a" -0x0b86: "aa" -0x0b87: "i" -0x0b88: "ii" -0x0b89: "u" -0x0b8a: "uu" -0x0b8b: "[?]" -0x0b8c: "[?]" -0x0b8d: "[?]" -0x0b8e: "e" -0x0b8f: "ee" -0x0b90: "ai" -0x0b91: "[?]" -0x0b92: "o" -0x0b93: "oo" -0x0b94: "au" -0x0b95: "k" -0x0b96: "[?]" -0x0b97: "[?]" -0x0b98: "[?]" -0x0b99: "ng" -0x0b9a: "c" -0x0b9b: "[?]" -0x0b9c: "j" -0x0b9d: "[?]" -0x0b9e: "ny" -0x0b9f: "tt" -0x0ba0: "[?]" -0x0ba1: "[?]" -0x0ba2: "[?]" -0x0ba3: "nn" -0x0ba4: "t" -0x0ba5: "[?]" -0x0ba6: "[?]" -0x0ba7: "[?]" -0x0ba8: "n" -0x0ba9: "nnn" -0x0baa: "p" -0x0bab: "[?]" -0x0bac: "[?]" -0x0bad: "[?]" -0x0bae: "m" -0x0baf: "y" -0x0bb0: "r" -0x0bb1: "rr" -0x0bb2: "l" -0x0bb3: "ll" -0x0bb4: "lll" -0x0bb5: "v" -0x0bb6: "[?]" -0x0bb7: "ss" -0x0bb8: "s" -0x0bb9: "h" -0x0bba: "[?]" -0x0bbb: "[?]" -0x0bbc: "[?]" -0x0bbd: "[?]" -0x0bbe: "aa" -0x0bbf: "i" -0x0bc0: "ii" -0x0bc1: "u" -0x0bc2: "uu" -0x0bc3: "[?]" -0x0bc4: "[?]" -0x0bc5: "[?]" -0x0bc6: "e" -0x0bc7: "ee" -0x0bc8: "ai" -0x0bc9: "[?]" -0x0bca: "o" -0x0bcb: "oo" -0x0bcc: "au" -0x0bcd: "" -0x0bce: "[?]" -0x0bcf: "[?]" -0x0bd0: "[?]" -0x0bd1: "[?]" -0x0bd2: "[?]" -0x0bd3: "[?]" -0x0bd4: "[?]" -0x0bd5: "[?]" -0x0bd6: "[?]" -0x0bd7: "+" -0x0bd8: "[?]" -0x0bd9: "[?]" -0x0bda: "[?]" -0x0bdb: "[?]" -0x0bdc: "[?]" -0x0bdd: "[?]" -0x0bde: "[?]" -0x0bdf: "[?]" -0x0be0: "[?]" -0x0be1: "[?]" -0x0be2: "[?]" -0x0be3: "[?]" -0x0be4: "[?]" -0x0be5: "[?]" -0x0be6: "0" -0x0be7: "1" -0x0be8: "2" -0x0be9: "3" -0x0bea: "4" -0x0beb: "5" -0x0bec: "6" -0x0bed: "7" -0x0bee: "8" -0x0bef: "9" -0x0bf0: "+10+" -0x0bf1: "+100+" -0x0bf2: "+1000+" -0x0bf3: "[?]" -0x0bf4: "[?]" -0x0bf5: "[?]" -0x0bf6: "[?]" -0x0bf7: "[?]" -0x0bf8: "[?]" -0x0bf9: "[?]" -0x0bfa: "[?]" -0x0bfb: "[?]" -0x0bfc: "[?]" -0x0bfd: "[?]" -0x0bfe: "[?]" -/* x00c */ -0x0c00: "[?]" -0x0c01: "N" -0x0c02: "N" -0x0c03: "H" -0x0c04: "[?]" -0x0c05: "a" -0x0c06: "aa" -0x0c07: "i" -0x0c08: "ii" -0x0c09: "u" -0x0c0a: "uu" -0x0c0b: "R" -0x0c0c: "L" -0x0c0d: "[?]" -0x0c0e: "e" -0x0c0f: "ee" -0x0c10: "ai" -0x0c11: "[?]" -0x0c12: "o" -0x0c13: "oo" -0x0c14: "au" -0x0c15: "k" -0x0c16: "kh" -0x0c17: "g" -0x0c18: "gh" -0x0c19: "ng" -0x0c1a: "c" -0x0c1b: "ch" -0x0c1c: "j" -0x0c1d: "jh" -0x0c1e: "ny" -0x0c1f: "tt" -0x0c20: "tth" -0x0c21: "dd" -0x0c22: "ddh" -0x0c23: "nn" -0x0c24: "t" -0x0c25: "th" -0x0c26: "d" -0x0c27: "dh" -0x0c28: "n" -0x0c29: "[?]" -0x0c2a: "p" -0x0c2b: "ph" -0x0c2c: "b" -0x0c2d: "bh" -0x0c2e: "m" -0x0c2f: "y" -0x0c30: "r" -0x0c31: "rr" -0x0c32: "l" -0x0c33: "ll" -0x0c34: "[?]" -0x0c35: "v" -0x0c36: "sh" -0x0c37: "ss" -0x0c38: "s" -0x0c39: "h" -0x0c3a: "[?]" -0x0c3b: "[?]" -0x0c3c: "[?]" -0x0c3d: "[?]" -0x0c3e: "aa" -0x0c3f: "i" -0x0c40: "ii" -0x0c41: "u" -0x0c42: "uu" -0x0c43: "R" -0x0c44: "RR" -0x0c45: "[?]" -0x0c46: "e" -0x0c47: "ee" -0x0c48: "ai" -0x0c49: "[?]" -0x0c4a: "o" -0x0c4b: "oo" -0x0c4c: "au" -0x0c4d: "" -0x0c4e: "[?]" -0x0c4f: "[?]" -0x0c50: "[?]" -0x0c51: "[?]" -0x0c52: "[?]" -0x0c53: "[?]" -0x0c54: "[?]" -0x0c55: "+" -0x0c56: "+" -0x0c57: "[?]" -0x0c58: "[?]" -0x0c59: "[?]" -0x0c5a: "[?]" -0x0c5b: "[?]" -0x0c5c: "[?]" -0x0c5d: "[?]" -0x0c5e: "[?]" -0x0c5f: "[?]" -0x0c60: "RR" -0x0c61: "LL" -0x0c62: "[?]" -0x0c63: "[?]" -0x0c64: "[?]" -0x0c65: "[?]" -0x0c66: "0" -0x0c67: "1" -0x0c68: "2" -0x0c69: "3" -0x0c6a: "4" -0x0c6b: "5" -0x0c6c: "6" -0x0c6d: "7" -0x0c6e: "8" -0x0c6f: "9" -0x0c70: "[?]" -0x0c71: "[?]" -0x0c72: "[?]" -0x0c73: "[?]" -0x0c74: "[?]" -0x0c75: "[?]" -0x0c76: "[?]" -0x0c77: "[?]" -0x0c78: "[?]" -0x0c79: "[?]" -0x0c7a: "[?]" -0x0c7b: "[?]" -0x0c7c: "[?]" -0x0c7d: "[?]" -0x0c7e: "[?]" -0x0c7f: "[?]" -0x0c80: "[?]" -0x0c81: "[?]" -0x0c82: "N" -0x0c83: "H" -0x0c84: "[?]" -0x0c85: "a" -0x0c86: "aa" -0x0c87: "i" -0x0c88: "ii" -0x0c89: "u" -0x0c8a: "uu" -0x0c8b: "R" -0x0c8c: "L" -0x0c8d: "[?]" -0x0c8e: "e" -0x0c8f: "ee" -0x0c90: "ai" -0x0c91: "[?]" -0x0c92: "o" -0x0c93: "oo" -0x0c94: "au" -0x0c95: "k" -0x0c96: "kh" -0x0c97: "g" -0x0c98: "gh" -0x0c99: "ng" -0x0c9a: "c" -0x0c9b: "ch" -0x0c9c: "j" -0x0c9d: "jh" -0x0c9e: "ny" -0x0c9f: "tt" -0x0ca0: "tth" -0x0ca1: "dd" -0x0ca2: "ddh" -0x0ca3: "nn" -0x0ca4: "t" -0x0ca5: "th" -0x0ca6: "d" -0x0ca7: "dh" -0x0ca8: "n" -0x0ca9: "[?]" -0x0caa: "p" -0x0cab: "ph" -0x0cac: "b" -0x0cad: "bh" -0x0cae: "m" -0x0caf: "y" -0x0cb0: "r" -0x0cb1: "rr" -0x0cb2: "l" -0x0cb3: "ll" -0x0cb4: "[?]" -0x0cb5: "v" -0x0cb6: "sh" -0x0cb7: "ss" -0x0cb8: "s" -0x0cb9: "h" -0x0cba: "[?]" -0x0cbb: "[?]" -0x0cbc: "[?]" -0x0cbd: "[?]" -0x0cbe: "aa" -0x0cbf: "i" -0x0cc0: "ii" -0x0cc1: "u" -0x0cc2: "uu" -0x0cc3: "R" -0x0cc4: "RR" -0x0cc5: "[?]" -0x0cc6: "e" -0x0cc7: "ee" -0x0cc8: "ai" -0x0cc9: "[?]" -0x0cca: "o" -0x0ccb: "oo" -0x0ccc: "au" -0x0ccd: "" -0x0cce: "[?]" -0x0ccf: "[?]" -0x0cd0: "[?]" -0x0cd1: "[?]" -0x0cd2: "[?]" -0x0cd3: "[?]" -0x0cd4: "[?]" -0x0cd5: "+" -0x0cd6: "+" -0x0cd7: "[?]" -0x0cd8: "[?]" -0x0cd9: "[?]" -0x0cda: "[?]" -0x0cdb: "[?]" -0x0cdc: "[?]" -0x0cdd: "[?]" -0x0cde: "lll" -0x0cdf: "[?]" -0x0ce0: "RR" -0x0ce1: "LL" -0x0ce2: "[?]" -0x0ce3: "[?]" -0x0ce4: "[?]" -0x0ce5: "[?]" -0x0ce6: "0" -0x0ce7: "1" -0x0ce8: "2" -0x0ce9: "3" -0x0cea: "4" -0x0ceb: "5" -0x0cec: "6" -0x0ced: "7" -0x0cee: "8" -0x0cef: "9" -0x0cf0: "[?]" -0x0cf1: "[?]" -0x0cf2: "[?]" -0x0cf3: "[?]" -0x0cf4: "[?]" -0x0cf5: "[?]" -0x0cf6: "[?]" -0x0cf7: "[?]" -0x0cf8: "[?]" -0x0cf9: "[?]" -0x0cfa: "[?]" -0x0cfb: "[?]" -0x0cfc: "[?]" -0x0cfd: "[?]" -0x0cfe: "[?]" -/* x00d */ -0x0d00: "[?]" -0x0d01: "[?]" -0x0d02: "N" -0x0d03: "H" -0x0d04: "[?]" -0x0d05: "a" -0x0d06: "aa" -0x0d07: "i" -0x0d08: "ii" -0x0d09: "u" -0x0d0a: "uu" -0x0d0b: "R" -0x0d0c: "L" -0x0d0d: "[?]" -0x0d0e: "e" -0x0d0f: "ee" -0x0d10: "ai" -0x0d11: "[?]" -0x0d12: "o" -0x0d13: "oo" -0x0d14: "au" -0x0d15: "k" -0x0d16: "kh" -0x0d17: "g" -0x0d18: "gh" -0x0d19: "ng" -0x0d1a: "c" -0x0d1b: "ch" -0x0d1c: "j" -0x0d1d: "jh" -0x0d1e: "ny" -0x0d1f: "tt" -0x0d20: "tth" -0x0d21: "dd" -0x0d22: "ddh" -0x0d23: "nn" -0x0d24: "t" -0x0d25: "th" -0x0d26: "d" -0x0d27: "dh" -0x0d28: "n" -0x0d29: "[?]" -0x0d2a: "p" -0x0d2b: "ph" -0x0d2c: "b" -0x0d2d: "bh" -0x0d2e: "m" -0x0d2f: "y" -0x0d30: "r" -0x0d31: "rr" -0x0d32: "l" -0x0d33: "ll" -0x0d34: "lll" -0x0d35: "v" -0x0d36: "sh" -0x0d37: "ss" -0x0d38: "s" -0x0d39: "h" -0x0d3a: "[?]" -0x0d3b: "[?]" -0x0d3c: "[?]" -0x0d3d: "[?]" -0x0d3e: "aa" -0x0d3f: "i" -0x0d40: "ii" -0x0d41: "u" -0x0d42: "uu" -0x0d43: "R" -0x0d44: "[?]" -0x0d45: "[?]" -0x0d46: "e" -0x0d47: "ee" -0x0d48: "ai" -0x0d49: "" -0x0d4a: "o" -0x0d4b: "oo" -0x0d4c: "au" -0x0d4d: "" -0x0d4e: "[?]" -0x0d4f: "[?]" -0x0d50: "[?]" -0x0d51: "[?]" -0x0d52: "[?]" -0x0d53: "[?]" -0x0d54: "[?]" -0x0d55: "[?]" -0x0d56: "[?]" -0x0d57: "+" -0x0d58: "[?]" -0x0d59: "[?]" -0x0d5a: "[?]" -0x0d5b: "[?]" -0x0d5c: "[?]" -0x0d5d: "[?]" -0x0d5e: "[?]" -0x0d5f: "[?]" -0x0d60: "RR" -0x0d61: "LL" -0x0d62: "[?]" -0x0d63: "[?]" -0x0d64: "[?]" -0x0d65: "[?]" -0x0d66: "0" -0x0d67: "1" -0x0d68: "2" -0x0d69: "3" -0x0d6a: "4" -0x0d6b: "5" -0x0d6c: "6" -0x0d6d: "7" -0x0d6e: "8" -0x0d6f: "9" -0x0d70: "[?]" -0x0d71: "[?]" -0x0d72: "[?]" -0x0d73: "[?]" -0x0d74: "[?]" -0x0d75: "[?]" -0x0d76: "[?]" -0x0d77: "[?]" -0x0d78: "[?]" -0x0d79: "[?]" -0x0d7a: "[?]" -0x0d7b: "[?]" -0x0d7c: "[?]" -0x0d7d: "[?]" -0x0d7e: "[?]" -0x0d7f: "[?]" -0x0d80: "[?]" -0x0d81: "[?]" -0x0d82: "N" -0x0d83: "H" -0x0d84: "[?]" -0x0d85: "a" -0x0d86: "aa" -0x0d87: "ae" -0x0d88: "aae" -0x0d89: "i" -0x0d8a: "ii" -0x0d8b: "u" -0x0d8c: "uu" -0x0d8d: "R" -0x0d8e: "RR" -0x0d8f: "L" -0x0d90: "LL" -0x0d91: "e" -0x0d92: "ee" -0x0d93: "ai" -0x0d94: "o" -0x0d95: "oo" -0x0d96: "au" -0x0d97: "[?]" -0x0d98: "[?]" -0x0d99: "[?]" -0x0d9a: "k" -0x0d9b: "kh" -0x0d9c: "g" -0x0d9d: "gh" -0x0d9e: "ng" -0x0d9f: "nng" -0x0da0: "c" -0x0da1: "ch" -0x0da2: "j" -0x0da3: "jh" -0x0da4: "ny" -0x0da5: "jny" -0x0da6: "nyj" -0x0da7: "tt" -0x0da8: "tth" -0x0da9: "dd" -0x0daa: "ddh" -0x0dab: "nn" -0x0dac: "nndd" -0x0dad: "t" -0x0dae: "th" -0x0daf: "d" -0x0db0: "dh" -0x0db1: "n" -0x0db2: "[?]" -0x0db3: "nd" -0x0db4: "p" -0x0db5: "ph" -0x0db6: "b" -0x0db7: "bh" -0x0db8: "m" -0x0db9: "mb" -0x0dba: "y" -0x0dbb: "r" -0x0dbc: "[?]" -0x0dbd: "l" -0x0dbe: "[?]" -0x0dbf: "[?]" -0x0dc0: "v" -0x0dc1: "sh" -0x0dc2: "ss" -0x0dc3: "s" -0x0dc4: "h" -0x0dc5: "ll" -0x0dc6: "f" -0x0dc7: "[?]" -0x0dc8: "[?]" -0x0dc9: "[?]" -0x0dca: "" -0x0dcb: "[?]" -0x0dcc: "[?]" -0x0dcd: "[?]" -0x0dce: "[?]" -0x0dcf: "aa" -0x0dd0: "ae" -0x0dd1: "aae" -0x0dd2: "i" -0x0dd3: "ii" -0x0dd4: "u" -0x0dd5: "[?]" -0x0dd6: "uu" -0x0dd7: "[?]" -0x0dd8: "R" -0x0dd9: "e" -0x0dda: "ee" -0x0ddb: "ai" -0x0ddc: "o" -0x0ddd: "oo" -0x0dde: "au" -0x0ddf: "L" -0x0de0: "[?]" -0x0de1: "[?]" -0x0de2: "[?]" -0x0de3: "[?]" -0x0de4: "[?]" -0x0de5: "[?]" -0x0de6: "[?]" -0x0de7: "[?]" -0x0de8: "[?]" -0x0de9: "[?]" -0x0dea: "[?]" -0x0deb: "[?]" -0x0dec: "[?]" -0x0ded: "[?]" -0x0dee: "[?]" -0x0def: "[?]" -0x0df0: "[?]" -0x0df1: "[?]" -0x0df2: "RR" -0x0df3: "LL" -0x0df4: " . " -0x0df5: "[?]" -0x0df6: "[?]" -0x0df7: "[?]" -0x0df8: "[?]" -0x0df9: "[?]" -0x0dfa: "[?]" -0x0dfb: "[?]" -0x0dfc: "[?]" -0x0dfd: "[?]" -0x0dfe: "[?]" -/* x00e */ -0x0e00: "[?]" -0x0e01: "k" -0x0e02: "kh" -0x0e03: "kh" -0x0e04: "kh" -0x0e05: "kh" -0x0e06: "kh" -0x0e07: "ng" -0x0e08: "cch" -0x0e09: "ch" -0x0e0a: "ch" -0x0e0b: "ch" -0x0e0c: "ch" -0x0e0d: "y" -0x0e0e: "d" -0x0e0f: "t" -0x0e10: "th" -0x0e11: "th" -0x0e12: "th" -0x0e13: "n" -0x0e14: "d" -0x0e15: "t" -0x0e16: "th" -0x0e17: "th" -0x0e18: "th" -0x0e19: "n" -0x0e1a: "b" -0x0e1b: "p" -0x0e1c: "ph" -0x0e1d: "f" -0x0e1e: "ph" -0x0e1f: "f" -0x0e20: "ph" -0x0e21: "m" -0x0e22: "y" -0x0e23: "r" -0x0e24: "R" -0x0e25: "l" -0x0e26: "L" -0x0e27: "w" -0x0e28: "s" -0x0e29: "s" -0x0e2a: "s" -0x0e2b: "h" -0x0e2c: "l" -0x0e2d: "`" -0x0e2e: "h" -0x0e2f: "~" -0x0e30: "a" -0x0e31: "a" -0x0e32: "aa" -0x0e33: "am" -0x0e34: "i" -0x0e35: "ii" -0x0e36: "ue" -0x0e37: "uue" -0x0e38: "u" -0x0e39: "uu" -0x0e3a: "'" -0x0e3b: "[?]" -0x0e3c: "[?]" -0x0e3d: "[?]" -0x0e3e: "[?]" -0x0e3f: "Bh." -0x0e40: "e" -0x0e41: "ae" -0x0e42: "o" -0x0e43: "ai" -0x0e44: "ai" -0x0e45: "ao" -0x0e46: "+" -0x0e47: "" -0x0e48: "" -0x0e49: "" -0x0e4a: "" -0x0e4b: "" -0x0e4c: "" -0x0e4d: "M" -0x0e4e: "" -0x0e4f: " * " -0x0e50: "0" -0x0e51: "1" -0x0e52: "2" -0x0e53: "3" -0x0e54: "4" -0x0e55: "5" -0x0e56: "6" -0x0e57: "7" -0x0e58: "8" -0x0e59: "9" -0x0e5a: " // " -0x0e5b: " /// " -0x0e5c: "[?]" -0x0e5d: "[?]" -0x0e5e: "[?]" -0x0e5f: "[?]" -0x0e60: "[?]" -0x0e61: "[?]" -0x0e62: "[?]" -0x0e63: "[?]" -0x0e64: "[?]" -0x0e65: "[?]" -0x0e66: "[?]" -0x0e67: "[?]" -0x0e68: "[?]" -0x0e69: "[?]" -0x0e6a: "[?]" -0x0e6b: "[?]" -0x0e6c: "[?]" -0x0e6d: "[?]" -0x0e6e: "[?]" -0x0e6f: "[?]" -0x0e70: "[?]" -0x0e71: "[?]" -0x0e72: "[?]" -0x0e73: "[?]" -0x0e74: "[?]" -0x0e75: "[?]" -0x0e76: "[?]" -0x0e77: "[?]" -0x0e78: "[?]" -0x0e79: "[?]" -0x0e7a: "[?]" -0x0e7b: "[?]" -0x0e7c: "[?]" -0x0e7d: "[?]" -0x0e7e: "[?]" -0x0e7f: "[?]" -0x0e80: "[?]" -0x0e81: "k" -0x0e82: "kh" -0x0e83: "[?]" -0x0e84: "kh" -0x0e85: "[?]" -0x0e86: "[?]" -0x0e87: "ng" -0x0e88: "ch" -0x0e89: "[?]" -0x0e8a: "s" -0x0e8b: "[?]" -0x0e8c: "[?]" -0x0e8d: "ny" -0x0e8e: "[?]" -0x0e8f: "[?]" -0x0e90: "[?]" -0x0e91: "[?]" -0x0e92: "[?]" -0x0e93: "[?]" -0x0e94: "d" -0x0e95: "h" -0x0e96: "th" -0x0e97: "th" -0x0e98: "[?]" -0x0e99: "n" -0x0e9a: "b" -0x0e9b: "p" -0x0e9c: "ph" -0x0e9d: "f" -0x0e9e: "ph" -0x0e9f: "f" -0x0ea0: "[?]" -0x0ea1: "m" -0x0ea2: "y" -0x0ea3: "r" -0x0ea4: "[?]" -0x0ea5: "l" -0x0ea6: "[?]" -0x0ea7: "w" -0x0ea8: "[?]" -0x0ea9: "[?]" -0x0eaa: "s" -0x0eab: "h" -0x0eac: "[?]" -0x0ead: "`" -0x0eae: "" -0x0eaf: "~" -0x0eb0: "a" -0x0eb1: "" -0x0eb2: "aa" -0x0eb3: "am" -0x0eb4: "i" -0x0eb5: "ii" -0x0eb6: "y" -0x0eb7: "yy" -0x0eb8: "u" -0x0eb9: "uu" -0x0eba: "[?]" -0x0ebb: "o" -0x0ebc: "l" -0x0ebd: "ny" -0x0ebe: "[?]" -0x0ebf: "[?]" -0x0ec0: "e" -0x0ec1: "ei" -0x0ec2: "o" -0x0ec3: "ay" -0x0ec4: "ai" -0x0ec5: "[?]" -0x0ec6: "+" -0x0ec7: "[?]" -0x0ec8: "" -0x0ec9: "" -0x0eca: "" -0x0ecb: "" -0x0ecc: "" -0x0ecd: "M" -0x0ece: "[?]" -0x0ecf: "[?]" -0x0ed0: "0" -0x0ed1: "1" -0x0ed2: "2" -0x0ed3: "3" -0x0ed4: "4" -0x0ed5: "5" -0x0ed6: "6" -0x0ed7: "7" -0x0ed8: "8" -0x0ed9: "9" -0x0eda: "[?]" -0x0edb: "[?]" -0x0edc: "hn" -0x0edd: "hm" -0x0ede: "[?]" -0x0edf: "[?]" -0x0ee0: "[?]" -0x0ee1: "[?]" -0x0ee2: "[?]" -0x0ee3: "[?]" -0x0ee4: "[?]" -0x0ee5: "[?]" -0x0ee6: "[?]" -0x0ee7: "[?]" -0x0ee8: "[?]" -0x0ee9: "[?]" -0x0eea: "[?]" -0x0eeb: "[?]" -0x0eec: "[?]" -0x0eed: "[?]" -0x0eee: "[?]" -0x0eef: "[?]" -0x0ef0: "[?]" -0x0ef1: "[?]" -0x0ef2: "[?]" -0x0ef3: "[?]" -0x0ef4: "[?]" -0x0ef5: "[?]" -0x0ef6: "[?]" -0x0ef7: "[?]" -0x0ef8: "[?]" -0x0ef9: "[?]" -0x0efa: "[?]" -0x0efb: "[?]" -0x0efc: "[?]" -0x0efd: "[?]" -0x0efe: "[?]" -/* x00f */ -0x0f00: "AUM" -0x0f01: "" -0x0f02: "" -0x0f03: "" -0x0f04: "" -0x0f05: "" -0x0f06: "" -0x0f07: "" -0x0f08: " // " -0x0f09: " * " -0x0f0a: "" -0x0f0b: "-" -0x0f0c: " / " -0x0f0d: " / " -0x0f0e: " // " -0x0f0f: " -/ " -0x0f10: " +/ " -0x0f11: " X/ " -0x0f12: " /XX/ " -0x0f13: " /X/ " -0x0f14: ", " -0x0f15: "" -0x0f16: "" -0x0f17: "" -0x0f18: "" -0x0f19: "" -0x0f1a: "" -0x0f1b: "" -0x0f1c: "" -0x0f1d: "" -0x0f1e: "" -0x0f1f: "" -0x0f20: "0" -0x0f21: "1" -0x0f22: "2" -0x0f23: "3" -0x0f24: "4" -0x0f25: "5" -0x0f26: "6" -0x0f27: "7" -0x0f28: "8" -0x0f29: "9" -0x0f2a: ".5" -0x0f2b: "1.5" -0x0f2c: "2.5" -0x0f2d: "3.5" -0x0f2e: "4.5" -0x0f2f: "5.5" -0x0f30: "6.5" -0x0f31: "7.5" -0x0f32: "8.5" -0x0f33: "-.5" -0x0f34: "+" -0x0f35: "*" -0x0f36: "^" -0x0f37: "_" -0x0f38: "" -0x0f39: "~" -0x0f3a: "[?]" -0x0f3b: "]" -0x0f3c: "[[" -0x0f3d: "]]" -0x0f3e: "" -0x0f3f: "" -0x0f40: "k" -0x0f41: "kh" -0x0f42: "g" -0x0f43: "gh" -0x0f44: "ng" -0x0f45: "c" -0x0f46: "ch" -0x0f47: "j" -0x0f48: "[?]" -0x0f49: "ny" -0x0f4a: "tt" -0x0f4b: "tth" -0x0f4c: "dd" -0x0f4d: "ddh" -0x0f4e: "nn" -0x0f4f: "t" -0x0f50: "th" -0x0f51: "d" -0x0f52: "dh" -0x0f53: "n" -0x0f54: "p" -0x0f55: "ph" -0x0f56: "b" -0x0f57: "bh" -0x0f58: "m" -0x0f59: "ts" -0x0f5a: "tsh" -0x0f5b: "dz" -0x0f5c: "dzh" -0x0f5d: "w" -0x0f5e: "zh" -0x0f5f: "z" -0x0f60: "'" -0x0f61: "y" -0x0f62: "r" -0x0f63: "l" -0x0f64: "sh" -0x0f65: "ssh" -0x0f66: "s" -0x0f67: "h" -0x0f68: "a" -0x0f69: "kss" -0x0f6a: "r" -0x0f6b: "[?]" -0x0f6c: "[?]" -0x0f6d: "[?]" -0x0f6e: "[?]" -0x0f6f: "[?]" -0x0f70: "[?]" -0x0f71: "aa" -0x0f72: "i" -0x0f73: "ii" -0x0f74: "u" -0x0f75: "uu" -0x0f76: "R" -0x0f77: "RR" -0x0f78: "L" -0x0f79: "LL" -0x0f7a: "e" -0x0f7b: "ee" -0x0f7c: "o" -0x0f7d: "oo" -0x0f7e: "M" -0x0f7f: "H" -0x0f80: "i" -0x0f81: "ii" -0x0f82: "" -0x0f83: "" -0x0f84: "" -0x0f85: "" -0x0f86: "" -0x0f87: "" -0x0f88: "" -0x0f89: "" -0x0f8a: "" -0x0f8b: "" -0x0f8c: "[?]" -0x0f8d: "[?]" -0x0f8e: "[?]" -0x0f8f: "[?]" -0x0f90: "k" -0x0f91: "kh" -0x0f92: "g" -0x0f93: "gh" -0x0f94: "ng" -0x0f95: "c" -0x0f96: "ch" -0x0f97: "j" -0x0f98: "[?]" -0x0f99: "ny" -0x0f9a: "tt" -0x0f9b: "tth" -0x0f9c: "dd" -0x0f9d: "ddh" -0x0f9e: "nn" -0x0f9f: "t" -0x0fa0: "th" -0x0fa1: "d" -0x0fa2: "dh" -0x0fa3: "n" -0x0fa4: "p" -0x0fa5: "ph" -0x0fa6: "b" -0x0fa7: "bh" -0x0fa8: "m" -0x0fa9: "ts" -0x0faa: "tsh" -0x0fab: "dz" -0x0fac: "dzh" -0x0fad: "w" -0x0fae: "zh" -0x0faf: "z" -0x0fb0: "'" -0x0fb1: "y" -0x0fb2: "r" -0x0fb3: "l" -0x0fb4: "sh" -0x0fb5: "ss" -0x0fb6: "s" -0x0fb7: "h" -0x0fb8: "a" -0x0fb9: "kss" -0x0fba: "w" -0x0fbb: "y" -0x0fbc: "r" -0x0fbd: "[?]" -0x0fbe: "X" -0x0fbf: " :X: " -0x0fc0: " /O/ " -0x0fc1: " /o/ " -0x0fc2: " \\o\\ " -0x0fc3: " (O) " -0x0fc4: "" -0x0fc5: "" -0x0fc6: "" -0x0fc7: "" -0x0fc8: "" -0x0fc9: "" -0x0fca: "" -0x0fcb: "" -0x0fcc: "" -0x0fcd: "[?]" -0x0fce: "[?]" -0x0fcf: "" -0x0fd0: "[?]" -0x0fd1: "[?]" -0x0fd2: "[?]" -0x0fd3: "[?]" -0x0fd4: "[?]" -0x0fd5: "[?]" -0x0fd6: "[?]" -0x0fd7: "[?]" -0x0fd8: "[?]" -0x0fd9: "[?]" -0x0fda: "[?]" -0x0fdb: "[?]" -0x0fdc: "[?]" -0x0fdd: "[?]" -0x0fde: "[?]" -0x0fdf: "[?]" -0x0fe0: "[?]" -0x0fe1: "[?]" -0x0fe2: "[?]" -0x0fe3: "[?]" -0x0fe4: "[?]" -0x0fe5: "[?]" -0x0fe6: "[?]" -0x0fe7: "[?]" -0x0fe8: "[?]" -0x0fe9: "[?]" -0x0fea: "[?]" -0x0feb: "[?]" -0x0fec: "[?]" -0x0fed: "[?]" -0x0fee: "[?]" -0x0fef: "[?]" -0x0ff0: "[?]" -0x0ff1: "[?]" -0x0ff2: "[?]" -0x0ff3: "[?]" -0x0ff4: "[?]" -0x0ff5: "[?]" -0x0ff6: "[?]" -0x0ff7: "[?]" -0x0ff8: "[?]" -0x0ff9: "[?]" -0x0ffa: "[?]" -0x0ffb: "[?]" -0x0ffc: "[?]" -0x0ffd: "[?]" -0x0ffe: "[?]" -/* x010 */ -0x1000: "k" -0x1001: "kh" -0x1002: "g" -0x1003: "gh" -0x1004: "ng" -0x1005: "c" -0x1006: "ch" -0x1007: "j" -0x1008: "jh" -0x1009: "ny" -0x100a: "nny" -0x100b: "tt" -0x100c: "tth" -0x100d: "dd" -0x100e: "ddh" -0x100f: "nn" -0x1010: "tt" -0x1011: "th" -0x1012: "d" -0x1013: "dh" -0x1014: "n" -0x1015: "p" -0x1016: "ph" -0x1017: "b" -0x1018: "bh" -0x1019: "m" -0x101a: "y" -0x101b: "r" -0x101c: "l" -0x101d: "w" -0x101e: "s" -0x101f: "h" -0x1020: "ll" -0x1021: "a" -0x1022: "[?]" -0x1023: "i" -0x1024: "ii" -0x1025: "u" -0x1026: "uu" -0x1027: "e" -0x1028: "[?]" -0x1029: "o" -0x102a: "au" -0x102b: "[?]" -0x102c: "aa" -0x102d: "i" -0x102e: "ii" -0x102f: "u" -0x1030: "uu" -0x1031: "e" -0x1032: "ai" -0x1033: "[?]" -0x1034: "[?]" -0x1035: "[?]" -0x1036: "N" -0x1037: "'" -0x1038: ":" -0x1039: "" -0x103a: "[?]" -0x103b: "[?]" -0x103c: "[?]" -0x103d: "[?]" -0x103e: "[?]" -0x103f: "[?]" -0x1040: "0" -0x1041: "1" -0x1042: "2" -0x1043: "3" -0x1044: "4" -0x1045: "5" -0x1046: "6" -0x1047: "7" -0x1048: "8" -0x1049: "9" -0x104a: " / " -0x104b: " // " -0x104c: "n*" -0x104d: "r*" -0x104e: "l*" -0x104f: "e*" -0x1050: "sh" -0x1051: "ss" -0x1052: "R" -0x1053: "RR" -0x1054: "L" -0x1055: "LL" -0x1056: "R" -0x1057: "RR" -0x1058: "L" -0x1059: "LL" -0x105a: "[?]" -0x105b: "[?]" -0x105c: "[?]" -0x105d: "[?]" -0x105e: "[?]" -0x105f: "[?]" -0x1060: "[?]" -0x1061: "[?]" -0x1062: "[?]" -0x1063: "[?]" -0x1064: "[?]" -0x1065: "[?]" -0x1066: "[?]" -0x1067: "[?]" -0x1068: "[?]" -0x1069: "[?]" -0x106a: "[?]" -0x106b: "[?]" -0x106c: "[?]" -0x106d: "[?]" -0x106e: "[?]" -0x106f: "[?]" -0x1070: "[?]" -0x1071: "[?]" -0x1072: "[?]" -0x1073: "[?]" -0x1074: "[?]" -0x1075: "[?]" -0x1076: "[?]" -0x1077: "[?]" -0x1078: "[?]" -0x1079: "[?]" -0x107a: "[?]" -0x107b: "[?]" -0x107c: "[?]" -0x107d: "[?]" -0x107e: "[?]" -0x107f: "[?]" -0x1080: "[?]" -0x1081: "[?]" -0x1082: "[?]" -0x1083: "[?]" -0x1084: "[?]" -0x1085: "[?]" -0x1086: "[?]" -0x1087: "[?]" -0x1088: "[?]" -0x1089: "[?]" -0x108a: "[?]" -0x108b: "[?]" -0x108c: "[?]" -0x108d: "[?]" -0x108e: "[?]" -0x108f: "[?]" -0x1090: "[?]" -0x1091: "[?]" -0x1092: "[?]" -0x1093: "[?]" -0x1094: "[?]" -0x1095: "[?]" -0x1096: "[?]" -0x1097: "[?]" -0x1098: "[?]" -0x1099: "[?]" -0x109a: "[?]" -0x109b: "[?]" -0x109c: "[?]" -0x109d: "[?]" -0x109e: "[?]" -0x109f: "[?]" -0x10a0: "A" -0x10a1: "B" -0x10a2: "G" -0x10a3: "D" -0x10a4: "E" -0x10a5: "V" -0x10a6: "Z" -0x10a7: "T`" -0x10a8: "I" -0x10a9: "K" -0x10aa: "L" -0x10ab: "M" -0x10ac: "N" -0x10ad: "O" -0x10ae: "P" -0x10af: "Zh" -0x10b0: "R" -0x10b1: "S" -0x10b2: "T" -0x10b3: "U" -0x10b4: "P`" -0x10b5: "K`" -0x10b6: "G'" -0x10b7: "Q" -0x10b8: "Sh" -0x10b9: "Ch`" -0x10ba: "C`" -0x10bb: "Z'" -0x10bc: "C" -0x10bd: "Ch" -0x10be: "X" -0x10bf: "J" -0x10c0: "H" -0x10c1: "E" -0x10c2: "Y" -0x10c3: "W" -0x10c4: "Xh" -0x10c5: "OE" -0x10c6: "[?]" -0x10c7: "[?]" -0x10c8: "[?]" -0x10c9: "[?]" -0x10ca: "[?]" -0x10cb: "[?]" -0x10cc: "[?]" -0x10cd: "[?]" -0x10ce: "[?]" -0x10cf: "[?]" -0x10d0: "a" -0x10d1: "b" -0x10d2: "g" -0x10d3: "d" -0x10d4: "e" -0x10d5: "v" -0x10d6: "z" -0x10d7: "t`" -0x10d8: "i" -0x10d9: "k" -0x10da: "l" -0x10db: "m" -0x10dc: "n" -0x10dd: "o" -0x10de: "p" -0x10df: "zh" -0x10e0: "r" -0x10e1: "s" -0x10e2: "t" -0x10e3: "u" -0x10e4: "p`" -0x10e5: "k`" -0x10e6: "g'" -0x10e7: "q" -0x10e8: "sh" -0x10e9: "ch`" -0x10ea: "c`" -0x10eb: "z'" -0x10ec: "c" -0x10ed: "ch" -0x10ee: "x" -0x10ef: "j" -0x10f0: "h" -0x10f1: "e" -0x10f2: "y" -0x10f3: "w" -0x10f4: "xh" -0x10f5: "oe" -0x10f6: "f" -0x10f7: "[?]" -0x10f8: "[?]" -0x10f9: "[?]" -0x10fa: "[?]" -0x10fb: " // " -0x10fc: "[?]" -0x10fd: "[?]" -0x10fe: "[?]" -/* x011 */ -0x1100: "g" -0x1101: "gg" -0x1102: "n" -0x1103: "d" -0x1104: "dd" -0x1105: "r" -0x1106: "m" -0x1107: "b" -0x1108: "bb" -0x1109: "s" -0x110a: "ss" -0x110b: "" -0x110c: "j" -0x110d: "jj" -0x110e: "c" -0x110f: "k" -0x1110: "t" -0x1111: "p" -0x1112: "h" -0x1113: "ng" -0x1114: "nn" -0x1115: "nd" -0x1116: "nb" -0x1117: "dg" -0x1118: "rn" -0x1119: "rr" -0x111a: "rh" -0x111b: "rN" -0x111c: "mb" -0x111d: "mN" -0x111e: "bg" -0x111f: "bn" -0x1120: "" -0x1121: "bs" -0x1122: "bsg" -0x1123: "bst" -0x1124: "bsb" -0x1125: "bss" -0x1126: "bsj" -0x1127: "bj" -0x1128: "bc" -0x1129: "bt" -0x112a: "bp" -0x112b: "bN" -0x112c: "bbN" -0x112d: "sg" -0x112e: "sn" -0x112f: "sd" -0x1130: "sr" -0x1131: "sm" -0x1132: "sb" -0x1133: "sbg" -0x1134: "sss" -0x1135: "s" -0x1136: "sj" -0x1137: "sc" -0x1138: "sk" -0x1139: "st" -0x113a: "sp" -0x113b: "sh" -0x113c: "" -0x113d: "" -0x113e: "" -0x113f: "" -0x1140: "Z" -0x1141: "g" -0x1142: "d" -0x1143: "m" -0x1144: "b" -0x1145: "s" -0x1146: "Z" -0x1147: "" -0x1148: "j" -0x1149: "c" -0x114a: "t" -0x114b: "p" -0x114c: "N" -0x114d: "j" -0x114e: "" -0x114f: "" -0x1150: "" -0x1151: "" -0x1152: "ck" -0x1153: "ch" -0x1154: "" -0x1155: "" -0x1156: "pb" -0x1157: "pN" -0x1158: "hh" -0x1159: "Q" -0x115a: "[?]" -0x115b: "[?]" -0x115c: "[?]" -0x115d: "[?]" -0x115e: "[?]" -0x115f: "" -0x1160: "" -0x1161: "a" -0x1162: "ae" -0x1163: "ya" -0x1164: "yae" -0x1165: "eo" -0x1166: "e" -0x1167: "yeo" -0x1168: "ye" -0x1169: "o" -0x116a: "wa" -0x116b: "wae" -0x116c: "oe" -0x116d: "yo" -0x116e: "u" -0x116f: "weo" -0x1170: "we" -0x1171: "wi" -0x1172: "yu" -0x1173: "eu" -0x1174: "yi" -0x1175: "i" -0x1176: "a-o" -0x1177: "a-u" -0x1178: "ya-o" -0x1179: "ya-yo" -0x117a: "eo-o" -0x117b: "eo-u" -0x117c: "eo-eu" -0x117d: "yeo-o" -0x117e: "yeo-u" -0x117f: "o-eo" -0x1180: "o-e" -0x1181: "o-ye" -0x1182: "o-o" -0x1183: "o-u" -0x1184: "yo-ya" -0x1185: "yo-yae" -0x1186: "yo-yeo" -0x1187: "yo-o" -0x1188: "yo-i" -0x1189: "u-a" -0x118a: "u-ae" -0x118b: "u-eo-eu" -0x118c: "u-ye" -0x118d: "u-u" -0x118e: "yu-a" -0x118f: "yu-eo" -0x1190: "yu-e" -0x1191: "yu-yeo" -0x1192: "yu-ye" -0x1193: "yu-u" -0x1194: "yu-i" -0x1195: "eu-u" -0x1196: "eu-eu" -0x1197: "yi-u" -0x1198: "i-a" -0x1199: "i-ya" -0x119a: "i-o" -0x119b: "i-u" -0x119c: "i-eu" -0x119d: "i-U" -0x119e: "U" -0x119f: "U-eo" -0x11a0: "U-u" -0x11a1: "U-i" -0x11a2: "UU" -0x11a3: "[?]" -0x11a4: "[?]" -0x11a5: "[?]" -0x11a6: "[?]" -0x11a7: "[?]" -0x11a8: "g" -0x11a9: "gg" -0x11aa: "gs" -0x11ab: "n" -0x11ac: "nj" -0x11ad: "nh" -0x11ae: "d" -0x11af: "l" -0x11b0: "lg" -0x11b1: "lm" -0x11b2: "lb" -0x11b3: "ls" -0x11b4: "lt" -0x11b5: "lp" -0x11b6: "lh" -0x11b7: "m" -0x11b8: "b" -0x11b9: "bs" -0x11ba: "s" -0x11bb: "ss" -0x11bc: "ng" -0x11bd: "j" -0x11be: "c" -0x11bf: "k" -0x11c0: "t" -0x11c1: "p" -0x11c2: "h" -0x11c3: "gl" -0x11c4: "gsg" -0x11c5: "ng" -0x11c6: "nd" -0x11c7: "ns" -0x11c8: "nZ" -0x11c9: "nt" -0x11ca: "dg" -0x11cb: "tl" -0x11cc: "lgs" -0x11cd: "ln" -0x11ce: "ld" -0x11cf: "lth" -0x11d0: "ll" -0x11d1: "lmg" -0x11d2: "lms" -0x11d3: "lbs" -0x11d4: "lbh" -0x11d5: "rNp" -0x11d6: "lss" -0x11d7: "lZ" -0x11d8: "lk" -0x11d9: "lQ" -0x11da: "mg" -0x11db: "ml" -0x11dc: "mb" -0x11dd: "ms" -0x11de: "mss" -0x11df: "mZ" -0x11e0: "mc" -0x11e1: "mh" -0x11e2: "mN" -0x11e3: "bl" -0x11e4: "bp" -0x11e5: "ph" -0x11e6: "pN" -0x11e7: "sg" -0x11e8: "sd" -0x11e9: "sl" -0x11ea: "sb" -0x11eb: "Z" -0x11ec: "g" -0x11ed: "ss" -0x11ee: "" -0x11ef: "kh" -0x11f0: "N" -0x11f1: "Ns" -0x11f2: "NZ" -0x11f3: "pb" -0x11f4: "pN" -0x11f5: "hn" -0x11f6: "hl" -0x11f7: "hm" -0x11f8: "hb" -0x11f9: "Q" -0x11fa: "[?]" -0x11fb: "[?]" -0x11fc: "[?]" -0x11fd: "[?]" -0x11fe: "[?]" -/* x012 */ -0x1200: "ha" -0x1201: "hu" -0x1202: "hi" -0x1203: "haa" -0x1204: "hee" -0x1205: "he" -0x1206: "ho" -0x1207: "[?]" -0x1208: "la" -0x1209: "lu" -0x120a: "li" -0x120b: "laa" -0x120c: "lee" -0x120d: "le" -0x120e: "lo" -0x120f: "lwa" -0x1210: "hha" -0x1211: "hhu" -0x1212: "hhi" -0x1213: "hhaa" -0x1214: "hhee" -0x1215: "hhe" -0x1216: "hho" -0x1217: "hhwa" -0x1218: "ma" -0x1219: "mu" -0x121a: "mi" -0x121b: "maa" -0x121c: "mee" -0x121d: "me" -0x121e: "mo" -0x121f: "mwa" -0x1220: "sza" -0x1221: "szu" -0x1222: "szi" -0x1223: "szaa" -0x1224: "szee" -0x1225: "sze" -0x1226: "szo" -0x1227: "szwa" -0x1228: "ra" -0x1229: "ru" -0x122a: "ri" -0x122b: "raa" -0x122c: "ree" -0x122d: "re" -0x122e: "ro" -0x122f: "rwa" -0x1230: "sa" -0x1231: "su" -0x1232: "si" -0x1233: "saa" -0x1234: "see" -0x1235: "se" -0x1236: "so" -0x1237: "swa" -0x1238: "sha" -0x1239: "shu" -0x123a: "shi" -0x123b: "shaa" -0x123c: "shee" -0x123d: "she" -0x123e: "sho" -0x123f: "shwa" -0x1240: "qa" -0x1241: "qu" -0x1242: "qi" -0x1243: "qaa" -0x1244: "qee" -0x1245: "qe" -0x1246: "qo" -0x1247: "[?]" -0x1248: "qwa" -0x1249: "[?]" -0x124a: "qwi" -0x124b: "qwaa" -0x124c: "qwee" -0x124d: "qwe" -0x124e: "[?]" -0x124f: "[?]" -0x1250: "qha" -0x1251: "qhu" -0x1252: "qhi" -0x1253: "qhaa" -0x1254: "qhee" -0x1255: "qhe" -0x1256: "qho" -0x1257: "[?]" -0x1258: "qhwa" -0x1259: "[?]" -0x125a: "qhwi" -0x125b: "qhwaa" -0x125c: "qhwee" -0x125d: "qhwe" -0x125e: "[?]" -0x125f: "[?]" -0x1260: "ba" -0x1261: "bu" -0x1262: "bi" -0x1263: "baa" -0x1264: "bee" -0x1265: "be" -0x1266: "bo" -0x1267: "bwa" -0x1268: "va" -0x1269: "vu" -0x126a: "vi" -0x126b: "vaa" -0x126c: "vee" -0x126d: "ve" -0x126e: "vo" -0x126f: "vwa" -0x1270: "ta" -0x1271: "tu" -0x1272: "ti" -0x1273: "taa" -0x1274: "tee" -0x1275: "te" -0x1276: "to" -0x1277: "twa" -0x1278: "ca" -0x1279: "cu" -0x127a: "ci" -0x127b: "caa" -0x127c: "cee" -0x127d: "ce" -0x127e: "co" -0x127f: "cwa" -0x1280: "xa" -0x1281: "xu" -0x1282: "xi" -0x1283: "xaa" -0x1284: "xee" -0x1285: "xe" -0x1286: "xo" -0x1287: "[?]" -0x1288: "xwa" -0x1289: "[?]" -0x128a: "xwi" -0x128b: "xwaa" -0x128c: "xwee" -0x128d: "xwe" -0x128e: "[?]" -0x128f: "[?]" -0x1290: "na" -0x1291: "nu" -0x1292: "ni" -0x1293: "naa" -0x1294: "nee" -0x1295: "ne" -0x1296: "no" -0x1297: "nwa" -0x1298: "nya" -0x1299: "nyu" -0x129a: "nyi" -0x129b: "nyaa" -0x129c: "nyee" -0x129d: "nye" -0x129e: "nyo" -0x129f: "nywa" -0x12a0: "'a" -0x12a1: "'u" -0x12a2: "[?]" -0x12a3: "'aa" -0x12a4: "'ee" -0x12a5: "'e" -0x12a6: "'o" -0x12a7: "'wa" -0x12a8: "ka" -0x12a9: "ku" -0x12aa: "ki" -0x12ab: "kaa" -0x12ac: "kee" -0x12ad: "ke" -0x12ae: "ko" -0x12af: "[?]" -0x12b0: "kwa" -0x12b1: "[?]" -0x12b2: "kwi" -0x12b3: "kwaa" -0x12b4: "kwee" -0x12b5: "kwe" -0x12b6: "[?]" -0x12b7: "[?]" -0x12b8: "kxa" -0x12b9: "kxu" -0x12ba: "kxi" -0x12bb: "kxaa" -0x12bc: "kxee" -0x12bd: "kxe" -0x12be: "kxo" -0x12bf: "[?]" -0x12c0: "kxwa" -0x12c1: "[?]" -0x12c2: "kxwi" -0x12c3: "kxwaa" -0x12c4: "kxwee" -0x12c5: "kxwe" -0x12c6: "[?]" -0x12c7: "[?]" -0x12c8: "wa" -0x12c9: "wu" -0x12ca: "wi" -0x12cb: "waa" -0x12cc: "wee" -0x12cd: "we" -0x12ce: "wo" -0x12cf: "[?]" -0x12d0: "`a" -0x12d1: "`u" -0x12d2: "`i" -0x12d3: "`aa" -0x12d4: "`ee" -0x12d5: "`e" -0x12d6: "`o" -0x12d7: "[?]" -0x12d8: "za" -0x12d9: "zu" -0x12da: "zi" -0x12db: "zaa" -0x12dc: "zee" -0x12dd: "ze" -0x12de: "zo" -0x12df: "zwa" -0x12e0: "zha" -0x12e1: "zhu" -0x12e2: "zhi" -0x12e3: "zhaa" -0x12e4: "zhee" -0x12e5: "zhe" -0x12e6: "zho" -0x12e7: "zhwa" -0x12e8: "ya" -0x12e9: "yu" -0x12ea: "yi" -0x12eb: "yaa" -0x12ec: "yee" -0x12ed: "ye" -0x12ee: "yo" -0x12ef: "[?]" -0x12f0: "da" -0x12f1: "du" -0x12f2: "di" -0x12f3: "daa" -0x12f4: "dee" -0x12f5: "de" -0x12f6: "do" -0x12f7: "dwa" -0x12f8: "dda" -0x12f9: "ddu" -0x12fa: "ddi" -0x12fb: "ddaa" -0x12fc: "ddee" -0x12fd: "dde" -0x12fe: "ddo" -0x12ff: "ddwa" -/* x013 */ -0x1300: "ja" -0x1301: "ju" -0x1302: "ji" -0x1303: "jaa" -0x1304: "jee" -0x1305: "je" -0x1306: "jo" -0x1307: "jwa" -0x1308: "ga" -0x1309: "gu" -0x130a: "gi" -0x130b: "gaa" -0x130c: "gee" -0x130d: "ge" -0x130e: "go" -0x130f: "[?]" -0x1310: "gwa" -0x1311: "[?]" -0x1312: "gwi" -0x1313: "gwaa" -0x1314: "gwee" -0x1315: "gwe" -0x1316: "[?]" -0x1317: "[?]" -0x1318: "gga" -0x1319: "ggu" -0x131a: "ggi" -0x131b: "ggaa" -0x131c: "ggee" -0x131d: "gge" -0x131e: "ggo" -0x131f: "[?]" -0x1320: "tha" -0x1321: "thu" -0x1322: "thi" -0x1323: "thaa" -0x1324: "thee" -0x1325: "the" -0x1326: "tho" -0x1327: "thwa" -0x1328: "cha" -0x1329: "chu" -0x132a: "chi" -0x132b: "chaa" -0x132c: "chee" -0x132d: "che" -0x132e: "cho" -0x132f: "chwa" -0x1330: "pha" -0x1331: "phu" -0x1332: "phi" -0x1333: "phaa" -0x1334: "phee" -0x1335: "phe" -0x1336: "pho" -0x1337: "phwa" -0x1338: "tsa" -0x1339: "tsu" -0x133a: "tsi" -0x133b: "tsaa" -0x133c: "tsee" -0x133d: "tse" -0x133e: "tso" -0x133f: "tswa" -0x1340: "tza" -0x1341: "tzu" -0x1342: "tzi" -0x1343: "tzaa" -0x1344: "tzee" -0x1345: "tze" -0x1346: "tzo" -0x1347: "[?]" -0x1348: "fa" -0x1349: "fu" -0x134a: "fi" -0x134b: "faa" -0x134c: "fee" -0x134d: "fe" -0x134e: "fo" -0x134f: "fwa" -0x1350: "pa" -0x1351: "pu" -0x1352: "pi" -0x1353: "paa" -0x1354: "pee" -0x1355: "pe" -0x1356: "po" -0x1357: "pwa" -0x1358: "rya" -0x1359: "mya" -0x135a: "fya" -0x135b: "[?]" -0x135c: "[?]" -0x135d: "[?]" -0x135e: "[?]" -0x135f: "[?]" -0x1360: "[?]" -0x1361: " " -0x1362: "." -0x1363: "," -0x1364: ";" -0x1365: ":" -0x1366: ":: " -0x1367: "?" -0x1368: "//" -0x1369: "1" -0x136a: "2" -0x136b: "3" -0x136c: "4" -0x136d: "5" -0x136e: "6" -0x136f: "7" -0x1370: "8" -0x1371: "9" -0x1372: "10+" -0x1373: "20+" -0x1374: "30+" -0x1375: "40+" -0x1376: "50+" -0x1377: "60+" -0x1378: "70+" -0x1379: "80+" -0x137a: "90+" -0x137b: "100+" -0x137c: "10,000+" -0x137d: "[?]" -0x137e: "[?]" -0x137f: "[?]" -0x1380: "[?]" -0x1381: "[?]" -0x1382: "[?]" -0x1383: "[?]" -0x1384: "[?]" -0x1385: "[?]" -0x1386: "[?]" -0x1387: "[?]" -0x1388: "[?]" -0x1389: "[?]" -0x138a: "[?]" -0x138b: "[?]" -0x138c: "[?]" -0x138d: "[?]" -0x138e: "[?]" -0x138f: "[?]" -0x1390: "[?]" -0x1391: "[?]" -0x1392: "[?]" -0x1393: "[?]" -0x1394: "[?]" -0x1395: "[?]" -0x1396: "[?]" -0x1397: "[?]" -0x1398: "[?]" -0x1399: "[?]" -0x139a: "[?]" -0x139b: "[?]" -0x139c: "[?]" -0x139d: "[?]" -0x139e: "[?]" -0x139f: "[?]" -0x13a0: "a" -0x13a1: "e" -0x13a2: "i" -0x13a3: "o" -0x13a4: "u" -0x13a5: "v" -0x13a6: "ga" -0x13a7: "ka" -0x13a8: "ge" -0x13a9: "gi" -0x13aa: "go" -0x13ab: "gu" -0x13ac: "gv" -0x13ad: "ha" -0x13ae: "he" -0x13af: "hi" -0x13b0: "ho" -0x13b1: "hu" -0x13b2: "hv" -0x13b3: "la" -0x13b4: "le" -0x13b5: "li" -0x13b6: "lo" -0x13b7: "lu" -0x13b8: "lv" -0x13b9: "ma" -0x13ba: "me" -0x13bb: "mi" -0x13bc: "mo" -0x13bd: "mu" -0x13be: "na" -0x13bf: "hna" -0x13c0: "nah" -0x13c1: "ne" -0x13c2: "ni" -0x13c3: "no" -0x13c4: "nu" -0x13c5: "nv" -0x13c6: "qua" -0x13c7: "que" -0x13c8: "qui" -0x13c9: "quo" -0x13ca: "quu" -0x13cb: "quv" -0x13cc: "sa" -0x13cd: "s" -0x13ce: "se" -0x13cf: "si" -0x13d0: "so" -0x13d1: "su" -0x13d2: "sv" -0x13d3: "da" -0x13d4: "ta" -0x13d5: "de" -0x13d6: "te" -0x13d7: "di" -0x13d8: "ti" -0x13d9: "do" -0x13da: "du" -0x13db: "dv" -0x13dc: "dla" -0x13dd: "tla" -0x13de: "tle" -0x13df: "tli" -0x13e0: "tlo" -0x13e1: "tlu" -0x13e2: "tlv" -0x13e3: "tsa" -0x13e4: "tse" -0x13e5: "tsi" -0x13e6: "tso" -0x13e7: "tsu" -0x13e8: "tsv" -0x13e9: "wa" -0x13ea: "we" -0x13eb: "wi" -0x13ec: "wo" -0x13ed: "wu" -0x13ee: "wv" -0x13ef: "ya" -0x13f0: "ye" -0x13f1: "yi" -0x13f2: "yo" -0x13f3: "yu" -0x13f4: "yv" -0x13f5: "[?]" -0x13f6: "[?]" -0x13f7: "[?]" -0x13f8: "[?]" -0x13f9: "[?]" -0x13fa: "[?]" -0x13fb: "[?]" -0x13fc: "[?]" -0x13fd: "[?]" -0x13fe: "[?]" -/* x014 */ -0x1400: "[?]" -0x1401: "e" -0x1402: "aai" -0x1403: "i" -0x1404: "ii" -0x1405: "o" -0x1406: "oo" -0x1407: "oo" -0x1408: "ee" -0x1409: "i" -0x140a: "a" -0x140b: "aa" -0x140c: "we" -0x140d: "we" -0x140e: "wi" -0x140f: "wi" -0x1410: "wii" -0x1411: "wii" -0x1412: "wo" -0x1413: "wo" -0x1414: "woo" -0x1415: "woo" -0x1416: "woo" -0x1417: "wa" -0x1418: "wa" -0x1419: "waa" -0x141a: "waa" -0x141b: "waa" -0x141c: "ai" -0x141d: "w" -0x141e: "'" -0x141f: "t" -0x1420: "k" -0x1421: "sh" -0x1422: "s" -0x1423: "n" -0x1424: "w" -0x1425: "n" -0x1426: "[?]" -0x1427: "w" -0x1428: "c" -0x1429: "?" -0x142a: "l" -0x142b: "en" -0x142c: "in" -0x142d: "on" -0x142e: "an" -0x142f: "pe" -0x1430: "paai" -0x1431: "pi" -0x1432: "pii" -0x1433: "po" -0x1434: "poo" -0x1435: "poo" -0x1436: "hee" -0x1437: "hi" -0x1438: "pa" -0x1439: "paa" -0x143a: "pwe" -0x143b: "pwe" -0x143c: "pwi" -0x143d: "pwi" -0x143e: "pwii" -0x143f: "pwii" -0x1440: "pwo" -0x1441: "pwo" -0x1442: "pwoo" -0x1443: "pwoo" -0x1444: "pwa" -0x1445: "pwa" -0x1446: "pwaa" -0x1447: "pwaa" -0x1448: "pwaa" -0x1449: "p" -0x144a: "p" -0x144b: "h" -0x144c: "te" -0x144d: "taai" -0x144e: "ti" -0x144f: "tii" -0x1450: "to" -0x1451: "too" -0x1452: "too" -0x1453: "dee" -0x1454: "di" -0x1455: "ta" -0x1456: "taa" -0x1457: "twe" -0x1458: "twe" -0x1459: "twi" -0x145a: "twi" -0x145b: "twii" -0x145c: "twii" -0x145d: "two" -0x145e: "two" -0x145f: "twoo" -0x1460: "twoo" -0x1461: "twa" -0x1462: "twa" -0x1463: "twaa" -0x1464: "twaa" -0x1465: "twaa" -0x1466: "t" -0x1467: "tte" -0x1468: "tti" -0x1469: "tto" -0x146a: "tta" -0x146b: "ke" -0x146c: "kaai" -0x146d: "ki" -0x146e: "kii" -0x146f: "ko" -0x1470: "koo" -0x1471: "koo" -0x1472: "ka" -0x1473: "kaa" -0x1474: "kwe" -0x1475: "kwe" -0x1476: "kwi" -0x1477: "kwi" -0x1478: "kwii" -0x1479: "kwii" -0x147a: "kwo" -0x147b: "kwo" -0x147c: "kwoo" -0x147d: "kwoo" -0x147e: "kwa" -0x147f: "kwa" -0x1480: "kwaa" -0x1481: "kwaa" -0x1482: "kwaa" -0x1483: "k" -0x1484: "kw" -0x1485: "keh" -0x1486: "kih" -0x1487: "koh" -0x1488: "kah" -0x1489: "ce" -0x148a: "caai" -0x148b: "ci" -0x148c: "cii" -0x148d: "co" -0x148e: "coo" -0x148f: "coo" -0x1490: "ca" -0x1491: "caa" -0x1492: "cwe" -0x1493: "cwe" -0x1494: "cwi" -0x1495: "cwi" -0x1496: "cwii" -0x1497: "cwii" -0x1498: "cwo" -0x1499: "cwo" -0x149a: "cwoo" -0x149b: "cwoo" -0x149c: "cwa" -0x149d: "cwa" -0x149e: "cwaa" -0x149f: "cwaa" -0x14a0: "cwaa" -0x14a1: "c" -0x14a2: "th" -0x14a3: "me" -0x14a4: "maai" -0x14a5: "mi" -0x14a6: "mii" -0x14a7: "mo" -0x14a8: "moo" -0x14a9: "moo" -0x14aa: "ma" -0x14ab: "maa" -0x14ac: "mwe" -0x14ad: "mwe" -0x14ae: "mwi" -0x14af: "mwi" -0x14b0: "mwii" -0x14b1: "mwii" -0x14b2: "mwo" -0x14b3: "mwo" -0x14b4: "mwoo" -0x14b5: "mwoo" -0x14b6: "mwa" -0x14b7: "mwa" -0x14b8: "mwaa" -0x14b9: "mwaa" -0x14ba: "mwaa" -0x14bb: "m" -0x14bc: "m" -0x14bd: "mh" -0x14be: "m" -0x14bf: "m" -0x14c0: "ne" -0x14c1: "naai" -0x14c2: "ni" -0x14c3: "nii" -0x14c4: "no" -0x14c5: "noo" -0x14c6: "noo" -0x14c7: "na" -0x14c8: "naa" -0x14c9: "nwe" -0x14ca: "nwe" -0x14cb: "nwa" -0x14cc: "nwa" -0x14cd: "nwaa" -0x14ce: "nwaa" -0x14cf: "nwaa" -0x14d0: "n" -0x14d1: "ng" -0x14d2: "nh" -0x14d3: "le" -0x14d4: "laai" -0x14d5: "li" -0x14d6: "lii" -0x14d7: "lo" -0x14d8: "loo" -0x14d9: "loo" -0x14da: "la" -0x14db: "laa" -0x14dc: "lwe" -0x14dd: "lwe" -0x14de: "lwi" -0x14df: "lwi" -0x14e0: "lwii" -0x14e1: "lwii" -0x14e2: "lwo" -0x14e3: "lwo" -0x14e4: "lwoo" -0x14e5: "lwoo" -0x14e6: "lwa" -0x14e7: "lwa" -0x14e8: "lwaa" -0x14e9: "lwaa" -0x14ea: "l" -0x14eb: "l" -0x14ec: "l" -0x14ed: "se" -0x14ee: "saai" -0x14ef: "si" -0x14f0: "sii" -0x14f1: "so" -0x14f2: "soo" -0x14f3: "soo" -0x14f4: "sa" -0x14f5: "saa" -0x14f6: "swe" -0x14f7: "swe" -0x14f8: "swi" -0x14f9: "swi" -0x14fa: "swii" -0x14fb: "swii" -0x14fc: "swo" -0x14fd: "swo" -0x14fe: "swoo" -0x14ff: "swoo" -/* x015 */ -0x1500: "swa" -0x1501: "swa" -0x1502: "swaa" -0x1503: "swaa" -0x1504: "swaa" -0x1505: "s" -0x1506: "s" -0x1507: "sw" -0x1508: "s" -0x1509: "sk" -0x150a: "skw" -0x150b: "sW" -0x150c: "spwa" -0x150d: "stwa" -0x150e: "skwa" -0x150f: "scwa" -0x1510: "she" -0x1511: "shi" -0x1512: "shii" -0x1513: "sho" -0x1514: "shoo" -0x1515: "sha" -0x1516: "shaa" -0x1517: "shwe" -0x1518: "shwe" -0x1519: "shwi" -0x151a: "shwi" -0x151b: "shwii" -0x151c: "shwii" -0x151d: "shwo" -0x151e: "shwo" -0x151f: "shwoo" -0x1520: "shwoo" -0x1521: "shwa" -0x1522: "shwa" -0x1523: "shwaa" -0x1524: "shwaa" -0x1525: "sh" -0x1526: "ye" -0x1527: "yaai" -0x1528: "yi" -0x1529: "yii" -0x152a: "yo" -0x152b: "yoo" -0x152c: "yoo" -0x152d: "ya" -0x152e: "yaa" -0x152f: "ywe" -0x1530: "ywe" -0x1531: "ywi" -0x1532: "ywi" -0x1533: "ywii" -0x1534: "ywii" -0x1535: "ywo" -0x1536: "ywo" -0x1537: "ywoo" -0x1538: "ywoo" -0x1539: "ywa" -0x153a: "ywa" -0x153b: "ywaa" -0x153c: "ywaa" -0x153d: "ywaa" -0x153e: "y" -0x153f: "y" -0x1540: "y" -0x1541: "yi" -0x1542: "re" -0x1543: "re" -0x1544: "le" -0x1545: "raai" -0x1546: "ri" -0x1547: "rii" -0x1548: "ro" -0x1549: "roo" -0x154a: "lo" -0x154b: "ra" -0x154c: "raa" -0x154d: "la" -0x154e: "rwaa" -0x154f: "rwaa" -0x1550: "r" -0x1551: "r" -0x1552: "r" -0x1553: "fe" -0x1554: "faai" -0x1555: "fi" -0x1556: "fii" -0x1557: "fo" -0x1558: "foo" -0x1559: "fa" -0x155a: "faa" -0x155b: "fwaa" -0x155c: "fwaa" -0x155d: "f" -0x155e: "the" -0x155f: "the" -0x1560: "thi" -0x1561: "thi" -0x1562: "thii" -0x1563: "thii" -0x1564: "tho" -0x1565: "thoo" -0x1566: "tha" -0x1567: "thaa" -0x1568: "thwaa" -0x1569: "thwaa" -0x156a: "th" -0x156b: "tthe" -0x156c: "tthi" -0x156d: "ttho" -0x156e: "ttha" -0x156f: "tth" -0x1570: "tye" -0x1571: "tyi" -0x1572: "tyo" -0x1573: "tya" -0x1574: "he" -0x1575: "hi" -0x1576: "hii" -0x1577: "ho" -0x1578: "hoo" -0x1579: "ha" -0x157a: "haa" -0x157b: "h" -0x157c: "h" -0x157d: "hk" -0x157e: "qaai" -0x157f: "qi" -0x1580: "qii" -0x1581: "qo" -0x1582: "qoo" -0x1583: "qa" -0x1584: "qaa" -0x1585: "q" -0x1586: "tlhe" -0x1587: "tlhi" -0x1588: "tlho" -0x1589: "tlha" -0x158a: "re" -0x158b: "ri" -0x158c: "ro" -0x158d: "ra" -0x158e: "ngaai" -0x158f: "ngi" -0x1590: "ngii" -0x1591: "ngo" -0x1592: "ngoo" -0x1593: "nga" -0x1594: "ngaa" -0x1595: "ng" -0x1596: "nng" -0x1597: "she" -0x1598: "shi" -0x1599: "sho" -0x159a: "sha" -0x159b: "the" -0x159c: "thi" -0x159d: "tho" -0x159e: "tha" -0x159f: "th" -0x15a0: "lhi" -0x15a1: "lhii" -0x15a2: "lho" -0x15a3: "lhoo" -0x15a4: "lha" -0x15a5: "lhaa" -0x15a6: "lh" -0x15a7: "the" -0x15a8: "thi" -0x15a9: "thii" -0x15aa: "tho" -0x15ab: "thoo" -0x15ac: "tha" -0x15ad: "thaa" -0x15ae: "th" -0x15af: "b" -0x15b0: "e" -0x15b1: "i" -0x15b2: "o" -0x15b3: "a" -0x15b4: "we" -0x15b5: "wi" -0x15b6: "wo" -0x15b7: "wa" -0x15b8: "ne" -0x15b9: "ni" -0x15ba: "no" -0x15bb: "na" -0x15bc: "ke" -0x15bd: "ki" -0x15be: "ko" -0x15bf: "ka" -0x15c0: "he" -0x15c1: "hi" -0x15c2: "ho" -0x15c3: "ha" -0x15c4: "ghu" -0x15c5: "gho" -0x15c6: "ghe" -0x15c7: "ghee" -0x15c8: "ghi" -0x15c9: "gha" -0x15ca: "ru" -0x15cb: "ro" -0x15cc: "re" -0x15cd: "ree" -0x15ce: "ri" -0x15cf: "ra" -0x15d0: "wu" -0x15d1: "wo" -0x15d2: "we" -0x15d3: "wee" -0x15d4: "wi" -0x15d5: "wa" -0x15d6: "hwu" -0x15d7: "hwo" -0x15d8: "hwe" -0x15d9: "hwee" -0x15da: "hwi" -0x15db: "hwa" -0x15dc: "thu" -0x15dd: "tho" -0x15de: "the" -0x15df: "thee" -0x15e0: "thi" -0x15e1: "tha" -0x15e2: "ttu" -0x15e3: "tto" -0x15e4: "tte" -0x15e5: "ttee" -0x15e6: "tti" -0x15e7: "tta" -0x15e8: "pu" -0x15e9: "po" -0x15ea: "pe" -0x15eb: "pee" -0x15ec: "pi" -0x15ed: "pa" -0x15ee: "p" -0x15ef: "gu" -0x15f0: "go" -0x15f1: "ge" -0x15f2: "gee" -0x15f3: "gi" -0x15f4: "ga" -0x15f5: "khu" -0x15f6: "kho" -0x15f7: "khe" -0x15f8: "khee" -0x15f9: "khi" -0x15fa: "kha" -0x15fb: "kku" -0x15fc: "kko" -0x15fd: "kke" -0x15fe: "kkee" -0x15ff: "kki" -/* x016 */ -0x1600: "kka" -0x1601: "kk" -0x1602: "nu" -0x1603: "no" -0x1604: "ne" -0x1605: "nee" -0x1606: "ni" -0x1607: "na" -0x1608: "mu" -0x1609: "mo" -0x160a: "me" -0x160b: "mee" -0x160c: "mi" -0x160d: "ma" -0x160e: "yu" -0x160f: "yo" -0x1610: "ye" -0x1611: "yee" -0x1612: "yi" -0x1613: "ya" -0x1614: "ju" -0x1615: "ju" -0x1616: "jo" -0x1617: "je" -0x1618: "jee" -0x1619: "ji" -0x161a: "ji" -0x161b: "ja" -0x161c: "jju" -0x161d: "jjo" -0x161e: "jje" -0x161f: "jjee" -0x1620: "jji" -0x1621: "jja" -0x1622: "lu" -0x1623: "lo" -0x1624: "le" -0x1625: "lee" -0x1626: "li" -0x1627: "la" -0x1628: "dlu" -0x1629: "dlo" -0x162a: "dle" -0x162b: "dlee" -0x162c: "dli" -0x162d: "dla" -0x162e: "lhu" -0x162f: "lho" -0x1630: "lhe" -0x1631: "lhee" -0x1632: "lhi" -0x1633: "lha" -0x1634: "tlhu" -0x1635: "tlho" -0x1636: "tlhe" -0x1637: "tlhee" -0x1638: "tlhi" -0x1639: "tlha" -0x163a: "tlu" -0x163b: "tlo" -0x163c: "tle" -0x163d: "tlee" -0x163e: "tli" -0x163f: "tla" -0x1640: "zu" -0x1641: "zo" -0x1642: "ze" -0x1643: "zee" -0x1644: "zi" -0x1645: "za" -0x1646: "z" -0x1647: "z" -0x1648: "dzu" -0x1649: "dzo" -0x164a: "dze" -0x164b: "dzee" -0x164c: "dzi" -0x164d: "dza" -0x164e: "su" -0x164f: "so" -0x1650: "se" -0x1651: "see" -0x1652: "si" -0x1653: "sa" -0x1654: "shu" -0x1655: "sho" -0x1656: "she" -0x1657: "shee" -0x1658: "shi" -0x1659: "sha" -0x165a: "sh" -0x165b: "tsu" -0x165c: "tso" -0x165d: "tse" -0x165e: "tsee" -0x165f: "tsi" -0x1660: "tsa" -0x1661: "chu" -0x1662: "cho" -0x1663: "che" -0x1664: "chee" -0x1665: "chi" -0x1666: "cha" -0x1667: "ttsu" -0x1668: "ttso" -0x1669: "ttse" -0x166a: "ttsee" -0x166b: "ttsi" -0x166c: "ttsa" -0x166d: "X" -0x166e: "." -0x166f: "qai" -0x1670: "ngai" -0x1671: "nngi" -0x1672: "nngii" -0x1673: "nngo" -0x1674: "nngoo" -0x1675: "nnga" -0x1676: "nngaa" -0x1677: "[?]" -0x1678: "[?]" -0x1679: "[?]" -0x167a: "[?]" -0x167b: "[?]" -0x167c: "[?]" -0x167d: "[?]" -0x167e: "[?]" -0x167f: "[?]" -0x1680: " " -0x1681: "b" -0x1682: "l" -0x1683: "f" -0x1684: "s" -0x1685: "n" -0x1686: "h" -0x1687: "d" -0x1688: "t" -0x1689: "c" -0x168a: "q" -0x168b: "m" -0x168c: "g" -0x168d: "ng" -0x168e: "z" -0x168f: "r" -0x1690: "a" -0x1691: "o" -0x1692: "u" -0x1693: "e" -0x1694: "i" -0x1695: "ch" -0x1696: "th" -0x1697: "ph" -0x1698: "p" -0x1699: "x" -0x169a: "p" -0x169b: "<" -0x169c: ">" -0x169d: "[?]" -0x169e: "[?]" -0x169f: "[?]" -0x16a0: "f" -0x16a1: "v" -0x16a2: "u" -0x16a3: "yr" -0x16a4: "y" -0x16a5: "w" -0x16a6: "th" -0x16a7: "th" -0x16a8: "a" -0x16a9: "o" -0x16aa: "ac" -0x16ab: "ae" -0x16ac: "o" -0x16ad: "o" -0x16ae: "o" -0x16af: "oe" -0x16b0: "on" -0x16b1: "r" -0x16b2: "k" -0x16b3: "c" -0x16b4: "k" -0x16b5: "g" -0x16b6: "ng" -0x16b7: "g" -0x16b8: "g" -0x16b9: "w" -0x16ba: "h" -0x16bb: "h" -0x16bc: "h" -0x16bd: "h" -0x16be: "n" -0x16bf: "n" -0x16c0: "n" -0x16c1: "i" -0x16c2: "e" -0x16c3: "j" -0x16c4: "g" -0x16c5: "ae" -0x16c6: "a" -0x16c7: "eo" -0x16c8: "p" -0x16c9: "z" -0x16ca: "s" -0x16cb: "s" -0x16cc: "s" -0x16cd: "c" -0x16ce: "z" -0x16cf: "t" -0x16d0: "t" -0x16d1: "d" -0x16d2: "b" -0x16d3: "b" -0x16d4: "p" -0x16d5: "p" -0x16d6: "e" -0x16d7: "m" -0x16d8: "m" -0x16d9: "m" -0x16da: "l" -0x16db: "l" -0x16dc: "ng" -0x16dd: "ng" -0x16de: "d" -0x16df: "o" -0x16e0: "ear" -0x16e1: "ior" -0x16e2: "qu" -0x16e3: "qu" -0x16e4: "qu" -0x16e5: "s" -0x16e6: "yr" -0x16e7: "yr" -0x16e8: "yr" -0x16e9: "q" -0x16ea: "x" -0x16eb: "." -0x16ec: ":" -0x16ed: "+" -0x16ee: "17" -0x16ef: "18" -0x16f0: "19" -0x16f1: "[?]" -0x16f2: "[?]" -0x16f3: "[?]" -0x16f4: "[?]" -0x16f5: "[?]" -0x16f6: "[?]" -0x16f7: "[?]" -0x16f8: "[?]" -0x16f9: "[?]" -0x16fa: "[?]" -0x16fb: "[?]" -0x16fc: "[?]" -0x16fd: "[?]" -0x16fe: "[?]" -/* x017 */ -0x1700: "[?]" -0x1701: "[?]" -0x1702: "[?]" -0x1703: "[?]" -0x1704: "[?]" -0x1705: "[?]" -0x1706: "[?]" -0x1707: "[?]" -0x1708: "[?]" -0x1709: "[?]" -0x170a: "[?]" -0x170b: "[?]" -0x170c: "[?]" -0x170d: "[?]" -0x170e: "[?]" -0x170f: "[?]" -0x1710: "[?]" -0x1711: "[?]" -0x1712: "[?]" -0x1713: "[?]" -0x1714: "[?]" -0x1715: "[?]" -0x1716: "[?]" -0x1717: "[?]" -0x1718: "[?]" -0x1719: "[?]" -0x171a: "[?]" -0x171b: "[?]" -0x171c: "[?]" -0x171d: "[?]" -0x171e: "[?]" -0x171f: "[?]" -0x1720: "[?]" -0x1721: "[?]" -0x1722: "[?]" -0x1723: "[?]" -0x1724: "[?]" -0x1725: "[?]" -0x1726: "[?]" -0x1727: "[?]" -0x1728: "[?]" -0x1729: "[?]" -0x172a: "[?]" -0x172b: "[?]" -0x172c: "[?]" -0x172d: "[?]" -0x172e: "[?]" -0x172f: "[?]" -0x1730: "[?]" -0x1731: "[?]" -0x1732: "[?]" -0x1733: "[?]" -0x1734: "[?]" -0x1735: "[?]" -0x1736: "[?]" -0x1737: "[?]" -0x1738: "[?]" -0x1739: "[?]" -0x173a: "[?]" -0x173b: "[?]" -0x173c: "[?]" -0x173d: "[?]" -0x173e: "[?]" -0x173f: "[?]" -0x1740: "[?]" -0x1741: "[?]" -0x1742: "[?]" -0x1743: "[?]" -0x1744: "[?]" -0x1745: "[?]" -0x1746: "[?]" -0x1747: "[?]" -0x1748: "[?]" -0x1749: "[?]" -0x174a: "[?]" -0x174b: "[?]" -0x174c: "[?]" -0x174d: "[?]" -0x174e: "[?]" -0x174f: "[?]" -0x1750: "[?]" -0x1751: "[?]" -0x1752: "[?]" -0x1753: "[?]" -0x1754: "[?]" -0x1755: "[?]" -0x1756: "[?]" -0x1757: "[?]" -0x1758: "[?]" -0x1759: "[?]" -0x175a: "[?]" -0x175b: "[?]" -0x175c: "[?]" -0x175d: "[?]" -0x175e: "[?]" -0x175f: "[?]" -0x1760: "[?]" -0x1761: "[?]" -0x1762: "[?]" -0x1763: "[?]" -0x1764: "[?]" -0x1765: "[?]" -0x1766: "[?]" -0x1767: "[?]" -0x1768: "[?]" -0x1769: "[?]" -0x176a: "[?]" -0x176b: "[?]" -0x176c: "[?]" -0x176d: "[?]" -0x176e: "[?]" -0x176f: "[?]" -0x1770: "[?]" -0x1771: "[?]" -0x1772: "[?]" -0x1773: "[?]" -0x1774: "[?]" -0x1775: "[?]" -0x1776: "[?]" -0x1777: "[?]" -0x1778: "[?]" -0x1779: "[?]" -0x177a: "[?]" -0x177b: "[?]" -0x177c: "[?]" -0x177d: "[?]" -0x177e: "[?]" -0x177f: "[?]" -0x1780: "k" -0x1781: "kh" -0x1782: "g" -0x1783: "gh" -0x1784: "ng" -0x1785: "c" -0x1786: "ch" -0x1787: "j" -0x1788: "jh" -0x1789: "ny" -0x178a: "t" -0x178b: "tth" -0x178c: "d" -0x178d: "ddh" -0x178e: "nn" -0x178f: "t" -0x1790: "th" -0x1791: "d" -0x1792: "dh" -0x1793: "n" -0x1794: "p" -0x1795: "ph" -0x1796: "b" -0x1797: "bh" -0x1798: "m" -0x1799: "y" -0x179a: "r" -0x179b: "l" -0x179c: "v" -0x179d: "sh" -0x179e: "ss" -0x179f: "s" -0x17a0: "h" -0x17a1: "l" -0x17a2: "q" -0x17a3: "a" -0x17a4: "aa" -0x17a5: "i" -0x17a6: "ii" -0x17a7: "u" -0x17a8: "uk" -0x17a9: "uu" -0x17aa: "uuv" -0x17ab: "ry" -0x17ac: "ryy" -0x17ad: "ly" -0x17ae: "lyy" -0x17af: "e" -0x17b0: "ai" -0x17b1: "oo" -0x17b2: "oo" -0x17b3: "au" -0x17b4: "a" -0x17b5: "aa" -0x17b6: "aa" -0x17b7: "i" -0x17b8: "ii" -0x17b9: "y" -0x17ba: "yy" -0x17bb: "u" -0x17bc: "uu" -0x17bd: "ua" -0x17be: "oe" -0x17bf: "ya" -0x17c0: "ie" -0x17c1: "e" -0x17c2: "ae" -0x17c3: "ai" -0x17c4: "oo" -0x17c5: "au" -0x17c6: "M" -0x17c7: "H" -0x17c8: "a`" -0x17c9: "" -0x17ca: "" -0x17cb: "" -0x17cc: "r" -0x17cd: "" -0x17ce: "!" -0x17cf: "" -0x17d0: "" -0x17d1: "" -0x17d2: "" -0x17d3: "" -0x17d4: "." -0x17d5: " // " -0x17d6: ":" -0x17d7: "+" -0x17d8: "++" -0x17d9: " * " -0x17da: " /// " -0x17db: "KR" -0x17dc: "'" -0x17dd: "[?]" -0x17de: "[?]" -0x17df: "[?]" -0x17e0: "0" -0x17e1: "1" -0x17e2: "2" -0x17e3: "3" -0x17e4: "4" -0x17e5: "5" -0x17e6: "6" -0x17e7: "7" -0x17e8: "8" -0x17e9: "9" -0x17ea: "[?]" -0x17eb: "[?]" -0x17ec: "[?]" -0x17ed: "[?]" -0x17ee: "[?]" -0x17ef: "[?]" -0x17f0: "[?]" -0x17f1: "[?]" -0x17f2: "[?]" -0x17f3: "[?]" -0x17f4: "[?]" -0x17f5: "[?]" -0x17f6: "[?]" -0x17f7: "[?]" -0x17f8: "[?]" -0x17f9: "[?]" -0x17fa: "[?]" -0x17fb: "[?]" -0x17fc: "[?]" -0x17fd: "[?]" -0x17fe: "[?]" -/* x018 */ -0x1800: " @ " -0x1801: " ... " -0x1802: ", " -0x1803: ". " -0x1804: ": " -0x1805: " // " -0x1806: "" -0x1807: "-" -0x1808: ", " -0x1809: ". " -0x180a: "" -0x180b: "" -0x180c: "" -0x180d: "" -0x180e: "" -0x180f: "[?]" -0x1810: "0" -0x1811: "1" -0x1812: "2" -0x1813: "3" -0x1814: "4" -0x1815: "5" -0x1816: "6" -0x1817: "7" -0x1818: "8" -0x1819: "9" -0x181a: "[?]" -0x181b: "[?]" -0x181c: "[?]" -0x181d: "[?]" -0x181e: "[?]" -0x181f: "[?]" -0x1820: "a" -0x1821: "e" -0x1822: "i" -0x1823: "o" -0x1824: "u" -0x1825: "O" -0x1826: "U" -0x1827: "ee" -0x1828: "n" -0x1829: "ng" -0x182a: "b" -0x182b: "p" -0x182c: "q" -0x182d: "g" -0x182e: "m" -0x182f: "l" -0x1830: "s" -0x1831: "sh" -0x1832: "t" -0x1833: "d" -0x1834: "ch" -0x1835: "j" -0x1836: "y" -0x1837: "r" -0x1838: "w" -0x1839: "f" -0x183a: "k" -0x183b: "kha" -0x183c: "ts" -0x183d: "z" -0x183e: "h" -0x183f: "zr" -0x1840: "lh" -0x1841: "zh" -0x1842: "ch" -0x1843: "-" -0x1844: "e" -0x1845: "i" -0x1846: "o" -0x1847: "u" -0x1848: "O" -0x1849: "U" -0x184a: "ng" -0x184b: "b" -0x184c: "p" -0x184d: "q" -0x184e: "g" -0x184f: "m" -0x1850: "t" -0x1851: "d" -0x1852: "ch" -0x1853: "j" -0x1854: "ts" -0x1855: "y" -0x1856: "w" -0x1857: "k" -0x1858: "g" -0x1859: "h" -0x185a: "jy" -0x185b: "ny" -0x185c: "dz" -0x185d: "e" -0x185e: "i" -0x185f: "iy" -0x1860: "U" -0x1861: "u" -0x1862: "ng" -0x1863: "k" -0x1864: "g" -0x1865: "h" -0x1866: "p" -0x1867: "sh" -0x1868: "t" -0x1869: "d" -0x186a: "j" -0x186b: "f" -0x186c: "g" -0x186d: "h" -0x186e: "ts" -0x186f: "z" -0x1870: "r" -0x1871: "ch" -0x1872: "zh" -0x1873: "i" -0x1874: "k" -0x1875: "r" -0x1876: "f" -0x1877: "zh" -0x1878: "[?]" -0x1879: "[?]" -0x187a: "[?]" -0x187b: "[?]" -0x187c: "[?]" -0x187d: "[?]" -0x187e: "[?]" -0x187f: "[?]" -0x1880: "[?]" -0x1881: "H" -0x1882: "X" -0x1883: "W" -0x1884: "M" -0x1885: " 3 " -0x1886: " 333 " -0x1887: "a" -0x1888: "i" -0x1889: "k" -0x188a: "ng" -0x188b: "c" -0x188c: "tt" -0x188d: "tth" -0x188e: "dd" -0x188f: "nn" -0x1890: "t" -0x1891: "d" -0x1892: "p" -0x1893: "ph" -0x1894: "ss" -0x1895: "zh" -0x1896: "z" -0x1897: "a" -0x1898: "t" -0x1899: "zh" -0x189a: "gh" -0x189b: "ng" -0x189c: "c" -0x189d: "jh" -0x189e: "tta" -0x189f: "ddh" -0x18a0: "t" -0x18a1: "dh" -0x18a2: "ss" -0x18a3: "cy" -0x18a4: "zh" -0x18a5: "z" -0x18a6: "u" -0x18a7: "y" -0x18a8: "bh" -0x18a9: "'" -0x18aa: "[?]" -0x18ab: "[?]" -0x18ac: "[?]" -0x18ad: "[?]" -0x18ae: "[?]" -0x18af: "[?]" -0x18b0: "[?]" -0x18b1: "[?]" -0x18b2: "[?]" -0x18b3: "[?]" -0x18b4: "[?]" -0x18b5: "[?]" -0x18b6: "[?]" -0x18b7: "[?]" -0x18b8: "[?]" -0x18b9: "[?]" -0x18ba: "[?]" -0x18bb: "[?]" -0x18bc: "[?]" -0x18bd: "[?]" -0x18be: "[?]" -0x18bf: "[?]" -0x18c0: "[?]" -0x18c1: "[?]" -0x18c2: "[?]" -0x18c3: "[?]" -0x18c4: "[?]" -0x18c5: "[?]" -0x18c6: "[?]" -0x18c7: "[?]" -0x18c8: "[?]" -0x18c9: "[?]" -0x18ca: "[?]" -0x18cb: "[?]" -0x18cc: "[?]" -0x18cd: "[?]" -0x18ce: "[?]" -0x18cf: "[?]" -0x18d0: "[?]" -0x18d1: "[?]" -0x18d2: "[?]" -0x18d3: "[?]" -0x18d4: "[?]" -0x18d5: "[?]" -0x18d6: "[?]" -0x18d7: "[?]" -0x18d8: "[?]" -0x18d9: "[?]" -0x18da: "[?]" -0x18db: "[?]" -0x18dc: "[?]" -0x18dd: "[?]" -0x18de: "[?]" -0x18df: "[?]" -0x18e0: "[?]" -0x18e1: "[?]" -0x18e2: "[?]" -0x18e3: "[?]" -0x18e4: "[?]" -0x18e5: "[?]" -0x18e6: "[?]" -0x18e7: "[?]" -0x18e8: "[?]" -0x18e9: "[?]" -0x18ea: "[?]" -0x18eb: "[?]" -0x18ec: "[?]" -0x18ed: "[?]" -0x18ee: "[?]" -0x18ef: "[?]" -0x18f0: "[?]" -0x18f1: "[?]" -0x18f2: "[?]" -0x18f3: "[?]" -0x18f4: "[?]" -0x18f5: "[?]" -0x18f6: "[?]" -0x18f7: "[?]" -0x18f8: "[?]" -0x18f9: "[?]" -0x18fa: "[?]" -0x18fb: "[?]" -0x18fc: "[?]" -0x18fd: "[?]" -0x18fe: "[?]" -/* x01d */ -0x1d00: "" -0x1d01: "" -0x1d02: "" -0x1d03: "" -0x1d04: "" -0x1d05: "" -0x1d06: "" -0x1d07: "" -0x1d08: "" -0x1d09: "" -0x1d0a: "" -0x1d0b: "" -0x1d0c: "" -0x1d0d: "" -0x1d0e: "" -0x1d0f: "" -0x1d10: "" -0x1d11: "" -0x1d12: "" -0x1d13: "" -0x1d14: "" -0x1d15: "" -0x1d16: "" -0x1d17: "" -0x1d18: "" -0x1d19: "" -0x1d1a: "" -0x1d1b: "" -0x1d1c: "" -0x1d1d: "" -0x1d1e: "" -0x1d1f: "" -0x1d20: "" -0x1d21: "" -0x1d22: "" -0x1d23: "" -0x1d24: "" -0x1d25: "" -0x1d26: "" -0x1d27: "" -0x1d28: "" -0x1d29: "" -0x1d2a: "" -0x1d2b: "" -0x1d2c: "" -0x1d2d: "" -0x1d2e: "" -0x1d2f: "" -0x1d30: "" -0x1d31: "" -0x1d32: "" -0x1d33: "" -0x1d34: "" -0x1d35: "" -0x1d36: "" -0x1d37: "" -0x1d38: "" -0x1d39: "" -0x1d3a: "" -0x1d3b: "" -0x1d3c: "" -0x1d3d: "" -0x1d3e: "" -0x1d3f: "" -0x1d40: "" -0x1d41: "" -0x1d42: "" -0x1d43: "" -0x1d44: "" -0x1d45: "" -0x1d46: "" -0x1d47: "" -0x1d48: "" -0x1d49: "" -0x1d4a: "" -0x1d4b: "" -0x1d4c: "" -0x1d4d: "" -0x1d4e: "" -0x1d4f: "" -0x1d50: "" -0x1d51: "" -0x1d52: "" -0x1d53: "" -0x1d54: "" -0x1d55: "" -0x1d56: "" -0x1d57: "" -0x1d58: "" -0x1d59: "" -0x1d5a: "" -0x1d5b: "" -0x1d5c: "" -0x1d5d: "" -0x1d5e: "" -0x1d5f: "" -0x1d60: "" -0x1d61: "" -0x1d62: "" -0x1d63: "" -0x1d64: "" -0x1d65: "" -0x1d66: "" -0x1d67: "" -0x1d68: "" -0x1d69: "" -0x1d6a: "" -0x1d6b: "" -0x1d6c: "b" -0x1d6d: "d" -0x1d6e: "f" -0x1d6f: "m" -0x1d70: "n" -0x1d71: "p" -0x1d72: "r" -0x1d73: "r" -0x1d74: "s" -0x1d75: "t" -0x1d76: "z" -0x1d77: "g" -0x1d78: "" -0x1d79: "" -0x1d7a: "" -0x1d7b: "" -0x1d7c: "" -0x1d7d: "p" -0x1d7e: "" -0x1d7f: "" -0x1d80: "b" -0x1d81: "d" -0x1d82: "f" -0x1d83: "g" -0x1d84: "k" -0x1d85: "l" -0x1d86: "m" -0x1d87: "n" -0x1d88: "p" -0x1d89: "r" -0x1d8a: "s" -0x1d8b: "" -0x1d8c: "v" -0x1d8d: "x" -0x1d8e: "z" -0x1d8f: "" -0x1d90: "" -0x1d91: "" -0x1d92: "" -0x1d93: "" -0x1d94: "" -0x1d95: "" -0x1d96: "" -0x1d97: "" -0x1d98: "" -0x1d99: "" -0x1d9a: "" -0x1d9b: "" -0x1d9c: "" -0x1d9d: "" -0x1d9e: "" -0x1d9f: "" -0x1da0: "" -0x1da1: "" -0x1da2: "" -0x1da3: "" -0x1da4: "" -0x1da5: "" -0x1da6: "" -0x1da7: "" -0x1da8: "" -0x1da9: "" -0x1daa: "" -0x1dab: "" -0x1dac: "" -0x1dad: "" -0x1dae: "" -0x1daf: "" -0x1db0: "" -0x1db1: "" -0x1db2: "" -0x1db3: "" -0x1db4: "" -0x1db5: "" -0x1db6: "" -0x1db7: "" -0x1db8: "" -0x1db9: "" -0x1dba: "" -0x1dbb: "" -0x1dbc: "" -0x1dbd: "" -0x1dbe: "" -0x1dbf: "" -0x1dc0: "" -0x1dc1: "" -0x1dc2: "" -0x1dc3: "" -0x1dc4: "" -0x1dc5: "" -0x1dc6: "" -0x1dc7: "" -0x1dc8: "" -0x1dc9: "" -0x1dca: "" -0x1dcb: "" -0x1dcc: "" -0x1dcd: "" -0x1dce: "" -0x1dcf: "" -0x1dd0: "" -0x1dd1: "" -0x1dd2: "" -0x1dd3: "" -0x1dd4: "" -0x1dd5: "" -0x1dd6: "" -0x1dd7: "" -0x1dd8: "" -0x1dd9: "" -0x1dda: "" -0x1ddb: "" -0x1ddc: "" -0x1ddd: "" -0x1dde: "" -0x1ddf: "" -0x1de0: "" -0x1de1: "" -0x1de2: "" -0x1de3: "" -0x1de4: "" -0x1de5: "" -0x1de6: "" -0x1de7: "" -0x1de8: "" -0x1de9: "" -0x1dea: "" -0x1deb: "" -0x1dec: "" -0x1ded: "" -0x1dee: "" -0x1def: "" -0x1df0: "" -0x1df1: "" -0x1df2: "" -0x1df3: "" -0x1df4: "" -0x1df5: "" -0x1df6: "" -0x1df7: "" -0x1df8: "" -0x1df9: "" -0x1dfa: "" -0x1dfb: "" -0x1dfc: "" -0x1dfd: "" -0x1dfe: "" -/* x01e */ -0x1e00: "A" -0x1e01: "a" -0x1e02: "B" -0x1e03: "b" -0x1e04: "B" -0x1e05: "b" -0x1e06: "B" -0x1e07: "b" -0x1e08: "C" -0x1e09: "c" -0x1e0a: "D" -0x1e0b: "d" -0x1e0c: "D" -0x1e0d: "d" -0x1e0e: "D" -0x1e0f: "d" -0x1e10: "D" -0x1e11: "d" -0x1e12: "D" -0x1e13: "d" -0x1e14: "E" -0x1e15: "e" -0x1e16: "E" -0x1e17: "e" -0x1e18: "E" -0x1e19: "e" -0x1e1a: "E" -0x1e1b: "e" -0x1e1c: "E" -0x1e1d: "e" -0x1e1e: "F" -0x1e1f: "f" -0x1e20: "G" -0x1e21: "g" -0x1e22: "H" -0x1e23: "h" -0x1e24: "H" -0x1e25: "h" -0x1e26: "H" -0x1e27: "h" -0x1e28: "H" -0x1e29: "h" -0x1e2a: "H" -0x1e2b: "h" -0x1e2c: "I" -0x1e2d: "i" -0x1e2e: "I" -0x1e2f: "i" -0x1e30: "K" -0x1e31: "k" -0x1e32: "K" -0x1e33: "k" -0x1e34: "K" -0x1e35: "k" -0x1e36: "L" -0x1e37: "l" -0x1e38: "L" -0x1e39: "l" -0x1e3a: "L" -0x1e3b: "l" -0x1e3c: "L" -0x1e3d: "l" -0x1e3e: "M" -0x1e3f: "m" -0x1e40: "M" -0x1e41: "m" -0x1e42: "M" -0x1e43: "m" -0x1e44: "N" -0x1e45: "n" -0x1e46: "N" -0x1e47: "n" -0x1e48: "N" -0x1e49: "n" -0x1e4a: "N" -0x1e4b: "n" -0x1e4c: "O" -0x1e4d: "o" -0x1e4e: "O" -0x1e4f: "o" -0x1e50: "O" -0x1e51: "o" -0x1e52: "O" -0x1e53: "o" -0x1e54: "P" -0x1e55: "p" -0x1e56: "P" -0x1e57: "p" -0x1e58: "R" -0x1e59: "r" -0x1e5a: "R" -0x1e5b: "r" -0x1e5c: "R" -0x1e5d: "r" -0x1e5e: "R" -0x1e5f: "r" -0x1e60: "S" -0x1e61: "s" -0x1e62: "S" -0x1e63: "s" -0x1e64: "S" -0x1e65: "s" -0x1e66: "S" -0x1e67: "s" -0x1e68: "S" -0x1e69: "s" -0x1e6a: "T" -0x1e6b: "t" -0x1e6c: "T" -0x1e6d: "t" -0x1e6e: "T" -0x1e6f: "t" -0x1e70: "T" -0x1e71: "t" -0x1e72: "U" -0x1e73: "u" -0x1e74: "U" -0x1e75: "u" -0x1e76: "U" -0x1e77: "u" -0x1e78: "U" -0x1e79: "u" -0x1e7a: "U" -0x1e7b: "u" -0x1e7c: "V" -0x1e7d: "v" -0x1e7e: "V" -0x1e7f: "v" -0x1e80: "W" -0x1e81: "w" -0x1e82: "W" -0x1e83: "w" -0x1e84: "W" -0x1e85: "w" -0x1e86: "W" -0x1e87: "w" -0x1e88: "W" -0x1e89: "w" -0x1e8a: "X" -0x1e8b: "x" -0x1e8c: "X" -0x1e8d: "x" -0x1e8e: "Y" -0x1e8f: "y" -0x1e90: "Z" -0x1e91: "z" -0x1e92: "Z" -0x1e93: "z" -0x1e94: "Z" -0x1e95: "z" -0x1e96: "h" -0x1e97: "t" -0x1e98: "w" -0x1e99: "y" -0x1e9a: "a" -0x1e9b: "S" -0x1e9c: "[?]" -0x1e9d: "[?]" -0x1e9e: "Ss" -0x1e9f: "[?]" -0x1ea0: "A" -0x1ea1: "a" -0x1ea2: "A" -0x1ea3: "a" -0x1ea4: "A" -0x1ea5: "a" -0x1ea6: "A" -0x1ea7: "a" -0x1ea8: "A" -0x1ea9: "a" -0x1eaa: "A" -0x1eab: "a" -0x1eac: "A" -0x1ead: "a" -0x1eae: "A" -0x1eaf: "a" -0x1eb0: "A" -0x1eb1: "a" -0x1eb2: "A" -0x1eb3: "a" -0x1eb4: "A" -0x1eb5: "a" -0x1eb6: "A" -0x1eb7: "a" -0x1eb8: "E" -0x1eb9: "e" -0x1eba: "E" -0x1ebb: "e" -0x1ebc: "E" -0x1ebd: "e" -0x1ebe: "E" -0x1ebf: "e" -0x1ec0: "E" -0x1ec1: "e" -0x1ec2: "E" -0x1ec3: "e" -0x1ec4: "E" -0x1ec5: "e" -0x1ec6: "E" -0x1ec7: "e" -0x1ec8: "I" -0x1ec9: "i" -0x1eca: "I" -0x1ecb: "i" -0x1ecc: "O" -0x1ecd: "o" -0x1ece: "O" -0x1ecf: "o" -0x1ed0: "O" -0x1ed1: "o" -0x1ed2: "O" -0x1ed3: "o" -0x1ed4: "O" -0x1ed5: "o" -0x1ed6: "O" -0x1ed7: "o" -0x1ed8: "O" -0x1ed9: "o" -0x1eda: "O" -0x1edb: "o" -0x1edc: "O" -0x1edd: "o" -0x1ede: "O" -0x1edf: "o" -0x1ee0: "O" -0x1ee1: "o" -0x1ee2: "O" -0x1ee3: "o" -0x1ee4: "U" -0x1ee5: "u" -0x1ee6: "U" -0x1ee7: "u" -0x1ee8: "U" -0x1ee9: "u" -0x1eea: "U" -0x1eeb: "u" -0x1eec: "U" -0x1eed: "u" -0x1eee: "U" -0x1eef: "u" -0x1ef0: "U" -0x1ef1: "u" -0x1ef2: "Y" -0x1ef3: "y" -0x1ef4: "Y" -0x1ef5: "y" -0x1ef6: "Y" -0x1ef7: "y" -0x1ef8: "Y" -0x1ef9: "y" -0x1efa: "[?]" -0x1efb: "[?]" -0x1efc: "[?]" -0x1efd: "[?]" -0x1efe: "[?]" -/* x01f */ -0x1f00: "a" -0x1f01: "a" -0x1f02: "a" -0x1f03: "a" -0x1f04: "a" -0x1f05: "a" -0x1f06: "a" -0x1f07: "a" -0x1f08: "A" -0x1f09: "A" -0x1f0a: "A" -0x1f0b: "A" -0x1f0c: "A" -0x1f0d: "A" -0x1f0e: "A" -0x1f0f: "A" -0x1f10: "e" -0x1f11: "e" -0x1f12: "e" -0x1f13: "e" -0x1f14: "e" -0x1f15: "e" -0x1f16: "[?]" -0x1f17: "[?]" -0x1f18: "E" -0x1f19: "E" -0x1f1a: "E" -0x1f1b: "E" -0x1f1c: "E" -0x1f1d: "E" -0x1f1e: "[?]" -0x1f1f: "[?]" -0x1f20: "e" -0x1f21: "e" -0x1f22: "e" -0x1f23: "e" -0x1f24: "e" -0x1f25: "e" -0x1f26: "e" -0x1f27: "e" -0x1f28: "E" -0x1f29: "E" -0x1f2a: "E" -0x1f2b: "E" -0x1f2c: "E" -0x1f2d: "E" -0x1f2e: "E" -0x1f2f: "E" -0x1f30: "i" -0x1f31: "i" -0x1f32: "i" -0x1f33: "i" -0x1f34: "i" -0x1f35: "i" -0x1f36: "i" -0x1f37: "i" -0x1f38: "I" -0x1f39: "I" -0x1f3a: "I" -0x1f3b: "I" -0x1f3c: "I" -0x1f3d: "I" -0x1f3e: "I" -0x1f3f: "I" -0x1f40: "o" -0x1f41: "o" -0x1f42: "o" -0x1f43: "o" -0x1f44: "o" -0x1f45: "o" -0x1f46: "[?]" -0x1f47: "[?]" -0x1f48: "O" -0x1f49: "O" -0x1f4a: "O" -0x1f4b: "O" -0x1f4c: "O" -0x1f4d: "O" -0x1f4e: "[?]" -0x1f4f: "[?]" -0x1f50: "u" -0x1f51: "u" -0x1f52: "u" -0x1f53: "u" -0x1f54: "u" -0x1f55: "u" -0x1f56: "u" -0x1f57: "u" -0x1f58: "[?]" -0x1f59: "U" -0x1f5a: "[?]" -0x1f5b: "U" -0x1f5c: "[?]" -0x1f5d: "U" -0x1f5e: "[?]" -0x1f5f: "U" -0x1f60: "o" -0x1f61: "o" -0x1f62: "o" -0x1f63: "o" -0x1f64: "o" -0x1f65: "o" -0x1f66: "o" -0x1f67: "o" -0x1f68: "O" -0x1f69: "O" -0x1f6a: "O" -0x1f6b: "O" -0x1f6c: "O" -0x1f6d: "O" -0x1f6e: "O" -0x1f6f: "O" -0x1f70: "a" -0x1f71: "a" -0x1f72: "e" -0x1f73: "e" -0x1f74: "e" -0x1f75: "e" -0x1f76: "i" -0x1f77: "i" -0x1f78: "o" -0x1f79: "o" -0x1f7a: "u" -0x1f7b: "u" -0x1f7c: "o" -0x1f7d: "o" -0x1f7e: "[?]" -0x1f7f: "[?]" -0x1f80: "a" -0x1f81: "a" -0x1f82: "a" -0x1f83: "a" -0x1f84: "a" -0x1f85: "a" -0x1f86: "a" -0x1f87: "a" -0x1f88: "A" -0x1f89: "A" -0x1f8a: "A" -0x1f8b: "A" -0x1f8c: "A" -0x1f8d: "A" -0x1f8e: "A" -0x1f8f: "A" -0x1f90: "e" -0x1f91: "e" -0x1f92: "e" -0x1f93: "e" -0x1f94: "e" -0x1f95: "e" -0x1f96: "e" -0x1f97: "e" -0x1f98: "E" -0x1f99: "E" -0x1f9a: "E" -0x1f9b: "E" -0x1f9c: "E" -0x1f9d: "E" -0x1f9e: "E" -0x1f9f: "E" -0x1fa0: "o" -0x1fa1: "o" -0x1fa2: "o" -0x1fa3: "o" -0x1fa4: "o" -0x1fa5: "o" -0x1fa6: "o" -0x1fa7: "o" -0x1fa8: "O" -0x1fa9: "O" -0x1faa: "O" -0x1fab: "O" -0x1fac: "O" -0x1fad: "O" -0x1fae: "O" -0x1faf: "O" -0x1fb0: "a" -0x1fb1: "a" -0x1fb2: "a" -0x1fb3: "a" -0x1fb4: "a" -0x1fb5: "[?]" -0x1fb6: "a" -0x1fb7: "a" -0x1fb8: "A" -0x1fb9: "A" -0x1fba: "A" -0x1fbb: "A" -0x1fbc: "A" -0x1fbd: "'" -0x1fbe: "i" -0x1fbf: "'" -0x1fc0: "~" -0x1fc1: "\"~" -0x1fc2: "e" -0x1fc3: "e" -0x1fc4: "e" -0x1fc5: "[?]" -0x1fc6: "e" -0x1fc7: "e" -0x1fc8: "E" -0x1fc9: "E" -0x1fca: "E" -0x1fcb: "E" -0x1fcc: "E" -0x1fcd: "'`" -0x1fce: "''" -0x1fcf: "'~" -0x1fd0: "i" -0x1fd1: "i" -0x1fd2: "i" -0x1fd3: "i" -0x1fd4: "[?]" -0x1fd5: "[?]" -0x1fd6: "i" -0x1fd7: "i" -0x1fd8: "I" -0x1fd9: "I" -0x1fda: "I" -0x1fdb: "I" -0x1fdc: "[?]" -0x1fdd: "`'" -0x1fde: "`'" -0x1fdf: "`~" -0x1fe0: "u" -0x1fe1: "u" -0x1fe2: "u" -0x1fe3: "u" -0x1fe4: "R" -0x1fe5: "R" -0x1fe6: "u" -0x1fe7: "u" -0x1fe8: "U" -0x1fe9: "U" -0x1fea: "U" -0x1feb: "U" -0x1fec: "R" -0x1fed: "\"`" -0x1fee: "\"'" -0x1fef: "`" -0x1ff0: "[?]" -0x1ff1: "[?]" -0x1ff2: "o" -0x1ff3: "o" -0x1ff4: "o" -0x1ff5: "[?]" -0x1ff6: "o" -0x1ff7: "o" -0x1ff8: "O" -0x1ff9: "O" -0x1ffa: "O" -0x1ffb: "O" -0x1ffc: "O" -0x1ffd: "'" -0x1ffe: "`" -/* x020 */ -0x2000: " " -0x2001: " " -0x2002: " " -0x2003: " " -0x2004: " " -0x2005: " " -0x2006: " " -0x2007: " " -0x2008: " " -0x2009: " " -0x200a: " " -0x200b: " " -0x200c: "" -0x200d: "" -0x200e: "" -0x200f: "" -0x2010: "-" -0x2011: "-" -0x2012: "-" -0x2013: "-" -0x2014: "--" -0x2015: "--" -0x2016: "||" -0x2017: "_" -0x2018: "'" -0x2019: "'" -0x201a: "," -0x201b: "'" -0x201c: "\"" -0x201d: "\"" -0x201e: ",," -0x201f: "\"" -0x2020: "+" -0x2021: "++" -0x2022: "*" -0x2023: "*>" -0x2024: "." -0x2025: ".." -0x2026: "..." -0x2027: "." -0x2028: "\n" -0x2029: "\n\n" -0x202a: "" -0x202b: "" -0x202c: "" -0x202d: "" -0x202e: "" -0x202f: " " -0x2030: "%0" -0x2031: "%00" -0x2032: "'" -0x2033: "''" -0x2034: "'''" -0x2035: "`" -0x2036: "``" -0x2037: "```" -0x2038: "^" -0x2039: "<" -0x203a: ">" -0x203b: "*" -0x203c: "!!" -0x203d: "!?" -0x203e: "-" -0x203f: "_" -0x2040: "-" -0x2041: "^" -0x2042: "***" -0x2043: "--" -0x2044: "/" -0x2045: "-[" -0x2046: "]-" -0x2047: "[?]" -0x2048: "?!" -0x2049: "!?" -0x204a: "7" -0x204b: "PP" -0x204c: "(]" -0x204d: "[)" -0x204e: "[?]" -0x204f: "[?]" -0x2050: "[?]" -0x2051: "[?]" -0x2052: "[?]" -0x2053: "[?]" -0x2054: "[?]" -0x2055: "[?]" -0x2056: "[?]" -0x2057: "[?]" -0x2058: "[?]" -0x2059: "[?]" -0x205a: "[?]" -0x205b: "[?]" -0x205c: "[?]" -0x205d: "[?]" -0x205e: "[?]" -0x205f: "[?]" -0x2060: "[?]" -0x2061: "[?]" -0x2062: "[?]" -0x2063: "[?]" -0x2064: "[?]" -0x2065: "[?]" -0x2066: "[?]" -0x2067: "[?]" -0x2068: "[?]" -0x2069: "[?]" -0x206a: "" -0x206b: "" -0x206c: "" -0x206d: "" -0x206e: "" -0x206f: "" -0x2070: "0" -0x2071: "" -0x2072: "" -0x2073: "" -0x2074: "4" -0x2075: "5" -0x2076: "6" -0x2077: "7" -0x2078: "8" -0x2079: "9" -0x207a: "+" -0x207b: "-" -0x207c: "=" -0x207d: "(" -0x207e: ")" -0x207f: "n" -0x2080: "0" -0x2081: "1" -0x2082: "2" -0x2083: "3" -0x2084: "4" -0x2085: "5" -0x2086: "6" -0x2087: "7" -0x2088: "8" -0x2089: "9" -0x208a: "+" -0x208b: "-" -0x208c: "=" -0x208d: "(" -0x208e: ")" -0x208f: "[?]" -0x2090: "[?]" -0x2091: "[?]" -0x2092: "[?]" -0x2093: "[?]" -0x2094: "[?]" -0x2095: "[?]" -0x2096: "[?]" -0x2097: "[?]" -0x2098: "[?]" -0x2099: "[?]" -0x209a: "[?]" -0x209b: "[?]" -0x209c: "[?]" -0x209d: "[?]" -0x209e: "[?]" -0x209f: "[?]" -0x20a0: "ECU" -0x20a1: "CL" -0x20a2: "Cr" -0x20a3: "FF" -0x20a4: "L" -0x20a5: "mil" -0x20a6: "N" -0x20a7: "Pts" -0x20a8: "Rs" -0x20a9: "W" -0x20aa: "NS" -0x20ab: "D" -0x20ac: "EU" -0x20ad: "K" -0x20ae: "T" -0x20af: "Dr" -0x20b0: "[?]" -0x20b1: "[?]" -0x20b2: "[?]" -0x20b3: "[?]" -0x20b4: "[?]" -0x20b5: "[?]" -0x20b6: "[?]" -0x20b7: "[?]" -0x20b8: "[?]" -0x20b9: "[?]" -0x20ba: "[?]" -0x20bb: "[?]" -0x20bc: "[?]" -0x20bd: "[?]" -0x20be: "[?]" -0x20bf: "[?]" -0x20c0: "[?]" -0x20c1: "[?]" -0x20c2: "[?]" -0x20c3: "[?]" -0x20c4: "[?]" -0x20c5: "[?]" -0x20c6: "[?]" -0x20c7: "[?]" -0x20c8: "[?]" -0x20c9: "[?]" -0x20ca: "[?]" -0x20cb: "[?]" -0x20cc: "[?]" -0x20cd: "[?]" -0x20ce: "[?]" -0x20cf: "[?]" -0x20d0: "" -0x20d1: "" -0x20d2: "" -0x20d3: "" -0x20d4: "" -0x20d5: "" -0x20d6: "" -0x20d7: "" -0x20d8: "" -0x20d9: "" -0x20da: "" -0x20db: "" -0x20dc: "" -0x20dd: "" -0x20de: "" -0x20df: "" -0x20e0: "" -0x20e1: "" -0x20e2: "" -0x20e3: "" -0x20e4: "[?]" -0x20e5: "[?]" -0x20e6: "[?]" -0x20e7: "[?]" -0x20e8: "[?]" -0x20e9: "[?]" -0x20ea: "[?]" -0x20eb: "[?]" -0x20ec: "[?]" -0x20ed: "[?]" -0x20ee: "[?]" -0x20ef: "[?]" -0x20f0: "[?]" -0x20f1: "[?]" -0x20f2: "[?]" -0x20f3: "[?]" -0x20f4: "[?]" -0x20f5: "[?]" -0x20f6: "[?]" -0x20f7: "[?]" -0x20f8: "[?]" -0x20f9: "[?]" -0x20fa: "[?]" -0x20fb: "[?]" -0x20fc: "[?]" -0x20fd: "[?]" -0x20fe: "[?]" -/* x021 */ -0x2100: "" -0x2101: "" -0x2102: "" -0x2103: "" -0x2104: "" -0x2105: "" -0x2106: "" -0x2107: "" -0x2108: "" -0x2109: "" -0x210a: "" -0x210b: "" -0x210c: "" -0x210d: "" -0x210e: "" -0x210f: "" -0x2110: "" -0x2111: "" -0x2112: "" -0x2113: "" -0x2114: "" -0x2115: "" -0x2116: "" -0x2117: "" -0x2118: "" -0x2119: "" -0x211a: "" -0x211b: "" -0x211c: "" -0x211d: "" -0x211e: "" -0x211f: "" -0x2120: "" -0x2121: "" -0x2122: "" -0x2123: "" -0x2124: "" -0x2125: "" -0x2126: "" -0x2127: "" -0x2128: "" -0x2129: "" -0x212a: "K" -0x212b: "A" -0x212c: "" -0x212d: "" -0x212e: "" -0x212f: "" -0x2130: "" -0x2131: "" -0x2132: "F" -0x2133: "" -0x2134: "" -0x2135: "" -0x2136: "" -0x2137: "" -0x2138: "" -0x2139: "" -0x213a: "" -0x213b: "[?]" -0x213c: "[?]" -0x213d: "[?]" -0x213e: "[?]" -0x213f: "[?]" -0x2140: "[?]" -0x2141: "[?]" -0x2142: "[?]" -0x2143: "[?]" -0x2144: "[?]" -0x2145: "[?]" -0x2146: "[?]" -0x2147: "[?]" -0x2148: "[?]" -0x2149: "[?]" -0x214a: "[?]" -0x214b: "[?]" -0x214c: "[?]" -0x214d: "[?]" -0x214e: "F" -0x214f: "[?]" -0x2150: "[?]" -0x2151: "[?]" -0x2152: "[?]" -0x2153: " 1/3 " -0x2154: " 2/3 " -0x2155: " 1/5 " -0x2156: " 2/5 " -0x2157: " 3/5 " -0x2158: " 4/5 " -0x2159: " 1/6 " -0x215a: " 5/6 " -0x215b: " 1/8 " -0x215c: " 3/8 " -0x215d: " 5/8 " -0x215e: " 7/8 " -0x215f: " 1/" -0x2160: "I" -0x2161: "II" -0x2162: "III" -0x2163: "IV" -0x2164: "V" -0x2165: "VI" -0x2166: "VII" -0x2167: "VIII" -0x2168: "IX" -0x2169: "X" -0x216a: "XI" -0x216b: "XII" -0x216c: "L" -0x216d: "C" -0x216e: "D" -0x216f: "M" -0x2170: "i" -0x2171: "ii" -0x2172: "iii" -0x2173: "iv" -0x2174: "v" -0x2175: "vi" -0x2176: "vii" -0x2177: "viii" -0x2178: "ix" -0x2179: "x" -0x217a: "xi" -0x217b: "xii" -0x217c: "l" -0x217d: "c" -0x217e: "d" -0x217f: "m" -0x2180: "(D" -0x2181: "D)" -0x2182: "((|))" -0x2183: ")" -0x2184: "[?]" -0x2185: "[?]" -0x2186: "[?]" -0x2187: "[?]" -0x2188: "[?]" -0x2189: "[?]" -0x218a: "[?]" -0x218b: "[?]" -0x218c: "[?]" -0x218d: "[?]" -0x218e: "[?]" -0x218f: "[?]" -0x2190: "-" -0x2191: "|" -0x2192: "-" -0x2193: "|" -0x2194: "-" -0x2195: "|" -0x2196: "\\" -0x2197: "/" -0x2198: "\\" -0x2199: "/" -0x219a: "-" -0x219b: "-" -0x219c: "~" -0x219d: "~" -0x219e: "-" -0x219f: "|" -0x21a0: "-" -0x21a1: "|" -0x21a2: "-" -0x21a3: "-" -0x21a4: "-" -0x21a5: "|" -0x21a6: "-" -0x21a7: "|" -0x21a8: "|" -0x21a9: "-" -0x21aa: "-" -0x21ab: "-" -0x21ac: "-" -0x21ad: "-" -0x21ae: "-" -0x21af: "|" -0x21b0: "|" -0x21b1: "|" -0x21b2: "|" -0x21b3: "|" -0x21b4: "|" -0x21b5: "|" -0x21b6: "^" -0x21b7: "V" -0x21b8: "\\" -0x21b9: "=" -0x21ba: "V" -0x21bb: "^" -0x21bc: "-" -0x21bd: "-" -0x21be: "|" -0x21bf: "|" -0x21c0: "-" -0x21c1: "-" -0x21c2: "|" -0x21c3: "|" -0x21c4: "=" -0x21c5: "|" -0x21c6: "=" -0x21c7: "=" -0x21c8: "|" -0x21c9: "=" -0x21ca: "|" -0x21cb: "=" -0x21cc: "=" -0x21cd: "=" -0x21ce: "=" -0x21cf: "=" -0x21d0: "=" -0x21d1: "|" -0x21d2: "=" -0x21d3: "|" -0x21d4: "=" -0x21d5: "|" -0x21d6: "\\" -0x21d7: "/" -0x21d8: "\\" -0x21d9: "/" -0x21da: "=" -0x21db: "=" -0x21dc: "~" -0x21dd: "~" -0x21de: "|" -0x21df: "|" -0x21e0: "-" -0x21e1: "|" -0x21e2: "-" -0x21e3: "|" -0x21e4: "-" -0x21e5: "-" -0x21e6: "-" -0x21e7: "|" -0x21e8: "-" -0x21e9: "|" -0x21ea: "|" -0x21eb: "|" -0x21ec: "|" -0x21ed: "|" -0x21ee: "|" -0x21ef: "|" -0x21f0: "-" -0x21f1: "\\" -0x21f2: "\\" -0x21f3: "|" -0x21f4: "[?]" -0x21f5: "[?]" -0x21f6: "[?]" -0x21f7: "[?]" -0x21f8: "[?]" -0x21f9: "[?]" -0x21fa: "[?]" -0x21fb: "[?]" -0x21fc: "[?]" -0x21fd: "[?]" -0x21fe: "[?]" -/* x022 */ -0x2200: "[?]" -0x2201: "[?]" -0x2202: "[?]" -0x2203: "[?]" -0x2204: "[?]" -0x2205: "[?]" -0x2206: "[?]" -0x2207: "[?]" -0x2208: "[?]" -0x2209: "[?]" -0x220a: "[?]" -0x220b: "[?]" -0x220c: "[?]" -0x220d: "[?]" -0x220e: "[?]" -0x220f: "[?]" -0x2210: "[?]" -0x2211: "[?]" -0x2212: "[?]" -0x2213: "[?]" -0x2214: "[?]" -0x2215: "[?]" -0x2216: "[?]" -0x2217: "[?]" -0x2218: "[?]" -0x2219: "[?]" -0x221a: "[?]" -0x221b: "[?]" -0x221c: "[?]" -0x221d: "[?]" -0x221e: "[?]" -0x221f: "[?]" -0x2220: "[?]" -0x2221: "[?]" -0x2222: "[?]" -0x2223: "[?]" -0x2224: "[?]" -0x2225: "[?]" -0x2226: "[?]" -0x2227: "[?]" -0x2228: "[?]" -0x2229: "[?]" -0x222a: "[?]" -0x222b: "[?]" -0x222c: "[?]" -0x222d: "[?]" -0x222e: "[?]" -0x222f: "[?]" -0x2230: "[?]" -0x2231: "[?]" -0x2232: "[?]" -0x2233: "[?]" -0x2234: "[?]" -0x2235: "[?]" -0x2236: "[?]" -0x2237: "[?]" -0x2238: "[?]" -0x2239: "[?]" -0x223a: "[?]" -0x223b: "[?]" -0x223c: "[?]" -0x223d: "[?]" -0x223e: "[?]" -0x223f: "[?]" -0x2240: "[?]" -0x2241: "[?]" -0x2242: "[?]" -0x2243: "[?]" -0x2244: "[?]" -0x2245: "[?]" -0x2246: "[?]" -0x2247: "[?]" -0x2248: "[?]" -0x2249: "[?]" -0x224a: "[?]" -0x224b: "[?]" -0x224c: "[?]" -0x224d: "[?]" -0x224e: "[?]" -0x224f: "[?]" -0x2250: "[?]" -0x2251: "[?]" -0x2252: "[?]" -0x2253: "[?]" -0x2254: "[?]" -0x2255: "[?]" -0x2256: "[?]" -0x2257: "[?]" -0x2258: "[?]" -0x2259: "[?]" -0x225a: "[?]" -0x225b: "[?]" -0x225c: "[?]" -0x225d: "[?]" -0x225e: "[?]" -0x225f: "[?]" -0x2260: "[?]" -0x2261: "[?]" -0x2262: "[?]" -0x2263: "[?]" -0x2264: "[?]" -0x2265: "[?]" -0x2266: "[?]" -0x2267: "[?]" -0x2268: "[?]" -0x2269: "[?]" -0x226a: "[?]" -0x226b: "[?]" -0x226c: "[?]" -0x226d: "[?]" -0x226e: "[?]" -0x226f: "[?]" -0x2270: "[?]" -0x2271: "[?]" -0x2272: "[?]" -0x2273: "[?]" -0x2274: "[?]" -0x2275: "[?]" -0x2276: "[?]" -0x2277: "[?]" -0x2278: "[?]" -0x2279: "[?]" -0x227a: "[?]" -0x227b: "[?]" -0x227c: "[?]" -0x227d: "[?]" -0x227e: "[?]" -0x227f: "[?]" -0x2280: "[?]" -0x2281: "[?]" -0x2282: "[?]" -0x2283: "[?]" -0x2284: "[?]" -0x2285: "[?]" -0x2286: "[?]" -0x2287: "[?]" -0x2288: "[?]" -0x2289: "[?]" -0x228a: "[?]" -0x228b: "[?]" -0x228c: "[?]" -0x228d: "[?]" -0x228e: "[?]" -0x228f: "[?]" -0x2290: "[?]" -0x2291: "[?]" -0x2292: "[?]" -0x2293: "[?]" -0x2294: "[?]" -0x2295: "[?]" -0x2296: "[?]" -0x2297: "[?]" -0x2298: "[?]" -0x2299: "[?]" -0x229a: "[?]" -0x229b: "[?]" -0x229c: "[?]" -0x229d: "[?]" -0x229e: "[?]" -0x229f: "[?]" -0x22a0: "[?]" -0x22a1: "[?]" -0x22a2: "[?]" -0x22a3: "[?]" -0x22a4: "[?]" -0x22a5: "[?]" -0x22a6: "[?]" -0x22a7: "[?]" -0x22a8: "[?]" -0x22a9: "[?]" -0x22aa: "[?]" -0x22ab: "[?]" -0x22ac: "[?]" -0x22ad: "[?]" -0x22ae: "[?]" -0x22af: "[?]" -0x22b0: "[?]" -0x22b1: "[?]" -0x22b2: "[?]" -0x22b3: "[?]" -0x22b4: "[?]" -0x22b5: "[?]" -0x22b6: "[?]" -0x22b7: "[?]" -0x22b8: "[?]" -0x22b9: "[?]" -0x22ba: "[?]" -0x22bb: "[?]" -0x22bc: "[?]" -0x22bd: "[?]" -0x22be: "[?]" -0x22bf: "[?]" -0x22c0: "[?]" -0x22c1: "[?]" -0x22c2: "[?]" -0x22c3: "[?]" -0x22c4: "[?]" -0x22c5: "[?]" -0x22c6: "[?]" -0x22c7: "[?]" -0x22c8: "[?]" -0x22c9: "[?]" -0x22ca: "[?]" -0x22cb: "[?]" -0x22cc: "[?]" -0x22cd: "[?]" -0x22ce: "[?]" -0x22cf: "[?]" -0x22d0: "[?]" -0x22d1: "[?]" -0x22d2: "[?]" -0x22d3: "[?]" -0x22d4: "[?]" -0x22d5: "[?]" -0x22d6: "[?]" -0x22d7: "[?]" -0x22d8: "[?]" -0x22d9: "[?]" -0x22da: "[?]" -0x22db: "[?]" -0x22dc: "[?]" -0x22dd: "[?]" -0x22de: "[?]" -0x22df: "[?]" -0x22e0: "[?]" -0x22e1: "[?]" -0x22e2: "[?]" -0x22e3: "[?]" -0x22e4: "[?]" -0x22e5: "[?]" -0x22e6: "[?]" -0x22e7: "[?]" -0x22e8: "[?]" -0x22e9: "[?]" -0x22ea: "[?]" -0x22eb: "[?]" -0x22ec: "[?]" -0x22ed: "[?]" -0x22ee: "[?]" -0x22ef: "[?]" -0x22f0: "[?]" -0x22f1: "[?]" -0x22f2: "[?]" -0x22f3: "[?]" -0x22f4: "[?]" -0x22f5: "[?]" -0x22f6: "[?]" -0x22f7: "[?]" -0x22f8: "[?]" -0x22f9: "[?]" -0x22fa: "[?]" -0x22fb: "[?]" -0x22fc: "[?]" -0x22fd: "[?]" -0x22fe: "[?]" -/* x023 */ -0x2300: "[?]" -0x2301: "[?]" -0x2302: "[?]" -0x2303: "[?]" -0x2304: "[?]" -0x2305: "[?]" -0x2306: "[?]" -0x2307: "[?]" -0x2308: "[?]" -0x2309: "[?]" -0x230a: "[?]" -0x230b: "[?]" -0x230c: "[?]" -0x230d: "[?]" -0x230e: "[?]" -0x230f: "[?]" -0x2310: "[?]" -0x2311: "[?]" -0x2312: "[?]" -0x2313: "[?]" -0x2314: "[?]" -0x2315: "[?]" -0x2316: "[?]" -0x2317: "[?]" -0x2318: "[?]" -0x2319: "[?]" -0x231a: "[?]" -0x231b: "[?]" -0x231c: "[?]" -0x231d: "[?]" -0x231e: "[?]" -0x231f: "[?]" -0x2320: "[?]" -0x2321: "[?]" -0x2322: "[?]" -0x2323: "[?]" -0x2324: "[?]" -0x2325: "[?]" -0x2326: "[?]" -0x2327: "[?]" -0x2328: "[?]" -0x2329: "[?]" -0x232a: "[?]" -0x232b: "[?]" -0x232c: "[?]" -0x232d: "[?]" -0x232e: "[?]" -0x232f: "[?]" -0x2330: "[?]" -0x2331: "[?]" -0x2332: "[?]" -0x2333: "[?]" -0x2334: "[?]" -0x2335: "[?]" -0x2336: "[?]" -0x2337: "[?]" -0x2338: "[?]" -0x2339: "[?]" -0x233a: "[?]" -0x233b: "[?]" -0x233c: "[?]" -0x233d: "[?]" -0x233e: "[?]" -0x233f: "[?]" -0x2340: "[?]" -0x2341: "[?]" -0x2342: "[?]" -0x2343: "[?]" -0x2344: "[?]" -0x2345: "[?]" -0x2346: "[?]" -0x2347: "[?]" -0x2348: "[?]" -0x2349: "[?]" -0x234a: "[?]" -0x234b: "[?]" -0x234c: "[?]" -0x234d: "[?]" -0x234e: "[?]" -0x234f: "[?]" -0x2350: "[?]" -0x2351: "[?]" -0x2352: "[?]" -0x2353: "[?]" -0x2354: "[?]" -0x2355: "[?]" -0x2356: "[?]" -0x2357: "[?]" -0x2358: "[?]" -0x2359: "[?]" -0x235a: "[?]" -0x235b: "[?]" -0x235c: "[?]" -0x235d: "[?]" -0x235e: "[?]" -0x235f: "[?]" -0x2360: "[?]" -0x2361: "[?]" -0x2362: "[?]" -0x2363: "[?]" -0x2364: "[?]" -0x2365: "[?]" -0x2366: "[?]" -0x2367: "[?]" -0x2368: "[?]" -0x2369: "[?]" -0x236a: "[?]" -0x236b: "[?]" -0x236c: "[?]" -0x236d: "[?]" -0x236e: "[?]" -0x236f: "[?]" -0x2370: "[?]" -0x2371: "[?]" -0x2372: "[?]" -0x2373: "[?]" -0x2374: "[?]" -0x2375: "[?]" -0x2376: "[?]" -0x2377: "[?]" -0x2378: "[?]" -0x2379: "[?]" -0x237a: "[?]" -0x237b: "[?]" -0x237c: "[?]" -0x237d: "[?]" -0x237e: "[?]" -0x237f: "[?]" -0x2380: "[?]" -0x2381: "[?]" -0x2382: "[?]" -0x2383: "[?]" -0x2384: "[?]" -0x2385: "[?]" -0x2386: "[?]" -0x2387: "[?]" -0x2388: "[?]" -0x2389: "[?]" -0x238a: "[?]" -0x238b: "[?]" -0x238c: "[?]" -0x238d: "[?]" -0x238e: "[?]" -0x238f: "[?]" -0x2390: "[?]" -0x2391: "[?]" -0x2392: "[?]" -0x2393: "[?]" -0x2394: "[?]" -0x2395: "[?]" -0x2396: "[?]" -0x2397: "[?]" -0x2398: "[?]" -0x2399: "[?]" -0x239a: "[?]" -0x239b: "[?]" -0x239c: "[?]" -0x239d: "[?]" -0x239e: "[?]" -0x239f: "[?]" -0x23a0: "[?]" -0x23a1: "[?]" -0x23a2: "[?]" -0x23a3: "[?]" -0x23a4: "[?]" -0x23a5: "[?]" -0x23a6: "[?]" -0x23a7: "[?]" -0x23a8: "[?]" -0x23a9: "[?]" -0x23aa: "[?]" -0x23ab: "[?]" -0x23ac: "[?]" -0x23ad: "[?]" -0x23ae: "[?]" -0x23af: "[?]" -0x23b0: "[?]" -0x23b1: "[?]" -0x23b2: "[?]" -0x23b3: "[?]" -0x23b4: "[?]" -0x23b5: "[?]" -0x23b6: "[?]" -0x23b7: "[?]" -0x23b8: "[?]" -0x23b9: "[?]" -0x23ba: "[?]" -0x23bb: "[?]" -0x23bc: "[?]" -0x23bd: "[?]" -0x23be: "[?]" -0x23bf: "[?]" -0x23c0: "[?]" -0x23c1: "[?]" -0x23c2: "[?]" -0x23c3: "[?]" -0x23c4: "[?]" -0x23c5: "[?]" -0x23c6: "[?]" -0x23c7: "[?]" -0x23c8: "[?]" -0x23c9: "[?]" -0x23ca: "[?]" -0x23cb: "[?]" -0x23cc: "[?]" -0x23cd: "[?]" -0x23ce: "[?]" -0x23cf: "[?]" -0x23d0: "[?]" -0x23d1: "[?]" -0x23d2: "[?]" -0x23d3: "[?]" -0x23d4: "[?]" -0x23d5: "[?]" -0x23d6: "[?]" -0x23d7: "[?]" -0x23d8: "[?]" -0x23d9: "[?]" -0x23da: "[?]" -0x23db: "[?]" -0x23dc: "[?]" -0x23dd: "[?]" -0x23de: "[?]" -0x23df: "[?]" -0x23e0: "[?]" -0x23e1: "[?]" -0x23e2: "[?]" -0x23e3: "[?]" -0x23e4: "[?]" -0x23e5: "[?]" -0x23e6: "[?]" -0x23e7: "[?]" -0x23e8: "[?]" -0x23e9: "[?]" -0x23ea: "[?]" -0x23eb: "[?]" -0x23ec: "[?]" -0x23ed: "[?]" -0x23ee: "[?]" -0x23ef: "[?]" -0x23f0: "[?]" -0x23f1: "[?]" -0x23f2: "[?]" -0x23f3: "[?]" -0x23f4: "[?]" -0x23f5: "[?]" -0x23f6: "[?]" -0x23f7: "[?]" -0x23f8: "[?]" -0x23f9: "[?]" -0x23fa: "[?]" -0x23fb: "[?]" -0x23fc: "[?]" -0x23fd: "[?]" -0x23fe: "[?]" -/* x024 */ -0x2400: "" -0x2401: "" -0x2402: "" -0x2403: "" -0x2404: "" -0x2405: "" -0x2406: "" -0x2407: "" -0x2408: "" -0x2409: "" -0x240a: "" -0x240b: "" -0x240c: "" -0x240d: "" -0x240e: "" -0x240f: "" -0x2410: "" -0x2411: "" -0x2412: "" -0x2413: "" -0x2414: "" -0x2415: "" -0x2416: "" -0x2417: "" -0x2418: "" -0x2419: "" -0x241a: "" -0x241b: "" -0x241c: "" -0x241d: "" -0x241e: "" -0x241f: "" -0x2420: "" -0x2421: "" -0x2422: "" -0x2423: "" -0x2424: "" -0x2425: "" -0x2426: "" -0x2427: "[?]" -0x2428: "[?]" -0x2429: "[?]" -0x242a: "[?]" -0x242b: "[?]" -0x242c: "[?]" -0x242d: "[?]" -0x242e: "[?]" -0x242f: "[?]" -0x2430: "[?]" -0x2431: "[?]" -0x2432: "[?]" -0x2433: "[?]" -0x2434: "[?]" -0x2435: "[?]" -0x2436: "[?]" -0x2437: "[?]" -0x2438: "[?]" -0x2439: "[?]" -0x243a: "[?]" -0x243b: "[?]" -0x243c: "[?]" -0x243d: "[?]" -0x243e: "[?]" -0x243f: "[?]" -0x2440: "" -0x2441: "" -0x2442: "" -0x2443: "" -0x2444: "" -0x2445: "" -0x2446: "" -0x2447: "" -0x2448: "" -0x2449: "" -0x244a: "" -0x244b: "[?]" -0x244c: "[?]" -0x244d: "[?]" -0x244e: "[?]" -0x244f: "[?]" -0x2450: "[?]" -0x2451: "[?]" -0x2452: "[?]" -0x2453: "[?]" -0x2454: "[?]" -0x2455: "[?]" -0x2456: "[?]" -0x2457: "[?]" -0x2458: "[?]" -0x2459: "[?]" -0x245a: "[?]" -0x245b: "[?]" -0x245c: "[?]" -0x245d: "[?]" -0x245e: "[?]" -0x245f: "[?]" -0x2460: "" -0x2461: "" -0x2462: "" -0x2463: "" -0x2464: "" -0x2465: "" -0x2466: "" -0x2467: "" -0x2468: "" -0x2469: "" -0x246a: "" -0x246b: "" -0x246c: "" -0x246d: "" -0x246e: "" -0x246f: "" -0x2470: "" -0x2471: "" -0x2472: "" -0x2473: "" -0x2474: "" -0x2475: "" -0x2476: "" -0x2477: "" -0x2478: "" -0x2479: "" -0x247a: "" -0x247b: "" -0x247c: "" -0x247d: "" -0x247e: "" -0x247f: "" -0x2480: "" -0x2481: "" -0x2482: "" -0x2483: "" -0x2484: "" -0x2485: "" -0x2486: "" -0x2487: "" -0x2488: "" -0x2489: "" -0x248a: "" -0x248b: "" -0x248c: "" -0x248d: "" -0x248e: "" -0x248f: "" -0x2490: "" -0x2491: "" -0x2492: "" -0x2493: "" -0x2494: "" -0x2495: "" -0x2496: "" -0x2497: "" -0x2498: "" -0x2499: "" -0x249a: "" -0x249b: "" -0x249c: "" -0x249d: "" -0x249e: "" -0x249f: "" -0x24a0: "" -0x24a1: "" -0x24a2: "" -0x24a3: "" -0x24a4: "" -0x24a5: "" -0x24a6: "" -0x24a7: "" -0x24a8: "" -0x24a9: "" -0x24aa: "" -0x24ab: "" -0x24ac: "" -0x24ad: "" -0x24ae: "" -0x24af: "" -0x24b0: "" -0x24b1: "" -0x24b2: "" -0x24b3: "" -0x24b4: "" -0x24b5: "" -0x24b6: "" -0x24b7: "" -0x24b8: "" -0x24b9: "" -0x24ba: "" -0x24bb: "" -0x24bc: "" -0x24bd: "" -0x24be: "" -0x24bf: "" -0x24c0: "" -0x24c1: "" -0x24c2: "" -0x24c3: "" -0x24c4: "" -0x24c5: "" -0x24c6: "" -0x24c7: "" -0x24c8: "" -0x24c9: "" -0x24ca: "" -0x24cb: "" -0x24cc: "" -0x24cd: "" -0x24ce: "" -0x24cf: "" -0x24d0: "a" -0x24d1: "b" -0x24d2: "c" -0x24d3: "d" -0x24d4: "e" -0x24d5: "f" -0x24d6: "g" -0x24d7: "h" -0x24d8: "i" -0x24d9: "j" -0x24da: "k" -0x24db: "l" -0x24dc: "m" -0x24dd: "n" -0x24de: "o" -0x24df: "p" -0x24e0: "q" -0x24e1: "r" -0x24e2: "s" -0x24e3: "t" -0x24e4: "u" -0x24e5: "v" -0x24e6: "w" -0x24e7: "x" -0x24e8: "y" -0x24e9: "z" -0x24ea: "0" -0x24eb: "[?]" -0x24ec: "[?]" -0x24ed: "[?]" -0x24ee: "[?]" -0x24ef: "[?]" -0x24f0: "[?]" -0x24f1: "[?]" -0x24f2: "[?]" -0x24f3: "[?]" -0x24f4: "[?]" -0x24f5: "[?]" -0x24f6: "[?]" -0x24f7: "[?]" -0x24f8: "[?]" -0x24f9: "[?]" -0x24fa: "[?]" -0x24fb: "[?]" -0x24fc: "[?]" -0x24fd: "[?]" -0x24fe: "[?]" -/* x025 */ -0x2500: "-" -0x2501: "-" -0x2502: "|" -0x2503: "|" -0x2504: "-" -0x2505: "-" -0x2506: "|" -0x2507: "|" -0x2508: "-" -0x2509: "-" -0x250a: "|" -0x250b: "|" -0x250c: "+" -0x250d: "+" -0x250e: "+" -0x250f: "+" -0x2510: "+" -0x2511: "+" -0x2512: "+" -0x2513: "+" -0x2514: "+" -0x2515: "+" -0x2516: "+" -0x2517: "+" -0x2518: "+" -0x2519: "+" -0x251a: "+" -0x251b: "+" -0x251c: "+" -0x251d: "+" -0x251e: "+" -0x251f: "+" -0x2520: "+" -0x2521: "+" -0x2522: "+" -0x2523: "+" -0x2524: "+" -0x2525: "+" -0x2526: "+" -0x2527: "+" -0x2528: "+" -0x2529: "+" -0x252a: "+" -0x252b: "+" -0x252c: "+" -0x252d: "+" -0x252e: "+" -0x252f: "+" -0x2530: "+" -0x2531: "+" -0x2532: "+" -0x2533: "+" -0x2534: "+" -0x2535: "+" -0x2536: "+" -0x2537: "+" -0x2538: "+" -0x2539: "+" -0x253a: "+" -0x253b: "+" -0x253c: "+" -0x253d: "+" -0x253e: "+" -0x253f: "+" -0x2540: "+" -0x2541: "+" -0x2542: "+" -0x2543: "+" -0x2544: "+" -0x2545: "+" -0x2546: "+" -0x2547: "+" -0x2548: "+" -0x2549: "+" -0x254a: "+" -0x254b: "+" -0x254c: "-" -0x254d: "-" -0x254e: "|" -0x254f: "|" -0x2550: "-" -0x2551: "|" -0x2552: "+" -0x2553: "+" -0x2554: "+" -0x2555: "+" -0x2556: "+" -0x2557: "+" -0x2558: "+" -0x2559: "+" -0x255a: "+" -0x255b: "+" -0x255c: "+" -0x255d: "+" -0x255e: "+" -0x255f: "+" -0x2560: "+" -0x2561: "+" -0x2562: "+" -0x2563: "+" -0x2564: "+" -0x2565: "+" -0x2566: "+" -0x2567: "+" -0x2568: "+" -0x2569: "+" -0x256a: "+" -0x256b: "+" -0x256c: "+" -0x256d: "+" -0x256e: "+" -0x256f: "+" -0x2570: "+" -0x2571: "/" -0x2572: "\\" -0x2573: "X" -0x2574: "-" -0x2575: "|" -0x2576: "-" -0x2577: "|" -0x2578: "-" -0x2579: "|" -0x257a: "-" -0x257b: "|" -0x257c: "-" -0x257d: "|" -0x257e: "-" -0x257f: "|" -0x2580: "#" -0x2581: "#" -0x2582: "#" -0x2583: "#" -0x2584: "#" -0x2585: "#" -0x2586: "#" -0x2587: "#" -0x2588: "#" -0x2589: "#" -0x258a: "#" -0x258b: "#" -0x258c: "#" -0x258d: "#" -0x258e: "#" -0x258f: "#" -0x2590: "#" -0x2591: "#" -0x2592: "#" -0x2593: "#" -0x2594: "-" -0x2595: "|" -0x2596: "[?]" -0x2597: "[?]" -0x2598: "[?]" -0x2599: "[?]" -0x259a: "[?]" -0x259b: "[?]" -0x259c: "[?]" -0x259d: "[?]" -0x259e: "[?]" -0x259f: "[?]" -0x25a0: "#" -0x25a1: "#" -0x25a2: "#" -0x25a3: "#" -0x25a4: "#" -0x25a5: "#" -0x25a6: "#" -0x25a7: "#" -0x25a8: "#" -0x25a9: "#" -0x25aa: "#" -0x25ab: "#" -0x25ac: "#" -0x25ad: "#" -0x25ae: "#" -0x25af: "#" -0x25b0: "#" -0x25b1: "#" -0x25b2: "^" -0x25b3: "^" -0x25b4: "^" -0x25b5: "^" -0x25b6: ">" -0x25b7: ">" -0x25b8: ">" -0x25b9: ">" -0x25ba: ">" -0x25bb: ">" -0x25bc: "V" -0x25bd: "V" -0x25be: "V" -0x25bf: "V" -0x25c0: "<" -0x25c1: "<" -0x25c2: "<" -0x25c3: "<" -0x25c4: "<" -0x25c5: "<" -0x25c6: "*" -0x25c7: "*" -0x25c8: "*" -0x25c9: "*" -0x25ca: "*" -0x25cb: "*" -0x25cc: "*" -0x25cd: "*" -0x25ce: "*" -0x25cf: "*" -0x25d0: "*" -0x25d1: "*" -0x25d2: "*" -0x25d3: "*" -0x25d4: "*" -0x25d5: "*" -0x25d6: "*" -0x25d7: "*" -0x25d8: "*" -0x25d9: "*" -0x25da: "*" -0x25db: "*" -0x25dc: "*" -0x25dd: "*" -0x25de: "*" -0x25df: "*" -0x25e0: "*" -0x25e1: "*" -0x25e2: "*" -0x25e3: "*" -0x25e4: "*" -0x25e5: "*" -0x25e6: "*" -0x25e7: "#" -0x25e8: "#" -0x25e9: "#" -0x25ea: "#" -0x25eb: "#" -0x25ec: "^" -0x25ed: "^" -0x25ee: "^" -0x25ef: "O" -0x25f0: "#" -0x25f1: "#" -0x25f2: "#" -0x25f3: "#" -0x25f4: "#" -0x25f5: "#" -0x25f6: "#" -0x25f7: "#" -0x25f8: "[?]" -0x25f9: "[?]" -0x25fa: "[?]" -0x25fb: "[?]" -0x25fc: "[?]" -0x25fd: "[?]" -0x25fe: "[?]" -/* x026 */ -0x2600: "" -0x2601: "" -0x2602: "" -0x2603: "" -0x2604: "" -0x2605: "" -0x2606: "" -0x2607: "" -0x2608: "" -0x2609: "" -0x260a: "" -0x260b: "" -0x260c: "" -0x260d: "" -0x260e: "" -0x260f: "" -0x2610: "" -0x2611: "" -0x2612: "" -0x2613: "" -0x2614: "[?]" -0x2615: "[?]" -0x2616: "[?]" -0x2617: "[?]" -0x2618: "[?]" -0x2619: "" -0x261a: "" -0x261b: "" -0x261c: "" -0x261d: "" -0x261e: "" -0x261f: "" -0x2620: "" -0x2621: "" -0x2622: "" -0x2623: "" -0x2624: "" -0x2625: "" -0x2626: "" -0x2627: "" -0x2628: "" -0x2629: "" -0x262a: "" -0x262b: "" -0x262c: "" -0x262d: "" -0x262e: "" -0x262f: "" -0x2630: "" -0x2631: "" -0x2632: "" -0x2633: "" -0x2634: "" -0x2635: "" -0x2636: "" -0x2637: "" -0x2638: "" -0x2639: "" -0x263a: "" -0x263b: "" -0x263c: "" -0x263d: "" -0x263e: "" -0x263f: "" -0x2640: "" -0x2641: "" -0x2642: "" -0x2643: "" -0x2644: "" -0x2645: "" -0x2646: "" -0x2647: "" -0x2648: "" -0x2649: "" -0x264a: "" -0x264b: "" -0x264c: "" -0x264d: "" -0x264e: "" -0x264f: "" -0x2650: "" -0x2651: "" -0x2652: "" -0x2653: "" -0x2654: "" -0x2655: "" -0x2656: "" -0x2657: "" -0x2658: "" -0x2659: "" -0x265a: "" -0x265b: "" -0x265c: "" -0x265d: "" -0x265e: "" -0x265f: "" -0x2660: "" -0x2661: "" -0x2662: "" -0x2663: "" -0x2664: "" -0x2665: "" -0x2666: "" -0x2667: "" -0x2668: "" -0x2669: "" -0x266a: "" -0x266b: "" -0x266c: "" -0x266d: "" -0x266e: "" -0x266f: "" -0x2670: "" -0x2671: "" -0x2672: "[?]" -0x2673: "[?]" -0x2674: "[?]" -0x2675: "[?]" -0x2676: "[?]" -0x2677: "[?]" -0x2678: "[?]" -0x2679: "[?]" -0x267a: "[?]" -0x267b: "[?]" -0x267c: "[?]" -0x267d: "[?]" -0x267e: "[?]" -0x267f: "[?]" -0x2680: "[?]" -0x2681: "[?]" -0x2682: "[?]" -0x2683: "[?]" -0x2684: "[?]" -0x2685: "[?]" -0x2686: "[?]" -0x2687: "[?]" -0x2688: "[?]" -0x2689: "[?]" -0x268a: "[?]" -0x268b: "[?]" -0x268c: "[?]" -0x268d: "[?]" -0x268e: "[?]" -0x268f: "[?]" -0x2690: "[?]" -0x2691: "[?]" -0x2692: "[?]" -0x2693: "[?]" -0x2694: "[?]" -0x2695: "[?]" -0x2696: "[?]" -0x2697: "[?]" -0x2698: "[?]" -0x2699: "[?]" -0x269a: "[?]" -0x269b: "[?]" -0x269c: "[?]" -0x269d: "[?]" -0x269e: "[?]" -0x269f: "[?]" -0x26a0: "[?]" -0x26a1: "[?]" -0x26a2: "[?]" -0x26a3: "[?]" -0x26a4: "[?]" -0x26a5: "[?]" -0x26a6: "[?]" -0x26a7: "[?]" -0x26a8: "[?]" -0x26a9: "[?]" -0x26aa: "[?]" -0x26ab: "[?]" -0x26ac: "[?]" -0x26ad: "[?]" -0x26ae: "[?]" -0x26af: "[?]" -0x26b0: "[?]" -0x26b1: "[?]" -0x26b2: "[?]" -0x26b3: "[?]" -0x26b4: "[?]" -0x26b5: "[?]" -0x26b6: "[?]" -0x26b7: "[?]" -0x26b8: "[?]" -0x26b9: "[?]" -0x26ba: "[?]" -0x26bb: "[?]" -0x26bc: "[?]" -0x26bd: "[?]" -0x26be: "[?]" -0x26bf: "[?]" -0x26c0: "[?]" -0x26c1: "[?]" -0x26c2: "[?]" -0x26c3: "[?]" -0x26c4: "[?]" -0x26c5: "[?]" -0x26c6: "[?]" -0x26c7: "[?]" -0x26c8: "[?]" -0x26c9: "[?]" -0x26ca: "[?]" -0x26cb: "[?]" -0x26cc: "[?]" -0x26cd: "[?]" -0x26ce: "[?]" -0x26cf: "[?]" -0x26d0: "[?]" -0x26d1: "[?]" -0x26d2: "[?]" -0x26d3: "[?]" -0x26d4: "[?]" -0x26d5: "[?]" -0x26d6: "[?]" -0x26d7: "[?]" -0x26d8: "[?]" -0x26d9: "[?]" -0x26da: "[?]" -0x26db: "[?]" -0x26dc: "[?]" -0x26dd: "[?]" -0x26de: "[?]" -0x26df: "[?]" -0x26e0: "[?]" -0x26e1: "[?]" -0x26e2: "[?]" -0x26e3: "[?]" -0x26e4: "[?]" -0x26e5: "[?]" -0x26e6: "[?]" -0x26e7: "[?]" -0x26e8: "[?]" -0x26e9: "[?]" -0x26ea: "[?]" -0x26eb: "[?]" -0x26ec: "[?]" -0x26ed: "[?]" -0x26ee: "[?]" -0x26ef: "[?]" -0x26f0: "[?]" -0x26f1: "[?]" -0x26f2: "[?]" -0x26f3: "[?]" -0x26f4: "[?]" -0x26f5: "[?]" -0x26f6: "[?]" -0x26f7: "[?]" -0x26f8: "[?]" -0x26f9: "[?]" -0x26fa: "[?]" -0x26fb: "[?]" -0x26fc: "[?]" -0x26fd: "[?]" -0x26fe: "[?]" -/* x027 */ -0x2700: "[?]" -0x2701: "" -0x2702: "" -0x2703: "" -0x2704: "" -0x2705: "" -0x2706: "" -0x2707: "" -0x2708: "" -0x2709: "" -0x270a: "" -0x270b: "" -0x270c: "" -0x270d: "" -0x270e: "" -0x270f: "" -0x2710: "" -0x2711: "" -0x2712: "" -0x2713: "" -0x2714: "" -0x2715: "" -0x2716: "" -0x2717: "" -0x2718: "" -0x2719: "" -0x271a: "" -0x271b: "" -0x271c: "" -0x271d: "" -0x271e: "" -0x271f: "" -0x2720: "" -0x2721: "" -0x2722: "" -0x2723: "" -0x2724: "" -0x2725: "" -0x2726: "" -0x2727: "" -0x2728: "" -0x2729: "" -0x272a: "" -0x272b: "" -0x272c: "" -0x272d: "" -0x272e: "" -0x272f: "" -0x2730: "" -0x2731: "" -0x2732: "" -0x2733: "" -0x2734: "" -0x2735: "" -0x2736: "" -0x2737: "" -0x2738: "" -0x2739: "" -0x273a: "" -0x273b: "" -0x273c: "" -0x273d: "" -0x273e: "" -0x273f: "" -0x2740: "" -0x2741: "" -0x2742: "" -0x2743: "" -0x2744: "" -0x2745: "" -0x2746: "" -0x2747: "" -0x2748: "" -0x2749: "" -0x274a: "" -0x274b: "" -0x274c: "" -0x274d: "" -0x274e: "" -0x274f: "" -0x2750: "" -0x2751: "" -0x2752: "" -0x2753: "" -0x2754: "" -0x2755: "" -0x2756: "" -0x2757: "" -0x2758: "" -0x2759: "" -0x275a: "" -0x275b: "" -0x275c: "" -0x275d: "" -0x275e: "" -0x275f: "[?]" -0x2760: "[?]" -0x2761: "" -0x2762: "" -0x2763: "" -0x2764: "" -0x2765: "" -0x2766: "" -0x2767: "" -0x2768: "" -0x2769: "" -0x276a: "" -0x276b: "" -0x276c: "" -0x276d: "" -0x276e: "" -0x276f: "" -0x2770: "" -0x2771: "" -0x2772: "" -0x2773: "" -0x2774: "" -0x2775: "" -0x2776: "" -0x2777: "" -0x2778: "" -0x2779: "" -0x277a: "" -0x277b: "" -0x277c: "" -0x277d: "" -0x277e: "" -0x277f: "" -0x2780: "" -0x2781: "" -0x2782: "" -0x2783: "" -0x2784: "" -0x2785: "" -0x2786: "" -0x2787: "" -0x2788: "" -0x2789: "" -0x278a: "" -0x278b: "" -0x278c: "" -0x278d: "" -0x278e: "" -0x278f: "" -0x2790: "" -0x2791: "" -0x2792: "" -0x2793: "" -0x2794: "" -0x2795: "" -0x2796: "" -0x2797: "" -0x2798: "" -0x2799: "" -0x279a: "" -0x279b: "" -0x279c: "" -0x279d: "" -0x279e: "" -0x279f: "" -0x27a0: "" -0x27a1: "" -0x27a2: "" -0x27a3: "" -0x27a4: "" -0x27a5: "" -0x27a6: "" -0x27a7: "" -0x27a8: "" -0x27a9: "" -0x27aa: "" -0x27ab: "" -0x27ac: "" -0x27ad: "" -0x27ae: "" -0x27af: "" -0x27b0: "[?]" -0x27b1: "" -0x27b2: "" -0x27b3: "" -0x27b4: "" -0x27b5: "" -0x27b6: "" -0x27b7: "" -0x27b8: "" -0x27b9: "" -0x27ba: "" -0x27bb: "" -0x27bc: "" -0x27bd: "" -0x27be: "" -0x27bf: "[?]" -0x27c0: "[?]" -0x27c1: "[?]" -0x27c2: "[?]" -0x27c3: "[?]" -0x27c4: "[?]" -0x27c5: "[?]" -0x27c6: "[?]" -0x27c7: "[?]" -0x27c8: "[?]" -0x27c9: "[?]" -0x27ca: "[?]" -0x27cb: "[?]" -0x27cc: "[?]" -0x27cd: "[?]" -0x27ce: "[?]" -0x27cf: "[?]" -0x27d0: "[?]" -0x27d1: "[?]" -0x27d2: "[?]" -0x27d3: "[?]" -0x27d4: "[?]" -0x27d5: "[?]" -0x27d6: "[?]" -0x27d7: "[?]" -0x27d8: "[?]" -0x27d9: "[?]" -0x27da: "[?]" -0x27db: "[?]" -0x27dc: "[?]" -0x27dd: "[?]" -0x27de: "[?]" -0x27df: "[?]" -0x27e0: "[?]" -0x27e1: "[?]" -0x27e2: "[?]" -0x27e3: "[?]" -0x27e4: "[?]" -0x27e5: "[?]" -0x27e6: "[?]" -0x27e7: "[?]" -0x27e8: "[?]" -0x27e9: "[?]" -0x27ea: "[?]" -0x27eb: "[?]" -0x27ec: "[?]" -0x27ed: "[?]" -0x27ee: "[?]" -0x27ef: "[?]" -0x27f0: "[?]" -0x27f1: "[?]" -0x27f2: "[?]" -0x27f3: "[?]" -0x27f4: "[?]" -0x27f5: "[?]" -0x27f6: "[?]" -0x27f7: "[?]" -0x27f8: "[?]" -0x27f9: "[?]" -0x27fa: "[?]" -0x27fb: "[?]" -0x27fc: "[?]" -0x27fd: "[?]" -0x27fe: "[?]" -/* x028 */ -0x2800: " " -0x2801: "a" -0x2802: "1" -0x2803: "b" -0x2804: "'" -0x2805: "k" -0x2806: "2" -0x2807: "l" -0x2808: "@" -0x2809: "c" -0x280a: "i" -0x280b: "f" -0x280c: "/" -0x280d: "m" -0x280e: "s" -0x280f: "p" -0x2810: "\"" -0x2811: "e" -0x2812: "3" -0x2813: "h" -0x2814: "9" -0x2815: "o" -0x2816: "6" -0x2817: "r" -0x2818: "^" -0x2819: "d" -0x281a: "j" -0x281b: "g" -0x281c: ">" -0x281d: "n" -0x281e: "t" -0x281f: "q" -0x2820: "," -0x2821: "*" -0x2822: "5" -0x2823: "<" -0x2824: "-" -0x2825: "u" -0x2826: "8" -0x2827: "v" -0x2828: "." -0x2829: "%" -0x282a: "[" -0x282b: "$" -0x282c: "+" -0x282d: "x" -0x282e: "!" -0x282f: "&" -0x2830: ";" -0x2831: ":" -0x2832: "4" -0x2833: "\\" -0x2834: "0" -0x2835: "z" -0x2836: "7" -0x2837: "(" -0x2838: "_" -0x2839: "?" -0x283a: "w" -0x283b: "]" -0x283c: "#" -0x283d: "y" -0x283e: ")" -0x283f: "=" -0x2840: "[d7]" -0x2841: "[d17]" -0x2842: "[d27]" -0x2843: "[d127]" -0x2844: "[d37]" -0x2845: "[d137]" -0x2846: "[d237]" -0x2847: "[d1237]" -0x2848: "[d47]" -0x2849: "[d147]" -0x284a: "[d247]" -0x284b: "[d1247]" -0x284c: "[d347]" -0x284d: "[d1347]" -0x284e: "[d2347]" -0x284f: "[d12347]" -0x2850: "[d57]" -0x2851: "[d157]" -0x2852: "[d257]" -0x2853: "[d1257]" -0x2854: "[d357]" -0x2855: "[d1357]" -0x2856: "[d2357]" -0x2857: "[d12357]" -0x2858: "[d457]" -0x2859: "[d1457]" -0x285a: "[d2457]" -0x285b: "[d12457]" -0x285c: "[d3457]" -0x285d: "[d13457]" -0x285e: "[d23457]" -0x285f: "[d123457]" -0x2860: "[d67]" -0x2861: "[d167]" -0x2862: "[d267]" -0x2863: "[d1267]" -0x2864: "[d367]" -0x2865: "[d1367]" -0x2866: "[d2367]" -0x2867: "[d12367]" -0x2868: "[d467]" -0x2869: "[d1467]" -0x286a: "[d2467]" -0x286b: "[d12467]" -0x286c: "[d3467]" -0x286d: "[d13467]" -0x286e: "[d23467]" -0x286f: "[d123467]" -0x2870: "[d567]" -0x2871: "[d1567]" -0x2872: "[d2567]" -0x2873: "[d12567]" -0x2874: "[d3567]" -0x2875: "[d13567]" -0x2876: "[d23567]" -0x2877: "[d123567]" -0x2878: "[d4567]" -0x2879: "[d14567]" -0x287a: "[d24567]" -0x287b: "[d124567]" -0x287c: "[d34567]" -0x287d: "[d134567]" -0x287e: "[d234567]" -0x287f: "[d1234567]" -0x2880: "[d8]" -0x2881: "[d18]" -0x2882: "[d28]" -0x2883: "[d128]" -0x2884: "[d38]" -0x2885: "[d138]" -0x2886: "[d238]" -0x2887: "[d1238]" -0x2888: "[d48]" -0x2889: "[d148]" -0x288a: "[d248]" -0x288b: "[d1248]" -0x288c: "[d348]" -0x288d: "[d1348]" -0x288e: "[d2348]" -0x288f: "[d12348]" -0x2890: "[d58]" -0x2891: "[d158]" -0x2892: "[d258]" -0x2893: "[d1258]" -0x2894: "[d358]" -0x2895: "[d1358]" -0x2896: "[d2358]" -0x2897: "[d12358]" -0x2898: "[d458]" -0x2899: "[d1458]" -0x289a: "[d2458]" -0x289b: "[d12458]" -0x289c: "[d3458]" -0x289d: "[d13458]" -0x289e: "[d23458]" -0x289f: "[d123458]" -0x28a0: "[d68]" -0x28a1: "[d168]" -0x28a2: "[d268]" -0x28a3: "[d1268]" -0x28a4: "[d368]" -0x28a5: "[d1368]" -0x28a6: "[d2368]" -0x28a7: "[d12368]" -0x28a8: "[d468]" -0x28a9: "[d1468]" -0x28aa: "[d2468]" -0x28ab: "[d12468]" -0x28ac: "[d3468]" -0x28ad: "[d13468]" -0x28ae: "[d23468]" -0x28af: "[d123468]" -0x28b0: "[d568]" -0x28b1: "[d1568]" -0x28b2: "[d2568]" -0x28b3: "[d12568]" -0x28b4: "[d3568]" -0x28b5: "[d13568]" -0x28b6: "[d23568]" -0x28b7: "[d123568]" -0x28b8: "[d4568]" -0x28b9: "[d14568]" -0x28ba: "[d24568]" -0x28bb: "[d124568]" -0x28bc: "[d34568]" -0x28bd: "[d134568]" -0x28be: "[d234568]" -0x28bf: "[d1234568]" -0x28c0: "[d78]" -0x28c1: "[d178]" -0x28c2: "[d278]" -0x28c3: "[d1278]" -0x28c4: "[d378]" -0x28c5: "[d1378]" -0x28c6: "[d2378]" -0x28c7: "[d12378]" -0x28c8: "[d478]" -0x28c9: "[d1478]" -0x28ca: "[d2478]" -0x28cb: "[d12478]" -0x28cc: "[d3478]" -0x28cd: "[d13478]" -0x28ce: "[d23478]" -0x28cf: "[d123478]" -0x28d0: "[d578]" -0x28d1: "[d1578]" -0x28d2: "[d2578]" -0x28d3: "[d12578]" -0x28d4: "[d3578]" -0x28d5: "[d13578]" -0x28d6: "[d23578]" -0x28d7: "[d123578]" -0x28d8: "[d4578]" -0x28d9: "[d14578]" -0x28da: "[d24578]" -0x28db: "[d124578]" -0x28dc: "[d34578]" -0x28dd: "[d134578]" -0x28de: "[d234578]" -0x28df: "[d1234578]" -0x28e0: "[d678]" -0x28e1: "[d1678]" -0x28e2: "[d2678]" -0x28e3: "[d12678]" -0x28e4: "[d3678]" -0x28e5: "[d13678]" -0x28e6: "[d23678]" -0x28e7: "[d123678]" -0x28e8: "[d4678]" -0x28e9: "[d14678]" -0x28ea: "[d24678]" -0x28eb: "[d124678]" -0x28ec: "[d34678]" -0x28ed: "[d134678]" -0x28ee: "[d234678]" -0x28ef: "[d1234678]" -0x28f0: "[d5678]" -0x28f1: "[d15678]" -0x28f2: "[d25678]" -0x28f3: "[d125678]" -0x28f4: "[d35678]" -0x28f5: "[d135678]" -0x28f6: "[d235678]" -0x28f7: "[d1235678]" -0x28f8: "[d45678]" -0x28f9: "[d145678]" -0x28fa: "[d245678]" -0x28fb: "[d1245678]" -0x28fc: "[d345678]" -0x28fd: "[d1345678]" -0x28fe: "[d2345678]" -0x28ff: "[d12345678]" -/* x02c */ -0x2c00: "" -0x2c01: "" -0x2c02: "" -0x2c03: "" -0x2c04: "" -0x2c05: "" -0x2c06: "" -0x2c07: "" -0x2c08: "" -0x2c09: "" -0x2c0a: "" -0x2c0b: "" -0x2c0c: "" -0x2c0d: "" -0x2c0e: "" -0x2c0f: "" -0x2c10: "" -0x2c11: "" -0x2c12: "" -0x2c13: "" -0x2c14: "" -0x2c15: "" -0x2c16: "" -0x2c17: "" -0x2c18: "" -0x2c19: "" -0x2c1a: "" -0x2c1b: "" -0x2c1c: "" -0x2c1d: "" -0x2c1e: "" -0x2c1f: "" -0x2c20: "" -0x2c21: "" -0x2c22: "" -0x2c23: "" -0x2c24: "" -0x2c25: "" -0x2c26: "" -0x2c27: "" -0x2c28: "" -0x2c29: "" -0x2c2a: "" -0x2c2b: "" -0x2c2c: "" -0x2c2d: "" -0x2c2e: "" -0x2c2f: "" -0x2c30: "" -0x2c31: "" -0x2c32: "" -0x2c33: "" -0x2c34: "" -0x2c35: "" -0x2c36: "" -0x2c37: "" -0x2c38: "" -0x2c39: "" -0x2c3a: "" -0x2c3b: "" -0x2c3c: "" -0x2c3d: "" -0x2c3e: "" -0x2c3f: "" -0x2c40: "" -0x2c41: "" -0x2c42: "" -0x2c43: "" -0x2c44: "" -0x2c45: "" -0x2c46: "" -0x2c47: "" -0x2c48: "" -0x2c49: "" -0x2c4a: "" -0x2c4b: "" -0x2c4c: "" -0x2c4d: "" -0x2c4e: "" -0x2c4f: "" -0x2c50: "" -0x2c51: "" -0x2c52: "" -0x2c53: "" -0x2c54: "" -0x2c55: "" -0x2c56: "" -0x2c57: "" -0x2c58: "" -0x2c59: "" -0x2c5a: "" -0x2c5b: "" -0x2c5c: "" -0x2c5d: "" -0x2c5e: "" -0x2c5f: "" -0x2c60: "L" -0x2c61: "l" -0x2c62: "L" -0x2c63: "P" -0x2c64: "R" -0x2c65: "a" -0x2c66: "t" -0x2c67: "H" -0x2c68: "h" -0x2c69: "K" -0x2c6a: "k" -0x2c6b: "Z" -0x2c6c: "z" -0x2c6d: "" -0x2c6e: "M" -0x2c6f: "A" -0x2c70: "" -0x2c71: "" -0x2c72: "" -0x2c73: "" -0x2c74: "" -0x2c75: "" -0x2c76: "" -0x2c77: "" -0x2c78: "" -0x2c79: "" -0x2c7a: "" -0x2c7b: "" -0x2c7c: "" -0x2c7d: "" -0x2c7e: "" -0x2c7f: "" -0x2c80: "" -0x2c81: "" -0x2c82: "" -0x2c83: "" -0x2c84: "" -0x2c85: "" -0x2c86: "" -0x2c87: "" -0x2c88: "" -0x2c89: "" -0x2c8a: "" -0x2c8b: "" -0x2c8c: "" -0x2c8d: "" -0x2c8e: "" -0x2c8f: "" -0x2c90: "" -0x2c91: "" -0x2c92: "" -0x2c93: "" -0x2c94: "" -0x2c95: "" -0x2c96: "" -0x2c97: "" -0x2c98: "" -0x2c99: "" -0x2c9a: "" -0x2c9b: "" -0x2c9c: "" -0x2c9d: "" -0x2c9e: "" -0x2c9f: "" -0x2ca0: "" -0x2ca1: "" -0x2ca2: "" -0x2ca3: "" -0x2ca4: "" -0x2ca5: "" -0x2ca6: "" -0x2ca7: "" -0x2ca8: "" -0x2ca9: "" -0x2caa: "" -0x2cab: "" -0x2cac: "" -0x2cad: "" -0x2cae: "" -0x2caf: "" -0x2cb0: "" -0x2cb1: "" -0x2cb2: "" -0x2cb3: "" -0x2cb4: "" -0x2cb5: "" -0x2cb6: "" -0x2cb7: "" -0x2cb8: "" -0x2cb9: "" -0x2cba: "" -0x2cbb: "" -0x2cbc: "" -0x2cbd: "" -0x2cbe: "" -0x2cbf: "" -0x2cc0: "" -0x2cc1: "" -0x2cc2: "" -0x2cc3: "" -0x2cc4: "" -0x2cc5: "" -0x2cc6: "" -0x2cc7: "" -0x2cc8: "" -0x2cc9: "" -0x2cca: "" -0x2ccb: "" -0x2ccc: "" -0x2ccd: "" -0x2cce: "" -0x2ccf: "" -0x2cd0: "" -0x2cd1: "" -0x2cd2: "" -0x2cd3: "" -0x2cd4: "" -0x2cd5: "" -0x2cd6: "" -0x2cd7: "" -0x2cd8: "" -0x2cd9: "" -0x2cda: "" -0x2cdb: "" -0x2cdc: "" -0x2cdd: "" -0x2cde: "" -0x2cdf: "" -0x2ce0: "" -0x2ce1: "" -0x2ce2: "" -0x2ce3: "" -0x2ce4: "" -0x2ce5: "" -0x2ce6: "" -0x2ce7: "" -0x2ce8: "" -0x2ce9: "" -0x2cea: "" -0x2ceb: "" -0x2cec: "" -0x2ced: "" -0x2cee: "" -0x2cef: "" -0x2cf0: "" -0x2cf1: "" -0x2cf2: "" -0x2cf3: "" -0x2cf4: "" -0x2cf5: "" -0x2cf6: "" -0x2cf7: "" -0x2cf8: "" -0x2cf9: "" -0x2cfa: "" -0x2cfb: "" -0x2cfc: "" -0x2cfd: "" -0x2cfe: "" -/* x02e */ -0x2e00: "[?]" -0x2e01: "[?]" -0x2e02: "[?]" -0x2e03: "[?]" -0x2e04: "[?]" -0x2e05: "[?]" -0x2e06: "[?]" -0x2e07: "[?]" -0x2e08: "[?]" -0x2e09: "[?]" -0x2e0a: "[?]" -0x2e0b: "[?]" -0x2e0c: "[?]" -0x2e0d: "[?]" -0x2e0e: "[?]" -0x2e0f: "[?]" -0x2e10: "[?]" -0x2e11: "[?]" -0x2e12: "[?]" -0x2e13: "[?]" -0x2e14: "[?]" -0x2e15: "[?]" -0x2e16: "[?]" -0x2e17: "[?]" -0x2e18: "[?]" -0x2e19: "[?]" -0x2e1a: "[?]" -0x2e1b: "[?]" -0x2e1c: "[?]" -0x2e1d: "[?]" -0x2e1e: "[?]" -0x2e1f: "[?]" -0x2e20: "[?]" -0x2e21: "[?]" -0x2e22: "[?]" -0x2e23: "[?]" -0x2e24: "[?]" -0x2e25: "[?]" -0x2e26: "[?]" -0x2e27: "[?]" -0x2e28: "[?]" -0x2e29: "[?]" -0x2e2a: "[?]" -0x2e2b: "[?]" -0x2e2c: "[?]" -0x2e2d: "[?]" -0x2e2e: "[?]" -0x2e2f: "[?]" -0x2e30: "[?]" -0x2e31: "[?]" -0x2e32: "[?]" -0x2e33: "[?]" -0x2e34: "[?]" -0x2e35: "[?]" -0x2e36: "[?]" -0x2e37: "[?]" -0x2e38: "[?]" -0x2e39: "[?]" -0x2e3a: "[?]" -0x2e3b: "[?]" -0x2e3c: "[?]" -0x2e3d: "[?]" -0x2e3e: "[?]" -0x2e3f: "[?]" -0x2e40: "[?]" -0x2e41: "[?]" -0x2e42: "[?]" -0x2e43: "[?]" -0x2e44: "[?]" -0x2e45: "[?]" -0x2e46: "[?]" -0x2e47: "[?]" -0x2e48: "[?]" -0x2e49: "[?]" -0x2e4a: "[?]" -0x2e4b: "[?]" -0x2e4c: "[?]" -0x2e4d: "[?]" -0x2e4e: "[?]" -0x2e4f: "[?]" -0x2e50: "[?]" -0x2e51: "[?]" -0x2e52: "[?]" -0x2e53: "[?]" -0x2e54: "[?]" -0x2e55: "[?]" -0x2e56: "[?]" -0x2e57: "[?]" -0x2e58: "[?]" -0x2e59: "[?]" -0x2e5a: "[?]" -0x2e5b: "[?]" -0x2e5c: "[?]" -0x2e5d: "[?]" -0x2e5e: "[?]" -0x2e5f: "[?]" -0x2e60: "[?]" -0x2e61: "[?]" -0x2e62: "[?]" -0x2e63: "[?]" -0x2e64: "[?]" -0x2e65: "[?]" -0x2e66: "[?]" -0x2e67: "[?]" -0x2e68: "[?]" -0x2e69: "[?]" -0x2e6a: "[?]" -0x2e6b: "[?]" -0x2e6c: "[?]" -0x2e6d: "[?]" -0x2e6e: "[?]" -0x2e6f: "[?]" -0x2e70: "[?]" -0x2e71: "[?]" -0x2e72: "[?]" -0x2e73: "[?]" -0x2e74: "[?]" -0x2e75: "[?]" -0x2e76: "[?]" -0x2e77: "[?]" -0x2e78: "[?]" -0x2e79: "[?]" -0x2e7a: "[?]" -0x2e7b: "[?]" -0x2e7c: "[?]" -0x2e7d: "[?]" -0x2e7e: "[?]" -0x2e7f: "[?]" -0x2e80: "[?] " -0x2e81: "[?] " -0x2e82: "[?] " -0x2e83: "[?] " -0x2e84: "[?] " -0x2e85: "[?] " -0x2e86: "[?] " -0x2e87: "[?] " -0x2e88: "[?] " -0x2e89: "[?] " -0x2e8a: "[?] " -0x2e8b: "[?] " -0x2e8c: "[?] " -0x2e8d: "[?] " -0x2e8e: "[?] " -0x2e8f: "[?] " -0x2e90: "[?] " -0x2e91: "[?] " -0x2e92: "[?] " -0x2e93: "[?] " -0x2e94: "[?] " -0x2e95: "[?] " -0x2e96: "[?] " -0x2e97: "[?] " -0x2e98: "[?] " -0x2e99: "[?] " -0x2e9a: "[?]" -0x2e9b: "[?] " -0x2e9c: "[?] " -0x2e9d: "[?] " -0x2e9e: "[?] " -0x2e9f: "[?] " -0x2ea0: "[?] " -0x2ea1: "[?] " -0x2ea2: "[?] " -0x2ea3: "[?] " -0x2ea4: "[?] " -0x2ea5: "[?] " -0x2ea6: "[?] " -0x2ea7: "[?] " -0x2ea8: "[?] " -0x2ea9: "[?] " -0x2eaa: "[?] " -0x2eab: "[?] " -0x2eac: "[?] " -0x2ead: "[?] " -0x2eae: "[?] " -0x2eaf: "[?] " -0x2eb0: "[?] " -0x2eb1: "[?] " -0x2eb2: "[?] " -0x2eb3: "[?] " -0x2eb4: "[?] " -0x2eb5: "[?] " -0x2eb6: "[?] " -0x2eb7: "[?] " -0x2eb8: "[?] " -0x2eb9: "[?] " -0x2eba: "[?] " -0x2ebb: "[?] " -0x2ebc: "[?] " -0x2ebd: "[?] " -0x2ebe: "[?] " -0x2ebf: "[?] " -0x2ec0: "[?] " -0x2ec1: "[?] " -0x2ec2: "[?] " -0x2ec3: "[?] " -0x2ec4: "[?] " -0x2ec5: "[?] " -0x2ec6: "[?] " -0x2ec7: "[?] " -0x2ec8: "[?] " -0x2ec9: "[?] " -0x2eca: "[?] " -0x2ecb: "[?] " -0x2ecc: "[?] " -0x2ecd: "[?] " -0x2ece: "[?] " -0x2ecf: "[?] " -0x2ed0: "[?] " -0x2ed1: "[?] " -0x2ed2: "[?] " -0x2ed3: "[?] " -0x2ed4: "[?] " -0x2ed5: "[?] " -0x2ed6: "[?] " -0x2ed7: "[?] " -0x2ed8: "[?] " -0x2ed9: "[?] " -0x2eda: "[?] " -0x2edb: "[?] " -0x2edc: "[?] " -0x2edd: "[?] " -0x2ede: "[?] " -0x2edf: "[?] " -0x2ee0: "[?] " -0x2ee1: "[?] " -0x2ee2: "[?] " -0x2ee3: "[?] " -0x2ee4: "[?] " -0x2ee5: "[?] " -0x2ee6: "[?] " -0x2ee7: "[?] " -0x2ee8: "[?] " -0x2ee9: "[?] " -0x2eea: "[?] " -0x2eeb: "[?] " -0x2eec: "[?] " -0x2eed: "[?] " -0x2eee: "[?] " -0x2eef: "[?] " -0x2ef0: "[?] " -0x2ef1: "[?] " -0x2ef2: "[?] " -0x2ef3: "[?] " -0x2ef4: "[?]" -0x2ef5: "[?]" -0x2ef6: "[?]" -0x2ef7: "[?]" -0x2ef8: "[?]" -0x2ef9: "[?]" -0x2efa: "[?]" -0x2efb: "[?]" -0x2efc: "[?]" -0x2efd: "[?]" -0x2efe: "[?]" -/* x02f */ -0x2f00: "[?] " -0x2f01: "[?] " -0x2f02: "[?] " -0x2f03: "[?] " -0x2f04: "[?] " -0x2f05: "[?] " -0x2f06: "[?] " -0x2f07: "[?] " -0x2f08: "[?] " -0x2f09: "[?] " -0x2f0a: "[?] " -0x2f0b: "[?] " -0x2f0c: "[?] " -0x2f0d: "[?] " -0x2f0e: "[?] " -0x2f0f: "[?] " -0x2f10: "[?] " -0x2f11: "[?] " -0x2f12: "[?] " -0x2f13: "[?] " -0x2f14: "[?] " -0x2f15: "[?] " -0x2f16: "[?] " -0x2f17: "[?] " -0x2f18: "[?] " -0x2f19: "[?] " -0x2f1a: "[?] " -0x2f1b: "[?] " -0x2f1c: "[?] " -0x2f1d: "[?] " -0x2f1e: "[?] " -0x2f1f: "[?] " -0x2f20: "[?] " -0x2f21: "[?] " -0x2f22: "[?] " -0x2f23: "[?] " -0x2f24: "[?] " -0x2f25: "[?] " -0x2f26: "[?] " -0x2f27: "[?] " -0x2f28: "[?] " -0x2f29: "[?] " -0x2f2a: "[?] " -0x2f2b: "[?] " -0x2f2c: "[?] " -0x2f2d: "[?] " -0x2f2e: "[?] " -0x2f2f: "[?] " -0x2f30: "[?] " -0x2f31: "[?] " -0x2f32: "[?] " -0x2f33: "[?] " -0x2f34: "[?] " -0x2f35: "[?] " -0x2f36: "[?] " -0x2f37: "[?] " -0x2f38: "[?] " -0x2f39: "[?] " -0x2f3a: "[?] " -0x2f3b: "[?] " -0x2f3c: "[?] " -0x2f3d: "[?] " -0x2f3e: "[?] " -0x2f3f: "[?] " -0x2f40: "[?] " -0x2f41: "[?] " -0x2f42: "[?] " -0x2f43: "[?] " -0x2f44: "[?] " -0x2f45: "[?] " -0x2f46: "[?] " -0x2f47: "[?] " -0x2f48: "[?] " -0x2f49: "[?] " -0x2f4a: "[?] " -0x2f4b: "[?] " -0x2f4c: "[?] " -0x2f4d: "[?] " -0x2f4e: "[?] " -0x2f4f: "[?] " -0x2f50: "[?] " -0x2f51: "[?] " -0x2f52: "[?] " -0x2f53: "[?] " -0x2f54: "[?] " -0x2f55: "[?] " -0x2f56: "[?] " -0x2f57: "[?] " -0x2f58: "[?] " -0x2f59: "[?] " -0x2f5a: "[?] " -0x2f5b: "[?] " -0x2f5c: "[?] " -0x2f5d: "[?] " -0x2f5e: "[?] " -0x2f5f: "[?] " -0x2f60: "[?] " -0x2f61: "[?] " -0x2f62: "[?] " -0x2f63: "[?] " -0x2f64: "[?] " -0x2f65: "[?] " -0x2f66: "[?] " -0x2f67: "[?] " -0x2f68: "[?] " -0x2f69: "[?] " -0x2f6a: "[?] " -0x2f6b: "[?] " -0x2f6c: "[?] " -0x2f6d: "[?] " -0x2f6e: "[?] " -0x2f6f: "[?] " -0x2f70: "[?] " -0x2f71: "[?] " -0x2f72: "[?] " -0x2f73: "[?] " -0x2f74: "[?] " -0x2f75: "[?] " -0x2f76: "[?] " -0x2f77: "[?] " -0x2f78: "[?] " -0x2f79: "[?] " -0x2f7a: "[?] " -0x2f7b: "[?] " -0x2f7c: "[?] " -0x2f7d: "[?] " -0x2f7e: "[?] " -0x2f7f: "[?] " -0x2f80: "[?] " -0x2f81: "[?] " -0x2f82: "[?] " -0x2f83: "[?] " -0x2f84: "[?] " -0x2f85: "[?] " -0x2f86: "[?] " -0x2f87: "[?] " -0x2f88: "[?] " -0x2f89: "[?] " -0x2f8a: "[?] " -0x2f8b: "[?] " -0x2f8c: "[?] " -0x2f8d: "[?] " -0x2f8e: "[?] " -0x2f8f: "[?] " -0x2f90: "[?] " -0x2f91: "[?] " -0x2f92: "[?] " -0x2f93: "[?] " -0x2f94: "[?] " -0x2f95: "[?] " -0x2f96: "[?] " -0x2f97: "[?] " -0x2f98: "[?] " -0x2f99: "[?] " -0x2f9a: "[?] " -0x2f9b: "[?] " -0x2f9c: "[?] " -0x2f9d: "[?] " -0x2f9e: "[?] " -0x2f9f: "[?] " -0x2fa0: "[?] " -0x2fa1: "[?] " -0x2fa2: "[?] " -0x2fa3: "[?] " -0x2fa4: "[?] " -0x2fa5: "[?] " -0x2fa6: "[?] " -0x2fa7: "[?] " -0x2fa8: "[?] " -0x2fa9: "[?] " -0x2faa: "[?] " -0x2fab: "[?] " -0x2fac: "[?] " -0x2fad: "[?] " -0x2fae: "[?] " -0x2faf: "[?] " -0x2fb0: "[?] " -0x2fb1: "[?] " -0x2fb2: "[?] " -0x2fb3: "[?] " -0x2fb4: "[?] " -0x2fb5: "[?] " -0x2fb6: "[?] " -0x2fb7: "[?] " -0x2fb8: "[?] " -0x2fb9: "[?] " -0x2fba: "[?] " -0x2fbb: "[?] " -0x2fbc: "[?] " -0x2fbd: "[?] " -0x2fbe: "[?] " -0x2fbf: "[?] " -0x2fc0: "[?] " -0x2fc1: "[?] " -0x2fc2: "[?] " -0x2fc3: "[?] " -0x2fc4: "[?] " -0x2fc5: "[?] " -0x2fc6: "[?] " -0x2fc7: "[?] " -0x2fc8: "[?] " -0x2fc9: "[?] " -0x2fca: "[?] " -0x2fcb: "[?] " -0x2fcc: "[?] " -0x2fcd: "[?] " -0x2fce: "[?] " -0x2fcf: "[?] " -0x2fd0: "[?] " -0x2fd1: "[?] " -0x2fd2: "[?] " -0x2fd3: "[?] " -0x2fd4: "[?] " -0x2fd5: "[?] " -0x2fd6: "[?]" -0x2fd7: "[?]" -0x2fd8: "[?]" -0x2fd9: "[?]" -0x2fda: "[?]" -0x2fdb: "[?]" -0x2fdc: "[?]" -0x2fdd: "[?]" -0x2fde: "[?]" -0x2fdf: "[?]" -0x2fe0: "[?]" -0x2fe1: "[?]" -0x2fe2: "[?]" -0x2fe3: "[?]" -0x2fe4: "[?]" -0x2fe5: "[?]" -0x2fe6: "[?]" -0x2fe7: "[?]" -0x2fe8: "[?]" -0x2fe9: "[?]" -0x2fea: "[?]" -0x2feb: "[?]" -0x2fec: "[?]" -0x2fed: "[?]" -0x2fee: "[?]" -0x2fef: "[?]" -0x2ff0: "[?] " -0x2ff1: "[?] " -0x2ff2: "[?] " -0x2ff3: "[?] " -0x2ff4: "[?] " -0x2ff5: "[?] " -0x2ff6: "[?] " -0x2ff7: "[?] " -0x2ff8: "[?] " -0x2ff9: "[?] " -0x2ffa: "[?] " -0x2ffb: "[?] " -0x2ffc: "[?]" -0x2ffd: "[?]" -0x2ffe: "[?]" -/* x030 */ -0x3000: " " -0x3001: ", " -0x3002: ". " -0x3003: "\"" -0x3004: "[JIS]" -0x3005: "\"" -0x3006: "/" -0x3007: "0" -0x3008: "<" -0x3009: "> " -0x300a: "<<" -0x300b: ">> " -0x300c: "[" -0x300d: "] " -0x300e: "{" -0x300f: "} " -0x3010: "[(" -0x3011: ")] " -0x3012: "@" -0x3013: "X " -0x3014: "[" -0x3015: "] " -0x3016: "[[" -0x3017: "]] " -0x3018: "((" -0x3019: ")) " -0x301a: "[[" -0x301b: "]] " -0x301c: "~ " -0x301d: "``" -0x301e: "''" -0x301f: ",," -0x3020: "@" -0x3021: "1" -0x3022: "2" -0x3023: "3" -0x3024: "4" -0x3025: "5" -0x3026: "6" -0x3027: "7" -0x3028: "8" -0x3029: "9" -0x302a: "" -0x302b: "" -0x302c: "" -0x302d: "" -0x302e: "" -0x302f: "" -0x3030: "~" -0x3031: "+" -0x3032: "+" -0x3033: "+" -0x3034: "+" -0x3035: "" -0x3036: "@" -0x3037: " // " -0x3038: "+10+" -0x3039: "+20+" -0x303a: "+30+" -0x303b: "[?]" -0x303c: "[?]" -0x303d: "[?]" -0x303e: "" -0x303f: "" -0x3040: "[?]" -0x3041: "a" -0x3042: "a" -0x3043: "i" -0x3044: "i" -0x3045: "u" -0x3046: "u" -0x3047: "e" -0x3048: "e" -0x3049: "o" -0x304a: "o" -0x304b: "ka" -0x304c: "ga" -0x304d: "ki" -0x304e: "gi" -0x304f: "ku" -0x3050: "gu" -0x3051: "ke" -0x3052: "ge" -0x3053: "ko" -0x3054: "go" -0x3055: "sa" -0x3056: "za" -0x3057: "shi" -0x3058: "zi" -0x3059: "su" -0x305a: "zu" -0x305b: "se" -0x305c: "ze" -0x305d: "so" -0x305e: "zo" -0x305f: "ta" -0x3060: "da" -0x3061: "chi" -0x3062: "di" -0x3063: "tsu" -0x3064: "tsu" -0x3065: "du" -0x3066: "te" -0x3067: "de" -0x3068: "to" -0x3069: "do" -0x306a: "na" -0x306b: "ni" -0x306c: "nu" -0x306d: "ne" -0x306e: "no" -0x306f: "ha" -0x3070: "ba" -0x3071: "pa" -0x3072: "hi" -0x3073: "bi" -0x3074: "pi" -0x3075: "hu" -0x3076: "bu" -0x3077: "pu" -0x3078: "he" -0x3079: "be" -0x307a: "pe" -0x307b: "ho" -0x307c: "bo" -0x307d: "po" -0x307e: "ma" -0x307f: "mi" -0x3080: "mu" -0x3081: "me" -0x3082: "mo" -0x3083: "ya" -0x3084: "ya" -0x3085: "yu" -0x3086: "yu" -0x3087: "yo" -0x3088: "yo" -0x3089: "ra" -0x308a: "ri" -0x308b: "ru" -0x308c: "re" -0x308d: "ro" -0x308e: "wa" -0x308f: "wa" -0x3090: "wi" -0x3091: "we" -0x3092: "wo" -0x3093: "n" -0x3094: "vu" -0x3095: "[?]" -0x3096: "[?]" -0x3097: "[?]" -0x3098: "[?]" -0x3099: "" -0x309a: "" -0x309b: "" -0x309c: "" -0x309d: "\"" -0x309e: "\"" -0x309f: "[?]" -0x30a0: "[?]" -0x30a1: "a" -0x30a2: "a" -0x30a3: "i" -0x30a4: "i" -0x30a5: "u" -0x30a6: "u" -0x30a7: "e" -0x30a8: "e" -0x30a9: "o" -0x30aa: "o" -0x30ab: "ka" -0x30ac: "ga" -0x30ad: "ki" -0x30ae: "gi" -0x30af: "ku" -0x30b0: "gu" -0x30b1: "ke" -0x30b2: "ge" -0x30b3: "ko" -0x30b4: "go" -0x30b5: "sa" -0x30b6: "za" -0x30b7: "shi" -0x30b8: "zi" -0x30b9: "su" -0x30ba: "zu" -0x30bb: "se" -0x30bc: "ze" -0x30bd: "so" -0x30be: "zo" -0x30bf: "ta" -0x30c0: "da" -0x30c1: "chi" -0x30c2: "di" -0x30c3: "tsu" -0x30c4: "tsu" -0x30c5: "du" -0x30c6: "te" -0x30c7: "de" -0x30c8: "to" -0x30c9: "do" -0x30ca: "na" -0x30cb: "ni" -0x30cc: "nu" -0x30cd: "ne" -0x30ce: "no" -0x30cf: "ha" -0x30d0: "ba" -0x30d1: "pa" -0x30d2: "hi" -0x30d3: "bi" -0x30d4: "pi" -0x30d5: "hu" -0x30d6: "bu" -0x30d7: "pu" -0x30d8: "he" -0x30d9: "be" -0x30da: "pe" -0x30db: "ho" -0x30dc: "bo" -0x30dd: "po" -0x30de: "ma" -0x30df: "mi" -0x30e0: "mu" -0x30e1: "me" -0x30e2: "mo" -0x30e3: "ya" -0x30e4: "ya" -0x30e5: "yu" -0x30e6: "yu" -0x30e7: "yo" -0x30e8: "yo" -0x30e9: "ra" -0x30ea: "ri" -0x30eb: "ru" -0x30ec: "re" -0x30ed: "ro" -0x30ee: "wa" -0x30ef: "wa" -0x30f0: "wi" -0x30f1: "we" -0x30f2: "wo" -0x30f3: "n" -0x30f4: "vu" -0x30f5: "ka" -0x30f6: "ke" -0x30f7: "va" -0x30f8: "vi" -0x30f9: "ve" -0x30fa: "vo" -0x30fb: "" -0x30fc: "" -0x30fd: "\"" -0x30fe: "\"" -/* x031 */ -0x3100: "[?]" -0x3101: "[?]" -0x3102: "[?]" -0x3103: "[?]" -0x3104: "[?]" -0x3105: "B" -0x3106: "P" -0x3107: "M" -0x3108: "F" -0x3109: "D" -0x310a: "T" -0x310b: "N" -0x310c: "L" -0x310d: "G" -0x310e: "K" -0x310f: "H" -0x3110: "J" -0x3111: "Q" -0x3112: "X" -0x3113: "ZH" -0x3114: "CH" -0x3115: "SH" -0x3116: "R" -0x3117: "Z" -0x3118: "C" -0x3119: "S" -0x311a: "A" -0x311b: "O" -0x311c: "E" -0x311d: "EH" -0x311e: "AI" -0x311f: "EI" -0x3120: "AU" -0x3121: "OU" -0x3122: "AN" -0x3123: "EN" -0x3124: "ANG" -0x3125: "ENG" -0x3126: "ER" -0x3127: "I" -0x3128: "U" -0x3129: "IU" -0x312a: "V" -0x312b: "NG" -0x312c: "GN" -0x312d: "[?]" -0x312e: "[?]" -0x312f: "[?]" -0x3130: "[?]" -0x3131: "g" -0x3132: "gg" -0x3133: "gs" -0x3134: "n" -0x3135: "nj" -0x3136: "nh" -0x3137: "d" -0x3138: "dd" -0x3139: "r" -0x313a: "lg" -0x313b: "lm" -0x313c: "lb" -0x313d: "ls" -0x313e: "lt" -0x313f: "lp" -0x3140: "rh" -0x3141: "m" -0x3142: "b" -0x3143: "bb" -0x3144: "bs" -0x3145: "s" -0x3146: "ss" -0x3147: "" -0x3148: "j" -0x3149: "jj" -0x314a: "c" -0x314b: "k" -0x314c: "t" -0x314d: "p" -0x314e: "h" -0x314f: "a" -0x3150: "ae" -0x3151: "ya" -0x3152: "yae" -0x3153: "eo" -0x3154: "e" -0x3155: "yeo" -0x3156: "ye" -0x3157: "o" -0x3158: "wa" -0x3159: "wae" -0x315a: "oe" -0x315b: "yo" -0x315c: "u" -0x315d: "weo" -0x315e: "we" -0x315f: "wi" -0x3160: "yu" -0x3161: "eu" -0x3162: "yi" -0x3163: "i" -0x3164: "" -0x3165: "nn" -0x3166: "nd" -0x3167: "ns" -0x3168: "nZ" -0x3169: "lgs" -0x316a: "ld" -0x316b: "lbs" -0x316c: "lZ" -0x316d: "lQ" -0x316e: "mb" -0x316f: "ms" -0x3170: "mZ" -0x3171: "mN" -0x3172: "bg" -0x3173: "" -0x3174: "bsg" -0x3175: "bst" -0x3176: "bj" -0x3177: "bt" -0x3178: "bN" -0x3179: "bbN" -0x317a: "sg" -0x317b: "sn" -0x317c: "sd" -0x317d: "sb" -0x317e: "sj" -0x317f: "Z" -0x3180: "" -0x3181: "N" -0x3182: "Ns" -0x3183: "NZ" -0x3184: "pN" -0x3185: "hh" -0x3186: "Q" -0x3187: "yo-ya" -0x3188: "yo-yae" -0x3189: "yo-i" -0x318a: "yu-yeo" -0x318b: "yu-ye" -0x318c: "yu-i" -0x318d: "U" -0x318e: "U-i" -0x318f: "[?]" -0x3190: "" -0x3191: "" -0x3192: "" -0x3193: "" -0x3194: "" -0x3195: "" -0x3196: "" -0x3197: "" -0x3198: "" -0x3199: "" -0x319a: "" -0x319b: "" -0x319c: "" -0x319d: "" -0x319e: "" -0x319f: "" -0x31a0: "BU" -0x31a1: "ZI" -0x31a2: "JI" -0x31a3: "GU" -0x31a4: "EE" -0x31a5: "ENN" -0x31a6: "OO" -0x31a7: "ONN" -0x31a8: "IR" -0x31a9: "ANN" -0x31aa: "INN" -0x31ab: "UNN" -0x31ac: "IM" -0x31ad: "NGG" -0x31ae: "AINN" -0x31af: "AUNN" -0x31b0: "AM" -0x31b1: "OM" -0x31b2: "ONG" -0x31b3: "INNN" -0x31b4: "P" -0x31b5: "T" -0x31b6: "K" -0x31b7: "H" -0x31b8: "[?]" -0x31b9: "[?]" -0x31ba: "[?]" -0x31bb: "[?]" -0x31bc: "[?]" -0x31bd: "[?]" -0x31be: "[?]" -0x31bf: "[?]" -0x31c0: "[?]" -0x31c1: "[?]" -0x31c2: "[?]" -0x31c3: "[?]" -0x31c4: "[?]" -0x31c5: "[?]" -0x31c6: "[?]" -0x31c7: "[?]" -0x31c8: "[?]" -0x31c9: "[?]" -0x31ca: "[?]" -0x31cb: "[?]" -0x31cc: "[?]" -0x31cd: "[?]" -0x31ce: "[?]" -0x31cf: "[?]" -0x31d0: "[?]" -0x31d1: "[?]" -0x31d2: "[?]" -0x31d3: "[?]" -0x31d4: "[?]" -0x31d5: "[?]" -0x31d6: "[?]" -0x31d7: "[?]" -0x31d8: "[?]" -0x31d9: "[?]" -0x31da: "[?]" -0x31db: "[?]" -0x31dc: "[?]" -0x31dd: "[?]" -0x31de: "[?]" -0x31df: "[?]" -0x31e0: "[?]" -0x31e1: "[?]" -0x31e2: "[?]" -0x31e3: "[?]" -0x31e4: "[?]" -0x31e5: "[?]" -0x31e6: "[?]" -0x31e7: "[?]" -0x31e8: "[?]" -0x31e9: "[?]" -0x31ea: "[?]" -0x31eb: "[?]" -0x31ec: "[?]" -0x31ed: "[?]" -0x31ee: "[?]" -0x31ef: "[?]" -0x31f0: "[?]" -0x31f1: "[?]" -0x31f2: "[?]" -0x31f3: "[?]" -0x31f4: "[?]" -0x31f5: "[?]" -0x31f6: "[?]" -0x31f7: "[?]" -0x31f8: "[?]" -0x31f9: "[?]" -0x31fa: "[?]" -0x31fb: "[?]" -0x31fc: "[?]" -0x31fd: "[?]" -0x31fe: "[?]" -/* x032 */ -0x3200: "(g)" -0x3201: "(n)" -0x3202: "(d)" -0x3203: "(r)" -0x3204: "(m)" -0x3205: "(b)" -0x3206: "(s)" -0x3207: "()" -0x3208: "(j)" -0x3209: "(c)" -0x320a: "(k)" -0x320b: "(t)" -0x320c: "(p)" -0x320d: "(h)" -0x320e: "(ga)" -0x320f: "(na)" -0x3210: "(da)" -0x3211: "(ra)" -0x3212: "(ma)" -0x3213: "(ba)" -0x3214: "(sa)" -0x3215: "(a)" -0x3216: "(ja)" -0x3217: "(ca)" -0x3218: "(ka)" -0x3219: "(ta)" -0x321a: "(pa)" -0x321b: "(ha)" -0x321c: "(ju)" -0x321d: "[?]" -0x321e: "[?]" -0x321f: "[?]" -0x3220: "(1) " -0x3221: "(2) " -0x3222: "(3) " -0x3223: "(4) " -0x3224: "(5) " -0x3225: "(6) " -0x3226: "(7) " -0x3227: "(8) " -0x3228: "(9) " -0x3229: "(10) " -0x322a: "(Yue) " -0x322b: "(Huo) " -0x322c: "(Shui) " -0x322d: "(Mu) " -0x322e: "(Jin) " -0x322f: "(Tu) " -0x3230: "(Ri) " -0x3231: "(Zhu) " -0x3232: "(You) " -0x3233: "(She) " -0x3234: "(Ming) " -0x3235: "(Te) " -0x3236: "(Cai) " -0x3237: "(Zhu) " -0x3238: "(Lao) " -0x3239: "(Dai) " -0x323a: "(Hu) " -0x323b: "(Xue) " -0x323c: "(Jian) " -0x323d: "(Qi) " -0x323e: "(Zi) " -0x323f: "(Xie) " -0x3240: "(Ji) " -0x3241: "(Xiu) " -0x3242: "<<" -0x3243: ">>" -0x3244: "[?]" -0x3245: "[?]" -0x3246: "[?]" -0x3247: "[?]" -0x3248: "[?]" -0x3249: "[?]" -0x324a: "[?]" -0x324b: "[?]" -0x324c: "[?]" -0x324d: "[?]" -0x324e: "[?]" -0x324f: "[?]" -0x3250: "[?]" -0x3251: "[?]" -0x3252: "[?]" -0x3253: "[?]" -0x3254: "[?]" -0x3255: "[?]" -0x3256: "[?]" -0x3257: "[?]" -0x3258: "[?]" -0x3259: "[?]" -0x325a: "[?]" -0x325b: "[?]" -0x325c: "[?]" -0x325d: "[?]" -0x325e: "[?]" -0x325f: "[?]" -0x3260: "(g)" -0x3261: "(n)" -0x3262: "(d)" -0x3263: "(r)" -0x3264: "(m)" -0x3265: "(b)" -0x3266: "(s)" -0x3267: "()" -0x3268: "(j)" -0x3269: "(c)" -0x326a: "(k)" -0x326b: "(t)" -0x326c: "(p)" -0x326d: "(h)" -0x326e: "(ga)" -0x326f: "(na)" -0x3270: "(da)" -0x3271: "(ra)" -0x3272: "(ma)" -0x3273: "(ba)" -0x3274: "(sa)" -0x3275: "(a)" -0x3276: "(ja)" -0x3277: "(ca)" -0x3278: "(ka)" -0x3279: "(ta)" -0x327a: "(pa)" -0x327b: "(ha)" -0x327c: "[?]" -0x327d: "[?]" -0x327e: "[?]" -0x327f: "KIS " -0x3280: "(1) " -0x3281: "(2) " -0x3282: "(3) " -0x3283: "(4) " -0x3284: "(5) " -0x3285: "(6) " -0x3286: "(7) " -0x3287: "(8) " -0x3288: "(9) " -0x3289: "(10) " -0x328a: "(Yue) " -0x328b: "(Huo) " -0x328c: "(Shui) " -0x328d: "(Mu) " -0x328e: "(Jin) " -0x328f: "(Tu) " -0x3290: "(Ri) " -0x3291: "(Zhu) " -0x3292: "(You) " -0x3293: "(She) " -0x3294: "(Ming) " -0x3295: "(Te) " -0x3296: "(Cai) " -0x3297: "(Zhu) " -0x3298: "(Lao) " -0x3299: "(Mi) " -0x329a: "(Nan) " -0x329b: "(Nu) " -0x329c: "(Shi) " -0x329d: "(You) " -0x329e: "(Yin) " -0x329f: "(Zhu) " -0x32a0: "(Xiang) " -0x32a1: "(Xiu) " -0x32a2: "(Xie) " -0x32a3: "(Zheng) " -0x32a4: "(Shang) " -0x32a5: "(Zhong) " -0x32a6: "(Xia) " -0x32a7: "(Zuo) " -0x32a8: "(You) " -0x32a9: "(Yi) " -0x32aa: "(Zong) " -0x32ab: "(Xue) " -0x32ac: "(Jian) " -0x32ad: "(Qi) " -0x32ae: "(Zi) " -0x32af: "(Xie) " -0x32b0: "(Ye) " -0x32b1: "[?]" -0x32b2: "[?]" -0x32b3: "[?]" -0x32b4: "[?]" -0x32b5: "[?]" -0x32b6: "[?]" -0x32b7: "[?]" -0x32b8: "[?]" -0x32b9: "[?]" -0x32ba: "[?]" -0x32bb: "[?]" -0x32bc: "[?]" -0x32bd: "[?]" -0x32be: "[?]" -0x32bf: "[?]" -0x32c0: "1M" -0x32c1: "2M" -0x32c2: "3M" -0x32c3: "4M" -0x32c4: "5M" -0x32c5: "6M" -0x32c6: "7M" -0x32c7: "8M" -0x32c8: "9M" -0x32c9: "10M" -0x32ca: "11M" -0x32cb: "12M" -0x32cc: "[?]" -0x32cd: "[?]" -0x32ce: "[?]" -0x32cf: "[?]" -0x32d0: "a" -0x32d1: "i" -0x32d2: "u" -0x32d3: "u" -0x32d4: "o" -0x32d5: "ka" -0x32d6: "ki" -0x32d7: "ku" -0x32d8: "ke" -0x32d9: "ko" -0x32da: "sa" -0x32db: "si" -0x32dc: "su" -0x32dd: "se" -0x32de: "so" -0x32df: "ta" -0x32e0: "ti" -0x32e1: "tu" -0x32e2: "te" -0x32e3: "to" -0x32e4: "na" -0x32e5: "ni" -0x32e6: "nu" -0x32e7: "ne" -0x32e8: "no" -0x32e9: "ha" -0x32ea: "hi" -0x32eb: "hu" -0x32ec: "he" -0x32ed: "ho" -0x32ee: "ma" -0x32ef: "mi" -0x32f0: "mu" -0x32f1: "me" -0x32f2: "mo" -0x32f3: "ya" -0x32f4: "yu" -0x32f5: "yo" -0x32f6: "ra" -0x32f7: "ri" -0x32f8: "ru" -0x32f9: "re" -0x32fa: "ro" -0x32fb: "wa" -0x32fc: "wi" -0x32fd: "we" -0x32fe: "wo" -/* x033 */ -0x3300: "apartment" -0x3301: "alpha" -0x3302: "ampere" -0x3303: "are" -0x3304: "inning" -0x3305: "inch" -0x3306: "won" -0x3307: "escudo" -0x3308: "acre" -0x3309: "ounce" -0x330a: "ohm" -0x330b: "kai-ri" -0x330c: "carat" -0x330d: "calorie" -0x330e: "gallon" -0x330f: "gamma" -0x3310: "giga" -0x3311: "guinea" -0x3312: "curie" -0x3313: "guilder" -0x3314: "kilo" -0x3315: "kilogram" -0x3316: "kilometer" -0x3317: "kilowatt" -0x3318: "gram" -0x3319: "gram ton" -0x331a: "cruzeiro" -0x331b: "krone" -0x331c: "case" -0x331d: "koruna" -0x331e: "co-op" -0x331f: "cycle" -0x3320: "centime" -0x3321: "shilling" -0x3322: "centi" -0x3323: "cent" -0x3324: "dozen" -0x3325: "desi" -0x3326: "dollar" -0x3327: "ton" -0x3328: "nano" -0x3329: "knot" -0x332a: "heights" -0x332b: "percent" -0x332c: "parts" -0x332d: "barrel" -0x332e: "piaster" -0x332f: "picul" -0x3330: "pico" -0x3331: "building" -0x3332: "farad" -0x3333: "feet" -0x3334: "bushel" -0x3335: "franc" -0x3336: "hectare" -0x3337: "peso" -0x3338: "pfennig" -0x3339: "hertz" -0x333a: "pence" -0x333b: "page" -0x333c: "beta" -0x333d: "point" -0x333e: "volt" -0x333f: "hon" -0x3340: "pound" -0x3341: "hall" -0x3342: "horn" -0x3343: "micro" -0x3344: "mile" -0x3345: "mach" -0x3346: "mark" -0x3347: "mansion" -0x3348: "micron" -0x3349: "milli" -0x334a: "millibar" -0x334b: "mega" -0x334c: "megaton" -0x334d: "meter" -0x334e: "yard" -0x334f: "yard" -0x3350: "yuan" -0x3351: "liter" -0x3352: "lira" -0x3353: "rupee" -0x3354: "ruble" -0x3355: "rem" -0x3356: "roentgen" -0x3357: "watt" -0x3358: "0h" -0x3359: "1h" -0x335a: "2h" -0x335b: "3h" -0x335c: "4h" -0x335d: "5h" -0x335e: "6h" -0x335f: "7h" -0x3360: "8h" -0x3361: "9h" -0x3362: "10h" -0x3363: "11h" -0x3364: "12h" -0x3365: "13h" -0x3366: "14h" -0x3367: "15h" -0x3368: "16h" -0x3369: "17h" -0x336a: "18h" -0x336b: "19h" -0x336c: "20h" -0x336d: "21h" -0x336e: "22h" -0x336f: "23h" -0x3370: "24h" -0x3371: "HPA" -0x3372: "da" -0x3373: "AU" -0x3374: "bar" -0x3375: "oV" -0x3376: "pc" -0x3377: "[?]" -0x3378: "[?]" -0x3379: "[?]" -0x337a: "[?]" -0x337b: "Heisei" -0x337c: "Syouwa" -0x337d: "Taisyou" -0x337e: "Meiji" -0x337f: "Inc." -0x3380: "pA" -0x3381: "nA" -0x3382: "microamp" -0x3383: "mA" -0x3384: "kA" -0x3385: "kB" -0x3386: "MB" -0x3387: "GB" -0x3388: "cal" -0x3389: "kcal" -0x338a: "pF" -0x338b: "nF" -0x338c: "microFarad" -0x338d: "microgram" -0x338e: "mg" -0x338f: "kg" -0x3390: "Hz" -0x3391: "kHz" -0x3392: "MHz" -0x3393: "GHz" -0x3394: "THz" -0x3395: "microliter" -0x3396: "ml" -0x3397: "dl" -0x3398: "kl" -0x3399: "fm" -0x339a: "nm" -0x339b: "micrometer" -0x339c: "mm" -0x339d: "cm" -0x339e: "km" -0x339f: "mm^2" -0x33a0: "cm^2" -0x33a1: "m^2" -0x33a2: "km^2" -0x33a3: "mm^4" -0x33a4: "cm^3" -0x33a5: "m^3" -0x33a6: "km^3" -0x33a7: "m/s" -0x33a8: "m/s^2" -0x33a9: "Pa" -0x33aa: "kPa" -0x33ab: "MPa" -0x33ac: "GPa" -0x33ad: "rad" -0x33ae: "rad/s" -0x33af: "rad/s^2" -0x33b0: "ps" -0x33b1: "ns" -0x33b2: "microsecond" -0x33b3: "ms" -0x33b4: "pV" -0x33b5: "nV" -0x33b6: "microvolt" -0x33b7: "mV" -0x33b8: "kV" -0x33b9: "MV" -0x33ba: "pW" -0x33bb: "nW" -0x33bc: "microwatt" -0x33bd: "mW" -0x33be: "kW" -0x33bf: "MW" -0x33c0: "kOhm" -0x33c1: "MOhm" -0x33c2: "a.m." -0x33c3: "Bq" -0x33c4: "cc" -0x33c5: "cd" -0x33c6: "C/kg" -0x33c7: "Co." -0x33c8: "dB" -0x33c9: "Gy" -0x33ca: "ha" -0x33cb: "HP" -0x33cc: "in" -0x33cd: "K.K." -0x33ce: "KM" -0x33cf: "kt" -0x33d0: "lm" -0x33d1: "ln" -0x33d2: "log" -0x33d3: "lx" -0x33d4: "mb" -0x33d5: "mil" -0x33d6: "mol" -0x33d7: "pH" -0x33d8: "p.m." -0x33d9: "PPM" -0x33da: "PR" -0x33db: "sr" -0x33dc: "Sv" -0x33dd: "Wb" -0x33de: "[?]" -0x33df: "[?]" -0x33e0: "1d" -0x33e1: "2d" -0x33e2: "3d" -0x33e3: "4d" -0x33e4: "5d" -0x33e5: "6d" -0x33e6: "7d" -0x33e7: "8d" -0x33e8: "9d" -0x33e9: "10d" -0x33ea: "11d" -0x33eb: "12d" -0x33ec: "13d" -0x33ed: "14d" -0x33ee: "15d" -0x33ef: "16d" -0x33f0: "17d" -0x33f1: "18d" -0x33f2: "19d" -0x33f3: "20d" -0x33f4: "21d" -0x33f5: "22d" -0x33f6: "23d" -0x33f7: "24d" -0x33f8: "25d" -0x33f9: "26d" -0x33fa: "27d" -0x33fb: "28d" -0x33fc: "29d" -0x33fd: "30d" -0x33fe: "31d" -/* x04d */ -0x4d00: "[?] " -0x4d01: "[?] " -0x4d02: "[?] " -0x4d03: "[?] " -0x4d04: "[?] " -0x4d05: "[?] " -0x4d06: "[?] " -0x4d07: "[?] " -0x4d08: "[?] " -0x4d09: "[?] " -0x4d0a: "[?] " -0x4d0b: "[?] " -0x4d0c: "[?] " -0x4d0d: "[?] " -0x4d0e: "[?] " -0x4d0f: "[?] " -0x4d10: "[?] " -0x4d11: "[?] " -0x4d12: "[?] " -0x4d13: "[?] " -0x4d14: "[?] " -0x4d15: "[?] " -0x4d16: "[?] " -0x4d17: "[?] " -0x4d18: "[?] " -0x4d19: "[?] " -0x4d1a: "[?] " -0x4d1b: "[?] " -0x4d1c: "[?] " -0x4d1d: "[?] " -0x4d1e: "[?] " -0x4d1f: "[?] " -0x4d20: "[?] " -0x4d21: "[?] " -0x4d22: "[?] " -0x4d23: "[?] " -0x4d24: "[?] " -0x4d25: "[?] " -0x4d26: "[?] " -0x4d27: "[?] " -0x4d28: "[?] " -0x4d29: "[?] " -0x4d2a: "[?] " -0x4d2b: "[?] " -0x4d2c: "[?] " -0x4d2d: "[?] " -0x4d2e: "[?] " -0x4d2f: "[?] " -0x4d30: "[?] " -0x4d31: "[?] " -0x4d32: "[?] " -0x4d33: "[?] " -0x4d34: "[?] " -0x4d35: "[?] " -0x4d36: "[?] " -0x4d37: "[?] " -0x4d38: "[?] " -0x4d39: "[?] " -0x4d3a: "[?] " -0x4d3b: "[?] " -0x4d3c: "[?] " -0x4d3d: "[?] " -0x4d3e: "[?] " -0x4d3f: "[?] " -0x4d40: "[?] " -0x4d41: "[?] " -0x4d42: "[?] " -0x4d43: "[?] " -0x4d44: "[?] " -0x4d45: "[?] " -0x4d46: "[?] " -0x4d47: "[?] " -0x4d48: "[?] " -0x4d49: "[?] " -0x4d4a: "[?] " -0x4d4b: "[?] " -0x4d4c: "[?] " -0x4d4d: "[?] " -0x4d4e: "[?] " -0x4d4f: "[?] " -0x4d50: "[?] " -0x4d51: "[?] " -0x4d52: "[?] " -0x4d53: "[?] " -0x4d54: "[?] " -0x4d55: "[?] " -0x4d56: "[?] " -0x4d57: "[?] " -0x4d58: "[?] " -0x4d59: "[?] " -0x4d5a: "[?] " -0x4d5b: "[?] " -0x4d5c: "[?] " -0x4d5d: "[?] " -0x4d5e: "[?] " -0x4d5f: "[?] " -0x4d60: "[?] " -0x4d61: "[?] " -0x4d62: "[?] " -0x4d63: "[?] " -0x4d64: "[?] " -0x4d65: "[?] " -0x4d66: "[?] " -0x4d67: "[?] " -0x4d68: "[?] " -0x4d69: "[?] " -0x4d6a: "[?] " -0x4d6b: "[?] " -0x4d6c: "[?] " -0x4d6d: "[?] " -0x4d6e: "[?] " -0x4d6f: "[?] " -0x4d70: "[?] " -0x4d71: "[?] " -0x4d72: "[?] " -0x4d73: "[?] " -0x4d74: "[?] " -0x4d75: "[?] " -0x4d76: "[?] " -0x4d77: "[?] " -0x4d78: "[?] " -0x4d79: "[?] " -0x4d7a: "[?] " -0x4d7b: "[?] " -0x4d7c: "[?] " -0x4d7d: "[?] " -0x4d7e: "[?] " -0x4d7f: "[?] " -0x4d80: "[?] " -0x4d81: "[?] " -0x4d82: "[?] " -0x4d83: "[?] " -0x4d84: "[?] " -0x4d85: "[?] " -0x4d86: "[?] " -0x4d87: "[?] " -0x4d88: "[?] " -0x4d89: "[?] " -0x4d8a: "[?] " -0x4d8b: "[?] " -0x4d8c: "[?] " -0x4d8d: "[?] " -0x4d8e: "[?] " -0x4d8f: "[?] " -0x4d90: "[?] " -0x4d91: "[?] " -0x4d92: "[?] " -0x4d93: "[?] " -0x4d94: "[?] " -0x4d95: "[?] " -0x4d96: "[?] " -0x4d97: "[?] " -0x4d98: "[?] " -0x4d99: "[?] " -0x4d9a: "[?] " -0x4d9b: "[?] " -0x4d9c: "[?] " -0x4d9d: "[?] " -0x4d9e: "[?] " -0x4d9f: "[?] " -0x4da0: "[?] " -0x4da1: "[?] " -0x4da2: "[?] " -0x4da3: "[?] " -0x4da4: "[?] " -0x4da5: "[?] " -0x4da6: "[?] " -0x4da7: "[?] " -0x4da8: "[?] " -0x4da9: "[?] " -0x4daa: "[?] " -0x4dab: "[?] " -0x4dac: "[?] " -0x4dad: "[?] " -0x4dae: "[?] " -0x4daf: "[?] " -0x4db0: "[?] " -0x4db1: "[?] " -0x4db2: "[?] " -0x4db3: "[?] " -0x4db4: "[?] " -0x4db5: "[?] " -0x4db6: "[?]" -0x4db7: "[?]" -0x4db8: "[?]" -0x4db9: "[?]" -0x4dba: "[?]" -0x4dbb: "[?]" -0x4dbc: "[?]" -0x4dbd: "[?]" -0x4dbe: "[?]" -0x4dbf: "[?]" -0x4dc0: "[?]" -0x4dc1: "[?]" -0x4dc2: "[?]" -0x4dc3: "[?]" -0x4dc4: "[?]" -0x4dc5: "[?]" -0x4dc6: "[?]" -0x4dc7: "[?]" -0x4dc8: "[?]" -0x4dc9: "[?]" -0x4dca: "[?]" -0x4dcb: "[?]" -0x4dcc: "[?]" -0x4dcd: "[?]" -0x4dce: "[?]" -0x4dcf: "[?]" -0x4dd0: "[?]" -0x4dd1: "[?]" -0x4dd2: "[?]" -0x4dd3: "[?]" -0x4dd4: "[?]" -0x4dd5: "[?]" -0x4dd6: "[?]" -0x4dd7: "[?]" -0x4dd8: "[?]" -0x4dd9: "[?]" -0x4dda: "[?]" -0x4ddb: "[?]" -0x4ddc: "[?]" -0x4ddd: "[?]" -0x4dde: "[?]" -0x4ddf: "[?]" -0x4de0: "[?]" -0x4de1: "[?]" -0x4de2: "[?]" -0x4de3: "[?]" -0x4de4: "[?]" -0x4de5: "[?]" -0x4de6: "[?]" -0x4de7: "[?]" -0x4de8: "[?]" -0x4de9: "[?]" -0x4dea: "[?]" -0x4deb: "[?]" -0x4dec: "[?]" -0x4ded: "[?]" -0x4dee: "[?]" -0x4def: "[?]" -0x4df0: "[?]" -0x4df1: "[?]" -0x4df2: "[?]" -0x4df3: "[?]" -0x4df4: "[?]" -0x4df5: "[?]" -0x4df6: "[?]" -0x4df7: "[?]" -0x4df8: "[?]" -0x4df9: "[?]" -0x4dfa: "[?]" -0x4dfb: "[?]" -0x4dfc: "[?]" -0x4dfd: "[?]" -0x4dfe: "[?]" -/* x04e */ -0x4e00: "[?] " -0x4e01: "Ding " -0x4e02: "Kao " -0x4e03: "Qi " -0x4e04: "Shang " -0x4e05: "Xia " -0x4e06: "[?] " -0x4e07: "Mo " -0x4e08: "Zhang " -0x4e09: "San " -0x4e0a: "Shang " -0x4e0b: "Xia " -0x4e0c: "Ji " -0x4e0d: "Bu " -0x4e0e: "Yu " -0x4e0f: "Mian " -0x4e10: "Gai " -0x4e11: "Chou " -0x4e12: "Chou " -0x4e13: "Zhuan " -0x4e14: "Qie " -0x4e15: "Pi " -0x4e16: "Shi " -0x4e17: "Shi " -0x4e18: "Qiu " -0x4e19: "Bing " -0x4e1a: "Ye " -0x4e1b: "Cong " -0x4e1c: "Dong " -0x4e1d: "Si " -0x4e1e: "Cheng " -0x4e1f: "Diu " -0x4e20: "Qiu " -0x4e21: "Liang " -0x4e22: "Diu " -0x4e23: "You " -0x4e24: "Liang " -0x4e25: "Yan " -0x4e26: "Bing " -0x4e27: "Sang " -0x4e28: "Gun " -0x4e29: "Jiu " -0x4e2a: "Ge " -0x4e2b: "Ya " -0x4e2c: "Qiang " -0x4e2d: "Zhong " -0x4e2e: "Ji " -0x4e2f: "Jie " -0x4e30: "Feng " -0x4e31: "Guan " -0x4e32: "Chuan " -0x4e33: "Chan " -0x4e34: "Lin " -0x4e35: "Zhuo " -0x4e36: "Zhu " -0x4e37: "Ha " -0x4e38: "Wan " -0x4e39: "Dan " -0x4e3a: "Wei " -0x4e3b: "Zhu " -0x4e3c: "Jing " -0x4e3d: "Li " -0x4e3e: "Ju " -0x4e3f: "Pie " -0x4e40: "Fu " -0x4e41: "Yi " -0x4e42: "Yi " -0x4e43: "Nai " -0x4e44: "Shime " -0x4e45: "Jiu " -0x4e46: "Jiu " -0x4e47: "Zhe " -0x4e48: "Yao " -0x4e49: "Yi " -0x4e4a: "[?] " -0x4e4b: "Zhi " -0x4e4c: "Wu " -0x4e4d: "Zha " -0x4e4e: "Hu " -0x4e4f: "Fa " -0x4e50: "Le " -0x4e51: "Zhong " -0x4e52: "Ping " -0x4e53: "Pang " -0x4e54: "Qiao " -0x4e55: "Hu " -0x4e56: "Guai " -0x4e57: "Cheng " -0x4e58: "Cheng " -0x4e59: "Yi " -0x4e5a: "Yin " -0x4e5b: "[?] " -0x4e5c: "Mie " -0x4e5d: "Jiu " -0x4e5e: "Qi " -0x4e5f: "Ye " -0x4e60: "Xi " -0x4e61: "Xiang " -0x4e62: "Gai " -0x4e63: "Diu " -0x4e64: "Hal " -0x4e65: "[?] " -0x4e66: "Shu " -0x4e67: "Twul " -0x4e68: "Shi " -0x4e69: "Ji " -0x4e6a: "Nang " -0x4e6b: "Jia " -0x4e6c: "Kel " -0x4e6d: "Shi " -0x4e6e: "[?] " -0x4e6f: "Ol " -0x4e70: "Mai " -0x4e71: "Luan " -0x4e72: "Cal " -0x4e73: "Ru " -0x4e74: "Xue " -0x4e75: "Yan " -0x4e76: "Fu " -0x4e77: "Sha " -0x4e78: "Na " -0x4e79: "Gan " -0x4e7a: "Sol " -0x4e7b: "El " -0x4e7c: "Cwul " -0x4e7d: "[?] " -0x4e7e: "Gan " -0x4e7f: "Chi " -0x4e80: "Gui " -0x4e81: "Gan " -0x4e82: "Luan " -0x4e83: "Lin " -0x4e84: "Yi " -0x4e85: "Jue " -0x4e86: "Liao " -0x4e87: "Ma " -0x4e88: "Yu " -0x4e89: "Zheng " -0x4e8a: "Shi " -0x4e8b: "Shi " -0x4e8c: "Er " -0x4e8d: "Chu " -0x4e8e: "Yu " -0x4e8f: "Yu " -0x4e90: "Yu " -0x4e91: "Yun " -0x4e92: "Hu " -0x4e93: "Qi " -0x4e94: "Wu " -0x4e95: "Jing " -0x4e96: "Si " -0x4e97: "Sui " -0x4e98: "Gen " -0x4e99: "Gen " -0x4e9a: "Ya " -0x4e9b: "Xie " -0x4e9c: "Ya " -0x4e9d: "Qi " -0x4e9e: "Ya " -0x4e9f: "Ji " -0x4ea0: "Tou " -0x4ea1: "Wang " -0x4ea2: "Kang " -0x4ea3: "Ta " -0x4ea4: "Jiao " -0x4ea5: "Hai " -0x4ea6: "Yi " -0x4ea7: "Chan " -0x4ea8: "Heng " -0x4ea9: "Mu " -0x4eaa: "[?] " -0x4eab: "Xiang " -0x4eac: "Jing " -0x4ead: "Ting " -0x4eae: "Liang " -0x4eaf: "Xiang " -0x4eb0: "Jing " -0x4eb1: "Ye " -0x4eb2: "Qin " -0x4eb3: "Bo " -0x4eb4: "You " -0x4eb5: "Xie " -0x4eb6: "Dan " -0x4eb7: "Lian " -0x4eb8: "Duo " -0x4eb9: "Wei " -0x4eba: "Ren " -0x4ebb: "Ren " -0x4ebc: "Ji " -0x4ebd: "La " -0x4ebe: "Wang " -0x4ebf: "Yi " -0x4ec0: "Shi " -0x4ec1: "Ren " -0x4ec2: "Le " -0x4ec3: "Ding " -0x4ec4: "Ze " -0x4ec5: "Jin " -0x4ec6: "Pu " -0x4ec7: "Chou " -0x4ec8: "Ba " -0x4ec9: "Zhang " -0x4eca: "Jin " -0x4ecb: "Jie " -0x4ecc: "Bing " -0x4ecd: "Reng " -0x4ece: "Cong " -0x4ecf: "Fo " -0x4ed0: "San " -0x4ed1: "Lun " -0x4ed2: "Sya " -0x4ed3: "Cang " -0x4ed4: "Zi " -0x4ed5: "Shi " -0x4ed6: "Ta " -0x4ed7: "Zhang " -0x4ed8: "Fu " -0x4ed9: "Xian " -0x4eda: "Xian " -0x4edb: "Tuo " -0x4edc: "Hong " -0x4edd: "Tong " -0x4ede: "Ren " -0x4edf: "Qian " -0x4ee0: "Gan " -0x4ee1: "Yi " -0x4ee2: "Di " -0x4ee3: "Dai " -0x4ee4: "Ling " -0x4ee5: "Yi " -0x4ee6: "Chao " -0x4ee7: "Chang " -0x4ee8: "Sa " -0x4ee9: "[?] " -0x4eea: "Yi " -0x4eeb: "Mu " -0x4eec: "Men " -0x4eed: "Ren " -0x4eee: "Jia " -0x4eef: "Chao " -0x4ef0: "Yang " -0x4ef1: "Qian " -0x4ef2: "Zhong " -0x4ef3: "Pi " -0x4ef4: "Wan " -0x4ef5: "Wu " -0x4ef6: "Jian " -0x4ef7: "Jie " -0x4ef8: "Yao " -0x4ef9: "Feng " -0x4efa: "Cang " -0x4efb: "Ren " -0x4efc: "Wang " -0x4efd: "Fen " -0x4efe: "Di " -0x4eff: "Fang " -/* x04f */ -0x4f00: "Zhong " -0x4f01: "Qi " -0x4f02: "Pei " -0x4f03: "Yu " -0x4f04: "Diao " -0x4f05: "Dun " -0x4f06: "Wen " -0x4f07: "Yi " -0x4f08: "Xin " -0x4f09: "Kang " -0x4f0a: "Yi " -0x4f0b: "Ji " -0x4f0c: "Ai " -0x4f0d: "Wu " -0x4f0e: "Ji " -0x4f0f: "Fu " -0x4f10: "Fa " -0x4f11: "Xiu " -0x4f12: "Jin " -0x4f13: "Bei " -0x4f14: "Dan " -0x4f15: "Fu " -0x4f16: "Tang " -0x4f17: "Zhong " -0x4f18: "You " -0x4f19: "Huo " -0x4f1a: "Hui " -0x4f1b: "Yu " -0x4f1c: "Cui " -0x4f1d: "Chuan " -0x4f1e: "San " -0x4f1f: "Wei " -0x4f20: "Chuan " -0x4f21: "Che " -0x4f22: "Ya " -0x4f23: "Xian " -0x4f24: "Shang " -0x4f25: "Chang " -0x4f26: "Lun " -0x4f27: "Cang " -0x4f28: "Xun " -0x4f29: "Xin " -0x4f2a: "Wei " -0x4f2b: "Zhu " -0x4f2c: "[?] " -0x4f2d: "Xuan " -0x4f2e: "Nu " -0x4f2f: "Bo " -0x4f30: "Gu " -0x4f31: "Ni " -0x4f32: "Ni " -0x4f33: "Xie " -0x4f34: "Ban " -0x4f35: "Xu " -0x4f36: "Ling " -0x4f37: "Zhou " -0x4f38: "Shen " -0x4f39: "Qu " -0x4f3a: "Si " -0x4f3b: "Beng " -0x4f3c: "Si " -0x4f3d: "Jia " -0x4f3e: "Pi " -0x4f3f: "Yi " -0x4f40: "Si " -0x4f41: "Ai " -0x4f42: "Zheng " -0x4f43: "Dian " -0x4f44: "Han " -0x4f45: "Mai " -0x4f46: "Dan " -0x4f47: "Zhu " -0x4f48: "Bu " -0x4f49: "Qu " -0x4f4a: "Bi " -0x4f4b: "Shao " -0x4f4c: "Ci " -0x4f4d: "Wei " -0x4f4e: "Di " -0x4f4f: "Zhu " -0x4f50: "Zuo " -0x4f51: "You " -0x4f52: "Yang " -0x4f53: "Ti " -0x4f54: "Zhan " -0x4f55: "He " -0x4f56: "Bi " -0x4f57: "Tuo " -0x4f58: "She " -0x4f59: "Yu " -0x4f5a: "Yi " -0x4f5b: "Fo " -0x4f5c: "Zuo " -0x4f5d: "Kou " -0x4f5e: "Ning " -0x4f5f: "Tong " -0x4f60: "Ni " -0x4f61: "Xuan " -0x4f62: "Qu " -0x4f63: "Yong " -0x4f64: "Wa " -0x4f65: "Qian " -0x4f66: "[?] " -0x4f67: "Ka " -0x4f68: "[?] " -0x4f69: "Pei " -0x4f6a: "Huai " -0x4f6b: "He " -0x4f6c: "Lao " -0x4f6d: "Xiang " -0x4f6e: "Ge " -0x4f6f: "Yang " -0x4f70: "Bai " -0x4f71: "Fa " -0x4f72: "Ming " -0x4f73: "Jia " -0x4f74: "Er " -0x4f75: "Bing " -0x4f76: "Ji " -0x4f77: "Hen " -0x4f78: "Huo " -0x4f79: "Gui " -0x4f7a: "Quan " -0x4f7b: "Tiao " -0x4f7c: "Jiao " -0x4f7d: "Ci " -0x4f7e: "Yi " -0x4f7f: "Shi " -0x4f80: "Xing " -0x4f81: "Shen " -0x4f82: "Tuo " -0x4f83: "Kan " -0x4f84: "Zhi " -0x4f85: "Gai " -0x4f86: "Lai " -0x4f87: "Yi " -0x4f88: "Chi " -0x4f89: "Kua " -0x4f8a: "Guang " -0x4f8b: "Li " -0x4f8c: "Yin " -0x4f8d: "Shi " -0x4f8e: "Mi " -0x4f8f: "Zhu " -0x4f90: "Xu " -0x4f91: "You " -0x4f92: "An " -0x4f93: "Lu " -0x4f94: "Mou " -0x4f95: "Er " -0x4f96: "Lun " -0x4f97: "Tong " -0x4f98: "Cha " -0x4f99: "Chi " -0x4f9a: "Xun " -0x4f9b: "Gong " -0x4f9c: "Zhou " -0x4f9d: "Yi " -0x4f9e: "Ru " -0x4f9f: "Jian " -0x4fa0: "Xia " -0x4fa1: "Jia " -0x4fa2: "Zai " -0x4fa3: "Lu " -0x4fa4: "Ko " -0x4fa5: "Jiao " -0x4fa6: "Zhen " -0x4fa7: "Ce " -0x4fa8: "Qiao " -0x4fa9: "Kuai " -0x4faa: "Chai " -0x4fab: "Ning " -0x4fac: "Nong " -0x4fad: "Jin " -0x4fae: "Wu " -0x4faf: "Hou " -0x4fb0: "Jiong " -0x4fb1: "Cheng " -0x4fb2: "Zhen " -0x4fb3: "Zuo " -0x4fb4: "Chou " -0x4fb5: "Qin " -0x4fb6: "Lu " -0x4fb7: "Ju " -0x4fb8: "Shu " -0x4fb9: "Ting " -0x4fba: "Shen " -0x4fbb: "Tuo " -0x4fbc: "Bo " -0x4fbd: "Nan " -0x4fbe: "Hao " -0x4fbf: "Bian " -0x4fc0: "Tui " -0x4fc1: "Yu " -0x4fc2: "Xi " -0x4fc3: "Cu " -0x4fc4: "E " -0x4fc5: "Qiu " -0x4fc6: "Xu " -0x4fc7: "Kuang " -0x4fc8: "Ku " -0x4fc9: "Wu " -0x4fca: "Jun " -0x4fcb: "Yi " -0x4fcc: "Fu " -0x4fcd: "Lang " -0x4fce: "Zu " -0x4fcf: "Qiao " -0x4fd0: "Li " -0x4fd1: "Yong " -0x4fd2: "Hun " -0x4fd3: "Jing " -0x4fd4: "Xian " -0x4fd5: "San " -0x4fd6: "Pai " -0x4fd7: "Su " -0x4fd8: "Fu " -0x4fd9: "Xi " -0x4fda: "Li " -0x4fdb: "Fu " -0x4fdc: "Ping " -0x4fdd: "Bao " -0x4fde: "Yu " -0x4fdf: "Si " -0x4fe0: "Xia " -0x4fe1: "Xin " -0x4fe2: "Xiu " -0x4fe3: "Yu " -0x4fe4: "Ti " -0x4fe5: "Che " -0x4fe6: "Chou " -0x4fe7: "[?] " -0x4fe8: "Yan " -0x4fe9: "Lia " -0x4fea: "Li " -0x4feb: "Lai " -0x4fec: "[?] " -0x4fed: "Jian " -0x4fee: "Xiu " -0x4fef: "Fu " -0x4ff0: "He " -0x4ff1: "Ju " -0x4ff2: "Xiao " -0x4ff3: "Pai " -0x4ff4: "Jian " -0x4ff5: "Biao " -0x4ff6: "Chu " -0x4ff7: "Fei " -0x4ff8: "Feng " -0x4ff9: "Ya " -0x4ffa: "An " -0x4ffb: "Bei " -0x4ffc: "Yu " -0x4ffd: "Xin " -0x4ffe: "Bi " -0x4fff: "Jian " -/* x050 */ -0x5000: "Chang " -0x5001: "Chi " -0x5002: "Bing " -0x5003: "Zan " -0x5004: "Yao " -0x5005: "Cui " -0x5006: "Lia " -0x5007: "Wan " -0x5008: "Lai " -0x5009: "Cang " -0x500a: "Zong " -0x500b: "Ge " -0x500c: "Guan " -0x500d: "Bei " -0x500e: "Tian " -0x500f: "Shu " -0x5010: "Shu " -0x5011: "Men " -0x5012: "Dao " -0x5013: "Tan " -0x5014: "Jue " -0x5015: "Chui " -0x5016: "Xing " -0x5017: "Peng " -0x5018: "Tang " -0x5019: "Hou " -0x501a: "Yi " -0x501b: "Qi " -0x501c: "Ti " -0x501d: "Gan " -0x501e: "Jing " -0x501f: "Jie " -0x5020: "Sui " -0x5021: "Chang " -0x5022: "Jie " -0x5023: "Fang " -0x5024: "Zhi " -0x5025: "Kong " -0x5026: "Juan " -0x5027: "Zong " -0x5028: "Ju " -0x5029: "Qian " -0x502a: "Ni " -0x502b: "Lun " -0x502c: "Zhuo " -0x502d: "Wei " -0x502e: "Luo " -0x502f: "Song " -0x5030: "Leng " -0x5031: "Hun " -0x5032: "Dong " -0x5033: "Zi " -0x5034: "Ben " -0x5035: "Wu " -0x5036: "Ju " -0x5037: "Nai " -0x5038: "Cai " -0x5039: "Jian " -0x503a: "Zhai " -0x503b: "Ye " -0x503c: "Zhi " -0x503d: "Sha " -0x503e: "Qing " -0x503f: "[?] " -0x5040: "Ying " -0x5041: "Cheng " -0x5042: "Jian " -0x5043: "Yan " -0x5044: "Nuan " -0x5045: "Zhong " -0x5046: "Chun " -0x5047: "Jia " -0x5048: "Jie " -0x5049: "Wei " -0x504a: "Yu " -0x504b: "Bing " -0x504c: "Ruo " -0x504d: "Ti " -0x504e: "Wei " -0x504f: "Pian " -0x5050: "Yan " -0x5051: "Feng " -0x5052: "Tang " -0x5053: "Wo " -0x5054: "E " -0x5055: "Xie " -0x5056: "Che " -0x5057: "Sheng " -0x5058: "Kan " -0x5059: "Di " -0x505a: "Zuo " -0x505b: "Cha " -0x505c: "Ting " -0x505d: "Bei " -0x505e: "Ye " -0x505f: "Huang " -0x5060: "Yao " -0x5061: "Zhan " -0x5062: "Chou " -0x5063: "Yan " -0x5064: "You " -0x5065: "Jian " -0x5066: "Xu " -0x5067: "Zha " -0x5068: "Ci " -0x5069: "Fu " -0x506a: "Bi " -0x506b: "Zhi " -0x506c: "Zong " -0x506d: "Mian " -0x506e: "Ji " -0x506f: "Yi " -0x5070: "Xie " -0x5071: "Xun " -0x5072: "Si " -0x5073: "Duan " -0x5074: "Ce " -0x5075: "Zhen " -0x5076: "Ou " -0x5077: "Tou " -0x5078: "Tou " -0x5079: "Bei " -0x507a: "Za " -0x507b: "Lu " -0x507c: "Jie " -0x507d: "Wei " -0x507e: "Fen " -0x507f: "Chang " -0x5080: "Gui " -0x5081: "Sou " -0x5082: "Zhi " -0x5083: "Su " -0x5084: "Xia " -0x5085: "Fu " -0x5086: "Yuan " -0x5087: "Rong " -0x5088: "Li " -0x5089: "Ru " -0x508a: "Yun " -0x508b: "Gou " -0x508c: "Ma " -0x508d: "Bang " -0x508e: "Dian " -0x508f: "Tang " -0x5090: "Hao " -0x5091: "Jie " -0x5092: "Xi " -0x5093: "Shan " -0x5094: "Qian " -0x5095: "Jue " -0x5096: "Cang " -0x5097: "Chu " -0x5098: "San " -0x5099: "Bei " -0x509a: "Xiao " -0x509b: "Yong " -0x509c: "Yao " -0x509d: "Tan " -0x509e: "Suo " -0x509f: "Yang " -0x50a0: "Fa " -0x50a1: "Bing " -0x50a2: "Jia " -0x50a3: "Dai " -0x50a4: "Zai " -0x50a5: "Tang " -0x50a6: "[?] " -0x50a7: "Bin " -0x50a8: "Chu " -0x50a9: "Nuo " -0x50aa: "Can " -0x50ab: "Lei " -0x50ac: "Cui " -0x50ad: "Yong " -0x50ae: "Zao " -0x50af: "Zong " -0x50b0: "Peng " -0x50b1: "Song " -0x50b2: "Ao " -0x50b3: "Chuan " -0x50b4: "Yu " -0x50b5: "Zhai " -0x50b6: "Cou " -0x50b7: "Shang " -0x50b8: "Qiang " -0x50b9: "Jing " -0x50ba: "Chi " -0x50bb: "Sha " -0x50bc: "Han " -0x50bd: "Zhang " -0x50be: "Qing " -0x50bf: "Yan " -0x50c0: "Di " -0x50c1: "Xi " -0x50c2: "Lu " -0x50c3: "Bei " -0x50c4: "Piao " -0x50c5: "Jin " -0x50c6: "Lian " -0x50c7: "Lu " -0x50c8: "Man " -0x50c9: "Qian " -0x50ca: "Xian " -0x50cb: "Tan " -0x50cc: "Ying " -0x50cd: "Dong " -0x50ce: "Zhuan " -0x50cf: "Xiang " -0x50d0: "Shan " -0x50d1: "Qiao " -0x50d2: "Jiong " -0x50d3: "Tui " -0x50d4: "Zun " -0x50d5: "Pu " -0x50d6: "Xi " -0x50d7: "Lao " -0x50d8: "Chang " -0x50d9: "Guang " -0x50da: "Liao " -0x50db: "Qi " -0x50dc: "Deng " -0x50dd: "Chan " -0x50de: "Wei " -0x50df: "Ji " -0x50e0: "Fan " -0x50e1: "Hui " -0x50e2: "Chuan " -0x50e3: "Jian " -0x50e4: "Dan " -0x50e5: "Jiao " -0x50e6: "Jiu " -0x50e7: "Seng " -0x50e8: "Fen " -0x50e9: "Xian " -0x50ea: "Jue " -0x50eb: "E " -0x50ec: "Jiao " -0x50ed: "Jian " -0x50ee: "Tong " -0x50ef: "Lin " -0x50f0: "Bo " -0x50f1: "Gu " -0x50f2: "[?] " -0x50f3: "Su " -0x50f4: "Xian " -0x50f5: "Jiang " -0x50f6: "Min " -0x50f7: "Ye " -0x50f8: "Jin " -0x50f9: "Jia " -0x50fa: "Qiao " -0x50fb: "Pi " -0x50fc: "Feng " -0x50fd: "Zhou " -0x50fe: "Ai " -0x50ff: "Sai " -/* x051 */ -0x5100: "Yi " -0x5101: "Jun " -0x5102: "Nong " -0x5103: "Chan " -0x5104: "Yi " -0x5105: "Dang " -0x5106: "Jing " -0x5107: "Xuan " -0x5108: "Kuai " -0x5109: "Jian " -0x510a: "Chu " -0x510b: "Dan " -0x510c: "Jiao " -0x510d: "Sha " -0x510e: "Zai " -0x510f: "[?] " -0x5110: "Bin " -0x5111: "An " -0x5112: "Ru " -0x5113: "Tai " -0x5114: "Chou " -0x5115: "Chai " -0x5116: "Lan " -0x5117: "Ni " -0x5118: "Jin " -0x5119: "Qian " -0x511a: "Meng " -0x511b: "Wu " -0x511c: "Ning " -0x511d: "Qiong " -0x511e: "Ni " -0x511f: "Chang " -0x5120: "Lie " -0x5121: "Lei " -0x5122: "Lu " -0x5123: "Kuang " -0x5124: "Bao " -0x5125: "Du " -0x5126: "Biao " -0x5127: "Zan " -0x5128: "Zhi " -0x5129: "Si " -0x512a: "You " -0x512b: "Hao " -0x512c: "Chen " -0x512d: "Chen " -0x512e: "Li " -0x512f: "Teng " -0x5130: "Wei " -0x5131: "Long " -0x5132: "Chu " -0x5133: "Chan " -0x5134: "Rang " -0x5135: "Shu " -0x5136: "Hui " -0x5137: "Li " -0x5138: "Luo " -0x5139: "Zan " -0x513a: "Nuo " -0x513b: "Tang " -0x513c: "Yan " -0x513d: "Lei " -0x513e: "Nang " -0x513f: "Er " -0x5140: "Wu " -0x5141: "Yun " -0x5142: "Zan " -0x5143: "Yuan " -0x5144: "Xiong " -0x5145: "Chong " -0x5146: "Zhao " -0x5147: "Xiong " -0x5148: "Xian " -0x5149: "Guang " -0x514a: "Dui " -0x514b: "Ke " -0x514c: "Dui " -0x514d: "Mian " -0x514e: "Tu " -0x514f: "Chang " -0x5150: "Er " -0x5151: "Dui " -0x5152: "Er " -0x5153: "Xin " -0x5154: "Tu " -0x5155: "Si " -0x5156: "Yan " -0x5157: "Yan " -0x5158: "Shi " -0x5159: "Shi " -0x515a: "Dang " -0x515b: "Qian " -0x515c: "Dou " -0x515d: "Fen " -0x515e: "Mao " -0x515f: "Shen " -0x5160: "Dou " -0x5161: "Bai " -0x5162: "Jing " -0x5163: "Li " -0x5164: "Huang " -0x5165: "Ru " -0x5166: "Wang " -0x5167: "Nei " -0x5168: "Quan " -0x5169: "Liang " -0x516a: "Yu " -0x516b: "Ba " -0x516c: "Gong " -0x516d: "Liu " -0x516e: "Xi " -0x516f: "[?] " -0x5170: "Lan " -0x5171: "Gong " -0x5172: "Tian " -0x5173: "Guan " -0x5174: "Xing " -0x5175: "Bing " -0x5176: "Qi " -0x5177: "Ju " -0x5178: "Dian " -0x5179: "Zi " -0x517a: "Ppwun " -0x517b: "Yang " -0x517c: "Jian " -0x517d: "Shou " -0x517e: "Ji " -0x517f: "Yi " -0x5180: "Ji " -0x5181: "Chan " -0x5182: "Jiong " -0x5183: "Mao " -0x5184: "Ran " -0x5185: "Nei " -0x5186: "Yuan " -0x5187: "Mao " -0x5188: "Gang " -0x5189: "Ran " -0x518a: "Ce " -0x518b: "Jiong " -0x518c: "Ce " -0x518d: "Zai " -0x518e: "Gua " -0x518f: "Jiong " -0x5190: "Mao " -0x5191: "Zhou " -0x5192: "Mou " -0x5193: "Gou " -0x5194: "Xu " -0x5195: "Mian " -0x5196: "Mi " -0x5197: "Rong " -0x5198: "Yin " -0x5199: "Xie " -0x519a: "Kan " -0x519b: "Jun " -0x519c: "Nong " -0x519d: "Yi " -0x519e: "Mi " -0x519f: "Shi " -0x51a0: "Guan " -0x51a1: "Meng " -0x51a2: "Zhong " -0x51a3: "Ju " -0x51a4: "Yuan " -0x51a5: "Ming " -0x51a6: "Kou " -0x51a7: "Lam " -0x51a8: "Fu " -0x51a9: "Xie " -0x51aa: "Mi " -0x51ab: "Bing " -0x51ac: "Dong " -0x51ad: "Tai " -0x51ae: "Gang " -0x51af: "Feng " -0x51b0: "Bing " -0x51b1: "Hu " -0x51b2: "Chong " -0x51b3: "Jue " -0x51b4: "Hu " -0x51b5: "Kuang " -0x51b6: "Ye " -0x51b7: "Leng " -0x51b8: "Pan " -0x51b9: "Fu " -0x51ba: "Min " -0x51bb: "Dong " -0x51bc: "Xian " -0x51bd: "Lie " -0x51be: "Xia " -0x51bf: "Jian " -0x51c0: "Jing " -0x51c1: "Shu " -0x51c2: "Mei " -0x51c3: "Tu " -0x51c4: "Qi " -0x51c5: "Gu " -0x51c6: "Zhun " -0x51c7: "Song " -0x51c8: "Jing " -0x51c9: "Liang " -0x51ca: "Qing " -0x51cb: "Diao " -0x51cc: "Ling " -0x51cd: "Dong " -0x51ce: "Gan " -0x51cf: "Jian " -0x51d0: "Yin " -0x51d1: "Cou " -0x51d2: "Yi " -0x51d3: "Li " -0x51d4: "Cang " -0x51d5: "Ming " -0x51d6: "Zhuen " -0x51d7: "Cui " -0x51d8: "Si " -0x51d9: "Duo " -0x51da: "Jin " -0x51db: "Lin " -0x51dc: "Lin " -0x51dd: "Ning " -0x51de: "Xi " -0x51df: "Du " -0x51e0: "Ji " -0x51e1: "Fan " -0x51e2: "Fan " -0x51e3: "Fan " -0x51e4: "Feng " -0x51e5: "Ju " -0x51e6: "Chu " -0x51e7: "Tako " -0x51e8: "Feng " -0x51e9: "Mok " -0x51ea: "Ci " -0x51eb: "Fu " -0x51ec: "Feng " -0x51ed: "Ping " -0x51ee: "Feng " -0x51ef: "Kai " -0x51f0: "Huang " -0x51f1: "Kai " -0x51f2: "Gan " -0x51f3: "Deng " -0x51f4: "Ping " -0x51f5: "Qu " -0x51f6: "Xiong " -0x51f7: "Kuai " -0x51f8: "Tu " -0x51f9: "Ao " -0x51fa: "Chu " -0x51fb: "Ji " -0x51fc: "Dang " -0x51fd: "Han " -0x51fe: "Han " -0x51ff: "Zao " -/* x052 */ -0x5200: "Dao " -0x5201: "Diao " -0x5202: "Dao " -0x5203: "Ren " -0x5204: "Ren " -0x5205: "Chuang " -0x5206: "Fen " -0x5207: "Qie " -0x5208: "Yi " -0x5209: "Ji " -0x520a: "Kan " -0x520b: "Qian " -0x520c: "Cun " -0x520d: "Chu " -0x520e: "Wen " -0x520f: "Ji " -0x5210: "Dan " -0x5211: "Xing " -0x5212: "Hua " -0x5213: "Wan " -0x5214: "Jue " -0x5215: "Li " -0x5216: "Yue " -0x5217: "Lie " -0x5218: "Liu " -0x5219: "Ze " -0x521a: "Gang " -0x521b: "Chuang " -0x521c: "Fu " -0x521d: "Chu " -0x521e: "Qu " -0x521f: "Ju " -0x5220: "Shan " -0x5221: "Min " -0x5222: "Ling " -0x5223: "Zhong " -0x5224: "Pan " -0x5225: "Bie " -0x5226: "Jie " -0x5227: "Jie " -0x5228: "Bao " -0x5229: "Li " -0x522a: "Shan " -0x522b: "Bie " -0x522c: "Chan " -0x522d: "Jing " -0x522e: "Gua " -0x522f: "Gen " -0x5230: "Dao " -0x5231: "Chuang " -0x5232: "Kui " -0x5233: "Ku " -0x5234: "Duo " -0x5235: "Er " -0x5236: "Zhi " -0x5237: "Shua " -0x5238: "Quan " -0x5239: "Cha " -0x523a: "Ci " -0x523b: "Ke " -0x523c: "Jie " -0x523d: "Gui " -0x523e: "Ci " -0x523f: "Gui " -0x5240: "Kai " -0x5241: "Duo " -0x5242: "Ji " -0x5243: "Ti " -0x5244: "Jing " -0x5245: "Lou " -0x5246: "Gen " -0x5247: "Ze " -0x5248: "Yuan " -0x5249: "Cuo " -0x524a: "Xue " -0x524b: "Ke " -0x524c: "La " -0x524d: "Qian " -0x524e: "Cha " -0x524f: "Chuang " -0x5250: "Gua " -0x5251: "Jian " -0x5252: "Cuo " -0x5253: "Li " -0x5254: "Ti " -0x5255: "Fei " -0x5256: "Pou " -0x5257: "Chan " -0x5258: "Qi " -0x5259: "Chuang " -0x525a: "Zi " -0x525b: "Gang " -0x525c: "Wan " -0x525d: "Bo " -0x525e: "Ji " -0x525f: "Duo " -0x5260: "Qing " -0x5261: "Yan " -0x5262: "Zhuo " -0x5263: "Jian " -0x5264: "Ji " -0x5265: "Bo " -0x5266: "Yan " -0x5267: "Ju " -0x5268: "Huo " -0x5269: "Sheng " -0x526a: "Jian " -0x526b: "Duo " -0x526c: "Duan " -0x526d: "Wu " -0x526e: "Gua " -0x526f: "Fu " -0x5270: "Sheng " -0x5271: "Jian " -0x5272: "Ge " -0x5273: "Zha " -0x5274: "Kai " -0x5275: "Chuang " -0x5276: "Juan " -0x5277: "Chan " -0x5278: "Tuan " -0x5279: "Lu " -0x527a: "Li " -0x527b: "Fou " -0x527c: "Shan " -0x527d: "Piao " -0x527e: "Kou " -0x527f: "Jiao " -0x5280: "Gua " -0x5281: "Qiao " -0x5282: "Jue " -0x5283: "Hua " -0x5284: "Zha " -0x5285: "Zhuo " -0x5286: "Lian " -0x5287: "Ju " -0x5288: "Pi " -0x5289: "Liu " -0x528a: "Gui " -0x528b: "Jiao " -0x528c: "Gui " -0x528d: "Jian " -0x528e: "Jian " -0x528f: "Tang " -0x5290: "Huo " -0x5291: "Ji " -0x5292: "Jian " -0x5293: "Yi " -0x5294: "Jian " -0x5295: "Zhi " -0x5296: "Chan " -0x5297: "Cuan " -0x5298: "Mo " -0x5299: "Li " -0x529a: "Zhu " -0x529b: "Li " -0x529c: "Ya " -0x529d: "Quan " -0x529e: "Ban " -0x529f: "Gong " -0x52a0: "Jia " -0x52a1: "Wu " -0x52a2: "Mai " -0x52a3: "Lie " -0x52a4: "Jin " -0x52a5: "Keng " -0x52a6: "Xie " -0x52a7: "Zhi " -0x52a8: "Dong " -0x52a9: "Zhu " -0x52aa: "Nu " -0x52ab: "Jie " -0x52ac: "Qu " -0x52ad: "Shao " -0x52ae: "Yi " -0x52af: "Zhu " -0x52b0: "Miao " -0x52b1: "Li " -0x52b2: "Jing " -0x52b3: "Lao " -0x52b4: "Lao " -0x52b5: "Juan " -0x52b6: "Kou " -0x52b7: "Yang " -0x52b8: "Wa " -0x52b9: "Xiao " -0x52ba: "Mou " -0x52bb: "Kuang " -0x52bc: "Jie " -0x52bd: "Lie " -0x52be: "He " -0x52bf: "Shi " -0x52c0: "Ke " -0x52c1: "Jing " -0x52c2: "Hao " -0x52c3: "Bo " -0x52c4: "Min " -0x52c5: "Chi " -0x52c6: "Lang " -0x52c7: "Yong " -0x52c8: "Yong " -0x52c9: "Mian " -0x52ca: "Ke " -0x52cb: "Xun " -0x52cc: "Juan " -0x52cd: "Qing " -0x52ce: "Lu " -0x52cf: "Pou " -0x52d0: "Meng " -0x52d1: "Lai " -0x52d2: "Le " -0x52d3: "Kai " -0x52d4: "Mian " -0x52d5: "Dong " -0x52d6: "Xu " -0x52d7: "Xu " -0x52d8: "Kan " -0x52d9: "Wu " -0x52da: "Yi " -0x52db: "Xun " -0x52dc: "Weng " -0x52dd: "Sheng " -0x52de: "Lao " -0x52df: "Mu " -0x52e0: "Lu " -0x52e1: "Piao " -0x52e2: "Shi " -0x52e3: "Ji " -0x52e4: "Qin " -0x52e5: "Qiang " -0x52e6: "Jiao " -0x52e7: "Quan " -0x52e8: "Yang " -0x52e9: "Yi " -0x52ea: "Jue " -0x52eb: "Fan " -0x52ec: "Juan " -0x52ed: "Tong " -0x52ee: "Ju " -0x52ef: "Dan " -0x52f0: "Xie " -0x52f1: "Mai " -0x52f2: "Xun " -0x52f3: "Xun " -0x52f4: "Lu " -0x52f5: "Li " -0x52f6: "Che " -0x52f7: "Rang " -0x52f8: "Quan " -0x52f9: "Bao " -0x52fa: "Shao " -0x52fb: "Yun " -0x52fc: "Jiu " -0x52fd: "Bao " -0x52fe: "Gou " -0x52ff: "Wu " -/* x053 */ -0x5300: "Yun " -0x5301: "Mwun " -0x5302: "Nay " -0x5303: "Gai " -0x5304: "Gai " -0x5305: "Bao " -0x5306: "Cong " -0x5307: "[?] " -0x5308: "Xiong " -0x5309: "Peng " -0x530a: "Ju " -0x530b: "Tao " -0x530c: "Ge " -0x530d: "Pu " -0x530e: "An " -0x530f: "Pao " -0x5310: "Fu " -0x5311: "Gong " -0x5312: "Da " -0x5313: "Jiu " -0x5314: "Qiong " -0x5315: "Bi " -0x5316: "Hua " -0x5317: "Bei " -0x5318: "Nao " -0x5319: "Chi " -0x531a: "Fang " -0x531b: "Jiu " -0x531c: "Yi " -0x531d: "Za " -0x531e: "Jiang " -0x531f: "Kang " -0x5320: "Jiang " -0x5321: "Kuang " -0x5322: "Hu " -0x5323: "Xia " -0x5324: "Qu " -0x5325: "Bian " -0x5326: "Gui " -0x5327: "Qie " -0x5328: "Zang " -0x5329: "Kuang " -0x532a: "Fei " -0x532b: "Hu " -0x532c: "Tou " -0x532d: "Gui " -0x532e: "Gui " -0x532f: "Hui " -0x5330: "Dan " -0x5331: "Gui " -0x5332: "Lian " -0x5333: "Lian " -0x5334: "Suan " -0x5335: "Du " -0x5336: "Jiu " -0x5337: "Qu " -0x5338: "Xi " -0x5339: "Pi " -0x533a: "Qu " -0x533b: "Yi " -0x533c: "Qia " -0x533d: "Yan " -0x533e: "Bian " -0x533f: "Ni " -0x5340: "Qu " -0x5341: "Shi " -0x5342: "Xin " -0x5343: "Qian " -0x5344: "Nian " -0x5345: "Sa " -0x5346: "Zu " -0x5347: "Sheng " -0x5348: "Wu " -0x5349: "Hui " -0x534a: "Ban " -0x534b: "Shi " -0x534c: "Xi " -0x534d: "Wan " -0x534e: "Hua " -0x534f: "Xie " -0x5350: "Wan " -0x5351: "Bei " -0x5352: "Zu " -0x5353: "Zhuo " -0x5354: "Xie " -0x5355: "Dan " -0x5356: "Mai " -0x5357: "Nan " -0x5358: "Dan " -0x5359: "Ji " -0x535a: "Bo " -0x535b: "Shuai " -0x535c: "Bu " -0x535d: "Kuang " -0x535e: "Bian " -0x535f: "Bu " -0x5360: "Zhan " -0x5361: "Qia " -0x5362: "Lu " -0x5363: "You " -0x5364: "Lu " -0x5365: "Xi " -0x5366: "Gua " -0x5367: "Wo " -0x5368: "Xie " -0x5369: "Jie " -0x536a: "Jie " -0x536b: "Wei " -0x536c: "Ang " -0x536d: "Qiong " -0x536e: "Zhi " -0x536f: "Mao " -0x5370: "Yin " -0x5371: "Wei " -0x5372: "Shao " -0x5373: "Ji " -0x5374: "Que " -0x5375: "Luan " -0x5376: "Shi " -0x5377: "Juan " -0x5378: "Xie " -0x5379: "Xu " -0x537a: "Jin " -0x537b: "Que " -0x537c: "Wu " -0x537d: "Ji " -0x537e: "E " -0x537f: "Qing " -0x5380: "Xi " -0x5381: "[?] " -0x5382: "Han " -0x5383: "Zhan " -0x5384: "E " -0x5385: "Ting " -0x5386: "Li " -0x5387: "Zhe " -0x5388: "Han " -0x5389: "Li " -0x538a: "Ya " -0x538b: "Ya " -0x538c: "Yan " -0x538d: "She " -0x538e: "Zhi " -0x538f: "Zha " -0x5390: "Pang " -0x5391: "[?] " -0x5392: "He " -0x5393: "Ya " -0x5394: "Zhi " -0x5395: "Ce " -0x5396: "Pang " -0x5397: "Ti " -0x5398: "Li " -0x5399: "She " -0x539a: "Hou " -0x539b: "Ting " -0x539c: "Zui " -0x539d: "Cuo " -0x539e: "Fei " -0x539f: "Yuan " -0x53a0: "Ce " -0x53a1: "Yuan " -0x53a2: "Xiang " -0x53a3: "Yan " -0x53a4: "Li " -0x53a5: "Jue " -0x53a6: "Sha " -0x53a7: "Dian " -0x53a8: "Chu " -0x53a9: "Jiu " -0x53aa: "Qin " -0x53ab: "Ao " -0x53ac: "Gui " -0x53ad: "Yan " -0x53ae: "Si " -0x53af: "Li " -0x53b0: "Chang " -0x53b1: "Lan " -0x53b2: "Li " -0x53b3: "Yan " -0x53b4: "Yan " -0x53b5: "Yuan " -0x53b6: "Si " -0x53b7: "Gong " -0x53b8: "Lin " -0x53b9: "Qiu " -0x53ba: "Qu " -0x53bb: "Qu " -0x53bc: "Uk " -0x53bd: "Lei " -0x53be: "Du " -0x53bf: "Xian " -0x53c0: "Zhuan " -0x53c1: "San " -0x53c2: "Can " -0x53c3: "Can " -0x53c4: "Can " -0x53c5: "Can " -0x53c6: "Ai " -0x53c7: "Dai " -0x53c8: "You " -0x53c9: "Cha " -0x53ca: "Ji " -0x53cb: "You " -0x53cc: "Shuang " -0x53cd: "Fan " -0x53ce: "Shou " -0x53cf: "Guai " -0x53d0: "Ba " -0x53d1: "Fa " -0x53d2: "Ruo " -0x53d3: "Shi " -0x53d4: "Shu " -0x53d5: "Zhuo " -0x53d6: "Qu " -0x53d7: "Shou " -0x53d8: "Bian " -0x53d9: "Xu " -0x53da: "Jia " -0x53db: "Pan " -0x53dc: "Sou " -0x53dd: "Gao " -0x53de: "Wei " -0x53df: "Sou " -0x53e0: "Die " -0x53e1: "Rui " -0x53e2: "Cong " -0x53e3: "Kou " -0x53e4: "Gu " -0x53e5: "Ju " -0x53e6: "Ling " -0x53e7: "Gua " -0x53e8: "Tao " -0x53e9: "Kou " -0x53ea: "Zhi " -0x53eb: "Jiao " -0x53ec: "Zhao " -0x53ed: "Ba " -0x53ee: "Ding " -0x53ef: "Ke " -0x53f0: "Tai " -0x53f1: "Chi " -0x53f2: "Shi " -0x53f3: "You " -0x53f4: "Qiu " -0x53f5: "Po " -0x53f6: "Xie " -0x53f7: "Hao " -0x53f8: "Si " -0x53f9: "Tan " -0x53fa: "Chi " -0x53fb: "Le " -0x53fc: "Diao " -0x53fd: "Ji " -0x53fe: "[?] " -0x53ff: "Hong " -/* x054 */ -0x5400: "Mie " -0x5401: "Xu " -0x5402: "Mang " -0x5403: "Chi " -0x5404: "Ge " -0x5405: "Xuan " -0x5406: "Yao " -0x5407: "Zi " -0x5408: "He " -0x5409: "Ji " -0x540a: "Diao " -0x540b: "Cun " -0x540c: "Tong " -0x540d: "Ming " -0x540e: "Hou " -0x540f: "Li " -0x5410: "Tu " -0x5411: "Xiang " -0x5412: "Zha " -0x5413: "Xia " -0x5414: "Ye " -0x5415: "Lu " -0x5416: "A " -0x5417: "Ma " -0x5418: "Ou " -0x5419: "Xue " -0x541a: "Yi " -0x541b: "Jun " -0x541c: "Chou " -0x541d: "Lin " -0x541e: "Tun " -0x541f: "Yin " -0x5420: "Fei " -0x5421: "Bi " -0x5422: "Qin " -0x5423: "Qin " -0x5424: "Jie " -0x5425: "Bu " -0x5426: "Fou " -0x5427: "Ba " -0x5428: "Dun " -0x5429: "Fen " -0x542a: "E " -0x542b: "Han " -0x542c: "Ting " -0x542d: "Hang " -0x542e: "Shun " -0x542f: "Qi " -0x5430: "Hong " -0x5431: "Zhi " -0x5432: "Shen " -0x5433: "Wu " -0x5434: "Wu " -0x5435: "Chao " -0x5436: "Ne " -0x5437: "Xue " -0x5438: "Xi " -0x5439: "Chui " -0x543a: "Dou " -0x543b: "Wen " -0x543c: "Hou " -0x543d: "Ou " -0x543e: "Wu " -0x543f: "Gao " -0x5440: "Ya " -0x5441: "Jun " -0x5442: "Lu " -0x5443: "E " -0x5444: "Ge " -0x5445: "Mei " -0x5446: "Ai " -0x5447: "Qi " -0x5448: "Cheng " -0x5449: "Wu " -0x544a: "Gao " -0x544b: "Fu " -0x544c: "Jiao " -0x544d: "Hong " -0x544e: "Chi " -0x544f: "Sheng " -0x5450: "Ne " -0x5451: "Tun " -0x5452: "Fu " -0x5453: "Yi " -0x5454: "Dai " -0x5455: "Ou " -0x5456: "Li " -0x5457: "Bai " -0x5458: "Yuan " -0x5459: "Kuai " -0x545a: "[?] " -0x545b: "Qiang " -0x545c: "Wu " -0x545d: "E " -0x545e: "Shi " -0x545f: "Quan " -0x5460: "Pen " -0x5461: "Wen " -0x5462: "Ni " -0x5463: "M " -0x5464: "Ling " -0x5465: "Ran " -0x5466: "You " -0x5467: "Di " -0x5468: "Zhou " -0x5469: "Shi " -0x546a: "Zhou " -0x546b: "Tie " -0x546c: "Xi " -0x546d: "Yi " -0x546e: "Qi " -0x546f: "Ping " -0x5470: "Zi " -0x5471: "Gu " -0x5472: "Zi " -0x5473: "Wei " -0x5474: "Xu " -0x5475: "He " -0x5476: "Nao " -0x5477: "Xia " -0x5478: "Pei " -0x5479: "Yi " -0x547a: "Xiao " -0x547b: "Shen " -0x547c: "Hu " -0x547d: "Ming " -0x547e: "Da " -0x547f: "Qu " -0x5480: "Ju " -0x5481: "Gem " -0x5482: "Za " -0x5483: "Tuo " -0x5484: "Duo " -0x5485: "Pou " -0x5486: "Pao " -0x5487: "Bi " -0x5488: "Fu " -0x5489: "Yang " -0x548a: "He " -0x548b: "Zha " -0x548c: "He " -0x548d: "Hai " -0x548e: "Jiu " -0x548f: "Yong " -0x5490: "Fu " -0x5491: "Que " -0x5492: "Zhou " -0x5493: "Wa " -0x5494: "Ka " -0x5495: "Gu " -0x5496: "Ka " -0x5497: "Zuo " -0x5498: "Bu " -0x5499: "Long " -0x549a: "Dong " -0x549b: "Ning " -0x549c: "Tha " -0x549d: "Si " -0x549e: "Xian " -0x549f: "Huo " -0x54a0: "Qi " -0x54a1: "Er " -0x54a2: "E " -0x54a3: "Guang " -0x54a4: "Zha " -0x54a5: "Xi " -0x54a6: "Yi " -0x54a7: "Lie " -0x54a8: "Zi " -0x54a9: "Mie " -0x54aa: "Mi " -0x54ab: "Zhi " -0x54ac: "Yao " -0x54ad: "Ji " -0x54ae: "Zhou " -0x54af: "Ge " -0x54b0: "Shuai " -0x54b1: "Zan " -0x54b2: "Xiao " -0x54b3: "Ke " -0x54b4: "Hui " -0x54b5: "Kua " -0x54b6: "Huai " -0x54b7: "Tao " -0x54b8: "Xian " -0x54b9: "E " -0x54ba: "Xuan " -0x54bb: "Xiu " -0x54bc: "Wai " -0x54bd: "Yan " -0x54be: "Lao " -0x54bf: "Yi " -0x54c0: "Ai " -0x54c1: "Pin " -0x54c2: "Shen " -0x54c3: "Tong " -0x54c4: "Hong " -0x54c5: "Xiong " -0x54c6: "Chi " -0x54c7: "Wa " -0x54c8: "Ha " -0x54c9: "Zai " -0x54ca: "Yu " -0x54cb: "Di " -0x54cc: "Pai " -0x54cd: "Xiang " -0x54ce: "Ai " -0x54cf: "Hen " -0x54d0: "Kuang " -0x54d1: "Ya " -0x54d2: "Da " -0x54d3: "Xiao " -0x54d4: "Bi " -0x54d5: "Yue " -0x54d6: "[?] " -0x54d7: "Hua " -0x54d8: "Sasou " -0x54d9: "Kuai " -0x54da: "Duo " -0x54db: "[?] " -0x54dc: "Ji " -0x54dd: "Nong " -0x54de: "Mou " -0x54df: "Yo " -0x54e0: "Hao " -0x54e1: "Yuan " -0x54e2: "Long " -0x54e3: "Pou " -0x54e4: "Mang " -0x54e5: "Ge " -0x54e6: "E " -0x54e7: "Chi " -0x54e8: "Shao " -0x54e9: "Li " -0x54ea: "Na " -0x54eb: "Zu " -0x54ec: "He " -0x54ed: "Ku " -0x54ee: "Xiao " -0x54ef: "Xian " -0x54f0: "Lao " -0x54f1: "Bo " -0x54f2: "Zhe " -0x54f3: "Zha " -0x54f4: "Liang " -0x54f5: "Ba " -0x54f6: "Mie " -0x54f7: "Le " -0x54f8: "Sui " -0x54f9: "Fou " -0x54fa: "Bu " -0x54fb: "Han " -0x54fc: "Heng " -0x54fd: "Geng " -0x54fe: "Shuo " -0x54ff: "Ge " -/* x055 */ -0x5500: "You " -0x5501: "Yan " -0x5502: "Gu " -0x5503: "Gu " -0x5504: "Bai " -0x5505: "Han " -0x5506: "Suo " -0x5507: "Chun " -0x5508: "Yi " -0x5509: "Ai " -0x550a: "Jia " -0x550b: "Tu " -0x550c: "Xian " -0x550d: "Huan " -0x550e: "Li " -0x550f: "Xi " -0x5510: "Tang " -0x5511: "Zuo " -0x5512: "Qiu " -0x5513: "Che " -0x5514: "Wu " -0x5515: "Zao " -0x5516: "Ya " -0x5517: "Dou " -0x5518: "Qi " -0x5519: "Di " -0x551a: "Qin " -0x551b: "Ma " -0x551c: "Mal " -0x551d: "Hong " -0x551e: "Dou " -0x551f: "Kes " -0x5520: "Lao " -0x5521: "Liang " -0x5522: "Suo " -0x5523: "Zao " -0x5524: "Huan " -0x5525: "Lang " -0x5526: "Sha " -0x5527: "Ji " -0x5528: "Zuo " -0x5529: "Wo " -0x552a: "Feng " -0x552b: "Yin " -0x552c: "Hu " -0x552d: "Qi " -0x552e: "Shou " -0x552f: "Wei " -0x5530: "Shua " -0x5531: "Chang " -0x5532: "Er " -0x5533: "Li " -0x5534: "Qiang " -0x5535: "An " -0x5536: "Jie " -0x5537: "Yo " -0x5538: "Nian " -0x5539: "Yu " -0x553a: "Tian " -0x553b: "Lai " -0x553c: "Sha " -0x553d: "Xi " -0x553e: "Tuo " -0x553f: "Hu " -0x5540: "Ai " -0x5541: "Zhou " -0x5542: "Nou " -0x5543: "Ken " -0x5544: "Zhuo " -0x5545: "Zhuo " -0x5546: "Shang " -0x5547: "Di " -0x5548: "Heng " -0x5549: "Lan " -0x554a: "A " -0x554b: "Xiao " -0x554c: "Xiang " -0x554d: "Tun " -0x554e: "Wu " -0x554f: "Wen " -0x5550: "Cui " -0x5551: "Sha " -0x5552: "Hu " -0x5553: "Qi " -0x5554: "Qi " -0x5555: "Tao " -0x5556: "Dan " -0x5557: "Dan " -0x5558: "Ye " -0x5559: "Zi " -0x555a: "Bi " -0x555b: "Cui " -0x555c: "Chuo " -0x555d: "He " -0x555e: "Ya " -0x555f: "Qi " -0x5560: "Zhe " -0x5561: "Pei " -0x5562: "Liang " -0x5563: "Xian " -0x5564: "Pi " -0x5565: "Sha " -0x5566: "La " -0x5567: "Ze " -0x5568: "Qing " -0x5569: "Gua " -0x556a: "Pa " -0x556b: "Zhe " -0x556c: "Se " -0x556d: "Zhuan " -0x556e: "Nie " -0x556f: "Guo " -0x5570: "Luo " -0x5571: "Yan " -0x5572: "Di " -0x5573: "Quan " -0x5574: "Tan " -0x5575: "Bo " -0x5576: "Ding " -0x5577: "Lang " -0x5578: "Xiao " -0x5579: "[?] " -0x557a: "Tang " -0x557b: "Chi " -0x557c: "Ti " -0x557d: "An " -0x557e: "Jiu " -0x557f: "Dan " -0x5580: "Ke " -0x5581: "Yong " -0x5582: "Wei " -0x5583: "Nan " -0x5584: "Shan " -0x5585: "Yu " -0x5586: "Zhe " -0x5587: "La " -0x5588: "Jie " -0x5589: "Hou " -0x558a: "Han " -0x558b: "Die " -0x558c: "Zhou " -0x558d: "Chai " -0x558e: "Wai " -0x558f: "Re " -0x5590: "Yu " -0x5591: "Yin " -0x5592: "Zan " -0x5593: "Yao " -0x5594: "Wo " -0x5595: "Mian " -0x5596: "Hu " -0x5597: "Yun " -0x5598: "Chuan " -0x5599: "Hui " -0x559a: "Huan " -0x559b: "Huan " -0x559c: "Xi " -0x559d: "He " -0x559e: "Ji " -0x559f: "Kui " -0x55a0: "Zhong " -0x55a1: "Wei " -0x55a2: "Sha " -0x55a3: "Xu " -0x55a4: "Huang " -0x55a5: "Du " -0x55a6: "Nie " -0x55a7: "Xuan " -0x55a8: "Liang " -0x55a9: "Yu " -0x55aa: "Sang " -0x55ab: "Chi " -0x55ac: "Qiao " -0x55ad: "Yan " -0x55ae: "Dan " -0x55af: "Pen " -0x55b0: "Can " -0x55b1: "Li " -0x55b2: "Yo " -0x55b3: "Zha " -0x55b4: "Wei " -0x55b5: "Miao " -0x55b6: "Ying " -0x55b7: "Pen " -0x55b8: "Phos " -0x55b9: "Kui " -0x55ba: "Xi " -0x55bb: "Yu " -0x55bc: "Jie " -0x55bd: "Lou " -0x55be: "Ku " -0x55bf: "Sao " -0x55c0: "Huo " -0x55c1: "Ti " -0x55c2: "Yao " -0x55c3: "He " -0x55c4: "A " -0x55c5: "Xiu " -0x55c6: "Qiang " -0x55c7: "Se " -0x55c8: "Yong " -0x55c9: "Su " -0x55ca: "Hong " -0x55cb: "Xie " -0x55cc: "Yi " -0x55cd: "Suo " -0x55ce: "Ma " -0x55cf: "Cha " -0x55d0: "Hai " -0x55d1: "Ke " -0x55d2: "Ta " -0x55d3: "Sang " -0x55d4: "Tian " -0x55d5: "Ru " -0x55d6: "Sou " -0x55d7: "Wa " -0x55d8: "Ji " -0x55d9: "Pang " -0x55da: "Wu " -0x55db: "Xian " -0x55dc: "Shi " -0x55dd: "Ge " -0x55de: "Zi " -0x55df: "Jie " -0x55e0: "Luo " -0x55e1: "Weng " -0x55e2: "Wa " -0x55e3: "Si " -0x55e4: "Chi " -0x55e5: "Hao " -0x55e6: "Suo " -0x55e7: "Jia " -0x55e8: "Hai " -0x55e9: "Suo " -0x55ea: "Qin " -0x55eb: "Nie " -0x55ec: "He " -0x55ed: "Cis " -0x55ee: "Sai " -0x55ef: "Ng " -0x55f0: "Ge " -0x55f1: "Na " -0x55f2: "Dia " -0x55f3: "Ai " -0x55f4: "[?] " -0x55f5: "Tong " -0x55f6: "Bi " -0x55f7: "Ao " -0x55f8: "Ao " -0x55f9: "Lian " -0x55fa: "Cui " -0x55fb: "Zhe " -0x55fc: "Mo " -0x55fd: "Sou " -0x55fe: "Sou " -0x55ff: "Tan " -/* x056 */ -0x5600: "Di " -0x5601: "Qi " -0x5602: "Jiao " -0x5603: "Chong " -0x5604: "Jiao " -0x5605: "Kai " -0x5606: "Tan " -0x5607: "San " -0x5608: "Cao " -0x5609: "Jia " -0x560a: "Ai " -0x560b: "Xiao " -0x560c: "Piao " -0x560d: "Lou " -0x560e: "Ga " -0x560f: "Gu " -0x5610: "Xiao " -0x5611: "Hu " -0x5612: "Hui " -0x5613: "Guo " -0x5614: "Ou " -0x5615: "Xian " -0x5616: "Ze " -0x5617: "Chang " -0x5618: "Xu " -0x5619: "Po " -0x561a: "De " -0x561b: "Ma " -0x561c: "Ma " -0x561d: "Hu " -0x561e: "Lei " -0x561f: "Du " -0x5620: "Ga " -0x5621: "Tang " -0x5622: "Ye " -0x5623: "Beng " -0x5624: "Ying " -0x5625: "Saai " -0x5626: "Jiao " -0x5627: "Mi " -0x5628: "Xiao " -0x5629: "Hua " -0x562a: "Mai " -0x562b: "Ran " -0x562c: "Zuo " -0x562d: "Peng " -0x562e: "Lao " -0x562f: "Xiao " -0x5630: "Ji " -0x5631: "Zhu " -0x5632: "Chao " -0x5633: "Kui " -0x5634: "Zui " -0x5635: "Xiao " -0x5636: "Si " -0x5637: "Hao " -0x5638: "Fu " -0x5639: "Liao " -0x563a: "Qiao " -0x563b: "Xi " -0x563c: "Xiu " -0x563d: "Tan " -0x563e: "Tan " -0x563f: "Mo " -0x5640: "Xun " -0x5641: "E " -0x5642: "Zun " -0x5643: "Fan " -0x5644: "Chi " -0x5645: "Hui " -0x5646: "Zan " -0x5647: "Chuang " -0x5648: "Cu " -0x5649: "Dan " -0x564a: "Yu " -0x564b: "Tun " -0x564c: "Cheng " -0x564d: "Jiao " -0x564e: "Ye " -0x564f: "Xi " -0x5650: "Qi " -0x5651: "Hao " -0x5652: "Lian " -0x5653: "Xu " -0x5654: "Deng " -0x5655: "Hui " -0x5656: "Yin " -0x5657: "Pu " -0x5658: "Jue " -0x5659: "Qin " -0x565a: "Xun " -0x565b: "Nie " -0x565c: "Lu " -0x565d: "Si " -0x565e: "Yan " -0x565f: "Ying " -0x5660: "Da " -0x5661: "Dan " -0x5662: "Yu " -0x5663: "Zhou " -0x5664: "Jin " -0x5665: "Nong " -0x5666: "Yue " -0x5667: "Hui " -0x5668: "Qi " -0x5669: "E " -0x566a: "Zao " -0x566b: "Yi " -0x566c: "Shi " -0x566d: "Jiao " -0x566e: "Yuan " -0x566f: "Ai " -0x5670: "Yong " -0x5671: "Jue " -0x5672: "Kuai " -0x5673: "Yu " -0x5674: "Pen " -0x5675: "Dao " -0x5676: "Ge " -0x5677: "Xin " -0x5678: "Dun " -0x5679: "Dang " -0x567a: "Sin " -0x567b: "Sai " -0x567c: "Pi " -0x567d: "Pi " -0x567e: "Yin " -0x567f: "Zui " -0x5680: "Ning " -0x5681: "Di " -0x5682: "Lan " -0x5683: "Ta " -0x5684: "Huo " -0x5685: "Ru " -0x5686: "Hao " -0x5687: "Xia " -0x5688: "Ya " -0x5689: "Duo " -0x568a: "Xi " -0x568b: "Chou " -0x568c: "Ji " -0x568d: "Jin " -0x568e: "Hao " -0x568f: "Ti " -0x5690: "Chang " -0x5691: "[?] " -0x5692: "[?] " -0x5693: "Ca " -0x5694: "Ti " -0x5695: "Lu " -0x5696: "Hui " -0x5697: "Bo " -0x5698: "You " -0x5699: "Nie " -0x569a: "Yin " -0x569b: "Hu " -0x569c: "Mo " -0x569d: "Huang " -0x569e: "Zhe " -0x569f: "Li " -0x56a0: "Liu " -0x56a1: "Haai " -0x56a2: "Nang " -0x56a3: "Xiao " -0x56a4: "Mo " -0x56a5: "Yan " -0x56a6: "Li " -0x56a7: "Lu " -0x56a8: "Long " -0x56a9: "Fu " -0x56aa: "Dan " -0x56ab: "Chen " -0x56ac: "Pin " -0x56ad: "Pi " -0x56ae: "Xiang " -0x56af: "Huo " -0x56b0: "Mo " -0x56b1: "Xi " -0x56b2: "Duo " -0x56b3: "Ku " -0x56b4: "Yan " -0x56b5: "Chan " -0x56b6: "Ying " -0x56b7: "Rang " -0x56b8: "Dian " -0x56b9: "La " -0x56ba: "Ta " -0x56bb: "Xiao " -0x56bc: "Jiao " -0x56bd: "Chuo " -0x56be: "Huan " -0x56bf: "Huo " -0x56c0: "Zhuan " -0x56c1: "Nie " -0x56c2: "Xiao " -0x56c3: "Ca " -0x56c4: "Li " -0x56c5: "Chan " -0x56c6: "Chai " -0x56c7: "Li " -0x56c8: "Yi " -0x56c9: "Luo " -0x56ca: "Nang " -0x56cb: "Zan " -0x56cc: "Su " -0x56cd: "Xi " -0x56ce: "So " -0x56cf: "Jian " -0x56d0: "Za " -0x56d1: "Zhu " -0x56d2: "Lan " -0x56d3: "Nie " -0x56d4: "Nang " -0x56d5: "[?] " -0x56d6: "[?] " -0x56d7: "Wei " -0x56d8: "Hui " -0x56d9: "Yin " -0x56da: "Qiu " -0x56db: "Si " -0x56dc: "Nin " -0x56dd: "Jian " -0x56de: "Hui " -0x56df: "Xin " -0x56e0: "Yin " -0x56e1: "Nan " -0x56e2: "Tuan " -0x56e3: "Tuan " -0x56e4: "Dun " -0x56e5: "Kang " -0x56e6: "Yuan " -0x56e7: "Jiong " -0x56e8: "Pian " -0x56e9: "Yun " -0x56ea: "Cong " -0x56eb: "Hu " -0x56ec: "Hui " -0x56ed: "Yuan " -0x56ee: "You " -0x56ef: "Guo " -0x56f0: "Kun " -0x56f1: "Cong " -0x56f2: "Wei " -0x56f3: "Tu " -0x56f4: "Wei " -0x56f5: "Lun " -0x56f6: "Guo " -0x56f7: "Qun " -0x56f8: "Ri " -0x56f9: "Ling " -0x56fa: "Gu " -0x56fb: "Guo " -0x56fc: "Tai " -0x56fd: "Guo " -0x56fe: "Tu " -0x56ff: "You " -/* x057 */ -0x5700: "Guo " -0x5701: "Yin " -0x5702: "Hun " -0x5703: "Pu " -0x5704: "Yu " -0x5705: "Han " -0x5706: "Yuan " -0x5707: "Lun " -0x5708: "Quan " -0x5709: "Yu " -0x570a: "Qing " -0x570b: "Guo " -0x570c: "Chuan " -0x570d: "Wei " -0x570e: "Yuan " -0x570f: "Quan " -0x5710: "Ku " -0x5711: "Fu " -0x5712: "Yuan " -0x5713: "Yuan " -0x5714: "E " -0x5715: "Tu " -0x5716: "Tu " -0x5717: "Tu " -0x5718: "Tuan " -0x5719: "Lue " -0x571a: "Hui " -0x571b: "Yi " -0x571c: "Yuan " -0x571d: "Luan " -0x571e: "Luan " -0x571f: "Tu " -0x5720: "Ya " -0x5721: "Tu " -0x5722: "Ting " -0x5723: "Sheng " -0x5724: "Pu " -0x5725: "Lu " -0x5726: "Iri " -0x5727: "Ya " -0x5728: "Zai " -0x5729: "Wei " -0x572a: "Ge " -0x572b: "Yu " -0x572c: "Wu " -0x572d: "Gui " -0x572e: "Pi " -0x572f: "Yi " -0x5730: "Di " -0x5731: "Qian " -0x5732: "Qian " -0x5733: "Zhen " -0x5734: "Zhuo " -0x5735: "Dang " -0x5736: "Qia " -0x5737: "Akutsu " -0x5738: "Yama " -0x5739: "Kuang " -0x573a: "Chang " -0x573b: "Qi " -0x573c: "Nie " -0x573d: "Mo " -0x573e: "Ji " -0x573f: "Jia " -0x5740: "Zhi " -0x5741: "Zhi " -0x5742: "Ban " -0x5743: "Xun " -0x5744: "Tou " -0x5745: "Qin " -0x5746: "Fen " -0x5747: "Jun " -0x5748: "Keng " -0x5749: "Tun " -0x574a: "Fang " -0x574b: "Fen " -0x574c: "Ben " -0x574d: "Tan " -0x574e: "Kan " -0x574f: "Pi " -0x5750: "Zuo " -0x5751: "Keng " -0x5752: "Bi " -0x5753: "Xing " -0x5754: "Di " -0x5755: "Jing " -0x5756: "Ji " -0x5757: "Kuai " -0x5758: "Di " -0x5759: "Jing " -0x575a: "Jian " -0x575b: "Tan " -0x575c: "Li " -0x575d: "Ba " -0x575e: "Wu " -0x575f: "Fen " -0x5760: "Zhui " -0x5761: "Po " -0x5762: "Pan " -0x5763: "Tang " -0x5764: "Kun " -0x5765: "Qu " -0x5766: "Tan " -0x5767: "Zhi " -0x5768: "Tuo " -0x5769: "Gan " -0x576a: "Ping " -0x576b: "Dian " -0x576c: "Gua " -0x576d: "Ni " -0x576e: "Tai " -0x576f: "Pi " -0x5770: "Jiong " -0x5771: "Yang " -0x5772: "Fo " -0x5773: "Ao " -0x5774: "Liu " -0x5775: "Qiu " -0x5776: "Mu " -0x5777: "Ke " -0x5778: "Gou " -0x5779: "Xue " -0x577a: "Ba " -0x577b: "Chi " -0x577c: "Che " -0x577d: "Ling " -0x577e: "Zhu " -0x577f: "Fu " -0x5780: "Hu " -0x5781: "Zhi " -0x5782: "Chui " -0x5783: "La " -0x5784: "Long " -0x5785: "Long " -0x5786: "Lu " -0x5787: "Ao " -0x5788: "Tay " -0x5789: "Pao " -0x578a: "[?] " -0x578b: "Xing " -0x578c: "Dong " -0x578d: "Ji " -0x578e: "Ke " -0x578f: "Lu " -0x5790: "Ci " -0x5791: "Chi " -0x5792: "Lei " -0x5793: "Gai " -0x5794: "Yin " -0x5795: "Hou " -0x5796: "Dui " -0x5797: "Zhao " -0x5798: "Fu " -0x5799: "Guang " -0x579a: "Yao " -0x579b: "Duo " -0x579c: "Duo " -0x579d: "Gui " -0x579e: "Cha " -0x579f: "Yang " -0x57a0: "Yin " -0x57a1: "Fa " -0x57a2: "Gou " -0x57a3: "Yuan " -0x57a4: "Die " -0x57a5: "Xie " -0x57a6: "Ken " -0x57a7: "Jiong " -0x57a8: "Shou " -0x57a9: "E " -0x57aa: "Ha " -0x57ab: "Dian " -0x57ac: "Hong " -0x57ad: "Wu " -0x57ae: "Kua " -0x57af: "[?] " -0x57b0: "Tao " -0x57b1: "Dang " -0x57b2: "Kai " -0x57b3: "Gake " -0x57b4: "Nao " -0x57b5: "An " -0x57b6: "Xing " -0x57b7: "Xian " -0x57b8: "Huan " -0x57b9: "Bang " -0x57ba: "Pei " -0x57bb: "Ba " -0x57bc: "Yi " -0x57bd: "Yin " -0x57be: "Han " -0x57bf: "Xu " -0x57c0: "Chui " -0x57c1: "Cen " -0x57c2: "Geng " -0x57c3: "Ai " -0x57c4: "Peng " -0x57c5: "Fang " -0x57c6: "Que " -0x57c7: "Yong " -0x57c8: "Xun " -0x57c9: "Jia " -0x57ca: "Di " -0x57cb: "Mai " -0x57cc: "Lang " -0x57cd: "Xuan " -0x57ce: "Cheng " -0x57cf: "Yan " -0x57d0: "Jin " -0x57d1: "Zhe " -0x57d2: "Lei " -0x57d3: "Lie " -0x57d4: "Bu " -0x57d5: "Cheng " -0x57d6: "Gomi " -0x57d7: "Bu " -0x57d8: "Shi " -0x57d9: "Xun " -0x57da: "Guo " -0x57db: "Jiong " -0x57dc: "Ye " -0x57dd: "Nian " -0x57de: "Di " -0x57df: "Yu " -0x57e0: "Bu " -0x57e1: "Ya " -0x57e2: "Juan " -0x57e3: "Sui " -0x57e4: "Pi " -0x57e5: "Cheng " -0x57e6: "Wan " -0x57e7: "Ju " -0x57e8: "Lun " -0x57e9: "Zheng " -0x57ea: "Kong " -0x57eb: "Chong " -0x57ec: "Dong " -0x57ed: "Dai " -0x57ee: "Tan " -0x57ef: "An " -0x57f0: "Cai " -0x57f1: "Shu " -0x57f2: "Beng " -0x57f3: "Kan " -0x57f4: "Zhi " -0x57f5: "Duo " -0x57f6: "Yi " -0x57f7: "Zhi " -0x57f8: "Yi " -0x57f9: "Pei " -0x57fa: "Ji " -0x57fb: "Zhun " -0x57fc: "Qi " -0x57fd: "Sao " -0x57fe: "Ju " -0x57ff: "Ni " -/* x058 */ -0x5800: "Ku " -0x5801: "Ke " -0x5802: "Tang " -0x5803: "Kun " -0x5804: "Ni " -0x5805: "Jian " -0x5806: "Dui " -0x5807: "Jin " -0x5808: "Gang " -0x5809: "Yu " -0x580a: "E " -0x580b: "Peng " -0x580c: "Gu " -0x580d: "Tu " -0x580e: "Leng " -0x580f: "[?] " -0x5810: "Ya " -0x5811: "Qian " -0x5812: "[?] " -0x5813: "An " -0x5814: "[?] " -0x5815: "Duo " -0x5816: "Nao " -0x5817: "Tu " -0x5818: "Cheng " -0x5819: "Yin " -0x581a: "Hun " -0x581b: "Bi " -0x581c: "Lian " -0x581d: "Guo " -0x581e: "Die " -0x581f: "Zhuan " -0x5820: "Hou " -0x5821: "Bao " -0x5822: "Bao " -0x5823: "Yu " -0x5824: "Di " -0x5825: "Mao " -0x5826: "Jie " -0x5827: "Ruan " -0x5828: "E " -0x5829: "Geng " -0x582a: "Kan " -0x582b: "Zong " -0x582c: "Yu " -0x582d: "Huang " -0x582e: "E " -0x582f: "Yao " -0x5830: "Yan " -0x5831: "Bao " -0x5832: "Ji " -0x5833: "Mei " -0x5834: "Chang " -0x5835: "Du " -0x5836: "Tuo " -0x5837: "Yin " -0x5838: "Feng " -0x5839: "Zhong " -0x583a: "Jie " -0x583b: "Zhen " -0x583c: "Feng " -0x583d: "Gang " -0x583e: "Chuan " -0x583f: "Jian " -0x5840: "Pyeng " -0x5841: "Toride " -0x5842: "Xiang " -0x5843: "Huang " -0x5844: "Leng " -0x5845: "Duan " -0x5846: "[?] " -0x5847: "Xuan " -0x5848: "Ji " -0x5849: "Ji " -0x584a: "Kuai " -0x584b: "Ying " -0x584c: "Ta " -0x584d: "Cheng " -0x584e: "Yong " -0x584f: "Kai " -0x5850: "Su " -0x5851: "Su " -0x5852: "Shi " -0x5853: "Mi " -0x5854: "Ta " -0x5855: "Weng " -0x5856: "Cheng " -0x5857: "Tu " -0x5858: "Tang " -0x5859: "Que " -0x585a: "Zhong " -0x585b: "Li " -0x585c: "Peng " -0x585d: "Bang " -0x585e: "Sai " -0x585f: "Zang " -0x5860: "Dui " -0x5861: "Tian " -0x5862: "Wu " -0x5863: "Cheng " -0x5864: "Xun " -0x5865: "Ge " -0x5866: "Zhen " -0x5867: "Ai " -0x5868: "Gong " -0x5869: "Yan " -0x586a: "Kan " -0x586b: "Tian " -0x586c: "Yuan " -0x586d: "Wen " -0x586e: "Xie " -0x586f: "Liu " -0x5870: "Ama " -0x5871: "Lang " -0x5872: "Chang " -0x5873: "Peng " -0x5874: "Beng " -0x5875: "Chen " -0x5876: "Cu " -0x5877: "Lu " -0x5878: "Ou " -0x5879: "Qian " -0x587a: "Mei " -0x587b: "Mo " -0x587c: "Zhuan " -0x587d: "Shuang " -0x587e: "Shu " -0x587f: "Lou " -0x5880: "Chi " -0x5881: "Man " -0x5882: "Biao " -0x5883: "Jing " -0x5884: "Qi " -0x5885: "Shu " -0x5886: "Di " -0x5887: "Zhang " -0x5888: "Kan " -0x5889: "Yong " -0x588a: "Dian " -0x588b: "Chen " -0x588c: "Zhi " -0x588d: "Xi " -0x588e: "Guo " -0x588f: "Qiang " -0x5890: "Jin " -0x5891: "Di " -0x5892: "Shang " -0x5893: "Mu " -0x5894: "Cui " -0x5895: "Yan " -0x5896: "Ta " -0x5897: "Zeng " -0x5898: "Qi " -0x5899: "Qiang " -0x589a: "Liang " -0x589b: "[?] " -0x589c: "Zhui " -0x589d: "Qiao " -0x589e: "Zeng " -0x589f: "Xu " -0x58a0: "Shan " -0x58a1: "Shan " -0x58a2: "Ba " -0x58a3: "Pu " -0x58a4: "Kuai " -0x58a5: "Dong " -0x58a6: "Fan " -0x58a7: "Que " -0x58a8: "Mo " -0x58a9: "Dun " -0x58aa: "Dun " -0x58ab: "Dun " -0x58ac: "Di " -0x58ad: "Sheng " -0x58ae: "Duo " -0x58af: "Duo " -0x58b0: "Tan " -0x58b1: "Deng " -0x58b2: "Wu " -0x58b3: "Fen " -0x58b4: "Huang " -0x58b5: "Tan " -0x58b6: "Da " -0x58b7: "Ye " -0x58b8: "Sho " -0x58b9: "Mama " -0x58ba: "Yu " -0x58bb: "Qiang " -0x58bc: "Ji " -0x58bd: "Qiao " -0x58be: "Ken " -0x58bf: "Yi " -0x58c0: "Pi " -0x58c1: "Bi " -0x58c2: "Dian " -0x58c3: "Jiang " -0x58c4: "Ye " -0x58c5: "Yong " -0x58c6: "Bo " -0x58c7: "Tan " -0x58c8: "Lan " -0x58c9: "Ju " -0x58ca: "Huai " -0x58cb: "Dang " -0x58cc: "Rang " -0x58cd: "Qian " -0x58ce: "Xun " -0x58cf: "Lan " -0x58d0: "Xi " -0x58d1: "He " -0x58d2: "Ai " -0x58d3: "Ya " -0x58d4: "Dao " -0x58d5: "Hao " -0x58d6: "Ruan " -0x58d7: "Mama " -0x58d8: "Lei " -0x58d9: "Kuang " -0x58da: "Lu " -0x58db: "Yan " -0x58dc: "Tan " -0x58dd: "Wei " -0x58de: "Huai " -0x58df: "Long " -0x58e0: "Long " -0x58e1: "Rui " -0x58e2: "Li " -0x58e3: "Lin " -0x58e4: "Rang " -0x58e5: "Ten " -0x58e6: "Xun " -0x58e7: "Yan " -0x58e8: "Lei " -0x58e9: "Ba " -0x58ea: "[?] " -0x58eb: "Shi " -0x58ec: "Ren " -0x58ed: "[?] " -0x58ee: "Zhuang " -0x58ef: "Zhuang " -0x58f0: "Sheng " -0x58f1: "Yi " -0x58f2: "Mai " -0x58f3: "Ke " -0x58f4: "Zhu " -0x58f5: "Zhuang " -0x58f6: "Hu " -0x58f7: "Hu " -0x58f8: "Kun " -0x58f9: "Yi " -0x58fa: "Hu " -0x58fb: "Xu " -0x58fc: "Kun " -0x58fd: "Shou " -0x58fe: "Mang " -0x58ff: "Zun " -/* x059 */ -0x5900: "Shou " -0x5901: "Yi " -0x5902: "Zhi " -0x5903: "Gu " -0x5904: "Chu " -0x5905: "Jiang " -0x5906: "Feng " -0x5907: "Bei " -0x5908: "Cay " -0x5909: "Bian " -0x590a: "Sui " -0x590b: "Qun " -0x590c: "Ling " -0x590d: "Fu " -0x590e: "Zuo " -0x590f: "Xia " -0x5910: "Xiong " -0x5911: "[?] " -0x5912: "Nao " -0x5913: "Xia " -0x5914: "Kui " -0x5915: "Xi " -0x5916: "Wai " -0x5917: "Yuan " -0x5918: "Mao " -0x5919: "Su " -0x591a: "Duo " -0x591b: "Duo " -0x591c: "Ye " -0x591d: "Qing " -0x591e: "Uys " -0x591f: "Gou " -0x5920: "Gou " -0x5921: "Qi " -0x5922: "Meng " -0x5923: "Meng " -0x5924: "Yin " -0x5925: "Huo " -0x5926: "Chen " -0x5927: "Da " -0x5928: "Ze " -0x5929: "Tian " -0x592a: "Tai " -0x592b: "Fu " -0x592c: "Guai " -0x592d: "Yao " -0x592e: "Yang " -0x592f: "Hang " -0x5930: "Gao " -0x5931: "Shi " -0x5932: "Ben " -0x5933: "Tai " -0x5934: "Tou " -0x5935: "Yan " -0x5936: "Bi " -0x5937: "Yi " -0x5938: "Kua " -0x5939: "Jia " -0x593a: "Duo " -0x593b: "Kwu " -0x593c: "Kuang " -0x593d: "Yun " -0x593e: "Jia " -0x593f: "Pa " -0x5940: "En " -0x5941: "Lian " -0x5942: "Huan " -0x5943: "Di " -0x5944: "Yan " -0x5945: "Pao " -0x5946: "Quan " -0x5947: "Qi " -0x5948: "Nai " -0x5949: "Feng " -0x594a: "Xie " -0x594b: "Fen " -0x594c: "Dian " -0x594d: "[?] " -0x594e: "Kui " -0x594f: "Zou " -0x5950: "Huan " -0x5951: "Qi " -0x5952: "Kai " -0x5953: "Zha " -0x5954: "Ben " -0x5955: "Yi " -0x5956: "Jiang " -0x5957: "Tao " -0x5958: "Zang " -0x5959: "Ben " -0x595a: "Xi " -0x595b: "Xiang " -0x595c: "Fei " -0x595d: "Diao " -0x595e: "Xun " -0x595f: "Keng " -0x5960: "Dian " -0x5961: "Ao " -0x5962: "She " -0x5963: "Weng " -0x5964: "Pan " -0x5965: "Ao " -0x5966: "Wu " -0x5967: "Ao " -0x5968: "Jiang " -0x5969: "Lian " -0x596a: "Duo " -0x596b: "Yun " -0x596c: "Jiang " -0x596d: "Shi " -0x596e: "Fen " -0x596f: "Huo " -0x5970: "Bi " -0x5971: "Lian " -0x5972: "Duo " -0x5973: "Nu " -0x5974: "Nu " -0x5975: "Ding " -0x5976: "Nai " -0x5977: "Qian " -0x5978: "Jian " -0x5979: "Ta " -0x597a: "Jiu " -0x597b: "Nan " -0x597c: "Cha " -0x597d: "Hao " -0x597e: "Xian " -0x597f: "Fan " -0x5980: "Ji " -0x5981: "Shuo " -0x5982: "Ru " -0x5983: "Fei " -0x5984: "Wang " -0x5985: "Hong " -0x5986: "Zhuang " -0x5987: "Fu " -0x5988: "Ma " -0x5989: "Dan " -0x598a: "Ren " -0x598b: "Fu " -0x598c: "Jing " -0x598d: "Yan " -0x598e: "Xie " -0x598f: "Wen " -0x5990: "Zhong " -0x5991: "Pa " -0x5992: "Du " -0x5993: "Ji " -0x5994: "Keng " -0x5995: "Zhong " -0x5996: "Yao " -0x5997: "Jin " -0x5998: "Yun " -0x5999: "Miao " -0x599a: "Pei " -0x599b: "Shi " -0x599c: "Yue " -0x599d: "Zhuang " -0x599e: "Niu " -0x599f: "Yan " -0x59a0: "Na " -0x59a1: "Xin " -0x59a2: "Fen " -0x59a3: "Bi " -0x59a4: "Yu " -0x59a5: "Tuo " -0x59a6: "Feng " -0x59a7: "Yuan " -0x59a8: "Fang " -0x59a9: "Wu " -0x59aa: "Yu " -0x59ab: "Gui " -0x59ac: "Du " -0x59ad: "Ba " -0x59ae: "Ni " -0x59af: "Zhou " -0x59b0: "Zhuo " -0x59b1: "Zhao " -0x59b2: "Da " -0x59b3: "Nai " -0x59b4: "Yuan " -0x59b5: "Tou " -0x59b6: "Xuan " -0x59b7: "Zhi " -0x59b8: "E " -0x59b9: "Mei " -0x59ba: "Mo " -0x59bb: "Qi " -0x59bc: "Bi " -0x59bd: "Shen " -0x59be: "Qie " -0x59bf: "E " -0x59c0: "He " -0x59c1: "Xu " -0x59c2: "Fa " -0x59c3: "Zheng " -0x59c4: "Min " -0x59c5: "Ban " -0x59c6: "Mu " -0x59c7: "Fu " -0x59c8: "Ling " -0x59c9: "Zi " -0x59ca: "Zi " -0x59cb: "Shi " -0x59cc: "Ran " -0x59cd: "Shan " -0x59ce: "Yang " -0x59cf: "Man " -0x59d0: "Jie " -0x59d1: "Gu " -0x59d2: "Si " -0x59d3: "Xing " -0x59d4: "Wei " -0x59d5: "Zi " -0x59d6: "Ju " -0x59d7: "Shan " -0x59d8: "Pin " -0x59d9: "Ren " -0x59da: "Yao " -0x59db: "Tong " -0x59dc: "Jiang " -0x59dd: "Shu " -0x59de: "Ji " -0x59df: "Gai " -0x59e0: "Shang " -0x59e1: "Kuo " -0x59e2: "Juan " -0x59e3: "Jiao " -0x59e4: "Gou " -0x59e5: "Mu " -0x59e6: "Jian " -0x59e7: "Jian " -0x59e8: "Yi " -0x59e9: "Nian " -0x59ea: "Zhi " -0x59eb: "Ji " -0x59ec: "Ji " -0x59ed: "Xian " -0x59ee: "Heng " -0x59ef: "Guang " -0x59f0: "Jun " -0x59f1: "Kua " -0x59f2: "Yan " -0x59f3: "Ming " -0x59f4: "Lie " -0x59f5: "Pei " -0x59f6: "Yan " -0x59f7: "You " -0x59f8: "Yan " -0x59f9: "Cha " -0x59fa: "Shen " -0x59fb: "Yin " -0x59fc: "Chi " -0x59fd: "Gui " -0x59fe: "Quan " -0x59ff: "Zi " -/* x05a */ -0x5a00: "Song " -0x5a01: "Wei " -0x5a02: "Hong " -0x5a03: "Wa " -0x5a04: "Lou " -0x5a05: "Ya " -0x5a06: "Rao " -0x5a07: "Jiao " -0x5a08: "Luan " -0x5a09: "Ping " -0x5a0a: "Xian " -0x5a0b: "Shao " -0x5a0c: "Li " -0x5a0d: "Cheng " -0x5a0e: "Xiao " -0x5a0f: "Mang " -0x5a10: "Fu " -0x5a11: "Suo " -0x5a12: "Wu " -0x5a13: "Wei " -0x5a14: "Ke " -0x5a15: "Lai " -0x5a16: "Chuo " -0x5a17: "Ding " -0x5a18: "Niang " -0x5a19: "Xing " -0x5a1a: "Nan " -0x5a1b: "Yu " -0x5a1c: "Nuo " -0x5a1d: "Pei " -0x5a1e: "Nei " -0x5a1f: "Juan " -0x5a20: "Shen " -0x5a21: "Zhi " -0x5a22: "Han " -0x5a23: "Di " -0x5a24: "Zhuang " -0x5a25: "E " -0x5a26: "Pin " -0x5a27: "Tui " -0x5a28: "Han " -0x5a29: "Mian " -0x5a2a: "Wu " -0x5a2b: "Yan " -0x5a2c: "Wu " -0x5a2d: "Xi " -0x5a2e: "Yan " -0x5a2f: "Yu " -0x5a30: "Si " -0x5a31: "Yu " -0x5a32: "Wa " -0x5a33: "[?] " -0x5a34: "Xian " -0x5a35: "Ju " -0x5a36: "Qu " -0x5a37: "Shui " -0x5a38: "Qi " -0x5a39: "Xian " -0x5a3a: "Zhui " -0x5a3b: "Dong " -0x5a3c: "Chang " -0x5a3d: "Lu " -0x5a3e: "Ai " -0x5a3f: "E " -0x5a40: "E " -0x5a41: "Lou " -0x5a42: "Mian " -0x5a43: "Cong " -0x5a44: "Pou " -0x5a45: "Ju " -0x5a46: "Po " -0x5a47: "Cai " -0x5a48: "Ding " -0x5a49: "Wan " -0x5a4a: "Biao " -0x5a4b: "Xiao " -0x5a4c: "Shu " -0x5a4d: "Qi " -0x5a4e: "Hui " -0x5a4f: "Fu " -0x5a50: "E " -0x5a51: "Wo " -0x5a52: "Tan " -0x5a53: "Fei " -0x5a54: "Wei " -0x5a55: "Jie " -0x5a56: "Tian " -0x5a57: "Ni " -0x5a58: "Quan " -0x5a59: "Jing " -0x5a5a: "Hun " -0x5a5b: "Jing " -0x5a5c: "Qian " -0x5a5d: "Dian " -0x5a5e: "Xing " -0x5a5f: "Hu " -0x5a60: "Wa " -0x5a61: "Lai " -0x5a62: "Bi " -0x5a63: "Yin " -0x5a64: "Chou " -0x5a65: "Chuo " -0x5a66: "Fu " -0x5a67: "Jing " -0x5a68: "Lun " -0x5a69: "Yan " -0x5a6a: "Lan " -0x5a6b: "Kun " -0x5a6c: "Yin " -0x5a6d: "Ya " -0x5a6e: "Ju " -0x5a6f: "Li " -0x5a70: "Dian " -0x5a71: "Xian " -0x5a72: "Hwa " -0x5a73: "Hua " -0x5a74: "Ying " -0x5a75: "Chan " -0x5a76: "Shen " -0x5a77: "Ting " -0x5a78: "Dang " -0x5a79: "Yao " -0x5a7a: "Wu " -0x5a7b: "Nan " -0x5a7c: "Ruo " -0x5a7d: "Jia " -0x5a7e: "Tou " -0x5a7f: "Xu " -0x5a80: "Yu " -0x5a81: "Wei " -0x5a82: "Ti " -0x5a83: "Rou " -0x5a84: "Mei " -0x5a85: "Dan " -0x5a86: "Ruan " -0x5a87: "Qin " -0x5a88: "Hui " -0x5a89: "Wu " -0x5a8a: "Qian " -0x5a8b: "Chun " -0x5a8c: "Mao " -0x5a8d: "Fu " -0x5a8e: "Jie " -0x5a8f: "Duan " -0x5a90: "Xi " -0x5a91: "Zhong " -0x5a92: "Mei " -0x5a93: "Huang " -0x5a94: "Mian " -0x5a95: "An " -0x5a96: "Ying " -0x5a97: "Xuan " -0x5a98: "Jie " -0x5a99: "Wei " -0x5a9a: "Mei " -0x5a9b: "Yuan " -0x5a9c: "Zhen " -0x5a9d: "Qiu " -0x5a9e: "Ti " -0x5a9f: "Xie " -0x5aa0: "Tuo " -0x5aa1: "Lian " -0x5aa2: "Mao " -0x5aa3: "Ran " -0x5aa4: "Si " -0x5aa5: "Pian " -0x5aa6: "Wei " -0x5aa7: "Wa " -0x5aa8: "Jiu " -0x5aa9: "Hu " -0x5aaa: "Ao " -0x5aab: "[?] " -0x5aac: "Bou " -0x5aad: "Xu " -0x5aae: "Tou " -0x5aaf: "Gui " -0x5ab0: "Zou " -0x5ab1: "Yao " -0x5ab2: "Pi " -0x5ab3: "Xi " -0x5ab4: "Yuan " -0x5ab5: "Ying " -0x5ab6: "Rong " -0x5ab7: "Ru " -0x5ab8: "Chi " -0x5ab9: "Liu " -0x5aba: "Mei " -0x5abb: "Pan " -0x5abc: "Ao " -0x5abd: "Ma " -0x5abe: "Gou " -0x5abf: "Kui " -0x5ac0: "Qin " -0x5ac1: "Jia " -0x5ac2: "Sao " -0x5ac3: "Zhen " -0x5ac4: "Yuan " -0x5ac5: "Cha " -0x5ac6: "Yong " -0x5ac7: "Ming " -0x5ac8: "Ying " -0x5ac9: "Ji " -0x5aca: "Su " -0x5acb: "Niao " -0x5acc: "Xian " -0x5acd: "Tao " -0x5ace: "Pang " -0x5acf: "Lang " -0x5ad0: "Nao " -0x5ad1: "Bao " -0x5ad2: "Ai " -0x5ad3: "Pi " -0x5ad4: "Pin " -0x5ad5: "Yi " -0x5ad6: "Piao " -0x5ad7: "Yu " -0x5ad8: "Lei " -0x5ad9: "Xuan " -0x5ada: "Man " -0x5adb: "Yi " -0x5adc: "Zhang " -0x5add: "Kang " -0x5ade: "Yong " -0x5adf: "Ni " -0x5ae0: "Li " -0x5ae1: "Di " -0x5ae2: "Gui " -0x5ae3: "Yan " -0x5ae4: "Jin " -0x5ae5: "Zhuan " -0x5ae6: "Chang " -0x5ae7: "Ce " -0x5ae8: "Han " -0x5ae9: "Nen " -0x5aea: "Lao " -0x5aeb: "Mo " -0x5aec: "Zhe " -0x5aed: "Hu " -0x5aee: "Hu " -0x5aef: "Ao " -0x5af0: "Nen " -0x5af1: "Qiang " -0x5af2: "Ma " -0x5af3: "Pie " -0x5af4: "Gu " -0x5af5: "Wu " -0x5af6: "Jiao " -0x5af7: "Tuo " -0x5af8: "Zhan " -0x5af9: "Mao " -0x5afa: "Xian " -0x5afb: "Xian " -0x5afc: "Mo " -0x5afd: "Liao " -0x5afe: "Lian " -0x5aff: "Hua " -/* x05b */ -0x5b00: "Gui " -0x5b01: "Deng " -0x5b02: "Zhi " -0x5b03: "Xu " -0x5b04: "Yi " -0x5b05: "Hua " -0x5b06: "Xi " -0x5b07: "Hui " -0x5b08: "Rao " -0x5b09: "Xi " -0x5b0a: "Yan " -0x5b0b: "Chan " -0x5b0c: "Jiao " -0x5b0d: "Mei " -0x5b0e: "Fan " -0x5b0f: "Fan " -0x5b10: "Xian " -0x5b11: "Yi " -0x5b12: "Wei " -0x5b13: "Jiao " -0x5b14: "Fu " -0x5b15: "Shi " -0x5b16: "Bi " -0x5b17: "Shan " -0x5b18: "Sui " -0x5b19: "Qiang " -0x5b1a: "Lian " -0x5b1b: "Huan " -0x5b1c: "Xin " -0x5b1d: "Niao " -0x5b1e: "Dong " -0x5b1f: "Yi " -0x5b20: "Can " -0x5b21: "Ai " -0x5b22: "Niang " -0x5b23: "Neng " -0x5b24: "Ma " -0x5b25: "Tiao " -0x5b26: "Chou " -0x5b27: "Jin " -0x5b28: "Ci " -0x5b29: "Yu " -0x5b2a: "Pin " -0x5b2b: "Yong " -0x5b2c: "Xu " -0x5b2d: "Nai " -0x5b2e: "Yan " -0x5b2f: "Tai " -0x5b30: "Ying " -0x5b31: "Can " -0x5b32: "Niao " -0x5b33: "Wo " -0x5b34: "Ying " -0x5b35: "Mian " -0x5b36: "Kaka " -0x5b37: "Ma " -0x5b38: "Shen " -0x5b39: "Xing " -0x5b3a: "Ni " -0x5b3b: "Du " -0x5b3c: "Liu " -0x5b3d: "Yuan " -0x5b3e: "Lan " -0x5b3f: "Yan " -0x5b40: "Shuang " -0x5b41: "Ling " -0x5b42: "Jiao " -0x5b43: "Niang " -0x5b44: "Lan " -0x5b45: "Xian " -0x5b46: "Ying " -0x5b47: "Shuang " -0x5b48: "Shuai " -0x5b49: "Quan " -0x5b4a: "Mi " -0x5b4b: "Li " -0x5b4c: "Luan " -0x5b4d: "Yan " -0x5b4e: "Zhu " -0x5b4f: "Lan " -0x5b50: "Zi " -0x5b51: "Jie " -0x5b52: "Jue " -0x5b53: "Jue " -0x5b54: "Kong " -0x5b55: "Yun " -0x5b56: "Zi " -0x5b57: "Zi " -0x5b58: "Cun " -0x5b59: "Sun " -0x5b5a: "Fu " -0x5b5b: "Bei " -0x5b5c: "Zi " -0x5b5d: "Xiao " -0x5b5e: "Xin " -0x5b5f: "Meng " -0x5b60: "Si " -0x5b61: "Tai " -0x5b62: "Bao " -0x5b63: "Ji " -0x5b64: "Gu " -0x5b65: "Nu " -0x5b66: "Xue " -0x5b67: "[?] " -0x5b68: "Zhuan " -0x5b69: "Hai " -0x5b6a: "Luan " -0x5b6b: "Sun " -0x5b6c: "Huai " -0x5b6d: "Mie " -0x5b6e: "Cong " -0x5b6f: "Qian " -0x5b70: "Shu " -0x5b71: "Chan " -0x5b72: "Ya " -0x5b73: "Zi " -0x5b74: "Ni " -0x5b75: "Fu " -0x5b76: "Zi " -0x5b77: "Li " -0x5b78: "Xue " -0x5b79: "Bo " -0x5b7a: "Ru " -0x5b7b: "Lai " -0x5b7c: "Nie " -0x5b7d: "Nie " -0x5b7e: "Ying " -0x5b7f: "Luan " -0x5b80: "Mian " -0x5b81: "Zhu " -0x5b82: "Rong " -0x5b83: "Ta " -0x5b84: "Gui " -0x5b85: "Zhai " -0x5b86: "Qiong " -0x5b87: "Yu " -0x5b88: "Shou " -0x5b89: "An " -0x5b8a: "Tu " -0x5b8b: "Song " -0x5b8c: "Wan " -0x5b8d: "Rou " -0x5b8e: "Yao " -0x5b8f: "Hong " -0x5b90: "Yi " -0x5b91: "Jing " -0x5b92: "Zhun " -0x5b93: "Mi " -0x5b94: "Zhu " -0x5b95: "Dang " -0x5b96: "Hong " -0x5b97: "Zong " -0x5b98: "Guan " -0x5b99: "Zhou " -0x5b9a: "Ding " -0x5b9b: "Wan " -0x5b9c: "Yi " -0x5b9d: "Bao " -0x5b9e: "Shi " -0x5b9f: "Shi " -0x5ba0: "Chong " -0x5ba1: "Shen " -0x5ba2: "Ke " -0x5ba3: "Xuan " -0x5ba4: "Shi " -0x5ba5: "You " -0x5ba6: "Huan " -0x5ba7: "Yi " -0x5ba8: "Tiao " -0x5ba9: "Shi " -0x5baa: "Xian " -0x5bab: "Gong " -0x5bac: "Cheng " -0x5bad: "Qun " -0x5bae: "Gong " -0x5baf: "Xiao " -0x5bb0: "Zai " -0x5bb1: "Zha " -0x5bb2: "Bao " -0x5bb3: "Hai " -0x5bb4: "Yan " -0x5bb5: "Xiao " -0x5bb6: "Jia " -0x5bb7: "Shen " -0x5bb8: "Chen " -0x5bb9: "Rong " -0x5bba: "Huang " -0x5bbb: "Mi " -0x5bbc: "Kou " -0x5bbd: "Kuan " -0x5bbe: "Bin " -0x5bbf: "Su " -0x5bc0: "Cai " -0x5bc1: "Zan " -0x5bc2: "Ji " -0x5bc3: "Yuan " -0x5bc4: "Ji " -0x5bc5: "Yin " -0x5bc6: "Mi " -0x5bc7: "Kou " -0x5bc8: "Qing " -0x5bc9: "Que " -0x5bca: "Zhen " -0x5bcb: "Jian " -0x5bcc: "Fu " -0x5bcd: "Ning " -0x5bce: "Bing " -0x5bcf: "Huan " -0x5bd0: "Mei " -0x5bd1: "Qin " -0x5bd2: "Han " -0x5bd3: "Yu " -0x5bd4: "Shi " -0x5bd5: "Ning " -0x5bd6: "Qin " -0x5bd7: "Ning " -0x5bd8: "Zhi " -0x5bd9: "Yu " -0x5bda: "Bao " -0x5bdb: "Kuan " -0x5bdc: "Ning " -0x5bdd: "Qin " -0x5bde: "Mo " -0x5bdf: "Cha " -0x5be0: "Ju " -0x5be1: "Gua " -0x5be2: "Qin " -0x5be3: "Hu " -0x5be4: "Wu " -0x5be5: "Liao " -0x5be6: "Shi " -0x5be7: "Zhu " -0x5be8: "Zhai " -0x5be9: "Shen " -0x5bea: "Wei " -0x5beb: "Xie " -0x5bec: "Kuan " -0x5bed: "Hui " -0x5bee: "Liao " -0x5bef: "Jun " -0x5bf0: "Huan " -0x5bf1: "Yi " -0x5bf2: "Yi " -0x5bf3: "Bao " -0x5bf4: "Qin " -0x5bf5: "Chong " -0x5bf6: "Bao " -0x5bf7: "Feng " -0x5bf8: "Cun " -0x5bf9: "Dui " -0x5bfa: "Si " -0x5bfb: "Xun " -0x5bfc: "Dao " -0x5bfd: "Lu " -0x5bfe: "Dui " -0x5bff: "Shou " -/* x05c */ -0x5c00: "Po " -0x5c01: "Feng " -0x5c02: "Zhuan " -0x5c03: "Fu " -0x5c04: "She " -0x5c05: "Ke " -0x5c06: "Jiang " -0x5c07: "Jiang " -0x5c08: "Zhuan " -0x5c09: "Wei " -0x5c0a: "Zun " -0x5c0b: "Xun " -0x5c0c: "Shu " -0x5c0d: "Dui " -0x5c0e: "Dao " -0x5c0f: "Xiao " -0x5c10: "Ji " -0x5c11: "Shao " -0x5c12: "Er " -0x5c13: "Er " -0x5c14: "Er " -0x5c15: "Ga " -0x5c16: "Jian " -0x5c17: "Shu " -0x5c18: "Chen " -0x5c19: "Shang " -0x5c1a: "Shang " -0x5c1b: "Mo " -0x5c1c: "Ga " -0x5c1d: "Chang " -0x5c1e: "Liao " -0x5c1f: "Xian " -0x5c20: "Xian " -0x5c21: "[?] " -0x5c22: "Wang " -0x5c23: "Wang " -0x5c24: "You " -0x5c25: "Liao " -0x5c26: "Liao " -0x5c27: "Yao " -0x5c28: "Mang " -0x5c29: "Wang " -0x5c2a: "Wang " -0x5c2b: "Wang " -0x5c2c: "Ga " -0x5c2d: "Yao " -0x5c2e: "Duo " -0x5c2f: "Kui " -0x5c30: "Zhong " -0x5c31: "Jiu " -0x5c32: "Gan " -0x5c33: "Gu " -0x5c34: "Gan " -0x5c35: "Tui " -0x5c36: "Gan " -0x5c37: "Gan " -0x5c38: "Shi " -0x5c39: "Yin " -0x5c3a: "Chi " -0x5c3b: "Kao " -0x5c3c: "Ni " -0x5c3d: "Jin " -0x5c3e: "Wei " -0x5c3f: "Niao " -0x5c40: "Ju " -0x5c41: "Pi " -0x5c42: "Ceng " -0x5c43: "Xi " -0x5c44: "Bi " -0x5c45: "Ju " -0x5c46: "Jie " -0x5c47: "Tian " -0x5c48: "Qu " -0x5c49: "Ti " -0x5c4a: "Jie " -0x5c4b: "Wu " -0x5c4c: "Diao " -0x5c4d: "Shi " -0x5c4e: "Shi " -0x5c4f: "Ping " -0x5c50: "Ji " -0x5c51: "Xie " -0x5c52: "Chen " -0x5c53: "Xi " -0x5c54: "Ni " -0x5c55: "Zhan " -0x5c56: "Xi " -0x5c57: "[?] " -0x5c58: "Man " -0x5c59: "E " -0x5c5a: "Lou " -0x5c5b: "Ping " -0x5c5c: "Ti " -0x5c5d: "Fei " -0x5c5e: "Shu " -0x5c5f: "Xie " -0x5c60: "Tu " -0x5c61: "Lu " -0x5c62: "Lu " -0x5c63: "Xi " -0x5c64: "Ceng " -0x5c65: "Lu " -0x5c66: "Ju " -0x5c67: "Xie " -0x5c68: "Ju " -0x5c69: "Jue " -0x5c6a: "Liao " -0x5c6b: "Jue " -0x5c6c: "Shu " -0x5c6d: "Xi " -0x5c6e: "Che " -0x5c6f: "Tun " -0x5c70: "Ni " -0x5c71: "Shan " -0x5c72: "[?] " -0x5c73: "Xian " -0x5c74: "Li " -0x5c75: "Xue " -0x5c76: "Nata " -0x5c77: "[?] " -0x5c78: "Long " -0x5c79: "Yi " -0x5c7a: "Qi " -0x5c7b: "Ren " -0x5c7c: "Wu " -0x5c7d: "Han " -0x5c7e: "Shen " -0x5c7f: "Yu " -0x5c80: "Chu " -0x5c81: "Sui " -0x5c82: "Qi " -0x5c83: "[?] " -0x5c84: "Yue " -0x5c85: "Ban " -0x5c86: "Yao " -0x5c87: "Ang " -0x5c88: "Ya " -0x5c89: "Wu " -0x5c8a: "Jie " -0x5c8b: "E " -0x5c8c: "Ji " -0x5c8d: "Qian " -0x5c8e: "Fen " -0x5c8f: "Yuan " -0x5c90: "Qi " -0x5c91: "Cen " -0x5c92: "Qian " -0x5c93: "Qi " -0x5c94: "Cha " -0x5c95: "Jie " -0x5c96: "Qu " -0x5c97: "Gang " -0x5c98: "Xian " -0x5c99: "Ao " -0x5c9a: "Lan " -0x5c9b: "Dao " -0x5c9c: "Ba " -0x5c9d: "Zuo " -0x5c9e: "Zuo " -0x5c9f: "Yang " -0x5ca0: "Ju " -0x5ca1: "Gang " -0x5ca2: "Ke " -0x5ca3: "Gou " -0x5ca4: "Xue " -0x5ca5: "Bei " -0x5ca6: "Li " -0x5ca7: "Tiao " -0x5ca8: "Ju " -0x5ca9: "Yan " -0x5caa: "Fu " -0x5cab: "Xiu " -0x5cac: "Jia " -0x5cad: "Ling " -0x5cae: "Tuo " -0x5caf: "Pei " -0x5cb0: "You " -0x5cb1: "Dai " -0x5cb2: "Kuang " -0x5cb3: "Yue " -0x5cb4: "Qu " -0x5cb5: "Hu " -0x5cb6: "Po " -0x5cb7: "Min " -0x5cb8: "An " -0x5cb9: "Tiao " -0x5cba: "Ling " -0x5cbb: "Chi " -0x5cbc: "Yuri " -0x5cbd: "Dong " -0x5cbe: "Cem " -0x5cbf: "Kui " -0x5cc0: "Xiu " -0x5cc1: "Mao " -0x5cc2: "Tong " -0x5cc3: "Xue " -0x5cc4: "Yi " -0x5cc5: "Kura " -0x5cc6: "He " -0x5cc7: "Ke " -0x5cc8: "Luo " -0x5cc9: "E " -0x5cca: "Fu " -0x5ccb: "Xun " -0x5ccc: "Die " -0x5ccd: "Lu " -0x5cce: "An " -0x5ccf: "Er " -0x5cd0: "Gai " -0x5cd1: "Quan " -0x5cd2: "Tong " -0x5cd3: "Yi " -0x5cd4: "Mu " -0x5cd5: "Shi " -0x5cd6: "An " -0x5cd7: "Wei " -0x5cd8: "Hu " -0x5cd9: "Zhi " -0x5cda: "Mi " -0x5cdb: "Li " -0x5cdc: "Ji " -0x5cdd: "Tong " -0x5cde: "Wei " -0x5cdf: "You " -0x5ce0: "Sang " -0x5ce1: "Xia " -0x5ce2: "Li " -0x5ce3: "Yao " -0x5ce4: "Jiao " -0x5ce5: "Zheng " -0x5ce6: "Luan " -0x5ce7: "Jiao " -0x5ce8: "E " -0x5ce9: "E " -0x5cea: "Yu " -0x5ceb: "Ye " -0x5cec: "Bu " -0x5ced: "Qiao " -0x5cee: "Qun " -0x5cef: "Feng " -0x5cf0: "Feng " -0x5cf1: "Nao " -0x5cf2: "Li " -0x5cf3: "You " -0x5cf4: "Xian " -0x5cf5: "Hong " -0x5cf6: "Dao " -0x5cf7: "Shen " -0x5cf8: "Cheng " -0x5cf9: "Tu " -0x5cfa: "Geng " -0x5cfb: "Jun " -0x5cfc: "Hao " -0x5cfd: "Xia " -0x5cfe: "Yin " -0x5cff: "Yu " -/* x05d */ -0x5d00: "Lang " -0x5d01: "Kan " -0x5d02: "Lao " -0x5d03: "Lai " -0x5d04: "Xian " -0x5d05: "Que " -0x5d06: "Kong " -0x5d07: "Chong " -0x5d08: "Chong " -0x5d09: "Ta " -0x5d0a: "Lin " -0x5d0b: "Hua " -0x5d0c: "Ju " -0x5d0d: "Lai " -0x5d0e: "Qi " -0x5d0f: "Min " -0x5d10: "Kun " -0x5d11: "Kun " -0x5d12: "Zu " -0x5d13: "Gu " -0x5d14: "Cui " -0x5d15: "Ya " -0x5d16: "Ya " -0x5d17: "Gang " -0x5d18: "Lun " -0x5d19: "Lun " -0x5d1a: "Leng " -0x5d1b: "Jue " -0x5d1c: "Duo " -0x5d1d: "Zheng " -0x5d1e: "Guo " -0x5d1f: "Yin " -0x5d20: "Dong " -0x5d21: "Han " -0x5d22: "Zheng " -0x5d23: "Wei " -0x5d24: "Yao " -0x5d25: "Pi " -0x5d26: "Yan " -0x5d27: "Song " -0x5d28: "Jie " -0x5d29: "Beng " -0x5d2a: "Zu " -0x5d2b: "Jue " -0x5d2c: "Dong " -0x5d2d: "Zhan " -0x5d2e: "Gu " -0x5d2f: "Yin " -0x5d30: "[?] " -0x5d31: "Ze " -0x5d32: "Huang " -0x5d33: "Yu " -0x5d34: "Wei " -0x5d35: "Yang " -0x5d36: "Feng " -0x5d37: "Qiu " -0x5d38: "Dun " -0x5d39: "Ti " -0x5d3a: "Yi " -0x5d3b: "Zhi " -0x5d3c: "Shi " -0x5d3d: "Zai " -0x5d3e: "Yao " -0x5d3f: "E " -0x5d40: "Zhu " -0x5d41: "Kan " -0x5d42: "Lu " -0x5d43: "Yan " -0x5d44: "Mei " -0x5d45: "Gan " -0x5d46: "Ji " -0x5d47: "Ji " -0x5d48: "Huan " -0x5d49: "Ting " -0x5d4a: "Sheng " -0x5d4b: "Mei " -0x5d4c: "Qian " -0x5d4d: "Wu " -0x5d4e: "Yu " -0x5d4f: "Zong " -0x5d50: "Lan " -0x5d51: "Jue " -0x5d52: "Yan " -0x5d53: "Yan " -0x5d54: "Wei " -0x5d55: "Zong " -0x5d56: "Cha " -0x5d57: "Sui " -0x5d58: "Rong " -0x5d59: "Yamashina " -0x5d5a: "Qin " -0x5d5b: "Yu " -0x5d5c: "Kewashii " -0x5d5d: "Lou " -0x5d5e: "Tu " -0x5d5f: "Dui " -0x5d60: "Xi " -0x5d61: "Weng " -0x5d62: "Cang " -0x5d63: "Dang " -0x5d64: "Hong " -0x5d65: "Jie " -0x5d66: "Ai " -0x5d67: "Liu " -0x5d68: "Wu " -0x5d69: "Song " -0x5d6a: "Qiao " -0x5d6b: "Zi " -0x5d6c: "Wei " -0x5d6d: "Beng " -0x5d6e: "Dian " -0x5d6f: "Cuo " -0x5d70: "Qian " -0x5d71: "Yong " -0x5d72: "Nie " -0x5d73: "Cuo " -0x5d74: "Ji " -0x5d75: "[?] " -0x5d76: "Tao " -0x5d77: "Song " -0x5d78: "Zong " -0x5d79: "Jiang " -0x5d7a: "Liao " -0x5d7b: "Kang " -0x5d7c: "Chan " -0x5d7d: "Die " -0x5d7e: "Cen " -0x5d7f: "Ding " -0x5d80: "Tu " -0x5d81: "Lou " -0x5d82: "Zhang " -0x5d83: "Zhan " -0x5d84: "Zhan " -0x5d85: "Ao " -0x5d86: "Cao " -0x5d87: "Qu " -0x5d88: "Qiang " -0x5d89: "Zui " -0x5d8a: "Zui " -0x5d8b: "Dao " -0x5d8c: "Dao " -0x5d8d: "Xi " -0x5d8e: "Yu " -0x5d8f: "Bo " -0x5d90: "Long " -0x5d91: "Xiang " -0x5d92: "Ceng " -0x5d93: "Bo " -0x5d94: "Qin " -0x5d95: "Jiao " -0x5d96: "Yan " -0x5d97: "Lao " -0x5d98: "Zhan " -0x5d99: "Lin " -0x5d9a: "Liao " -0x5d9b: "Liao " -0x5d9c: "Jin " -0x5d9d: "Deng " -0x5d9e: "Duo " -0x5d9f: "Zun " -0x5da0: "Jiao " -0x5da1: "Gui " -0x5da2: "Yao " -0x5da3: "Qiao " -0x5da4: "Yao " -0x5da5: "Jue " -0x5da6: "Zhan " -0x5da7: "Yi " -0x5da8: "Xue " -0x5da9: "Nao " -0x5daa: "Ye " -0x5dab: "Ye " -0x5dac: "Yi " -0x5dad: "E " -0x5dae: "Xian " -0x5daf: "Ji " -0x5db0: "Xie " -0x5db1: "Ke " -0x5db2: "Xi " -0x5db3: "Di " -0x5db4: "Ao " -0x5db5: "Zui " -0x5db6: "[?] " -0x5db7: "Ni " -0x5db8: "Rong " -0x5db9: "Dao " -0x5dba: "Ling " -0x5dbb: "Za " -0x5dbc: "Yu " -0x5dbd: "Yue " -0x5dbe: "Yin " -0x5dbf: "[?] " -0x5dc0: "Jie " -0x5dc1: "Li " -0x5dc2: "Sui " -0x5dc3: "Long " -0x5dc4: "Long " -0x5dc5: "Dian " -0x5dc6: "Ying " -0x5dc7: "Xi " -0x5dc8: "Ju " -0x5dc9: "Chan " -0x5dca: "Ying " -0x5dcb: "Kui " -0x5dcc: "Yan " -0x5dcd: "Wei " -0x5dce: "Nao " -0x5dcf: "Quan " -0x5dd0: "Chao " -0x5dd1: "Cuan " -0x5dd2: "Luan " -0x5dd3: "Dian " -0x5dd4: "Dian " -0x5dd5: "[?] " -0x5dd6: "Yan " -0x5dd7: "Yan " -0x5dd8: "Yan " -0x5dd9: "Nao " -0x5dda: "Yan " -0x5ddb: "Chuan " -0x5ddc: "Gui " -0x5ddd: "Chuan " -0x5dde: "Zhou " -0x5ddf: "Huang " -0x5de0: "Jing " -0x5de1: "Xun " -0x5de2: "Chao " -0x5de3: "Chao " -0x5de4: "Lie " -0x5de5: "Gong " -0x5de6: "Zuo " -0x5de7: "Qiao " -0x5de8: "Ju " -0x5de9: "Gong " -0x5dea: "Kek " -0x5deb: "Wu " -0x5dec: "Pwu " -0x5ded: "Pwu " -0x5dee: "Chai " -0x5def: "Qiu " -0x5df0: "Qiu " -0x5df1: "Ji " -0x5df2: "Yi " -0x5df3: "Si " -0x5df4: "Ba " -0x5df5: "Zhi " -0x5df6: "Zhao " -0x5df7: "Xiang " -0x5df8: "Yi " -0x5df9: "Jin " -0x5dfa: "Xun " -0x5dfb: "Juan " -0x5dfc: "Phas " -0x5dfd: "Xun " -0x5dfe: "Jin " -0x5dff: "Fu " -/* x05e */ -0x5e00: "Za " -0x5e01: "Bi " -0x5e02: "Shi " -0x5e03: "Bu " -0x5e04: "Ding " -0x5e05: "Shuai " -0x5e06: "Fan " -0x5e07: "Nie " -0x5e08: "Shi " -0x5e09: "Fen " -0x5e0a: "Pa " -0x5e0b: "Zhi " -0x5e0c: "Xi " -0x5e0d: "Hu " -0x5e0e: "Dan " -0x5e0f: "Wei " -0x5e10: "Zhang " -0x5e11: "Tang " -0x5e12: "Dai " -0x5e13: "Ma " -0x5e14: "Pei " -0x5e15: "Pa " -0x5e16: "Tie " -0x5e17: "Fu " -0x5e18: "Lian " -0x5e19: "Zhi " -0x5e1a: "Zhou " -0x5e1b: "Bo " -0x5e1c: "Zhi " -0x5e1d: "Di " -0x5e1e: "Mo " -0x5e1f: "Yi " -0x5e20: "Yi " -0x5e21: "Ping " -0x5e22: "Qia " -0x5e23: "Juan " -0x5e24: "Ru " -0x5e25: "Shuai " -0x5e26: "Dai " -0x5e27: "Zheng " -0x5e28: "Shui " -0x5e29: "Qiao " -0x5e2a: "Zhen " -0x5e2b: "Shi " -0x5e2c: "Qun " -0x5e2d: "Xi " -0x5e2e: "Bang " -0x5e2f: "Dai " -0x5e30: "Gui " -0x5e31: "Chou " -0x5e32: "Ping " -0x5e33: "Zhang " -0x5e34: "Sha " -0x5e35: "Wan " -0x5e36: "Dai " -0x5e37: "Wei " -0x5e38: "Chang " -0x5e39: "Sha " -0x5e3a: "Qi " -0x5e3b: "Ze " -0x5e3c: "Guo " -0x5e3d: "Mao " -0x5e3e: "Du " -0x5e3f: "Hou " -0x5e40: "Zheng " -0x5e41: "Xu " -0x5e42: "Mi " -0x5e43: "Wei " -0x5e44: "Wo " -0x5e45: "Fu " -0x5e46: "Yi " -0x5e47: "Bang " -0x5e48: "Ping " -0x5e49: "Tazuna " -0x5e4a: "Gong " -0x5e4b: "Pan " -0x5e4c: "Huang " -0x5e4d: "Dao " -0x5e4e: "Mi " -0x5e4f: "Jia " -0x5e50: "Teng " -0x5e51: "Hui " -0x5e52: "Zhong " -0x5e53: "Shan " -0x5e54: "Man " -0x5e55: "Mu " -0x5e56: "Biao " -0x5e57: "Guo " -0x5e58: "Ze " -0x5e59: "Mu " -0x5e5a: "Bang " -0x5e5b: "Zhang " -0x5e5c: "Jiong " -0x5e5d: "Chan " -0x5e5e: "Fu " -0x5e5f: "Zhi " -0x5e60: "Hu " -0x5e61: "Fan " -0x5e62: "Chuang " -0x5e63: "Bi " -0x5e64: "Hei " -0x5e65: "[?] " -0x5e66: "Mi " -0x5e67: "Qiao " -0x5e68: "Chan " -0x5e69: "Fen " -0x5e6a: "Meng " -0x5e6b: "Bang " -0x5e6c: "Chou " -0x5e6d: "Mie " -0x5e6e: "Chu " -0x5e6f: "Jie " -0x5e70: "Xian " -0x5e71: "Lan " -0x5e72: "Gan " -0x5e73: "Ping " -0x5e74: "Nian " -0x5e75: "Qian " -0x5e76: "Bing " -0x5e77: "Bing " -0x5e78: "Xing " -0x5e79: "Gan " -0x5e7a: "Yao " -0x5e7b: "Huan " -0x5e7c: "You " -0x5e7d: "You " -0x5e7e: "Ji " -0x5e7f: "Yan " -0x5e80: "Pi " -0x5e81: "Ting " -0x5e82: "Ze " -0x5e83: "Guang " -0x5e84: "Zhuang " -0x5e85: "Mo " -0x5e86: "Qing " -0x5e87: "Bi " -0x5e88: "Qin " -0x5e89: "Dun " -0x5e8a: "Chuang " -0x5e8b: "Gui " -0x5e8c: "Ya " -0x5e8d: "Bai " -0x5e8e: "Jie " -0x5e8f: "Xu " -0x5e90: "Lu " -0x5e91: "Wu " -0x5e92: "[?] " -0x5e93: "Ku " -0x5e94: "Ying " -0x5e95: "Di " -0x5e96: "Pao " -0x5e97: "Dian " -0x5e98: "Ya " -0x5e99: "Miao " -0x5e9a: "Geng " -0x5e9b: "Ci " -0x5e9c: "Fu " -0x5e9d: "Tong " -0x5e9e: "Pang " -0x5e9f: "Fei " -0x5ea0: "Xiang " -0x5ea1: "Yi " -0x5ea2: "Zhi " -0x5ea3: "Tiao " -0x5ea4: "Zhi " -0x5ea5: "Xiu " -0x5ea6: "Du " -0x5ea7: "Zuo " -0x5ea8: "Xiao " -0x5ea9: "Tu " -0x5eaa: "Gui " -0x5eab: "Ku " -0x5eac: "Pang " -0x5ead: "Ting " -0x5eae: "You " -0x5eaf: "Bu " -0x5eb0: "Ding " -0x5eb1: "Cheng " -0x5eb2: "Lai " -0x5eb3: "Bei " -0x5eb4: "Ji " -0x5eb5: "An " -0x5eb6: "Shu " -0x5eb7: "Kang " -0x5eb8: "Yong " -0x5eb9: "Tuo " -0x5eba: "Song " -0x5ebb: "Shu " -0x5ebc: "Qing " -0x5ebd: "Yu " -0x5ebe: "Yu " -0x5ebf: "Miao " -0x5ec0: "Sou " -0x5ec1: "Ce " -0x5ec2: "Xiang " -0x5ec3: "Fei " -0x5ec4: "Jiu " -0x5ec5: "He " -0x5ec6: "Hui " -0x5ec7: "Liu " -0x5ec8: "Sha " -0x5ec9: "Lian " -0x5eca: "Lang " -0x5ecb: "Sou " -0x5ecc: "Jian " -0x5ecd: "Pou " -0x5ece: "Qing " -0x5ecf: "Jiu " -0x5ed0: "Jiu " -0x5ed1: "Qin " -0x5ed2: "Ao " -0x5ed3: "Kuo " -0x5ed4: "Lou " -0x5ed5: "Yin " -0x5ed6: "Liao " -0x5ed7: "Dai " -0x5ed8: "Lu " -0x5ed9: "Yi " -0x5eda: "Chu " -0x5edb: "Chan " -0x5edc: "Tu " -0x5edd: "Si " -0x5ede: "Xin " -0x5edf: "Miao " -0x5ee0: "Chang " -0x5ee1: "Wu " -0x5ee2: "Fei " -0x5ee3: "Guang " -0x5ee4: "Koc " -0x5ee5: "Kuai " -0x5ee6: "Bi " -0x5ee7: "Qiang " -0x5ee8: "Xie " -0x5ee9: "Lin " -0x5eea: "Lin " -0x5eeb: "Liao " -0x5eec: "Lu " -0x5eed: "[?] " -0x5eee: "Ying " -0x5eef: "Xian " -0x5ef0: "Ting " -0x5ef1: "Yong " -0x5ef2: "Li " -0x5ef3: "Ting " -0x5ef4: "Yin " -0x5ef5: "Xun " -0x5ef6: "Yan " -0x5ef7: "Ting " -0x5ef8: "Di " -0x5ef9: "Po " -0x5efa: "Jian " -0x5efb: "Hui " -0x5efc: "Nai " -0x5efd: "Hui " -0x5efe: "Gong " -0x5eff: "Nian " -/* x05f */ -0x5f00: "Kai " -0x5f01: "Bian " -0x5f02: "Yi " -0x5f03: "Qi " -0x5f04: "Nong " -0x5f05: "Fen " -0x5f06: "Ju " -0x5f07: "Yan " -0x5f08: "Yi " -0x5f09: "Zang " -0x5f0a: "Bi " -0x5f0b: "Yi " -0x5f0c: "Yi " -0x5f0d: "Er " -0x5f0e: "San " -0x5f0f: "Shi " -0x5f10: "Er " -0x5f11: "Shi " -0x5f12: "Shi " -0x5f13: "Gong " -0x5f14: "Diao " -0x5f15: "Yin " -0x5f16: "Hu " -0x5f17: "Fu " -0x5f18: "Hong " -0x5f19: "Wu " -0x5f1a: "Tui " -0x5f1b: "Chi " -0x5f1c: "Jiang " -0x5f1d: "Ba " -0x5f1e: "Shen " -0x5f1f: "Di " -0x5f20: "Zhang " -0x5f21: "Jue " -0x5f22: "Tao " -0x5f23: "Fu " -0x5f24: "Di " -0x5f25: "Mi " -0x5f26: "Xian " -0x5f27: "Hu " -0x5f28: "Chao " -0x5f29: "Nu " -0x5f2a: "Jing " -0x5f2b: "Zhen " -0x5f2c: "Yi " -0x5f2d: "Mi " -0x5f2e: "Quan " -0x5f2f: "Wan " -0x5f30: "Shao " -0x5f31: "Ruo " -0x5f32: "Xuan " -0x5f33: "Jing " -0x5f34: "Dun " -0x5f35: "Zhang " -0x5f36: "Jiang " -0x5f37: "Qiang " -0x5f38: "Peng " -0x5f39: "Dan " -0x5f3a: "Qiang " -0x5f3b: "Bi " -0x5f3c: "Bi " -0x5f3d: "She " -0x5f3e: "Dan " -0x5f3f: "Jian " -0x5f40: "Gou " -0x5f41: "Sei " -0x5f42: "Fa " -0x5f43: "Bi " -0x5f44: "Kou " -0x5f45: "Nagi " -0x5f46: "Bie " -0x5f47: "Xiao " -0x5f48: "Dan " -0x5f49: "Kuo " -0x5f4a: "Qiang " -0x5f4b: "Hong " -0x5f4c: "Mi " -0x5f4d: "Kuo " -0x5f4e: "Wan " -0x5f4f: "Jue " -0x5f50: "Ji " -0x5f51: "Ji " -0x5f52: "Gui " -0x5f53: "Dang " -0x5f54: "Lu " -0x5f55: "Lu " -0x5f56: "Tuan " -0x5f57: "Hui " -0x5f58: "Zhi " -0x5f59: "Hui " -0x5f5a: "Hui " -0x5f5b: "Yi " -0x5f5c: "Yi " -0x5f5d: "Yi " -0x5f5e: "Yi " -0x5f5f: "Huo " -0x5f60: "Huo " -0x5f61: "Shan " -0x5f62: "Xing " -0x5f63: "Wen " -0x5f64: "Tong " -0x5f65: "Yan " -0x5f66: "Yan " -0x5f67: "Yu " -0x5f68: "Chi " -0x5f69: "Cai " -0x5f6a: "Biao " -0x5f6b: "Diao " -0x5f6c: "Bin " -0x5f6d: "Peng " -0x5f6e: "Yong " -0x5f6f: "Piao " -0x5f70: "Zhang " -0x5f71: "Ying " -0x5f72: "Chi " -0x5f73: "Chi " -0x5f74: "Zhuo " -0x5f75: "Tuo " -0x5f76: "Ji " -0x5f77: "Pang " -0x5f78: "Zhong " -0x5f79: "Yi " -0x5f7a: "Wang " -0x5f7b: "Che " -0x5f7c: "Bi " -0x5f7d: "Chi " -0x5f7e: "Ling " -0x5f7f: "Fu " -0x5f80: "Wang " -0x5f81: "Zheng " -0x5f82: "Cu " -0x5f83: "Wang " -0x5f84: "Jing " -0x5f85: "Dai " -0x5f86: "Xi " -0x5f87: "Xun " -0x5f88: "Hen " -0x5f89: "Yang " -0x5f8a: "Huai " -0x5f8b: "Lu " -0x5f8c: "Hou " -0x5f8d: "Wa " -0x5f8e: "Cheng " -0x5f8f: "Zhi " -0x5f90: "Xu " -0x5f91: "Jing " -0x5f92: "Tu " -0x5f93: "Cong " -0x5f94: "[?] " -0x5f95: "Lai " -0x5f96: "Cong " -0x5f97: "De " -0x5f98: "Pai " -0x5f99: "Xi " -0x5f9a: "[?] " -0x5f9b: "Qi " -0x5f9c: "Chang " -0x5f9d: "Zhi " -0x5f9e: "Cong " -0x5f9f: "Zhou " -0x5fa0: "Lai " -0x5fa1: "Yu " -0x5fa2: "Xie " -0x5fa3: "Jie " -0x5fa4: "Jian " -0x5fa5: "Chi " -0x5fa6: "Jia " -0x5fa7: "Bian " -0x5fa8: "Huang " -0x5fa9: "Fu " -0x5faa: "Xun " -0x5fab: "Wei " -0x5fac: "Pang " -0x5fad: "Yao " -0x5fae: "Wei " -0x5faf: "Xi " -0x5fb0: "Zheng " -0x5fb1: "Piao " -0x5fb2: "Chi " -0x5fb3: "De " -0x5fb4: "Zheng " -0x5fb5: "Zheng " -0x5fb6: "Bie " -0x5fb7: "De " -0x5fb8: "Chong " -0x5fb9: "Che " -0x5fba: "Jiao " -0x5fbb: "Wei " -0x5fbc: "Jiao " -0x5fbd: "Hui " -0x5fbe: "Mei " -0x5fbf: "Long " -0x5fc0: "Xiang " -0x5fc1: "Bao " -0x5fc2: "Qu " -0x5fc3: "Xin " -0x5fc4: "Shu " -0x5fc5: "Bi " -0x5fc6: "Yi " -0x5fc7: "Le " -0x5fc8: "Ren " -0x5fc9: "Dao " -0x5fca: "Ding " -0x5fcb: "Gai " -0x5fcc: "Ji " -0x5fcd: "Ren " -0x5fce: "Ren " -0x5fcf: "Chan " -0x5fd0: "Tan " -0x5fd1: "Te " -0x5fd2: "Te " -0x5fd3: "Gan " -0x5fd4: "Qi " -0x5fd5: "Shi " -0x5fd6: "Cun " -0x5fd7: "Zhi " -0x5fd8: "Wang " -0x5fd9: "Mang " -0x5fda: "Xi " -0x5fdb: "Fan " -0x5fdc: "Ying " -0x5fdd: "Tian " -0x5fde: "Min " -0x5fdf: "Min " -0x5fe0: "Zhong " -0x5fe1: "Chong " -0x5fe2: "Wu " -0x5fe3: "Ji " -0x5fe4: "Wu " -0x5fe5: "Xi " -0x5fe6: "Ye " -0x5fe7: "You " -0x5fe8: "Wan " -0x5fe9: "Cong " -0x5fea: "Zhong " -0x5feb: "Kuai " -0x5fec: "Yu " -0x5fed: "Bian " -0x5fee: "Zhi " -0x5fef: "Qi " -0x5ff0: "Cui " -0x5ff1: "Chen " -0x5ff2: "Tai " -0x5ff3: "Tun " -0x5ff4: "Qian " -0x5ff5: "Nian " -0x5ff6: "Hun " -0x5ff7: "Xiong " -0x5ff8: "Niu " -0x5ff9: "Wang " -0x5ffa: "Xian " -0x5ffb: "Xin " -0x5ffc: "Kang " -0x5ffd: "Hu " -0x5ffe: "Kai " -0x5fff: "Fen " -/* x060 */ -0x6000: "Huai " -0x6001: "Tai " -0x6002: "Song " -0x6003: "Wu " -0x6004: "Ou " -0x6005: "Chang " -0x6006: "Chuang " -0x6007: "Ju " -0x6008: "Yi " -0x6009: "Bao " -0x600a: "Chao " -0x600b: "Min " -0x600c: "Pei " -0x600d: "Zuo " -0x600e: "Zen " -0x600f: "Yang " -0x6010: "Kou " -0x6011: "Ban " -0x6012: "Nu " -0x6013: "Nao " -0x6014: "Zheng " -0x6015: "Pa " -0x6016: "Bu " -0x6017: "Tie " -0x6018: "Gu " -0x6019: "Hu " -0x601a: "Ju " -0x601b: "Da " -0x601c: "Lian " -0x601d: "Si " -0x601e: "Chou " -0x601f: "Di " -0x6020: "Dai " -0x6021: "Yi " -0x6022: "Tu " -0x6023: "You " -0x6024: "Fu " -0x6025: "Ji " -0x6026: "Peng " -0x6027: "Xing " -0x6028: "Yuan " -0x6029: "Ni " -0x602a: "Guai " -0x602b: "Fu " -0x602c: "Xi " -0x602d: "Bi " -0x602e: "You " -0x602f: "Qie " -0x6030: "Xuan " -0x6031: "Cong " -0x6032: "Bing " -0x6033: "Huang " -0x6034: "Xu " -0x6035: "Chu " -0x6036: "Pi " -0x6037: "Xi " -0x6038: "Xi " -0x6039: "Tan " -0x603a: "Koraeru " -0x603b: "Zong " -0x603c: "Dui " -0x603d: "[?] " -0x603e: "Ki " -0x603f: "Yi " -0x6040: "Chi " -0x6041: "Ren " -0x6042: "Xun " -0x6043: "Shi " -0x6044: "Xi " -0x6045: "Lao " -0x6046: "Heng " -0x6047: "Kuang " -0x6048: "Mu " -0x6049: "Zhi " -0x604a: "Xie " -0x604b: "Lian " -0x604c: "Tiao " -0x604d: "Huang " -0x604e: "Die " -0x604f: "Hao " -0x6050: "Kong " -0x6051: "Gui " -0x6052: "Heng " -0x6053: "Xi " -0x6054: "Xiao " -0x6055: "Shu " -0x6056: "S " -0x6057: "Kua " -0x6058: "Qiu " -0x6059: "Yang " -0x605a: "Hui " -0x605b: "Hui " -0x605c: "Chi " -0x605d: "Jia " -0x605e: "Yi " -0x605f: "Xiong " -0x6060: "Guai " -0x6061: "Lin " -0x6062: "Hui " -0x6063: "Zi " -0x6064: "Xu " -0x6065: "Chi " -0x6066: "Xiang " -0x6067: "Nu " -0x6068: "Hen " -0x6069: "En " -0x606a: "Ke " -0x606b: "Tong " -0x606c: "Tian " -0x606d: "Gong " -0x606e: "Quan " -0x606f: "Xi " -0x6070: "Qia " -0x6071: "Yue " -0x6072: "Peng " -0x6073: "Ken " -0x6074: "De " -0x6075: "Hui " -0x6076: "E " -0x6077: "Kyuu " -0x6078: "Tong " -0x6079: "Yan " -0x607a: "Kai " -0x607b: "Ce " -0x607c: "Nao " -0x607d: "Yun " -0x607e: "Mang " -0x607f: "Yong " -0x6080: "Yong " -0x6081: "Yuan " -0x6082: "Pi " -0x6083: "Kun " -0x6084: "Qiao " -0x6085: "Yue " -0x6086: "Yu " -0x6087: "Yu " -0x6088: "Jie " -0x6089: "Xi " -0x608a: "Zhe " -0x608b: "Lin " -0x608c: "Ti " -0x608d: "Han " -0x608e: "Hao " -0x608f: "Qie " -0x6090: "Ti " -0x6091: "Bu " -0x6092: "Yi " -0x6093: "Qian " -0x6094: "Hui " -0x6095: "Xi " -0x6096: "Bei " -0x6097: "Man " -0x6098: "Yi " -0x6099: "Heng " -0x609a: "Song " -0x609b: "Quan " -0x609c: "Cheng " -0x609d: "Hui " -0x609e: "Wu " -0x609f: "Wu " -0x60a0: "You " -0x60a1: "Li " -0x60a2: "Liang " -0x60a3: "Huan " -0x60a4: "Cong " -0x60a5: "Yi " -0x60a6: "Yue " -0x60a7: "Li " -0x60a8: "Nin " -0x60a9: "Nao " -0x60aa: "E " -0x60ab: "Que " -0x60ac: "Xuan " -0x60ad: "Qian " -0x60ae: "Wu " -0x60af: "Min " -0x60b0: "Cong " -0x60b1: "Fei " -0x60b2: "Bei " -0x60b3: "Duo " -0x60b4: "Cui " -0x60b5: "Chang " -0x60b6: "Men " -0x60b7: "Li " -0x60b8: "Ji " -0x60b9: "Guan " -0x60ba: "Guan " -0x60bb: "Xing " -0x60bc: "Dao " -0x60bd: "Qi " -0x60be: "Kong " -0x60bf: "Tian " -0x60c0: "Lun " -0x60c1: "Xi " -0x60c2: "Kan " -0x60c3: "Kun " -0x60c4: "Ni " -0x60c5: "Qing " -0x60c6: "Chou " -0x60c7: "Dun " -0x60c8: "Guo " -0x60c9: "Chan " -0x60ca: "Liang " -0x60cb: "Wan " -0x60cc: "Yuan " -0x60cd: "Jin " -0x60ce: "Ji " -0x60cf: "Lin " -0x60d0: "Yu " -0x60d1: "Huo " -0x60d2: "He " -0x60d3: "Quan " -0x60d4: "Tan " -0x60d5: "Ti " -0x60d6: "Ti " -0x60d7: "Nie " -0x60d8: "Wang " -0x60d9: "Chuo " -0x60da: "Bu " -0x60db: "Hun " -0x60dc: "Xi " -0x60dd: "Tang " -0x60de: "Xin " -0x60df: "Wei " -0x60e0: "Hui " -0x60e1: "E " -0x60e2: "Rui " -0x60e3: "Zong " -0x60e4: "Jian " -0x60e5: "Yong " -0x60e6: "Dian " -0x60e7: "Ju " -0x60e8: "Can " -0x60e9: "Cheng " -0x60ea: "De " -0x60eb: "Bei " -0x60ec: "Qie " -0x60ed: "Can " -0x60ee: "Dan " -0x60ef: "Guan " -0x60f0: "Duo " -0x60f1: "Nao " -0x60f2: "Yun " -0x60f3: "Xiang " -0x60f4: "Zhui " -0x60f5: "Die " -0x60f6: "Huang " -0x60f7: "Chun " -0x60f8: "Qiong " -0x60f9: "Re " -0x60fa: "Xing " -0x60fb: "Ce " -0x60fc: "Bian " -0x60fd: "Hun " -0x60fe: "Zong " -0x60ff: "Ti " -/* x061 */ -0x6100: "Qiao " -0x6101: "Chou " -0x6102: "Bei " -0x6103: "Xuan " -0x6104: "Wei " -0x6105: "Ge " -0x6106: "Qian " -0x6107: "Wei " -0x6108: "Yu " -0x6109: "Yu " -0x610a: "Bi " -0x610b: "Xuan " -0x610c: "Huan " -0x610d: "Min " -0x610e: "Bi " -0x610f: "Yi " -0x6110: "Mian " -0x6111: "Yong " -0x6112: "Kai " -0x6113: "Dang " -0x6114: "Yin " -0x6115: "E " -0x6116: "Chen " -0x6117: "Mou " -0x6118: "Ke " -0x6119: "Ke " -0x611a: "Yu " -0x611b: "Ai " -0x611c: "Qie " -0x611d: "Yan " -0x611e: "Nuo " -0x611f: "Gan " -0x6120: "Yun " -0x6121: "Zong " -0x6122: "Sai " -0x6123: "Leng " -0x6124: "Fen " -0x6125: "[?] " -0x6126: "Kui " -0x6127: "Kui " -0x6128: "Que " -0x6129: "Gong " -0x612a: "Yun " -0x612b: "Su " -0x612c: "Su " -0x612d: "Qi " -0x612e: "Yao " -0x612f: "Song " -0x6130: "Huang " -0x6131: "Ji " -0x6132: "Gu " -0x6133: "Ju " -0x6134: "Chuang " -0x6135: "Ni " -0x6136: "Xie " -0x6137: "Kai " -0x6138: "Zheng " -0x6139: "Yong " -0x613a: "Cao " -0x613b: "Sun " -0x613c: "Shen " -0x613d: "Bo " -0x613e: "Kai " -0x613f: "Yuan " -0x6140: "Xie " -0x6141: "Hun " -0x6142: "Yong " -0x6143: "Yang " -0x6144: "Li " -0x6145: "Sao " -0x6146: "Tao " -0x6147: "Yin " -0x6148: "Ci " -0x6149: "Xu " -0x614a: "Qian " -0x614b: "Tai " -0x614c: "Huang " -0x614d: "Yun " -0x614e: "Shen " -0x614f: "Ming " -0x6150: "[?] " -0x6151: "She " -0x6152: "Cong " -0x6153: "Piao " -0x6154: "Mo " -0x6155: "Mu " -0x6156: "Guo " -0x6157: "Chi " -0x6158: "Can " -0x6159: "Can " -0x615a: "Can " -0x615b: "Cui " -0x615c: "Min " -0x615d: "Te " -0x615e: "Zhang " -0x615f: "Tong " -0x6160: "Ao " -0x6161: "Shuang " -0x6162: "Man " -0x6163: "Guan " -0x6164: "Que " -0x6165: "Zao " -0x6166: "Jiu " -0x6167: "Hui " -0x6168: "Kai " -0x6169: "Lian " -0x616a: "Ou " -0x616b: "Song " -0x616c: "Jin " -0x616d: "Yin " -0x616e: "Lu " -0x616f: "Shang " -0x6170: "Wei " -0x6171: "Tuan " -0x6172: "Man " -0x6173: "Qian " -0x6174: "She " -0x6175: "Yong " -0x6176: "Qing " -0x6177: "Kang " -0x6178: "Di " -0x6179: "Zhi " -0x617a: "Lou " -0x617b: "Juan " -0x617c: "Qi " -0x617d: "Qi " -0x617e: "Yu " -0x617f: "Ping " -0x6180: "Liao " -0x6181: "Cong " -0x6182: "You " -0x6183: "Chong " -0x6184: "Zhi " -0x6185: "Tong " -0x6186: "Cheng " -0x6187: "Qi " -0x6188: "Qu " -0x6189: "Peng " -0x618a: "Bei " -0x618b: "Bie " -0x618c: "Chun " -0x618d: "Jiao " -0x618e: "Zeng " -0x618f: "Chi " -0x6190: "Lian " -0x6191: "Ping " -0x6192: "Kui " -0x6193: "Hui " -0x6194: "Qiao " -0x6195: "Cheng " -0x6196: "Yin " -0x6197: "Yin " -0x6198: "Xi " -0x6199: "Xi " -0x619a: "Dan " -0x619b: "Tan " -0x619c: "Duo " -0x619d: "Dui " -0x619e: "Dui " -0x619f: "Su " -0x61a0: "Jue " -0x61a1: "Ce " -0x61a2: "Xiao " -0x61a3: "Fan " -0x61a4: "Fen " -0x61a5: "Lao " -0x61a6: "Lao " -0x61a7: "Chong " -0x61a8: "Han " -0x61a9: "Qi " -0x61aa: "Xian " -0x61ab: "Min " -0x61ac: "Jing " -0x61ad: "Liao " -0x61ae: "Wu " -0x61af: "Can " -0x61b0: "Jue " -0x61b1: "Cu " -0x61b2: "Xian " -0x61b3: "Tan " -0x61b4: "Sheng " -0x61b5: "Pi " -0x61b6: "Yi " -0x61b7: "Chu " -0x61b8: "Xian " -0x61b9: "Nao " -0x61ba: "Dan " -0x61bb: "Tan " -0x61bc: "Jing " -0x61bd: "Song " -0x61be: "Han " -0x61bf: "Jiao " -0x61c0: "Wai " -0x61c1: "Huan " -0x61c2: "Dong " -0x61c3: "Qin " -0x61c4: "Qin " -0x61c5: "Qu " -0x61c6: "Cao " -0x61c7: "Ken " -0x61c8: "Xie " -0x61c9: "Ying " -0x61ca: "Ao " -0x61cb: "Mao " -0x61cc: "Yi " -0x61cd: "Lin " -0x61ce: "Se " -0x61cf: "Jun " -0x61d0: "Huai " -0x61d1: "Men " -0x61d2: "Lan " -0x61d3: "Ai " -0x61d4: "Lin " -0x61d5: "Yan " -0x61d6: "Gua " -0x61d7: "Xia " -0x61d8: "Chi " -0x61d9: "Yu " -0x61da: "Yin " -0x61db: "Dai " -0x61dc: "Meng " -0x61dd: "Ai " -0x61de: "Meng " -0x61df: "Dui " -0x61e0: "Qi " -0x61e1: "Mo " -0x61e2: "Lan " -0x61e3: "Men " -0x61e4: "Chou " -0x61e5: "Zhi " -0x61e6: "Nuo " -0x61e7: "Nuo " -0x61e8: "Yan " -0x61e9: "Yang " -0x61ea: "Bo " -0x61eb: "Zhi " -0x61ec: "Kuang " -0x61ed: "Kuang " -0x61ee: "You " -0x61ef: "Fu " -0x61f0: "Liu " -0x61f1: "Mie " -0x61f2: "Cheng " -0x61f3: "[?] " -0x61f4: "Chan " -0x61f5: "Meng " -0x61f6: "Lan " -0x61f7: "Huai " -0x61f8: "Xuan " -0x61f9: "Rang " -0x61fa: "Chan " -0x61fb: "Ji " -0x61fc: "Ju " -0x61fd: "Huan " -0x61fe: "She " -0x61ff: "Yi " -/* x062 */ -0x6200: "Lian " -0x6201: "Nan " -0x6202: "Mi " -0x6203: "Tang " -0x6204: "Jue " -0x6205: "Gang " -0x6206: "Gang " -0x6207: "Gang " -0x6208: "Ge " -0x6209: "Yue " -0x620a: "Wu " -0x620b: "Jian " -0x620c: "Xu " -0x620d: "Shu " -0x620e: "Rong " -0x620f: "Xi " -0x6210: "Cheng " -0x6211: "Wo " -0x6212: "Jie " -0x6213: "Ge " -0x6214: "Jian " -0x6215: "Qiang " -0x6216: "Huo " -0x6217: "Qiang " -0x6218: "Zhan " -0x6219: "Dong " -0x621a: "Qi " -0x621b: "Jia " -0x621c: "Die " -0x621d: "Zei " -0x621e: "Jia " -0x621f: "Ji " -0x6220: "Shi " -0x6221: "Kan " -0x6222: "Ji " -0x6223: "Kui " -0x6224: "Gai " -0x6225: "Deng " -0x6226: "Zhan " -0x6227: "Chuang " -0x6228: "Ge " -0x6229: "Jian " -0x622a: "Jie " -0x622b: "Yu " -0x622c: "Jian " -0x622d: "Yan " -0x622e: "Lu " -0x622f: "Xi " -0x6230: "Zhan " -0x6231: "Xi " -0x6232: "Xi " -0x6233: "Chuo " -0x6234: "Dai " -0x6235: "Qu " -0x6236: "Hu " -0x6237: "Hu " -0x6238: "Hu " -0x6239: "E " -0x623a: "Shi " -0x623b: "Li " -0x623c: "Mao " -0x623d: "Hu " -0x623e: "Li " -0x623f: "Fang " -0x6240: "Suo " -0x6241: "Bian " -0x6242: "Dian " -0x6243: "Jiong " -0x6244: "Shang " -0x6245: "Yi " -0x6246: "Yi " -0x6247: "Shan " -0x6248: "Hu " -0x6249: "Fei " -0x624a: "Yan " -0x624b: "Shou " -0x624c: "T " -0x624d: "Cai " -0x624e: "Zha " -0x624f: "Qiu " -0x6250: "Le " -0x6251: "Bu " -0x6252: "Ba " -0x6253: "Da " -0x6254: "Reng " -0x6255: "Fu " -0x6256: "Hameru " -0x6257: "Zai " -0x6258: "Tuo " -0x6259: "Zhang " -0x625a: "Diao " -0x625b: "Kang " -0x625c: "Yu " -0x625d: "Ku " -0x625e: "Han " -0x625f: "Shen " -0x6260: "Cha " -0x6261: "Yi " -0x6262: "Gu " -0x6263: "Kou " -0x6264: "Wu " -0x6265: "Tuo " -0x6266: "Qian " -0x6267: "Zhi " -0x6268: "Ren " -0x6269: "Kuo " -0x626a: "Men " -0x626b: "Sao " -0x626c: "Yang " -0x626d: "Niu " -0x626e: "Ban " -0x626f: "Che " -0x6270: "Rao " -0x6271: "Xi " -0x6272: "Qian " -0x6273: "Ban " -0x6274: "Jia " -0x6275: "Yu " -0x6276: "Fu " -0x6277: "Ao " -0x6278: "Xi " -0x6279: "Pi " -0x627a: "Zhi " -0x627b: "Zi " -0x627c: "E " -0x627d: "Dun " -0x627e: "Zhao " -0x627f: "Cheng " -0x6280: "Ji " -0x6281: "Yan " -0x6282: "Kuang " -0x6283: "Bian " -0x6284: "Chao " -0x6285: "Ju " -0x6286: "Wen " -0x6287: "Hu " -0x6288: "Yue " -0x6289: "Jue " -0x628a: "Ba " -0x628b: "Qin " -0x628c: "Zhen " -0x628d: "Zheng " -0x628e: "Yun " -0x628f: "Wan " -0x6290: "Nu " -0x6291: "Yi " -0x6292: "Shu " -0x6293: "Zhua " -0x6294: "Pou " -0x6295: "Tou " -0x6296: "Dou " -0x6297: "Kang " -0x6298: "Zhe " -0x6299: "Pou " -0x629a: "Fu " -0x629b: "Pao " -0x629c: "Ba " -0x629d: "Ao " -0x629e: "Ze " -0x629f: "Tuan " -0x62a0: "Kou " -0x62a1: "Lun " -0x62a2: "Qiang " -0x62a3: "[?] " -0x62a4: "Hu " -0x62a5: "Bao " -0x62a6: "Bing " -0x62a7: "Zhi " -0x62a8: "Peng " -0x62a9: "Tan " -0x62aa: "Pu " -0x62ab: "Pi " -0x62ac: "Tai " -0x62ad: "Yao " -0x62ae: "Zhen " -0x62af: "Zha " -0x62b0: "Yang " -0x62b1: "Bao " -0x62b2: "He " -0x62b3: "Ni " -0x62b4: "Yi " -0x62b5: "Di " -0x62b6: "Chi " -0x62b7: "Pi " -0x62b8: "Za " -0x62b9: "Mo " -0x62ba: "Mo " -0x62bb: "Shen " -0x62bc: "Ya " -0x62bd: "Chou " -0x62be: "Qu " -0x62bf: "Min " -0x62c0: "Chu " -0x62c1: "Jia " -0x62c2: "Fu " -0x62c3: "Zhan " -0x62c4: "Zhu " -0x62c5: "Dan " -0x62c6: "Chai " -0x62c7: "Mu " -0x62c8: "Nian " -0x62c9: "La " -0x62ca: "Fu " -0x62cb: "Pao " -0x62cc: "Ban " -0x62cd: "Pai " -0x62ce: "Ling " -0x62cf: "Na " -0x62d0: "Guai " -0x62d1: "Qian " -0x62d2: "Ju " -0x62d3: "Tuo " -0x62d4: "Ba " -0x62d5: "Tuo " -0x62d6: "Tuo " -0x62d7: "Ao " -0x62d8: "Ju " -0x62d9: "Zhuo " -0x62da: "Pan " -0x62db: "Zhao " -0x62dc: "Bai " -0x62dd: "Bai " -0x62de: "Di " -0x62df: "Ni " -0x62e0: "Ju " -0x62e1: "Kuo " -0x62e2: "Long " -0x62e3: "Jian " -0x62e4: "[?] " -0x62e5: "Yong " -0x62e6: "Lan " -0x62e7: "Ning " -0x62e8: "Bo " -0x62e9: "Ze " -0x62ea: "Qian " -0x62eb: "Hen " -0x62ec: "Gua " -0x62ed: "Shi " -0x62ee: "Jie " -0x62ef: "Zheng " -0x62f0: "Nin " -0x62f1: "Gong " -0x62f2: "Gong " -0x62f3: "Quan " -0x62f4: "Shuan " -0x62f5: "Cun " -0x62f6: "Zan " -0x62f7: "Kao " -0x62f8: "Chi " -0x62f9: "Xie " -0x62fa: "Ce " -0x62fb: "Hui " -0x62fc: "Pin " -0x62fd: "Zhuai " -0x62fe: "Shi " -0x62ff: "Na " -/* x063 */ -0x6300: "Bo " -0x6301: "Chi " -0x6302: "Gua " -0x6303: "Zhi " -0x6304: "Kuo " -0x6305: "Duo " -0x6306: "Duo " -0x6307: "Zhi " -0x6308: "Qie " -0x6309: "An " -0x630a: "Nong " -0x630b: "Zhen " -0x630c: "Ge " -0x630d: "Jiao " -0x630e: "Ku " -0x630f: "Dong " -0x6310: "Ru " -0x6311: "Tiao " -0x6312: "Lie " -0x6313: "Zha " -0x6314: "Lu " -0x6315: "Die " -0x6316: "Wa " -0x6317: "Jue " -0x6318: "Mushiru " -0x6319: "Ju " -0x631a: "Zhi " -0x631b: "Luan " -0x631c: "Ya " -0x631d: "Zhua " -0x631e: "Ta " -0x631f: "Xie " -0x6320: "Nao " -0x6321: "Dang " -0x6322: "Jiao " -0x6323: "Zheng " -0x6324: "Ji " -0x6325: "Hui " -0x6326: "Xun " -0x6327: "Ku " -0x6328: "Ai " -0x6329: "Tuo " -0x632a: "Nuo " -0x632b: "Cuo " -0x632c: "Bo " -0x632d: "Geng " -0x632e: "Ti " -0x632f: "Zhen " -0x6330: "Cheng " -0x6331: "Suo " -0x6332: "Suo " -0x6333: "Keng " -0x6334: "Mei " -0x6335: "Long " -0x6336: "Ju " -0x6337: "Peng " -0x6338: "Jian " -0x6339: "Yi " -0x633a: "Ting " -0x633b: "Shan " -0x633c: "Nuo " -0x633d: "Wan " -0x633e: "Xie " -0x633f: "Cha " -0x6340: "Feng " -0x6341: "Jiao " -0x6342: "Wu " -0x6343: "Jun " -0x6344: "Jiu " -0x6345: "Tong " -0x6346: "Kun " -0x6347: "Huo " -0x6348: "Tu " -0x6349: "Zhuo " -0x634a: "Pou " -0x634b: "Le " -0x634c: "Ba " -0x634d: "Han " -0x634e: "Shao " -0x634f: "Nie " -0x6350: "Juan " -0x6351: "Ze " -0x6352: "Song " -0x6353: "Ye " -0x6354: "Jue " -0x6355: "Bu " -0x6356: "Huan " -0x6357: "Bu " -0x6358: "Zun " -0x6359: "Yi " -0x635a: "Zhai " -0x635b: "Lu " -0x635c: "Sou " -0x635d: "Tuo " -0x635e: "Lao " -0x635f: "Sun " -0x6360: "Bang " -0x6361: "Jian " -0x6362: "Huan " -0x6363: "Dao " -0x6364: "[?] " -0x6365: "Wan " -0x6366: "Qin " -0x6367: "Peng " -0x6368: "She " -0x6369: "Lie " -0x636a: "Min " -0x636b: "Men " -0x636c: "Fu " -0x636d: "Bai " -0x636e: "Ju " -0x636f: "Dao " -0x6370: "Wo " -0x6371: "Ai " -0x6372: "Juan " -0x6373: "Yue " -0x6374: "Zong " -0x6375: "Chen " -0x6376: "Chui " -0x6377: "Jie " -0x6378: "Tu " -0x6379: "Ben " -0x637a: "Na " -0x637b: "Nian " -0x637c: "Nuo " -0x637d: "Zu " -0x637e: "Wo " -0x637f: "Xi " -0x6380: "Xian " -0x6381: "Cheng " -0x6382: "Dian " -0x6383: "Sao " -0x6384: "Lun " -0x6385: "Qing " -0x6386: "Gang " -0x6387: "Duo " -0x6388: "Shou " -0x6389: "Diao " -0x638a: "Pou " -0x638b: "Di " -0x638c: "Zhang " -0x638d: "Gun " -0x638e: "Ji " -0x638f: "Tao " -0x6390: "Qia " -0x6391: "Qi " -0x6392: "Pai " -0x6393: "Shu " -0x6394: "Qian " -0x6395: "Ling " -0x6396: "Yi " -0x6397: "Ya " -0x6398: "Jue " -0x6399: "Zheng " -0x639a: "Liang " -0x639b: "Gua " -0x639c: "Yi " -0x639d: "Huo " -0x639e: "Shan " -0x639f: "Zheng " -0x63a0: "Lue " -0x63a1: "Cai " -0x63a2: "Tan " -0x63a3: "Che " -0x63a4: "Bing " -0x63a5: "Jie " -0x63a6: "Ti " -0x63a7: "Kong " -0x63a8: "Tui " -0x63a9: "Yan " -0x63aa: "Cuo " -0x63ab: "Zou " -0x63ac: "Ju " -0x63ad: "Tian " -0x63ae: "Qian " -0x63af: "Ken " -0x63b0: "Bai " -0x63b1: "Shou " -0x63b2: "Jie " -0x63b3: "Lu " -0x63b4: "Guo " -0x63b5: "Haba " -0x63b6: "[?] " -0x63b7: "Zhi " -0x63b8: "Dan " -0x63b9: "Mang " -0x63ba: "Xian " -0x63bb: "Sao " -0x63bc: "Guan " -0x63bd: "Peng " -0x63be: "Yuan " -0x63bf: "Nuo " -0x63c0: "Jian " -0x63c1: "Zhen " -0x63c2: "Jiu " -0x63c3: "Jian " -0x63c4: "Yu " -0x63c5: "Yan " -0x63c6: "Kui " -0x63c7: "Nan " -0x63c8: "Hong " -0x63c9: "Rou " -0x63ca: "Pi " -0x63cb: "Wei " -0x63cc: "Sai " -0x63cd: "Zou " -0x63ce: "Xuan " -0x63cf: "Miao " -0x63d0: "Ti " -0x63d1: "Nie " -0x63d2: "Cha " -0x63d3: "Shi " -0x63d4: "Zong " -0x63d5: "Zhen " -0x63d6: "Yi " -0x63d7: "Shun " -0x63d8: "Heng " -0x63d9: "Bian " -0x63da: "Yang " -0x63db: "Huan " -0x63dc: "Yan " -0x63dd: "Zuan " -0x63de: "An " -0x63df: "Xu " -0x63e0: "Ya " -0x63e1: "Wo " -0x63e2: "Ke " -0x63e3: "Chuai " -0x63e4: "Ji " -0x63e5: "Ti " -0x63e6: "La " -0x63e7: "La " -0x63e8: "Cheng " -0x63e9: "Kai " -0x63ea: "Jiu " -0x63eb: "Jiu " -0x63ec: "Tu " -0x63ed: "Jie " -0x63ee: "Hui " -0x63ef: "Geng " -0x63f0: "Chong " -0x63f1: "Shuo " -0x63f2: "She " -0x63f3: "Xie " -0x63f4: "Yuan " -0x63f5: "Qian " -0x63f6: "Ye " -0x63f7: "Cha " -0x63f8: "Zha " -0x63f9: "Bei " -0x63fa: "Yao " -0x63fb: "[?] " -0x63fc: "[?] " -0x63fd: "Lan " -0x63fe: "Wen " -0x63ff: "Qin " -/* x064 */ -0x6400: "Chan " -0x6401: "Ge " -0x6402: "Lou " -0x6403: "Zong " -0x6404: "Geng " -0x6405: "Jiao " -0x6406: "Gou " -0x6407: "Qin " -0x6408: "Yong " -0x6409: "Que " -0x640a: "Chou " -0x640b: "Chi " -0x640c: "Zhan " -0x640d: "Sun " -0x640e: "Sun " -0x640f: "Bo " -0x6410: "Chu " -0x6411: "Rong " -0x6412: "Beng " -0x6413: "Cuo " -0x6414: "Sao " -0x6415: "Ke " -0x6416: "Yao " -0x6417: "Dao " -0x6418: "Zhi " -0x6419: "Nu " -0x641a: "Xie " -0x641b: "Jian " -0x641c: "Sou " -0x641d: "Qiu " -0x641e: "Gao " -0x641f: "Xian " -0x6420: "Shuo " -0x6421: "Sang " -0x6422: "Jin " -0x6423: "Mie " -0x6424: "E " -0x6425: "Chui " -0x6426: "Nuo " -0x6427: "Shan " -0x6428: "Ta " -0x6429: "Jie " -0x642a: "Tang " -0x642b: "Pan " -0x642c: "Ban " -0x642d: "Da " -0x642e: "Li " -0x642f: "Tao " -0x6430: "Hu " -0x6431: "Zhi " -0x6432: "Wa " -0x6433: "Xia " -0x6434: "Qian " -0x6435: "Wen " -0x6436: "Qiang " -0x6437: "Tian " -0x6438: "Zhen " -0x6439: "E " -0x643a: "Xi " -0x643b: "Nuo " -0x643c: "Quan " -0x643d: "Cha " -0x643e: "Zha " -0x643f: "Ge " -0x6440: "Wu " -0x6441: "En " -0x6442: "She " -0x6443: "Kang " -0x6444: "She " -0x6445: "Shu " -0x6446: "Bai " -0x6447: "Yao " -0x6448: "Bin " -0x6449: "Sou " -0x644a: "Tan " -0x644b: "Sa " -0x644c: "Chan " -0x644d: "Suo " -0x644e: "Liao " -0x644f: "Chong " -0x6450: "Chuang " -0x6451: "Guo " -0x6452: "Bing " -0x6453: "Feng " -0x6454: "Shuai " -0x6455: "Di " -0x6456: "Qi " -0x6457: "Sou " -0x6458: "Zhai " -0x6459: "Lian " -0x645a: "Tang " -0x645b: "Chi " -0x645c: "Guan " -0x645d: "Lu " -0x645e: "Luo " -0x645f: "Lou " -0x6460: "Zong " -0x6461: "Gai " -0x6462: "Hu " -0x6463: "Zha " -0x6464: "Chuang " -0x6465: "Tang " -0x6466: "Hua " -0x6467: "Cui " -0x6468: "Nai " -0x6469: "Mo " -0x646a: "Jiang " -0x646b: "Gui " -0x646c: "Ying " -0x646d: "Zhi " -0x646e: "Ao " -0x646f: "Zhi " -0x6470: "Nie " -0x6471: "Man " -0x6472: "Shan " -0x6473: "Kou " -0x6474: "Shu " -0x6475: "Suo " -0x6476: "Tuan " -0x6477: "Jiao " -0x6478: "Mo " -0x6479: "Mo " -0x647a: "Zhe " -0x647b: "Xian " -0x647c: "Keng " -0x647d: "Piao " -0x647e: "Jiang " -0x647f: "Yin " -0x6480: "Gou " -0x6481: "Qian " -0x6482: "Lue " -0x6483: "Ji " -0x6484: "Ying " -0x6485: "Jue " -0x6486: "Pie " -0x6487: "Pie " -0x6488: "Lao " -0x6489: "Dun " -0x648a: "Xian " -0x648b: "Ruan " -0x648c: "Kui " -0x648d: "Zan " -0x648e: "Yi " -0x648f: "Xun " -0x6490: "Cheng " -0x6491: "Cheng " -0x6492: "Sa " -0x6493: "Nao " -0x6494: "Heng " -0x6495: "Si " -0x6496: "Qian " -0x6497: "Huang " -0x6498: "Da " -0x6499: "Zun " -0x649a: "Nian " -0x649b: "Lin " -0x649c: "Zheng " -0x649d: "Hui " -0x649e: "Zhuang " -0x649f: "Jiao " -0x64a0: "Ji " -0x64a1: "Cao " -0x64a2: "Dan " -0x64a3: "Dan " -0x64a4: "Che " -0x64a5: "Bo " -0x64a6: "Che " -0x64a7: "Jue " -0x64a8: "Xiao " -0x64a9: "Liao " -0x64aa: "Ben " -0x64ab: "Fu " -0x64ac: "Qiao " -0x64ad: "Bo " -0x64ae: "Cuo " -0x64af: "Zhuo " -0x64b0: "Zhuan " -0x64b1: "Tuo " -0x64b2: "Pu " -0x64b3: "Qin " -0x64b4: "Dun " -0x64b5: "Nian " -0x64b6: "[?] " -0x64b7: "Xie " -0x64b8: "Lu " -0x64b9: "Jiao " -0x64ba: "Cuan " -0x64bb: "Ta " -0x64bc: "Han " -0x64bd: "Qiao " -0x64be: "Zhua " -0x64bf: "Jian " -0x64c0: "Gan " -0x64c1: "Yong " -0x64c2: "Lei " -0x64c3: "Kuo " -0x64c4: "Lu " -0x64c5: "Shan " -0x64c6: "Zhuo " -0x64c7: "Ze " -0x64c8: "Pu " -0x64c9: "Chuo " -0x64ca: "Ji " -0x64cb: "Dang " -0x64cc: "Suo " -0x64cd: "Cao " -0x64ce: "Qing " -0x64cf: "Jing " -0x64d0: "Huan " -0x64d1: "Jie " -0x64d2: "Qin " -0x64d3: "Kuai " -0x64d4: "Dan " -0x64d5: "Xi " -0x64d6: "Ge " -0x64d7: "Pi " -0x64d8: "Bo " -0x64d9: "Ao " -0x64da: "Ju " -0x64db: "Ye " -0x64dc: "[?] " -0x64dd: "Mang " -0x64de: "Sou " -0x64df: "Mi " -0x64e0: "Ji " -0x64e1: "Tai " -0x64e2: "Zhuo " -0x64e3: "Dao " -0x64e4: "Xing " -0x64e5: "Lan " -0x64e6: "Ca " -0x64e7: "Ju " -0x64e8: "Ye " -0x64e9: "Ru " -0x64ea: "Ye " -0x64eb: "Ye " -0x64ec: "Ni " -0x64ed: "Hu " -0x64ee: "Ji " -0x64ef: "Bin " -0x64f0: "Ning " -0x64f1: "Ge " -0x64f2: "Zhi " -0x64f3: "Jie " -0x64f4: "Kuo " -0x64f5: "Mo " -0x64f6: "Jian " -0x64f7: "Xie " -0x64f8: "Lie " -0x64f9: "Tan " -0x64fa: "Bai " -0x64fb: "Sou " -0x64fc: "Lu " -0x64fd: "Lue " -0x64fe: "Rao " -0x64ff: "Zhi " -/* x065 */ -0x6500: "Pan " -0x6501: "Yang " -0x6502: "Lei " -0x6503: "Sa " -0x6504: "Shu " -0x6505: "Zan " -0x6506: "Nian " -0x6507: "Xian " -0x6508: "Jun " -0x6509: "Huo " -0x650a: "Li " -0x650b: "La " -0x650c: "Han " -0x650d: "Ying " -0x650e: "Lu " -0x650f: "Long " -0x6510: "Qian " -0x6511: "Qian " -0x6512: "Zan " -0x6513: "Qian " -0x6514: "Lan " -0x6515: "San " -0x6516: "Ying " -0x6517: "Mei " -0x6518: "Rang " -0x6519: "Chan " -0x651a: "[?] " -0x651b: "Cuan " -0x651c: "Xi " -0x651d: "She " -0x651e: "Luo " -0x651f: "Jun " -0x6520: "Mi " -0x6521: "Li " -0x6522: "Zan " -0x6523: "Luan " -0x6524: "Tan " -0x6525: "Zuan " -0x6526: "Li " -0x6527: "Dian " -0x6528: "Wa " -0x6529: "Dang " -0x652a: "Jiao " -0x652b: "Jue " -0x652c: "Lan " -0x652d: "Li " -0x652e: "Nang " -0x652f: "Zhi " -0x6530: "Gui " -0x6531: "Gui " -0x6532: "Qi " -0x6533: "Xin " -0x6534: "Pu " -0x6535: "Sui " -0x6536: "Shou " -0x6537: "Kao " -0x6538: "You " -0x6539: "Gai " -0x653a: "Yi " -0x653b: "Gong " -0x653c: "Gan " -0x653d: "Ban " -0x653e: "Fang " -0x653f: "Zheng " -0x6540: "Bo " -0x6541: "Dian " -0x6542: "Kou " -0x6543: "Min " -0x6544: "Wu " -0x6545: "Gu " -0x6546: "He " -0x6547: "Ce " -0x6548: "Xiao " -0x6549: "Mi " -0x654a: "Chu " -0x654b: "Ge " -0x654c: "Di " -0x654d: "Xu " -0x654e: "Jiao " -0x654f: "Min " -0x6550: "Chen " -0x6551: "Jiu " -0x6552: "Zhen " -0x6553: "Duo " -0x6554: "Yu " -0x6555: "Chi " -0x6556: "Ao " -0x6557: "Bai " -0x6558: "Xu " -0x6559: "Jiao " -0x655a: "Duo " -0x655b: "Lian " -0x655c: "Nie " -0x655d: "Bi " -0x655e: "Chang " -0x655f: "Dian " -0x6560: "Duo " -0x6561: "Yi " -0x6562: "Gan " -0x6563: "San " -0x6564: "Ke " -0x6565: "Yan " -0x6566: "Dun " -0x6567: "Qi " -0x6568: "Dou " -0x6569: "Xiao " -0x656a: "Duo " -0x656b: "Jiao " -0x656c: "Jing " -0x656d: "Yang " -0x656e: "Xia " -0x656f: "Min " -0x6570: "Shu " -0x6571: "Ai " -0x6572: "Qiao " -0x6573: "Ai " -0x6574: "Zheng " -0x6575: "Di " -0x6576: "Zhen " -0x6577: "Fu " -0x6578: "Shu " -0x6579: "Liao " -0x657a: "Qu " -0x657b: "Xiong " -0x657c: "Xi " -0x657d: "Jiao " -0x657e: "Sen " -0x657f: "Jiao " -0x6580: "Zhuo " -0x6581: "Yi " -0x6582: "Lian " -0x6583: "Bi " -0x6584: "Li " -0x6585: "Xiao " -0x6586: "Xiao " -0x6587: "Wen " -0x6588: "Xue " -0x6589: "Qi " -0x658a: "Qi " -0x658b: "Zhai " -0x658c: "Bin " -0x658d: "Jue " -0x658e: "Zhai " -0x658f: "[?] " -0x6590: "Fei " -0x6591: "Ban " -0x6592: "Ban " -0x6593: "Lan " -0x6594: "Yu " -0x6595: "Lan " -0x6596: "Wei " -0x6597: "Dou " -0x6598: "Sheng " -0x6599: "Liao " -0x659a: "Jia " -0x659b: "Hu " -0x659c: "Xie " -0x659d: "Jia " -0x659e: "Yu " -0x659f: "Zhen " -0x65a0: "Jiao " -0x65a1: "Wo " -0x65a2: "Tou " -0x65a3: "Chu " -0x65a4: "Jin " -0x65a5: "Chi " -0x65a6: "Yin " -0x65a7: "Fu " -0x65a8: "Qiang " -0x65a9: "Zhan " -0x65aa: "Qu " -0x65ab: "Zhuo " -0x65ac: "Zhan " -0x65ad: "Duan " -0x65ae: "Zhuo " -0x65af: "Si " -0x65b0: "Xin " -0x65b1: "Zhuo " -0x65b2: "Zhuo " -0x65b3: "Qin " -0x65b4: "Lin " -0x65b5: "Zhuo " -0x65b6: "Chu " -0x65b7: "Duan " -0x65b8: "Zhu " -0x65b9: "Fang " -0x65ba: "Xie " -0x65bb: "Hang " -0x65bc: "Yu " -0x65bd: "Shi " -0x65be: "Pei " -0x65bf: "You " -0x65c0: "Mye " -0x65c1: "Pang " -0x65c2: "Qi " -0x65c3: "Zhan " -0x65c4: "Mao " -0x65c5: "Lu " -0x65c6: "Pei " -0x65c7: "Pi " -0x65c8: "Liu " -0x65c9: "Fu " -0x65ca: "Fang " -0x65cb: "Xuan " -0x65cc: "Jing " -0x65cd: "Jing " -0x65ce: "Ni " -0x65cf: "Zu " -0x65d0: "Zhao " -0x65d1: "Yi " -0x65d2: "Liu " -0x65d3: "Shao " -0x65d4: "Jian " -0x65d5: "Es " -0x65d6: "Yi " -0x65d7: "Qi " -0x65d8: "Zhi " -0x65d9: "Fan " -0x65da: "Piao " -0x65db: "Fan " -0x65dc: "Zhan " -0x65dd: "Guai " -0x65de: "Sui " -0x65df: "Yu " -0x65e0: "Wu " -0x65e1: "Ji " -0x65e2: "Ji " -0x65e3: "Ji " -0x65e4: "Huo " -0x65e5: "Ri " -0x65e6: "Dan " -0x65e7: "Jiu " -0x65e8: "Zhi " -0x65e9: "Zao " -0x65ea: "Xie " -0x65eb: "Tiao " -0x65ec: "Xun " -0x65ed: "Xu " -0x65ee: "Xu " -0x65ef: "Xu " -0x65f0: "Gan " -0x65f1: "Han " -0x65f2: "Tai " -0x65f3: "Di " -0x65f4: "Xu " -0x65f5: "Chan " -0x65f6: "Shi " -0x65f7: "Kuang " -0x65f8: "Yang " -0x65f9: "Shi " -0x65fa: "Wang " -0x65fb: "Min " -0x65fc: "Min " -0x65fd: "Tun " -0x65fe: "Chun " -0x65ff: "Wu " -/* x066 */ -0x6600: "Yun " -0x6601: "Bei " -0x6602: "Ang " -0x6603: "Ze " -0x6604: "Ban " -0x6605: "Jie " -0x6606: "Kun " -0x6607: "Sheng " -0x6608: "Hu " -0x6609: "Fang " -0x660a: "Hao " -0x660b: "Gui " -0x660c: "Chang " -0x660d: "Xuan " -0x660e: "Ming " -0x660f: "Hun " -0x6610: "Fen " -0x6611: "Qin " -0x6612: "Hu " -0x6613: "Yi " -0x6614: "Xi " -0x6615: "Xin " -0x6616: "Yan " -0x6617: "Ze " -0x6618: "Fang " -0x6619: "Tan " -0x661a: "Shen " -0x661b: "Ju " -0x661c: "Yang " -0x661d: "Zan " -0x661e: "Bing " -0x661f: "Xing " -0x6620: "Ying " -0x6621: "Xuan " -0x6622: "Pei " -0x6623: "Zhen " -0x6624: "Ling " -0x6625: "Chun " -0x6626: "Hao " -0x6627: "Mei " -0x6628: "Zuo " -0x6629: "Mo " -0x662a: "Bian " -0x662b: "Xu " -0x662c: "Hun " -0x662d: "Zhao " -0x662e: "Zong " -0x662f: "Shi " -0x6630: "Shi " -0x6631: "Yu " -0x6632: "Fei " -0x6633: "Die " -0x6634: "Mao " -0x6635: "Ni " -0x6636: "Chang " -0x6637: "Wen " -0x6638: "Dong " -0x6639: "Ai " -0x663a: "Bing " -0x663b: "Ang " -0x663c: "Zhou " -0x663d: "Long " -0x663e: "Xian " -0x663f: "Kuang " -0x6640: "Tiao " -0x6641: "Chao " -0x6642: "Shi " -0x6643: "Huang " -0x6644: "Huang " -0x6645: "Xuan " -0x6646: "Kui " -0x6647: "Xu " -0x6648: "Jiao " -0x6649: "Jin " -0x664a: "Zhi " -0x664b: "Jin " -0x664c: "Shang " -0x664d: "Tong " -0x664e: "Hong " -0x664f: "Yan " -0x6650: "Gai " -0x6651: "Xiang " -0x6652: "Shai " -0x6653: "Xiao " -0x6654: "Ye " -0x6655: "Yun " -0x6656: "Hui " -0x6657: "Han " -0x6658: "Han " -0x6659: "Jun " -0x665a: "Wan " -0x665b: "Xian " -0x665c: "Kun " -0x665d: "Zhou " -0x665e: "Xi " -0x665f: "Cheng " -0x6660: "Sheng " -0x6661: "Bu " -0x6662: "Zhe " -0x6663: "Zhe " -0x6664: "Wu " -0x6665: "Han " -0x6666: "Hui " -0x6667: "Hao " -0x6668: "Chen " -0x6669: "Wan " -0x666a: "Tian " -0x666b: "Zhuo " -0x666c: "Zui " -0x666d: "Zhou " -0x666e: "Pu " -0x666f: "Jing " -0x6670: "Xi " -0x6671: "Shan " -0x6672: "Yi " -0x6673: "Xi " -0x6674: "Qing " -0x6675: "Qi " -0x6676: "Jing " -0x6677: "Gui " -0x6678: "Zhen " -0x6679: "Yi " -0x667a: "Zhi " -0x667b: "An " -0x667c: "Wan " -0x667d: "Lin " -0x667e: "Liang " -0x667f: "Chang " -0x6680: "Wang " -0x6681: "Xiao " -0x6682: "Zan " -0x6683: "Hi " -0x6684: "Xuan " -0x6685: "Xuan " -0x6686: "Yi " -0x6687: "Xia " -0x6688: "Yun " -0x6689: "Hui " -0x668a: "Fu " -0x668b: "Min " -0x668c: "Kui " -0x668d: "He " -0x668e: "Ying " -0x668f: "Du " -0x6690: "Wei " -0x6691: "Shu " -0x6692: "Qing " -0x6693: "Mao " -0x6694: "Nan " -0x6695: "Jian " -0x6696: "Nuan " -0x6697: "An " -0x6698: "Yang " -0x6699: "Chun " -0x669a: "Yao " -0x669b: "Suo " -0x669c: "Jin " -0x669d: "Ming " -0x669e: "Jiao " -0x669f: "Kai " -0x66a0: "Gao " -0x66a1: "Weng " -0x66a2: "Chang " -0x66a3: "Qi " -0x66a4: "Hao " -0x66a5: "Yan " -0x66a6: "Li " -0x66a7: "Ai " -0x66a8: "Ji " -0x66a9: "Gui " -0x66aa: "Men " -0x66ab: "Zan " -0x66ac: "Xie " -0x66ad: "Hao " -0x66ae: "Mu " -0x66af: "Mo " -0x66b0: "Cong " -0x66b1: "Ni " -0x66b2: "Zhang " -0x66b3: "Hui " -0x66b4: "Bao " -0x66b5: "Han " -0x66b6: "Xuan " -0x66b7: "Chuan " -0x66b8: "Liao " -0x66b9: "Xian " -0x66ba: "Dan " -0x66bb: "Jing " -0x66bc: "Pie " -0x66bd: "Lin " -0x66be: "Tun " -0x66bf: "Xi " -0x66c0: "Yi " -0x66c1: "Ji " -0x66c2: "Huang " -0x66c3: "Tai " -0x66c4: "Ye " -0x66c5: "Ye " -0x66c6: "Li " -0x66c7: "Tan " -0x66c8: "Tong " -0x66c9: "Xiao " -0x66ca: "Fei " -0x66cb: "Qin " -0x66cc: "Zhao " -0x66cd: "Hao " -0x66ce: "Yi " -0x66cf: "Xiang " -0x66d0: "Xing " -0x66d1: "Sen " -0x66d2: "Jiao " -0x66d3: "Bao " -0x66d4: "Jing " -0x66d5: "Yian " -0x66d6: "Ai " -0x66d7: "Ye " -0x66d8: "Ru " -0x66d9: "Shu " -0x66da: "Meng " -0x66db: "Xun " -0x66dc: "Yao " -0x66dd: "Pu " -0x66de: "Li " -0x66df: "Chen " -0x66e0: "Kuang " -0x66e1: "Die " -0x66e2: "[?] " -0x66e3: "Yan " -0x66e4: "Huo " -0x66e5: "Lu " -0x66e6: "Xi " -0x66e7: "Rong " -0x66e8: "Long " -0x66e9: "Nang " -0x66ea: "Luo " -0x66eb: "Luan " -0x66ec: "Shai " -0x66ed: "Tang " -0x66ee: "Yan " -0x66ef: "Chu " -0x66f0: "Yue " -0x66f1: "Yue " -0x66f2: "Qu " -0x66f3: "Yi " -0x66f4: "Geng " -0x66f5: "Ye " -0x66f6: "Hu " -0x66f7: "He " -0x66f8: "Shu " -0x66f9: "Cao " -0x66fa: "Cao " -0x66fb: "Noboru " -0x66fc: "Man " -0x66fd: "Ceng " -0x66fe: "Ceng " -0x66ff: "Ti " -/* x067 */ -0x6700: "Zui " -0x6701: "Can " -0x6702: "Xu " -0x6703: "Hui " -0x6704: "Yin " -0x6705: "Qie " -0x6706: "Fen " -0x6707: "Pi " -0x6708: "Yue " -0x6709: "You " -0x670a: "Ruan " -0x670b: "Peng " -0x670c: "Ban " -0x670d: "Fu " -0x670e: "Ling " -0x670f: "Fei " -0x6710: "Qu " -0x6711: "[?] " -0x6712: "Nu " -0x6713: "Tiao " -0x6714: "Shuo " -0x6715: "Zhen " -0x6716: "Lang " -0x6717: "Lang " -0x6718: "Juan " -0x6719: "Ming " -0x671a: "Huang " -0x671b: "Wang " -0x671c: "Tun " -0x671d: "Zhao " -0x671e: "Ji " -0x671f: "Qi " -0x6720: "Ying " -0x6721: "Zong " -0x6722: "Wang " -0x6723: "Tong " -0x6724: "Lang " -0x6725: "[?] " -0x6726: "Meng " -0x6727: "Long " -0x6728: "Mu " -0x6729: "Deng " -0x672a: "Wei " -0x672b: "Mo " -0x672c: "Ben " -0x672d: "Zha " -0x672e: "Zhu " -0x672f: "Zhu " -0x6730: "[?] " -0x6731: "Zhu " -0x6732: "Ren " -0x6733: "Ba " -0x6734: "Po " -0x6735: "Duo " -0x6736: "Duo " -0x6737: "Dao " -0x6738: "Li " -0x6739: "Qiu " -0x673a: "Ji " -0x673b: "Jiu " -0x673c: "Bi " -0x673d: "Xiu " -0x673e: "Ting " -0x673f: "Ci " -0x6740: "Sha " -0x6741: "Eburi " -0x6742: "Za " -0x6743: "Quan " -0x6744: "Qian " -0x6745: "Yu " -0x6746: "Gan " -0x6747: "Wu " -0x6748: "Cha " -0x6749: "Shan " -0x674a: "Xun " -0x674b: "Fan " -0x674c: "Wu " -0x674d: "Zi " -0x674e: "Li " -0x674f: "Xing " -0x6750: "Cai " -0x6751: "Cun " -0x6752: "Ren " -0x6753: "Shao " -0x6754: "Tuo " -0x6755: "Di " -0x6756: "Zhang " -0x6757: "Mang " -0x6758: "Chi " -0x6759: "Yi " -0x675a: "Gu " -0x675b: "Gong " -0x675c: "Du " -0x675d: "Yi " -0x675e: "Qi " -0x675f: "Shu " -0x6760: "Gang " -0x6761: "Tiao " -0x6762: "Moku " -0x6763: "Soma " -0x6764: "Tochi " -0x6765: "Lai " -0x6766: "Sugi " -0x6767: "Mang " -0x6768: "Yang " -0x6769: "Ma " -0x676a: "Miao " -0x676b: "Si " -0x676c: "Yuan " -0x676d: "Hang " -0x676e: "Fei " -0x676f: "Bei " -0x6770: "Jie " -0x6771: "Dong " -0x6772: "Gao " -0x6773: "Yao " -0x6774: "Xian " -0x6775: "Chu " -0x6776: "Qun " -0x6777: "Pa " -0x6778: "Shu " -0x6779: "Hua " -0x677a: "Xin " -0x677b: "Chou " -0x677c: "Zhu " -0x677d: "Chou " -0x677e: "Song " -0x677f: "Ban " -0x6780: "Song " -0x6781: "Ji " -0x6782: "Yue " -0x6783: "Jin " -0x6784: "Gou " -0x6785: "Ji " -0x6786: "Mao " -0x6787: "Pi " -0x6788: "Bi " -0x6789: "Wang " -0x678a: "Ang " -0x678b: "Fang " -0x678c: "Fen " -0x678d: "Yi " -0x678e: "Fu " -0x678f: "Nan " -0x6790: "Xi " -0x6791: "Hu " -0x6792: "Ya " -0x6793: "Dou " -0x6794: "Xun " -0x6795: "Zhen " -0x6796: "Yao " -0x6797: "Lin " -0x6798: "Rui " -0x6799: "E " -0x679a: "Mei " -0x679b: "Zhao " -0x679c: "Guo " -0x679d: "Zhi " -0x679e: "Cong " -0x679f: "Yun " -0x67a0: "Waku " -0x67a1: "Dou " -0x67a2: "Shu " -0x67a3: "Zao " -0x67a4: "[?] " -0x67a5: "Li " -0x67a6: "Haze " -0x67a7: "Jian " -0x67a8: "Cheng " -0x67a9: "Matsu " -0x67aa: "Qiang " -0x67ab: "Feng " -0x67ac: "Nan " -0x67ad: "Xiao " -0x67ae: "Xian " -0x67af: "Ku " -0x67b0: "Ping " -0x67b1: "Yi " -0x67b2: "Xi " -0x67b3: "Zhi " -0x67b4: "Guai " -0x67b5: "Xiao " -0x67b6: "Jia " -0x67b7: "Jia " -0x67b8: "Gou " -0x67b9: "Fu " -0x67ba: "Mo " -0x67bb: "Yi " -0x67bc: "Ye " -0x67bd: "Ye " -0x67be: "Shi " -0x67bf: "Nie " -0x67c0: "Bi " -0x67c1: "Duo " -0x67c2: "Yi " -0x67c3: "Ling " -0x67c4: "Bing " -0x67c5: "Ni " -0x67c6: "La " -0x67c7: "He " -0x67c8: "Pan " -0x67c9: "Fan " -0x67ca: "Zhong " -0x67cb: "Dai " -0x67cc: "Ci " -0x67cd: "Yang " -0x67ce: "Fu " -0x67cf: "Bo " -0x67d0: "Mou " -0x67d1: "Gan " -0x67d2: "Qi " -0x67d3: "Ran " -0x67d4: "Rou " -0x67d5: "Mao " -0x67d6: "Zhao " -0x67d7: "Song " -0x67d8: "Zhe " -0x67d9: "Xia " -0x67da: "You " -0x67db: "Shen " -0x67dc: "Ju " -0x67dd: "Tuo " -0x67de: "Zuo " -0x67df: "Nan " -0x67e0: "Ning " -0x67e1: "Yong " -0x67e2: "Di " -0x67e3: "Zhi " -0x67e4: "Zha " -0x67e5: "Cha " -0x67e6: "Dan " -0x67e7: "Gu " -0x67e8: "Pu " -0x67e9: "Jiu " -0x67ea: "Ao " -0x67eb: "Fu " -0x67ec: "Jian " -0x67ed: "Bo " -0x67ee: "Duo " -0x67ef: "Ke " -0x67f0: "Nai " -0x67f1: "Zhu " -0x67f2: "Bi " -0x67f3: "Liu " -0x67f4: "Chai " -0x67f5: "Zha " -0x67f6: "Si " -0x67f7: "Zhu " -0x67f8: "Pei " -0x67f9: "Shi " -0x67fa: "Guai " -0x67fb: "Cha " -0x67fc: "Yao " -0x67fd: "Jue " -0x67fe: "Jiu " -0x67ff: "Shi " -/* x068 */ -0x6800: "Zhi " -0x6801: "Liu " -0x6802: "Mei " -0x6803: "Hoy " -0x6804: "Rong " -0x6805: "Zha " -0x6806: "[?] " -0x6807: "Biao " -0x6808: "Zhan " -0x6809: "Jie " -0x680a: "Long " -0x680b: "Dong " -0x680c: "Lu " -0x680d: "Sayng " -0x680e: "Li " -0x680f: "Lan " -0x6810: "Yong " -0x6811: "Shu " -0x6812: "Xun " -0x6813: "Shuan " -0x6814: "Qi " -0x6815: "Zhen " -0x6816: "Qi " -0x6817: "Li " -0x6818: "Yi " -0x6819: "Xiang " -0x681a: "Zhen " -0x681b: "Li " -0x681c: "Su " -0x681d: "Gua " -0x681e: "Kan " -0x681f: "Bing " -0x6820: "Ren " -0x6821: "Xiao " -0x6822: "Bo " -0x6823: "Ren " -0x6824: "Bing " -0x6825: "Zi " -0x6826: "Chou " -0x6827: "Yi " -0x6828: "Jie " -0x6829: "Xu " -0x682a: "Zhu " -0x682b: "Jian " -0x682c: "Zui " -0x682d: "Er " -0x682e: "Er " -0x682f: "You " -0x6830: "Fa " -0x6831: "Gong " -0x6832: "Kao " -0x6833: "Lao " -0x6834: "Zhan " -0x6835: "Li " -0x6836: "Yin " -0x6837: "Yang " -0x6838: "He " -0x6839: "Gen " -0x683a: "Zhi " -0x683b: "Chi " -0x683c: "Ge " -0x683d: "Zai " -0x683e: "Luan " -0x683f: "Fu " -0x6840: "Jie " -0x6841: "Hang " -0x6842: "Gui " -0x6843: "Tao " -0x6844: "Guang " -0x6845: "Wei " -0x6846: "Kuang " -0x6847: "Ru " -0x6848: "An " -0x6849: "An " -0x684a: "Juan " -0x684b: "Yi " -0x684c: "Zhuo " -0x684d: "Ku " -0x684e: "Zhi " -0x684f: "Qiong " -0x6850: "Tong " -0x6851: "Sang " -0x6852: "Sang " -0x6853: "Huan " -0x6854: "Jie " -0x6855: "Jiu " -0x6856: "Xue " -0x6857: "Duo " -0x6858: "Zhui " -0x6859: "Yu " -0x685a: "Zan " -0x685b: "Kasei " -0x685c: "Ying " -0x685d: "Masu " -0x685e: "[?] " -0x685f: "Zhan " -0x6860: "Ya " -0x6861: "Nao " -0x6862: "Zhen " -0x6863: "Dang " -0x6864: "Qi " -0x6865: "Qiao " -0x6866: "Hua " -0x6867: "Kuai " -0x6868: "Jiang " -0x6869: "Zhuang " -0x686a: "Xun " -0x686b: "Suo " -0x686c: "Sha " -0x686d: "Zhen " -0x686e: "Bei " -0x686f: "Ting " -0x6870: "Gua " -0x6871: "Jing " -0x6872: "Bo " -0x6873: "Ben " -0x6874: "Fu " -0x6875: "Rui " -0x6876: "Tong " -0x6877: "Jue " -0x6878: "Xi " -0x6879: "Lang " -0x687a: "Liu " -0x687b: "Feng " -0x687c: "Qi " -0x687d: "Wen " -0x687e: "Jun " -0x687f: "Gan " -0x6880: "Cu " -0x6881: "Liang " -0x6882: "Qiu " -0x6883: "Ting " -0x6884: "You " -0x6885: "Mei " -0x6886: "Bang " -0x6887: "Long " -0x6888: "Peng " -0x6889: "Zhuang " -0x688a: "Di " -0x688b: "Xuan " -0x688c: "Tu " -0x688d: "Zao " -0x688e: "Ao " -0x688f: "Gu " -0x6890: "Bi " -0x6891: "Di " -0x6892: "Han " -0x6893: "Zi " -0x6894: "Zhi " -0x6895: "Ren " -0x6896: "Bei " -0x6897: "Geng " -0x6898: "Jian " -0x6899: "Huan " -0x689a: "Wan " -0x689b: "Nuo " -0x689c: "Jia " -0x689d: "Tiao " -0x689e: "Ji " -0x689f: "Xiao " -0x68a0: "Lu " -0x68a1: "Huan " -0x68a2: "Shao " -0x68a3: "Cen " -0x68a4: "Fen " -0x68a5: "Song " -0x68a6: "Meng " -0x68a7: "Wu " -0x68a8: "Li " -0x68a9: "Li " -0x68aa: "Dou " -0x68ab: "Cen " -0x68ac: "Ying " -0x68ad: "Suo " -0x68ae: "Ju " -0x68af: "Ti " -0x68b0: "Jie " -0x68b1: "Kun " -0x68b2: "Zhuo " -0x68b3: "Shu " -0x68b4: "Chan " -0x68b5: "Fan " -0x68b6: "Wei " -0x68b7: "Jing " -0x68b8: "Li " -0x68b9: "Bing " -0x68ba: "Fumoto " -0x68bb: "Shikimi " -0x68bc: "Tao " -0x68bd: "Zhi " -0x68be: "Lai " -0x68bf: "Lian " -0x68c0: "Jian " -0x68c1: "Zhuo " -0x68c2: "Ling " -0x68c3: "Li " -0x68c4: "Qi " -0x68c5: "Bing " -0x68c6: "Zhun " -0x68c7: "Cong " -0x68c8: "Qian " -0x68c9: "Mian " -0x68ca: "Qi " -0x68cb: "Qi " -0x68cc: "Cai " -0x68cd: "Gun " -0x68ce: "Chan " -0x68cf: "Te " -0x68d0: "Fei " -0x68d1: "Pai " -0x68d2: "Bang " -0x68d3: "Pou " -0x68d4: "Hun " -0x68d5: "Zong " -0x68d6: "Cheng " -0x68d7: "Zao " -0x68d8: "Ji " -0x68d9: "Li " -0x68da: "Peng " -0x68db: "Yu " -0x68dc: "Yu " -0x68dd: "Gu " -0x68de: "Hun " -0x68df: "Dong " -0x68e0: "Tang " -0x68e1: "Gang " -0x68e2: "Wang " -0x68e3: "Di " -0x68e4: "Xi " -0x68e5: "Fan " -0x68e6: "Cheng " -0x68e7: "Zhan " -0x68e8: "Qi " -0x68e9: "Yuan " -0x68ea: "Yan " -0x68eb: "Yu " -0x68ec: "Quan " -0x68ed: "Yi " -0x68ee: "Sen " -0x68ef: "Ren " -0x68f0: "Chui " -0x68f1: "Leng " -0x68f2: "Qi " -0x68f3: "Zhuo " -0x68f4: "Fu " -0x68f5: "Ke " -0x68f6: "Lai " -0x68f7: "Zou " -0x68f8: "Zou " -0x68f9: "Zhuo " -0x68fa: "Guan " -0x68fb: "Fen " -0x68fc: "Fen " -0x68fd: "Chen " -0x68fe: "Qiong " -0x68ff: "Nie " -/* x069 */ -0x6900: "Wan " -0x6901: "Guo " -0x6902: "Lu " -0x6903: "Hao " -0x6904: "Jie " -0x6905: "Yi " -0x6906: "Chou " -0x6907: "Ju " -0x6908: "Ju " -0x6909: "Cheng " -0x690a: "Zuo " -0x690b: "Liang " -0x690c: "Qiang " -0x690d: "Zhi " -0x690e: "Zhui " -0x690f: "Ya " -0x6910: "Ju " -0x6911: "Bei " -0x6912: "Jiao " -0x6913: "Zhuo " -0x6914: "Zi " -0x6915: "Bin " -0x6916: "Peng " -0x6917: "Ding " -0x6918: "Chu " -0x6919: "Chang " -0x691a: "Kunugi " -0x691b: "Momiji " -0x691c: "Jian " -0x691d: "Gui " -0x691e: "Xi " -0x691f: "Du " -0x6920: "Qian " -0x6921: "Kunugi " -0x6922: "Soko " -0x6923: "Shide " -0x6924: "Luo " -0x6925: "Zhi " -0x6926: "Ken " -0x6927: "Myeng " -0x6928: "Tafu " -0x6929: "[?] " -0x692a: "Peng " -0x692b: "Zhan " -0x692c: "[?] " -0x692d: "Tuo " -0x692e: "Sen " -0x692f: "Duo " -0x6930: "Ye " -0x6931: "Fou " -0x6932: "Wei " -0x6933: "Wei " -0x6934: "Duan " -0x6935: "Jia " -0x6936: "Zong " -0x6937: "Jian " -0x6938: "Yi " -0x6939: "Shen " -0x693a: "Xi " -0x693b: "Yan " -0x693c: "Yan " -0x693d: "Chuan " -0x693e: "Zhan " -0x693f: "Chun " -0x6940: "Yu " -0x6941: "He " -0x6942: "Zha " -0x6943: "Wo " -0x6944: "Pian " -0x6945: "Bi " -0x6946: "Yao " -0x6947: "Huo " -0x6948: "Xu " -0x6949: "Ruo " -0x694a: "Yang " -0x694b: "La " -0x694c: "Yan " -0x694d: "Ben " -0x694e: "Hun " -0x694f: "Kui " -0x6950: "Jie " -0x6951: "Kui " -0x6952: "Si " -0x6953: "Feng " -0x6954: "Xie " -0x6955: "Tuo " -0x6956: "Zhi " -0x6957: "Jian " -0x6958: "Mu " -0x6959: "Mao " -0x695a: "Chu " -0x695b: "Hu " -0x695c: "Hu " -0x695d: "Lian " -0x695e: "Leng " -0x695f: "Ting " -0x6960: "Nan " -0x6961: "Yu " -0x6962: "You " -0x6963: "Mei " -0x6964: "Song " -0x6965: "Xuan " -0x6966: "Xuan " -0x6967: "Ying " -0x6968: "Zhen " -0x6969: "Pian " -0x696a: "Ye " -0x696b: "Ji " -0x696c: "Jie " -0x696d: "Ye " -0x696e: "Chu " -0x696f: "Shun " -0x6970: "Yu " -0x6971: "Cou " -0x6972: "Wei " -0x6973: "Mei " -0x6974: "Di " -0x6975: "Ji " -0x6976: "Jie " -0x6977: "Kai " -0x6978: "Qiu " -0x6979: "Ying " -0x697a: "Rou " -0x697b: "Heng " -0x697c: "Lou " -0x697d: "Le " -0x697e: "Hazou " -0x697f: "Katsura " -0x6980: "Pin " -0x6981: "Muro " -0x6982: "Gai " -0x6983: "Tan " -0x6984: "Lan " -0x6985: "Yun " -0x6986: "Yu " -0x6987: "Chen " -0x6988: "Lu " -0x6989: "Ju " -0x698a: "Sakaki " -0x698b: "[?] " -0x698c: "Pi " -0x698d: "Xie " -0x698e: "Jia " -0x698f: "Yi " -0x6990: "Zhan " -0x6991: "Fu " -0x6992: "Nai " -0x6993: "Mi " -0x6994: "Lang " -0x6995: "Rong " -0x6996: "Gu " -0x6997: "Jian " -0x6998: "Ju " -0x6999: "Ta " -0x699a: "Yao " -0x699b: "Zhen " -0x699c: "Bang " -0x699d: "Sha " -0x699e: "Yuan " -0x699f: "Zi " -0x69a0: "Ming " -0x69a1: "Su " -0x69a2: "Jia " -0x69a3: "Yao " -0x69a4: "Jie " -0x69a5: "Huang " -0x69a6: "Gan " -0x69a7: "Fei " -0x69a8: "Zha " -0x69a9: "Qian " -0x69aa: "Ma " -0x69ab: "Sun " -0x69ac: "Yuan " -0x69ad: "Xie " -0x69ae: "Rong " -0x69af: "Shi " -0x69b0: "Zhi " -0x69b1: "Cui " -0x69b2: "Yun " -0x69b3: "Ting " -0x69b4: "Liu " -0x69b5: "Rong " -0x69b6: "Tang " -0x69b7: "Que " -0x69b8: "Zhai " -0x69b9: "Si " -0x69ba: "Sheng " -0x69bb: "Ta " -0x69bc: "Ke " -0x69bd: "Xi " -0x69be: "Gu " -0x69bf: "Qi " -0x69c0: "Kao " -0x69c1: "Gao " -0x69c2: "Sun " -0x69c3: "Pan " -0x69c4: "Tao " -0x69c5: "Ge " -0x69c6: "Xun " -0x69c7: "Dian " -0x69c8: "Nou " -0x69c9: "Ji " -0x69ca: "Shuo " -0x69cb: "Gou " -0x69cc: "Chui " -0x69cd: "Qiang " -0x69ce: "Cha " -0x69cf: "Qian " -0x69d0: "Huai " -0x69d1: "Mei " -0x69d2: "Xu " -0x69d3: "Gang " -0x69d4: "Gao " -0x69d5: "Zhuo " -0x69d6: "Tuo " -0x69d7: "Hashi " -0x69d8: "Yang " -0x69d9: "Dian " -0x69da: "Jia " -0x69db: "Jian " -0x69dc: "Zui " -0x69dd: "Kashi " -0x69de: "Ori " -0x69df: "Bin " -0x69e0: "Zhu " -0x69e1: "[?] " -0x69e2: "Xi " -0x69e3: "Qi " -0x69e4: "Lian " -0x69e5: "Hui " -0x69e6: "Yong " -0x69e7: "Qian " -0x69e8: "Guo " -0x69e9: "Gai " -0x69ea: "Gai " -0x69eb: "Tuan " -0x69ec: "Hua " -0x69ed: "Cu " -0x69ee: "Sen " -0x69ef: "Cui " -0x69f0: "Beng " -0x69f1: "You " -0x69f2: "Hu " -0x69f3: "Jiang " -0x69f4: "Hu " -0x69f5: "Huan " -0x69f6: "Kui " -0x69f7: "Yi " -0x69f8: "Nie " -0x69f9: "Gao " -0x69fa: "Kang " -0x69fb: "Gui " -0x69fc: "Gui " -0x69fd: "Cao " -0x69fe: "Man " -0x69ff: "Jin " -/* x06a */ -0x6a00: "Di " -0x6a01: "Zhuang " -0x6a02: "Le " -0x6a03: "Lang " -0x6a04: "Chen " -0x6a05: "Cong " -0x6a06: "Li " -0x6a07: "Xiu " -0x6a08: "Qing " -0x6a09: "Shuang " -0x6a0a: "Fan " -0x6a0b: "Tong " -0x6a0c: "Guan " -0x6a0d: "Ji " -0x6a0e: "Suo " -0x6a0f: "Lei " -0x6a10: "Lu " -0x6a11: "Liang " -0x6a12: "Mi " -0x6a13: "Lou " -0x6a14: "Chao " -0x6a15: "Su " -0x6a16: "Ke " -0x6a17: "Shu " -0x6a18: "Tang " -0x6a19: "Biao " -0x6a1a: "Lu " -0x6a1b: "Jiu " -0x6a1c: "Shu " -0x6a1d: "Zha " -0x6a1e: "Shu " -0x6a1f: "Zhang " -0x6a20: "Men " -0x6a21: "Mo " -0x6a22: "Niao " -0x6a23: "Yang " -0x6a24: "Tiao " -0x6a25: "Peng " -0x6a26: "Zhu " -0x6a27: "Sha " -0x6a28: "Xi " -0x6a29: "Quan " -0x6a2a: "Heng " -0x6a2b: "Jian " -0x6a2c: "Cong " -0x6a2d: "[?] " -0x6a2e: "Hokuso " -0x6a2f: "Qiang " -0x6a30: "Tara " -0x6a31: "Ying " -0x6a32: "Er " -0x6a33: "Xin " -0x6a34: "Zhi " -0x6a35: "Qiao " -0x6a36: "Zui " -0x6a37: "Cong " -0x6a38: "Pu " -0x6a39: "Shu " -0x6a3a: "Hua " -0x6a3b: "Kui " -0x6a3c: "Zhen " -0x6a3d: "Zun " -0x6a3e: "Yue " -0x6a3f: "Zhan " -0x6a40: "Xi " -0x6a41: "Xun " -0x6a42: "Dian " -0x6a43: "Fa " -0x6a44: "Gan " -0x6a45: "Mo " -0x6a46: "Wu " -0x6a47: "Qiao " -0x6a48: "Nao " -0x6a49: "Lin " -0x6a4a: "Liu " -0x6a4b: "Qiao " -0x6a4c: "Xian " -0x6a4d: "Run " -0x6a4e: "Fan " -0x6a4f: "Zhan " -0x6a50: "Tuo " -0x6a51: "Lao " -0x6a52: "Yun " -0x6a53: "Shun " -0x6a54: "Tui " -0x6a55: "Cheng " -0x6a56: "Tang " -0x6a57: "Meng " -0x6a58: "Ju " -0x6a59: "Cheng " -0x6a5a: "Su " -0x6a5b: "Jue " -0x6a5c: "Jue " -0x6a5d: "Tan " -0x6a5e: "Hui " -0x6a5f: "Ji " -0x6a60: "Nuo " -0x6a61: "Xiang " -0x6a62: "Tuo " -0x6a63: "Ning " -0x6a64: "Rui " -0x6a65: "Zhu " -0x6a66: "Chuang " -0x6a67: "Zeng " -0x6a68: "Fen " -0x6a69: "Qiong " -0x6a6a: "Ran " -0x6a6b: "Heng " -0x6a6c: "Cen " -0x6a6d: "Gu " -0x6a6e: "Liu " -0x6a6f: "Lao " -0x6a70: "Gao " -0x6a71: "Chu " -0x6a72: "Zusa " -0x6a73: "Nude " -0x6a74: "Ca " -0x6a75: "San " -0x6a76: "Ji " -0x6a77: "Dou " -0x6a78: "Shou " -0x6a79: "Lu " -0x6a7a: "[?] " -0x6a7b: "[?] " -0x6a7c: "Yuan " -0x6a7d: "Ta " -0x6a7e: "Shu " -0x6a7f: "Jiang " -0x6a80: "Tan " -0x6a81: "Lin " -0x6a82: "Nong " -0x6a83: "Yin " -0x6a84: "Xi " -0x6a85: "Sui " -0x6a86: "Shan " -0x6a87: "Zui " -0x6a88: "Xuan " -0x6a89: "Cheng " -0x6a8a: "Gan " -0x6a8b: "Ju " -0x6a8c: "Zui " -0x6a8d: "Yi " -0x6a8e: "Qin " -0x6a8f: "Pu " -0x6a90: "Yan " -0x6a91: "Lei " -0x6a92: "Feng " -0x6a93: "Hui " -0x6a94: "Dang " -0x6a95: "Ji " -0x6a96: "Sui " -0x6a97: "Bo " -0x6a98: "Bi " -0x6a99: "Ding " -0x6a9a: "Chu " -0x6a9b: "Zhua " -0x6a9c: "Kuai " -0x6a9d: "Ji " -0x6a9e: "Jie " -0x6a9f: "Jia " -0x6aa0: "Qing " -0x6aa1: "Zhe " -0x6aa2: "Jian " -0x6aa3: "Qiang " -0x6aa4: "Dao " -0x6aa5: "Yi " -0x6aa6: "Biao " -0x6aa7: "Song " -0x6aa8: "She " -0x6aa9: "Lin " -0x6aaa: "Kunugi " -0x6aab: "Cha " -0x6aac: "Meng " -0x6aad: "Yin " -0x6aae: "Tao " -0x6aaf: "Tai " -0x6ab0: "Mian " -0x6ab1: "Qi " -0x6ab2: "Toan " -0x6ab3: "Bin " -0x6ab4: "Huo " -0x6ab5: "Ji " -0x6ab6: "Qian " -0x6ab7: "Mi " -0x6ab8: "Ning " -0x6ab9: "Yi " -0x6aba: "Gao " -0x6abb: "Jian " -0x6abc: "Yin " -0x6abd: "Er " -0x6abe: "Qing " -0x6abf: "Yan " -0x6ac0: "Qi " -0x6ac1: "Mi " -0x6ac2: "Zhao " -0x6ac3: "Gui " -0x6ac4: "Chun " -0x6ac5: "Ji " -0x6ac6: "Kui " -0x6ac7: "Po " -0x6ac8: "Deng " -0x6ac9: "Chu " -0x6aca: "[?] " -0x6acb: "Mian " -0x6acc: "You " -0x6acd: "Zhi " -0x6ace: "Guang " -0x6acf: "Qian " -0x6ad0: "Lei " -0x6ad1: "Lei " -0x6ad2: "Sa " -0x6ad3: "Lu " -0x6ad4: "Li " -0x6ad5: "Cuan " -0x6ad6: "Lu " -0x6ad7: "Mie " -0x6ad8: "Hui " -0x6ad9: "Ou " -0x6ada: "Lu " -0x6adb: "Jie " -0x6adc: "Gao " -0x6add: "Du " -0x6ade: "Yuan " -0x6adf: "Li " -0x6ae0: "Fei " -0x6ae1: "Zhuo " -0x6ae2: "Sou " -0x6ae3: "Lian " -0x6ae4: "Tamo " -0x6ae5: "Chu " -0x6ae6: "[?] " -0x6ae7: "Zhu " -0x6ae8: "Lu " -0x6ae9: "Yan " -0x6aea: "Li " -0x6aeb: "Zhu " -0x6aec: "Chen " -0x6aed: "Jie " -0x6aee: "E " -0x6aef: "Su " -0x6af0: "Huai " -0x6af1: "Nie " -0x6af2: "Yu " -0x6af3: "Long " -0x6af4: "Lai " -0x6af5: "[?] " -0x6af6: "Xian " -0x6af7: "Kwi " -0x6af8: "Ju " -0x6af9: "Xiao " -0x6afa: "Ling " -0x6afb: "Ying " -0x6afc: "Jian " -0x6afd: "Yin " -0x6afe: "You " -0x6aff: "Ying " -/* x06b */ -0x6b00: "Xiang " -0x6b01: "Nong " -0x6b02: "Bo " -0x6b03: "Chan " -0x6b04: "Lan " -0x6b05: "Ju " -0x6b06: "Shuang " -0x6b07: "She " -0x6b08: "Wei " -0x6b09: "Cong " -0x6b0a: "Quan " -0x6b0b: "Qu " -0x6b0c: "Cang " -0x6b0d: "[?] " -0x6b0e: "Yu " -0x6b0f: "Luo " -0x6b10: "Li " -0x6b11: "Zan " -0x6b12: "Luan " -0x6b13: "Dang " -0x6b14: "Jue " -0x6b15: "Em " -0x6b16: "Lan " -0x6b17: "Lan " -0x6b18: "Zhu " -0x6b19: "Lei " -0x6b1a: "Li " -0x6b1b: "Ba " -0x6b1c: "Nang " -0x6b1d: "Yu " -0x6b1e: "Ling " -0x6b1f: "Tsuki " -0x6b20: "Qian " -0x6b21: "Ci " -0x6b22: "Huan " -0x6b23: "Xin " -0x6b24: "Yu " -0x6b25: "Yu " -0x6b26: "Qian " -0x6b27: "Ou " -0x6b28: "Xu " -0x6b29: "Chao " -0x6b2a: "Chu " -0x6b2b: "Chi " -0x6b2c: "Kai " -0x6b2d: "Yi " -0x6b2e: "Jue " -0x6b2f: "Xi " -0x6b30: "Xu " -0x6b31: "Xia " -0x6b32: "Yu " -0x6b33: "Kuai " -0x6b34: "Lang " -0x6b35: "Kuan " -0x6b36: "Shuo " -0x6b37: "Xi " -0x6b38: "Ai " -0x6b39: "Yi " -0x6b3a: "Qi " -0x6b3b: "Hu " -0x6b3c: "Chi " -0x6b3d: "Qin " -0x6b3e: "Kuan " -0x6b3f: "Kan " -0x6b40: "Kuan " -0x6b41: "Kan " -0x6b42: "Chuan " -0x6b43: "Sha " -0x6b44: "Gua " -0x6b45: "Yin " -0x6b46: "Xin " -0x6b47: "Xie " -0x6b48: "Yu " -0x6b49: "Qian " -0x6b4a: "Xiao " -0x6b4b: "Yi " -0x6b4c: "Ge " -0x6b4d: "Wu " -0x6b4e: "Tan " -0x6b4f: "Jin " -0x6b50: "Ou " -0x6b51: "Hu " -0x6b52: "Ti " -0x6b53: "Huan " -0x6b54: "Xu " -0x6b55: "Pen " -0x6b56: "Xi " -0x6b57: "Xiao " -0x6b58: "Xu " -0x6b59: "Xi " -0x6b5a: "Sen " -0x6b5b: "Lian " -0x6b5c: "Chu " -0x6b5d: "Yi " -0x6b5e: "Kan " -0x6b5f: "Yu " -0x6b60: "Chuo " -0x6b61: "Huan " -0x6b62: "Zhi " -0x6b63: "Zheng " -0x6b64: "Ci " -0x6b65: "Bu " -0x6b66: "Wu " -0x6b67: "Qi " -0x6b68: "Bu " -0x6b69: "Bu " -0x6b6a: "Wai " -0x6b6b: "Ju " -0x6b6c: "Qian " -0x6b6d: "Chi " -0x6b6e: "Se " -0x6b6f: "Chi " -0x6b70: "Se " -0x6b71: "Zhong " -0x6b72: "Sui " -0x6b73: "Sui " -0x6b74: "Li " -0x6b75: "Cuo " -0x6b76: "Yu " -0x6b77: "Li " -0x6b78: "Gui " -0x6b79: "Dai " -0x6b7a: "Dai " -0x6b7b: "Si " -0x6b7c: "Jian " -0x6b7d: "Zhe " -0x6b7e: "Mo " -0x6b7f: "Mo " -0x6b80: "Yao " -0x6b81: "Mo " -0x6b82: "Cu " -0x6b83: "Yang " -0x6b84: "Tian " -0x6b85: "Sheng " -0x6b86: "Dai " -0x6b87: "Shang " -0x6b88: "Xu " -0x6b89: "Xun " -0x6b8a: "Shu " -0x6b8b: "Can " -0x6b8c: "Jue " -0x6b8d: "Piao " -0x6b8e: "Qia " -0x6b8f: "Qiu " -0x6b90: "Su " -0x6b91: "Qing " -0x6b92: "Yun " -0x6b93: "Lian " -0x6b94: "Yi " -0x6b95: "Fou " -0x6b96: "Zhi " -0x6b97: "Ye " -0x6b98: "Can " -0x6b99: "Hun " -0x6b9a: "Dan " -0x6b9b: "Ji " -0x6b9c: "Ye " -0x6b9d: "Zhen " -0x6b9e: "Yun " -0x6b9f: "Wen " -0x6ba0: "Chou " -0x6ba1: "Bin " -0x6ba2: "Ti " -0x6ba3: "Jin " -0x6ba4: "Shang " -0x6ba5: "Yin " -0x6ba6: "Diao " -0x6ba7: "Cu " -0x6ba8: "Hui " -0x6ba9: "Cuan " -0x6baa: "Yi " -0x6bab: "Dan " -0x6bac: "Du " -0x6bad: "Jiang " -0x6bae: "Lian " -0x6baf: "Bin " -0x6bb0: "Du " -0x6bb1: "Tsukusu " -0x6bb2: "Jian " -0x6bb3: "Shu " -0x6bb4: "Ou " -0x6bb5: "Duan " -0x6bb6: "Zhu " -0x6bb7: "Yin " -0x6bb8: "Qing " -0x6bb9: "Yi " -0x6bba: "Sha " -0x6bbb: "Que " -0x6bbc: "Ke " -0x6bbd: "Yao " -0x6bbe: "Jun " -0x6bbf: "Dian " -0x6bc0: "Hui " -0x6bc1: "Hui " -0x6bc2: "Gu " -0x6bc3: "Que " -0x6bc4: "Ji " -0x6bc5: "Yi " -0x6bc6: "Ou " -0x6bc7: "Hui " -0x6bc8: "Duan " -0x6bc9: "Yi " -0x6bca: "Xiao " -0x6bcb: "Wu " -0x6bcc: "Guan " -0x6bcd: "Mu " -0x6bce: "Mei " -0x6bcf: "Mei " -0x6bd0: "Ai " -0x6bd1: "Zuo " -0x6bd2: "Du " -0x6bd3: "Yu " -0x6bd4: "Bi " -0x6bd5: "Bi " -0x6bd6: "Bi " -0x6bd7: "Pi " -0x6bd8: "Pi " -0x6bd9: "Bi " -0x6bda: "Chan " -0x6bdb: "Mao " -0x6bdc: "[?] " -0x6bdd: "[?] " -0x6bde: "Pu " -0x6bdf: "Mushiru " -0x6be0: "Jia " -0x6be1: "Zhan " -0x6be2: "Sai " -0x6be3: "Mu " -0x6be4: "Tuo " -0x6be5: "Xun " -0x6be6: "Er " -0x6be7: "Rong " -0x6be8: "Xian " -0x6be9: "Ju " -0x6bea: "Mu " -0x6beb: "Hao " -0x6bec: "Qiu " -0x6bed: "Dou " -0x6bee: "Mushiru " -0x6bef: "Tan " -0x6bf0: "Pei " -0x6bf1: "Ju " -0x6bf2: "Duo " -0x6bf3: "Cui " -0x6bf4: "Bi " -0x6bf5: "San " -0x6bf6: "[?] " -0x6bf7: "Mao " -0x6bf8: "Sui " -0x6bf9: "Yu " -0x6bfa: "Yu " -0x6bfb: "Tuo " -0x6bfc: "He " -0x6bfd: "Jian " -0x6bfe: "Ta " -0x6bff: "San " -/* x06c */ -0x6c00: "Lu " -0x6c01: "Mu " -0x6c02: "Li " -0x6c03: "Tong " -0x6c04: "Rong " -0x6c05: "Chang " -0x6c06: "Pu " -0x6c07: "Luo " -0x6c08: "Zhan " -0x6c09: "Sao " -0x6c0a: "Zhan " -0x6c0b: "Meng " -0x6c0c: "Luo " -0x6c0d: "Qu " -0x6c0e: "Die " -0x6c0f: "Shi " -0x6c10: "Di " -0x6c11: "Min " -0x6c12: "Jue " -0x6c13: "Mang " -0x6c14: "Qi " -0x6c15: "Pie " -0x6c16: "Nai " -0x6c17: "Qi " -0x6c18: "Dao " -0x6c19: "Xian " -0x6c1a: "Chuan " -0x6c1b: "Fen " -0x6c1c: "Ri " -0x6c1d: "Nei " -0x6c1e: "[?] " -0x6c1f: "Fu " -0x6c20: "Shen " -0x6c21: "Dong " -0x6c22: "Qing " -0x6c23: "Qi " -0x6c24: "Yin " -0x6c25: "Xi " -0x6c26: "Hai " -0x6c27: "Yang " -0x6c28: "An " -0x6c29: "Ya " -0x6c2a: "Ke " -0x6c2b: "Qing " -0x6c2c: "Ya " -0x6c2d: "Dong " -0x6c2e: "Dan " -0x6c2f: "Lu " -0x6c30: "Qing " -0x6c31: "Yang " -0x6c32: "Yun " -0x6c33: "Yun " -0x6c34: "Shui " -0x6c35: "San " -0x6c36: "Zheng " -0x6c37: "Bing " -0x6c38: "Yong " -0x6c39: "Dang " -0x6c3a: "Shitamizu " -0x6c3b: "Le " -0x6c3c: "Ni " -0x6c3d: "Tun " -0x6c3e: "Fan " -0x6c3f: "Gui " -0x6c40: "Ting " -0x6c41: "Zhi " -0x6c42: "Qiu " -0x6c43: "Bin " -0x6c44: "Ze " -0x6c45: "Mian " -0x6c46: "Cuan " -0x6c47: "Hui " -0x6c48: "Diao " -0x6c49: "Yi " -0x6c4a: "Cha " -0x6c4b: "Zhuo " -0x6c4c: "Chuan " -0x6c4d: "Wan " -0x6c4e: "Fan " -0x6c4f: "Dai " -0x6c50: "Xi " -0x6c51: "Tuo " -0x6c52: "Mang " -0x6c53: "Qiu " -0x6c54: "Qi " -0x6c55: "Shan " -0x6c56: "Pai " -0x6c57: "Han " -0x6c58: "Qian " -0x6c59: "Wu " -0x6c5a: "Wu " -0x6c5b: "Xun " -0x6c5c: "Si " -0x6c5d: "Ru " -0x6c5e: "Gong " -0x6c5f: "Jiang " -0x6c60: "Chi " -0x6c61: "Wu " -0x6c62: "Tsuchi " -0x6c63: "[?] " -0x6c64: "Tang " -0x6c65: "Zhi " -0x6c66: "Chi " -0x6c67: "Qian " -0x6c68: "Mi " -0x6c69: "Yu " -0x6c6a: "Wang " -0x6c6b: "Qing " -0x6c6c: "Jing " -0x6c6d: "Rui " -0x6c6e: "Jun " -0x6c6f: "Hong " -0x6c70: "Tai " -0x6c71: "Quan " -0x6c72: "Ji " -0x6c73: "Bian " -0x6c74: "Bian " -0x6c75: "Gan " -0x6c76: "Wen " -0x6c77: "Zhong " -0x6c78: "Fang " -0x6c79: "Xiong " -0x6c7a: "Jue " -0x6c7b: "Hang " -0x6c7c: "Niou " -0x6c7d: "Qi " -0x6c7e: "Fen " -0x6c7f: "Xu " -0x6c80: "Xu " -0x6c81: "Qin " -0x6c82: "Yi " -0x6c83: "Wo " -0x6c84: "Yun " -0x6c85: "Yuan " -0x6c86: "Hang " -0x6c87: "Yan " -0x6c88: "Chen " -0x6c89: "Chen " -0x6c8a: "Dan " -0x6c8b: "You " -0x6c8c: "Dun " -0x6c8d: "Hu " -0x6c8e: "Huo " -0x6c8f: "Qie " -0x6c90: "Mu " -0x6c91: "Rou " -0x6c92: "Mei " -0x6c93: "Ta " -0x6c94: "Mian " -0x6c95: "Wu " -0x6c96: "Chong " -0x6c97: "Tian " -0x6c98: "Bi " -0x6c99: "Sha " -0x6c9a: "Zhi " -0x6c9b: "Pei " -0x6c9c: "Pan " -0x6c9d: "Zhui " -0x6c9e: "Za " -0x6c9f: "Gou " -0x6ca0: "Liu " -0x6ca1: "Mei " -0x6ca2: "Ze " -0x6ca3: "Feng " -0x6ca4: "Ou " -0x6ca5: "Li " -0x6ca6: "Lun " -0x6ca7: "Cang " -0x6ca8: "Feng " -0x6ca9: "Wei " -0x6caa: "Hu " -0x6cab: "Mo " -0x6cac: "Mei " -0x6cad: "Shu " -0x6cae: "Ju " -0x6caf: "Zan " -0x6cb0: "Tuo " -0x6cb1: "Tuo " -0x6cb2: "Tuo " -0x6cb3: "He " -0x6cb4: "Li " -0x6cb5: "Mi " -0x6cb6: "Yi " -0x6cb7: "Fa " -0x6cb8: "Fei " -0x6cb9: "You " -0x6cba: "Tian " -0x6cbb: "Zhi " -0x6cbc: "Zhao " -0x6cbd: "Gu " -0x6cbe: "Zhan " -0x6cbf: "Yan " -0x6cc0: "Si " -0x6cc1: "Kuang " -0x6cc2: "Jiong " -0x6cc3: "Ju " -0x6cc4: "Xie " -0x6cc5: "Qiu " -0x6cc6: "Yi " -0x6cc7: "Jia " -0x6cc8: "Zhong " -0x6cc9: "Quan " -0x6cca: "Bo " -0x6ccb: "Hui " -0x6ccc: "Mi " -0x6ccd: "Ben " -0x6cce: "Zhuo " -0x6ccf: "Chu " -0x6cd0: "Le " -0x6cd1: "You " -0x6cd2: "Gu " -0x6cd3: "Hong " -0x6cd4: "Gan " -0x6cd5: "Fa " -0x6cd6: "Mao " -0x6cd7: "Si " -0x6cd8: "Hu " -0x6cd9: "Ping " -0x6cda: "Ci " -0x6cdb: "Fan " -0x6cdc: "Chi " -0x6cdd: "Su " -0x6cde: "Ning " -0x6cdf: "Cheng " -0x6ce0: "Ling " -0x6ce1: "Pao " -0x6ce2: "Bo " -0x6ce3: "Qi " -0x6ce4: "Si " -0x6ce5: "Ni " -0x6ce6: "Ju " -0x6ce7: "Yue " -0x6ce8: "Zhu " -0x6ce9: "Sheng " -0x6cea: "Lei " -0x6ceb: "Xuan " -0x6cec: "Xue " -0x6ced: "Fu " -0x6cee: "Pan " -0x6cef: "Min " -0x6cf0: "Tai " -0x6cf1: "Yang " -0x6cf2: "Ji " -0x6cf3: "Yong " -0x6cf4: "Guan " -0x6cf5: "Beng " -0x6cf6: "Xue " -0x6cf7: "Long " -0x6cf8: "Lu " -0x6cf9: "[?] " -0x6cfa: "Bo " -0x6cfb: "Xie " -0x6cfc: "Po " -0x6cfd: "Ze " -0x6cfe: "Jing " -0x6cff: "Yin " -/* x06d */ -0x6d00: "Zhou " -0x6d01: "Ji " -0x6d02: "Yi " -0x6d03: "Hui " -0x6d04: "Hui " -0x6d05: "Zui " -0x6d06: "Cheng " -0x6d07: "Yin " -0x6d08: "Wei " -0x6d09: "Hou " -0x6d0a: "Jian " -0x6d0b: "Yang " -0x6d0c: "Lie " -0x6d0d: "Si " -0x6d0e: "Ji " -0x6d0f: "Er " -0x6d10: "Xing " -0x6d11: "Fu " -0x6d12: "Sa " -0x6d13: "Suo " -0x6d14: "Zhi " -0x6d15: "Yin " -0x6d16: "Wu " -0x6d17: "Xi " -0x6d18: "Kao " -0x6d19: "Zhu " -0x6d1a: "Jiang " -0x6d1b: "Luo " -0x6d1c: "[?] " -0x6d1d: "An " -0x6d1e: "Dong " -0x6d1f: "Yi " -0x6d20: "Mou " -0x6d21: "Lei " -0x6d22: "Yi " -0x6d23: "Mi " -0x6d24: "Quan " -0x6d25: "Jin " -0x6d26: "Mo " -0x6d27: "Wei " -0x6d28: "Xiao " -0x6d29: "Xie " -0x6d2a: "Hong " -0x6d2b: "Xu " -0x6d2c: "Shuo " -0x6d2d: "Kuang " -0x6d2e: "Tao " -0x6d2f: "Qie " -0x6d30: "Ju " -0x6d31: "Er " -0x6d32: "Zhou " -0x6d33: "Ru " -0x6d34: "Ping " -0x6d35: "Xun " -0x6d36: "Xiong " -0x6d37: "Zhi " -0x6d38: "Guang " -0x6d39: "Huan " -0x6d3a: "Ming " -0x6d3b: "Huo " -0x6d3c: "Wa " -0x6d3d: "Qia " -0x6d3e: "Pai " -0x6d3f: "Wu " -0x6d40: "Qu " -0x6d41: "Liu " -0x6d42: "Yi " -0x6d43: "Jia " -0x6d44: "Jing " -0x6d45: "Qian " -0x6d46: "Jiang " -0x6d47: "Jiao " -0x6d48: "Cheng " -0x6d49: "Shi " -0x6d4a: "Zhuo " -0x6d4b: "Ce " -0x6d4c: "Pal " -0x6d4d: "Kuai " -0x6d4e: "Ji " -0x6d4f: "Liu " -0x6d50: "Chan " -0x6d51: "Hun " -0x6d52: "Hu " -0x6d53: "Nong " -0x6d54: "Xun " -0x6d55: "Jin " -0x6d56: "Lie " -0x6d57: "Qiu " -0x6d58: "Wei " -0x6d59: "Zhe " -0x6d5a: "Jun " -0x6d5b: "Han " -0x6d5c: "Bang " -0x6d5d: "Mang " -0x6d5e: "Zhuo " -0x6d5f: "You " -0x6d60: "Xi " -0x6d61: "Bo " -0x6d62: "Dou " -0x6d63: "Wan " -0x6d64: "Hong " -0x6d65: "Yi " -0x6d66: "Pu " -0x6d67: "Ying " -0x6d68: "Lan " -0x6d69: "Hao " -0x6d6a: "Lang " -0x6d6b: "Han " -0x6d6c: "Li " -0x6d6d: "Geng " -0x6d6e: "Fu " -0x6d6f: "Wu " -0x6d70: "Lian " -0x6d71: "Chun " -0x6d72: "Feng " -0x6d73: "Yi " -0x6d74: "Yu " -0x6d75: "Tong " -0x6d76: "Lao " -0x6d77: "Hai " -0x6d78: "Jin " -0x6d79: "Jia " -0x6d7a: "Chong " -0x6d7b: "Weng " -0x6d7c: "Mei " -0x6d7d: "Sui " -0x6d7e: "Cheng " -0x6d7f: "Pei " -0x6d80: "Xian " -0x6d81: "Shen " -0x6d82: "Tu " -0x6d83: "Kun " -0x6d84: "Pin " -0x6d85: "Nie " -0x6d86: "Han " -0x6d87: "Jing " -0x6d88: "Xiao " -0x6d89: "She " -0x6d8a: "Nian " -0x6d8b: "Tu " -0x6d8c: "Yong " -0x6d8d: "Xiao " -0x6d8e: "Xian " -0x6d8f: "Ting " -0x6d90: "E " -0x6d91: "Su " -0x6d92: "Tun " -0x6d93: "Juan " -0x6d94: "Cen " -0x6d95: "Ti " -0x6d96: "Li " -0x6d97: "Shui " -0x6d98: "Si " -0x6d99: "Lei " -0x6d9a: "Shui " -0x6d9b: "Tao " -0x6d9c: "Du " -0x6d9d: "Lao " -0x6d9e: "Lai " -0x6d9f: "Lian " -0x6da0: "Wei " -0x6da1: "Wo " -0x6da2: "Yun " -0x6da3: "Huan " -0x6da4: "Di " -0x6da5: "[?] " -0x6da6: "Run " -0x6da7: "Jian " -0x6da8: "Zhang " -0x6da9: "Se " -0x6daa: "Fu " -0x6dab: "Guan " -0x6dac: "Xing " -0x6dad: "Shou " -0x6dae: "Shuan " -0x6daf: "Ya " -0x6db0: "Chuo " -0x6db1: "Zhang " -0x6db2: "Ye " -0x6db3: "Kong " -0x6db4: "Wo " -0x6db5: "Han " -0x6db6: "Tuo " -0x6db7: "Dong " -0x6db8: "He " -0x6db9: "Wo " -0x6dba: "Ju " -0x6dbb: "Gan " -0x6dbc: "Liang " -0x6dbd: "Hun " -0x6dbe: "Ta " -0x6dbf: "Zhuo " -0x6dc0: "Dian " -0x6dc1: "Qie " -0x6dc2: "De " -0x6dc3: "Juan " -0x6dc4: "Zi " -0x6dc5: "Xi " -0x6dc6: "Yao " -0x6dc7: "Qi " -0x6dc8: "Gu " -0x6dc9: "Guo " -0x6dca: "Han " -0x6dcb: "Lin " -0x6dcc: "Tang " -0x6dcd: "Zhou " -0x6dce: "Peng " -0x6dcf: "Hao " -0x6dd0: "Chang " -0x6dd1: "Shu " -0x6dd2: "Qi " -0x6dd3: "Fang " -0x6dd4: "Chi " -0x6dd5: "Lu " -0x6dd6: "Nao " -0x6dd7: "Ju " -0x6dd8: "Tao " -0x6dd9: "Cong " -0x6dda: "Lei " -0x6ddb: "Zhi " -0x6ddc: "Peng " -0x6ddd: "Fei " -0x6dde: "Song " -0x6ddf: "Tian " -0x6de0: "Pi " -0x6de1: "Dan " -0x6de2: "Yu " -0x6de3: "Ni " -0x6de4: "Yu " -0x6de5: "Lu " -0x6de6: "Gan " -0x6de7: "Mi " -0x6de8: "Jing " -0x6de9: "Ling " -0x6dea: "Lun " -0x6deb: "Yin " -0x6dec: "Cui " -0x6ded: "Qu " -0x6dee: "Huai " -0x6def: "Yu " -0x6df0: "Nian " -0x6df1: "Shen " -0x6df2: "Piao " -0x6df3: "Chun " -0x6df4: "Wa " -0x6df5: "Yuan " -0x6df6: "Lai " -0x6df7: "Hun " -0x6df8: "Qing " -0x6df9: "Yan " -0x6dfa: "Qian " -0x6dfb: "Tian " -0x6dfc: "Miao " -0x6dfd: "Zhi " -0x6dfe: "Yin " -0x6dff: "Mi " -/* x06e */ -0x6e00: "Ben " -0x6e01: "Yuan " -0x6e02: "Wen " -0x6e03: "Re " -0x6e04: "Fei " -0x6e05: "Qing " -0x6e06: "Yuan " -0x6e07: "Ke " -0x6e08: "Ji " -0x6e09: "She " -0x6e0a: "Yuan " -0x6e0b: "Shibui " -0x6e0c: "Lu " -0x6e0d: "Zi " -0x6e0e: "Du " -0x6e0f: "[?] " -0x6e10: "Jian " -0x6e11: "Min " -0x6e12: "Pi " -0x6e13: "Tani " -0x6e14: "Yu " -0x6e15: "Yuan " -0x6e16: "Shen " -0x6e17: "Shen " -0x6e18: "Rou " -0x6e19: "Huan " -0x6e1a: "Zhu " -0x6e1b: "Jian " -0x6e1c: "Nuan " -0x6e1d: "Yu " -0x6e1e: "Qiu " -0x6e1f: "Ting " -0x6e20: "Qu " -0x6e21: "Du " -0x6e22: "Feng " -0x6e23: "Zha " -0x6e24: "Bo " -0x6e25: "Wo " -0x6e26: "Wo " -0x6e27: "Di " -0x6e28: "Wei " -0x6e29: "Wen " -0x6e2a: "Ru " -0x6e2b: "Xie " -0x6e2c: "Ce " -0x6e2d: "Wei " -0x6e2e: "Ge " -0x6e2f: "Gang " -0x6e30: "Yan " -0x6e31: "Hong " -0x6e32: "Xuan " -0x6e33: "Mi " -0x6e34: "Ke " -0x6e35: "Mao " -0x6e36: "Ying " -0x6e37: "Yan " -0x6e38: "You " -0x6e39: "Hong " -0x6e3a: "Miao " -0x6e3b: "Xing " -0x6e3c: "Mei " -0x6e3d: "Zai " -0x6e3e: "Hun " -0x6e3f: "Nai " -0x6e40: "Kui " -0x6e41: "Shi " -0x6e42: "E " -0x6e43: "Pai " -0x6e44: "Mei " -0x6e45: "Lian " -0x6e46: "Qi " -0x6e47: "Qi " -0x6e48: "Mei " -0x6e49: "Tian " -0x6e4a: "Cou " -0x6e4b: "Wei " -0x6e4c: "Can " -0x6e4d: "Tuan " -0x6e4e: "Mian " -0x6e4f: "Hui " -0x6e50: "Mo " -0x6e51: "Xu " -0x6e52: "Ji " -0x6e53: "Pen " -0x6e54: "Jian " -0x6e55: "Jian " -0x6e56: "Hu " -0x6e57: "Feng " -0x6e58: "Xiang " -0x6e59: "Yi " -0x6e5a: "Yin " -0x6e5b: "Zhan " -0x6e5c: "Shi " -0x6e5d: "Jie " -0x6e5e: "Cheng " -0x6e5f: "Huang " -0x6e60: "Tan " -0x6e61: "Yu " -0x6e62: "Bi " -0x6e63: "Min " -0x6e64: "Shi " -0x6e65: "Tu " -0x6e66: "Sheng " -0x6e67: "Yong " -0x6e68: "Qu " -0x6e69: "Zhong " -0x6e6a: "Suei " -0x6e6b: "Jiu " -0x6e6c: "Jiao " -0x6e6d: "Qiou " -0x6e6e: "Yin " -0x6e6f: "Tang " -0x6e70: "Long " -0x6e71: "Huo " -0x6e72: "Yuan " -0x6e73: "Nan " -0x6e74: "Ban " -0x6e75: "You " -0x6e76: "Quan " -0x6e77: "Chui " -0x6e78: "Liang " -0x6e79: "Chan " -0x6e7a: "Yan " -0x6e7b: "Chun " -0x6e7c: "Nie " -0x6e7d: "Zi " -0x6e7e: "Wan " -0x6e7f: "Shi " -0x6e80: "Man " -0x6e81: "Ying " -0x6e82: "Ratsu " -0x6e83: "Kui " -0x6e84: "[?] " -0x6e85: "Jian " -0x6e86: "Xu " -0x6e87: "Lu " -0x6e88: "Gui " -0x6e89: "Gai " -0x6e8a: "[?] " -0x6e8b: "[?] " -0x6e8c: "Po " -0x6e8d: "Jin " -0x6e8e: "Gui " -0x6e8f: "Tang " -0x6e90: "Yuan " -0x6e91: "Suo " -0x6e92: "Yuan " -0x6e93: "Lian " -0x6e94: "Yao " -0x6e95: "Meng " -0x6e96: "Zhun " -0x6e97: "Sheng " -0x6e98: "Ke " -0x6e99: "Tai " -0x6e9a: "Da " -0x6e9b: "Wa " -0x6e9c: "Liu " -0x6e9d: "Gou " -0x6e9e: "Sao " -0x6e9f: "Ming " -0x6ea0: "Zha " -0x6ea1: "Shi " -0x6ea2: "Yi " -0x6ea3: "Lun " -0x6ea4: "Ma " -0x6ea5: "Pu " -0x6ea6: "Wei " -0x6ea7: "Li " -0x6ea8: "Cai " -0x6ea9: "Wu " -0x6eaa: "Xi " -0x6eab: "Wen " -0x6eac: "Qiang " -0x6ead: "Ze " -0x6eae: "Shi " -0x6eaf: "Su " -0x6eb0: "Yi " -0x6eb1: "Zhen " -0x6eb2: "Sou " -0x6eb3: "Yun " -0x6eb4: "Xiu " -0x6eb5: "Yin " -0x6eb6: "Rong " -0x6eb7: "Hun " -0x6eb8: "Su " -0x6eb9: "Su " -0x6eba: "Ni " -0x6ebb: "Ta " -0x6ebc: "Shi " -0x6ebd: "Ru " -0x6ebe: "Wei " -0x6ebf: "Pan " -0x6ec0: "Chu " -0x6ec1: "Chu " -0x6ec2: "Pang " -0x6ec3: "Weng " -0x6ec4: "Cang " -0x6ec5: "Mie " -0x6ec6: "He " -0x6ec7: "Dian " -0x6ec8: "Hao " -0x6ec9: "Huang " -0x6eca: "Xi " -0x6ecb: "Zi " -0x6ecc: "Di " -0x6ecd: "Zhi " -0x6ece: "Ying " -0x6ecf: "Fu " -0x6ed0: "Jie " -0x6ed1: "Hua " -0x6ed2: "Ge " -0x6ed3: "Zi " -0x6ed4: "Tao " -0x6ed5: "Teng " -0x6ed6: "Sui " -0x6ed7: "Bi " -0x6ed8: "Jiao " -0x6ed9: "Hui " -0x6eda: "Gun " -0x6edb: "Yin " -0x6edc: "Gao " -0x6edd: "Long " -0x6ede: "Zhi " -0x6edf: "Yan " -0x6ee0: "She " -0x6ee1: "Man " -0x6ee2: "Ying " -0x6ee3: "Chun " -0x6ee4: "Lu " -0x6ee5: "Lan " -0x6ee6: "Luan " -0x6ee7: "[?] " -0x6ee8: "Bin " -0x6ee9: "Tan " -0x6eea: "Yu " -0x6eeb: "Sou " -0x6eec: "Hu " -0x6eed: "Bi " -0x6eee: "Biao " -0x6eef: "Zhi " -0x6ef0: "Jiang " -0x6ef1: "Kou " -0x6ef2: "Shen " -0x6ef3: "Shang " -0x6ef4: "Di " -0x6ef5: "Mi " -0x6ef6: "Ao " -0x6ef7: "Lu " -0x6ef8: "Hu " -0x6ef9: "Hu " -0x6efa: "You " -0x6efb: "Chan " -0x6efc: "Fan " -0x6efd: "Yong " -0x6efe: "Gun " -0x6eff: "Man " -/* x06f */ -0x6f00: "Qing " -0x6f01: "Yu " -0x6f02: "Piao " -0x6f03: "Ji " -0x6f04: "Ya " -0x6f05: "Jiao " -0x6f06: "Qi " -0x6f07: "Xi " -0x6f08: "Ji " -0x6f09: "Lu " -0x6f0a: "Lu " -0x6f0b: "Long " -0x6f0c: "Jin " -0x6f0d: "Guo " -0x6f0e: "Cong " -0x6f0f: "Lou " -0x6f10: "Zhi " -0x6f11: "Gai " -0x6f12: "Qiang " -0x6f13: "Li " -0x6f14: "Yan " -0x6f15: "Cao " -0x6f16: "Jiao " -0x6f17: "Cong " -0x6f18: "Qun " -0x6f19: "Tuan " -0x6f1a: "Ou " -0x6f1b: "Teng " -0x6f1c: "Ye " -0x6f1d: "Xi " -0x6f1e: "Mi " -0x6f1f: "Tang " -0x6f20: "Mo " -0x6f21: "Shang " -0x6f22: "Han " -0x6f23: "Lian " -0x6f24: "Lan " -0x6f25: "Wa " -0x6f26: "Li " -0x6f27: "Qian " -0x6f28: "Feng " -0x6f29: "Xuan " -0x6f2a: "Yi " -0x6f2b: "Man " -0x6f2c: "Zi " -0x6f2d: "Mang " -0x6f2e: "Kang " -0x6f2f: "Lei " -0x6f30: "Peng " -0x6f31: "Shu " -0x6f32: "Zhang " -0x6f33: "Zhang " -0x6f34: "Chong " -0x6f35: "Xu " -0x6f36: "Huan " -0x6f37: "Kuo " -0x6f38: "Jian " -0x6f39: "Yan " -0x6f3a: "Chuang " -0x6f3b: "Liao " -0x6f3c: "Cui " -0x6f3d: "Ti " -0x6f3e: "Yang " -0x6f3f: "Jiang " -0x6f40: "Cong " -0x6f41: "Ying " -0x6f42: "Hong " -0x6f43: "Xun " -0x6f44: "Shu " -0x6f45: "Guan " -0x6f46: "Ying " -0x6f47: "Xiao " -0x6f48: "[?] " -0x6f49: "[?] " -0x6f4a: "Xu " -0x6f4b: "Lian " -0x6f4c: "Zhi " -0x6f4d: "Wei " -0x6f4e: "Pi " -0x6f4f: "Jue " -0x6f50: "Jiao " -0x6f51: "Po " -0x6f52: "Dang " -0x6f53: "Hui " -0x6f54: "Jie " -0x6f55: "Wu " -0x6f56: "Pa " -0x6f57: "Ji " -0x6f58: "Pan " -0x6f59: "Gui " -0x6f5a: "Xiao " -0x6f5b: "Qian " -0x6f5c: "Qian " -0x6f5d: "Xi " -0x6f5e: "Lu " -0x6f5f: "Xi " -0x6f60: "Xuan " -0x6f61: "Dun " -0x6f62: "Huang " -0x6f63: "Min " -0x6f64: "Run " -0x6f65: "Su " -0x6f66: "Liao " -0x6f67: "Zhen " -0x6f68: "Zhong " -0x6f69: "Yi " -0x6f6a: "Di " -0x6f6b: "Wan " -0x6f6c: "Dan " -0x6f6d: "Tan " -0x6f6e: "Chao " -0x6f6f: "Xun " -0x6f70: "Kui " -0x6f71: "Yie " -0x6f72: "Shao " -0x6f73: "Tu " -0x6f74: "Zhu " -0x6f75: "San " -0x6f76: "Hei " -0x6f77: "Bi " -0x6f78: "Shan " -0x6f79: "Chan " -0x6f7a: "Chan " -0x6f7b: "Shu " -0x6f7c: "Tong " -0x6f7d: "Pu " -0x6f7e: "Lin " -0x6f7f: "Wei " -0x6f80: "Se " -0x6f81: "Se " -0x6f82: "Cheng " -0x6f83: "Jiong " -0x6f84: "Cheng " -0x6f85: "Hua " -0x6f86: "Jiao " -0x6f87: "Lao " -0x6f88: "Che " -0x6f89: "Gan " -0x6f8a: "Cun " -0x6f8b: "Heng " -0x6f8c: "Si " -0x6f8d: "Shu " -0x6f8e: "Peng " -0x6f8f: "Han " -0x6f90: "Yun " -0x6f91: "Liu " -0x6f92: "Hong " -0x6f93: "Fu " -0x6f94: "Hao " -0x6f95: "He " -0x6f96: "Xian " -0x6f97: "Jian " -0x6f98: "Shan " -0x6f99: "Xi " -0x6f9a: "Oki " -0x6f9b: "[?] " -0x6f9c: "Lan " -0x6f9d: "[?] " -0x6f9e: "Yu " -0x6f9f: "Lin " -0x6fa0: "Min " -0x6fa1: "Zao " -0x6fa2: "Dang " -0x6fa3: "Wan " -0x6fa4: "Ze " -0x6fa5: "Xie " -0x6fa6: "Yu " -0x6fa7: "Li " -0x6fa8: "Shi " -0x6fa9: "Xue " -0x6faa: "Ling " -0x6fab: "Man " -0x6fac: "Zi " -0x6fad: "Yong " -0x6fae: "Kuai " -0x6faf: "Can " -0x6fb0: "Lian " -0x6fb1: "Dian " -0x6fb2: "Ye " -0x6fb3: "Ao " -0x6fb4: "Huan " -0x6fb5: "Zhen " -0x6fb6: "Chan " -0x6fb7: "Man " -0x6fb8: "Dan " -0x6fb9: "Dan " -0x6fba: "Yi " -0x6fbb: "Sui " -0x6fbc: "Pi " -0x6fbd: "Ju " -0x6fbe: "Ta " -0x6fbf: "Qin " -0x6fc0: "Ji " -0x6fc1: "Zhuo " -0x6fc2: "Lian " -0x6fc3: "Nong " -0x6fc4: "Guo " -0x6fc5: "Jin " -0x6fc6: "Fen " -0x6fc7: "Se " -0x6fc8: "Ji " -0x6fc9: "Sui " -0x6fca: "Hui " -0x6fcb: "Chu " -0x6fcc: "Ta " -0x6fcd: "Song " -0x6fce: "Ding " -0x6fcf: "[?] " -0x6fd0: "Zhu " -0x6fd1: "Lai " -0x6fd2: "Bin " -0x6fd3: "Lian " -0x6fd4: "Mi " -0x6fd5: "Shi " -0x6fd6: "Shu " -0x6fd7: "Mi " -0x6fd8: "Ning " -0x6fd9: "Ying " -0x6fda: "Ying " -0x6fdb: "Meng " -0x6fdc: "Jin " -0x6fdd: "Qi " -0x6fde: "Pi " -0x6fdf: "Ji " -0x6fe0: "Hao " -0x6fe1: "Ru " -0x6fe2: "Zui " -0x6fe3: "Wo " -0x6fe4: "Tao " -0x6fe5: "Yin " -0x6fe6: "Yin " -0x6fe7: "Dui " -0x6fe8: "Ci " -0x6fe9: "Huo " -0x6fea: "Jing " -0x6feb: "Lan " -0x6fec: "Jun " -0x6fed: "Ai " -0x6fee: "Pu " -0x6fef: "Zhuo " -0x6ff0: "Wei " -0x6ff1: "Bin " -0x6ff2: "Gu " -0x6ff3: "Qian " -0x6ff4: "Xing " -0x6ff5: "Hama " -0x6ff6: "Kuo " -0x6ff7: "Fei " -0x6ff8: "[?] " -0x6ff9: "Boku " -0x6ffa: "Jian " -0x6ffb: "Wei " -0x6ffc: "Luo " -0x6ffd: "Zan " -0x6ffe: "Lu " -0x6fff: "Li " -/* x070 */ -0x7000: "You " -0x7001: "Yang " -0x7002: "Lu " -0x7003: "Si " -0x7004: "Jie " -0x7005: "Ying " -0x7006: "Du " -0x7007: "Wang " -0x7008: "Hui " -0x7009: "Xie " -0x700a: "Pan " -0x700b: "Shen " -0x700c: "Biao " -0x700d: "Chan " -0x700e: "Mo " -0x700f: "Liu " -0x7010: "Jian " -0x7011: "Pu " -0x7012: "Se " -0x7013: "Cheng " -0x7014: "Gu " -0x7015: "Bin " -0x7016: "Huo " -0x7017: "Xian " -0x7018: "Lu " -0x7019: "Qin " -0x701a: "Han " -0x701b: "Ying " -0x701c: "Yong " -0x701d: "Li " -0x701e: "Jing " -0x701f: "Xiao " -0x7020: "Ying " -0x7021: "Sui " -0x7022: "Wei " -0x7023: "Xie " -0x7024: "Huai " -0x7025: "Hao " -0x7026: "Zhu " -0x7027: "Long " -0x7028: "Lai " -0x7029: "Dui " -0x702a: "Fan " -0x702b: "Hu " -0x702c: "Lai " -0x702d: "[?] " -0x702e: "[?] " -0x702f: "Ying " -0x7030: "Mi " -0x7031: "Ji " -0x7032: "Lian " -0x7033: "Jian " -0x7034: "Ying " -0x7035: "Fen " -0x7036: "Lin " -0x7037: "Yi " -0x7038: "Jian " -0x7039: "Yue " -0x703a: "Chan " -0x703b: "Dai " -0x703c: "Rang " -0x703d: "Jian " -0x703e: "Lan " -0x703f: "Fan " -0x7040: "Shuang " -0x7041: "Yuan " -0x7042: "Zhuo " -0x7043: "Feng " -0x7044: "She " -0x7045: "Lei " -0x7046: "Lan " -0x7047: "Cong " -0x7048: "Qu " -0x7049: "Yong " -0x704a: "Qian " -0x704b: "Fa " -0x704c: "Guan " -0x704d: "Que " -0x704e: "Yan " -0x704f: "Hao " -0x7050: "Hyeng " -0x7051: "Sa " -0x7052: "Zan " -0x7053: "Luan " -0x7054: "Yan " -0x7055: "Li " -0x7056: "Mi " -0x7057: "Shan " -0x7058: "Tan " -0x7059: "Dang " -0x705a: "Jiao " -0x705b: "Chan " -0x705c: "[?] " -0x705d: "Hao " -0x705e: "Ba " -0x705f: "Zhu " -0x7060: "Lan " -0x7061: "Lan " -0x7062: "Nang " -0x7063: "Wan " -0x7064: "Luan " -0x7065: "Xun " -0x7066: "Xian " -0x7067: "Yan " -0x7068: "Gan " -0x7069: "Yan " -0x706a: "Yu " -0x706b: "Huo " -0x706c: "Si " -0x706d: "Mie " -0x706e: "Guang " -0x706f: "Deng " -0x7070: "Hui " -0x7071: "Xiao " -0x7072: "Xiao " -0x7073: "Hu " -0x7074: "Hong " -0x7075: "Ling " -0x7076: "Zao " -0x7077: "Zhuan " -0x7078: "Jiu " -0x7079: "Zha " -0x707a: "Xie " -0x707b: "Chi " -0x707c: "Zhuo " -0x707d: "Zai " -0x707e: "Zai " -0x707f: "Can " -0x7080: "Yang " -0x7081: "Qi " -0x7082: "Zhong " -0x7083: "Fen " -0x7084: "Niu " -0x7085: "Jiong " -0x7086: "Wen " -0x7087: "Po " -0x7088: "Yi " -0x7089: "Lu " -0x708a: "Chui " -0x708b: "Pi " -0x708c: "Kai " -0x708d: "Pan " -0x708e: "Yan " -0x708f: "Kai " -0x7090: "Pang " -0x7091: "Mu " -0x7092: "Chao " -0x7093: "Liao " -0x7094: "Gui " -0x7095: "Kang " -0x7096: "Tun " -0x7097: "Guang " -0x7098: "Xin " -0x7099: "Zhi " -0x709a: "Guang " -0x709b: "Guang " -0x709c: "Wei " -0x709d: "Qiang " -0x709e: "[?] " -0x709f: "Da " -0x70a0: "Xia " -0x70a1: "Zheng " -0x70a2: "Zhu " -0x70a3: "Ke " -0x70a4: "Zhao " -0x70a5: "Fu " -0x70a6: "Ba " -0x70a7: "Duo " -0x70a8: "Duo " -0x70a9: "Ling " -0x70aa: "Zhuo " -0x70ab: "Xuan " -0x70ac: "Ju " -0x70ad: "Tan " -0x70ae: "Pao " -0x70af: "Jiong " -0x70b0: "Pao " -0x70b1: "Tai " -0x70b2: "Tai " -0x70b3: "Bing " -0x70b4: "Yang " -0x70b5: "Tong " -0x70b6: "Han " -0x70b7: "Zhu " -0x70b8: "Zha " -0x70b9: "Dian " -0x70ba: "Wei " -0x70bb: "Shi " -0x70bc: "Lian " -0x70bd: "Chi " -0x70be: "Huang " -0x70bf: "[?] " -0x70c0: "Hu " -0x70c1: "Shuo " -0x70c2: "Lan " -0x70c3: "Jing " -0x70c4: "Jiao " -0x70c5: "Xu " -0x70c6: "Xing " -0x70c7: "Quan " -0x70c8: "Lie " -0x70c9: "Huan " -0x70ca: "Yang " -0x70cb: "Xiao " -0x70cc: "Xiu " -0x70cd: "Xian " -0x70ce: "Yin " -0x70cf: "Wu " -0x70d0: "Zhou " -0x70d1: "Yao " -0x70d2: "Shi " -0x70d3: "Wei " -0x70d4: "Tong " -0x70d5: "Xue " -0x70d6: "Zai " -0x70d7: "Kai " -0x70d8: "Hong " -0x70d9: "Luo " -0x70da: "Xia " -0x70db: "Zhu " -0x70dc: "Xuan " -0x70dd: "Zheng " -0x70de: "Po " -0x70df: "Yan " -0x70e0: "Hui " -0x70e1: "Guang " -0x70e2: "Zhe " -0x70e3: "Hui " -0x70e4: "Kao " -0x70e5: "[?] " -0x70e6: "Fan " -0x70e7: "Shao " -0x70e8: "Ye " -0x70e9: "Hui " -0x70ea: "[?] " -0x70eb: "Tang " -0x70ec: "Jin " -0x70ed: "Re " -0x70ee: "[?] " -0x70ef: "Xi " -0x70f0: "Fu " -0x70f1: "Jiong " -0x70f2: "Che " -0x70f3: "Pu " -0x70f4: "Jing " -0x70f5: "Zhuo " -0x70f6: "Ting " -0x70f7: "Wan " -0x70f8: "Hai " -0x70f9: "Peng " -0x70fa: "Lang " -0x70fb: "Shan " -0x70fc: "Hu " -0x70fd: "Feng " -0x70fe: "Chi " -0x70ff: "Rong " -/* x071 */ -0x7100: "Hu " -0x7101: "Xi " -0x7102: "Shu " -0x7103: "He " -0x7104: "Xun " -0x7105: "Ku " -0x7106: "Jue " -0x7107: "Xiao " -0x7108: "Xi " -0x7109: "Yan " -0x710a: "Han " -0x710b: "Zhuang " -0x710c: "Jun " -0x710d: "Di " -0x710e: "Xie " -0x710f: "Ji " -0x7110: "Wu " -0x7111: "[?] " -0x7112: "[?] " -0x7113: "Han " -0x7114: "Yan " -0x7115: "Huan " -0x7116: "Men " -0x7117: "Ju " -0x7118: "Chou " -0x7119: "Bei " -0x711a: "Fen " -0x711b: "Lin " -0x711c: "Kun " -0x711d: "Hun " -0x711e: "Tun " -0x711f: "Xi " -0x7120: "Cui " -0x7121: "Wu " -0x7122: "Hong " -0x7123: "Ju " -0x7124: "Fu " -0x7125: "Wo " -0x7126: "Jiao " -0x7127: "Cong " -0x7128: "Feng " -0x7129: "Ping " -0x712a: "Qiong " -0x712b: "Ruo " -0x712c: "Xi " -0x712d: "Qiong " -0x712e: "Xin " -0x712f: "Zhuo " -0x7130: "Yan " -0x7131: "Yan " -0x7132: "Yi " -0x7133: "Jue " -0x7134: "Yu " -0x7135: "Gang " -0x7136: "Ran " -0x7137: "Pi " -0x7138: "Gu " -0x7139: "[?] " -0x713a: "Sheng " -0x713b: "Chang " -0x713c: "Shao " -0x713d: "[?] " -0x713e: "[?] " -0x713f: "[?] " -0x7140: "[?] " -0x7141: "Chen " -0x7142: "He " -0x7143: "Kui " -0x7144: "Zhong " -0x7145: "Duan " -0x7146: "Xia " -0x7147: "Hui " -0x7148: "Feng " -0x7149: "Lian " -0x714a: "Xuan " -0x714b: "Xing " -0x714c: "Huang " -0x714d: "Jiao " -0x714e: "Jian " -0x714f: "Bi " -0x7150: "Ying " -0x7151: "Zhu " -0x7152: "Wei " -0x7153: "Tuan " -0x7154: "Tian " -0x7155: "Xi " -0x7156: "Nuan " -0x7157: "Nuan " -0x7158: "Chan " -0x7159: "Yan " -0x715a: "Jiong " -0x715b: "Jiong " -0x715c: "Yu " -0x715d: "Mei " -0x715e: "Sha " -0x715f: "Wei " -0x7160: "Ye " -0x7161: "Xin " -0x7162: "Qiong " -0x7163: "Rou " -0x7164: "Mei " -0x7165: "Huan " -0x7166: "Xu " -0x7167: "Zhao " -0x7168: "Wei " -0x7169: "Fan " -0x716a: "Qiu " -0x716b: "Sui " -0x716c: "Yang " -0x716d: "Lie " -0x716e: "Zhu " -0x716f: "Jie " -0x7170: "Gao " -0x7171: "Gua " -0x7172: "Bao " -0x7173: "Hu " -0x7174: "Yun " -0x7175: "Xia " -0x7176: "[?] " -0x7177: "[?] " -0x7178: "Bian " -0x7179: "Gou " -0x717a: "Tui " -0x717b: "Tang " -0x717c: "Chao " -0x717d: "Shan " -0x717e: "N " -0x717f: "Bo " -0x7180: "Huang " -0x7181: "Xie " -0x7182: "Xi " -0x7183: "Wu " -0x7184: "Xi " -0x7185: "Yun " -0x7186: "He " -0x7187: "He " -0x7188: "Xi " -0x7189: "Yun " -0x718a: "Xiong " -0x718b: "Nai " -0x718c: "Shan " -0x718d: "Qiong " -0x718e: "Yao " -0x718f: "Xun " -0x7190: "Mi " -0x7191: "Lian " -0x7192: "Ying " -0x7193: "Wen " -0x7194: "Rong " -0x7195: "Oozutsu " -0x7196: "[?] " -0x7197: "Qiang " -0x7198: "Liu " -0x7199: "Xi " -0x719a: "Bi " -0x719b: "Biao " -0x719c: "Zong " -0x719d: "Lu " -0x719e: "Jian " -0x719f: "Shou " -0x71a0: "Yi " -0x71a1: "Lou " -0x71a2: "Feng " -0x71a3: "Sui " -0x71a4: "Yi " -0x71a5: "Tong " -0x71a6: "Jue " -0x71a7: "Zong " -0x71a8: "Yun " -0x71a9: "Hu " -0x71aa: "Yi " -0x71ab: "Zhi " -0x71ac: "Ao " -0x71ad: "Wei " -0x71ae: "Liao " -0x71af: "Han " -0x71b0: "Ou " -0x71b1: "Re " -0x71b2: "Jiong " -0x71b3: "Man " -0x71b4: "[?] " -0x71b5: "Shang " -0x71b6: "Cuan " -0x71b7: "Zeng " -0x71b8: "Jian " -0x71b9: "Xi " -0x71ba: "Xi " -0x71bb: "Xi " -0x71bc: "Yi " -0x71bd: "Xiao " -0x71be: "Chi " -0x71bf: "Huang " -0x71c0: "Chan " -0x71c1: "Ye " -0x71c2: "Qian " -0x71c3: "Ran " -0x71c4: "Yan " -0x71c5: "Xian " -0x71c6: "Qiao " -0x71c7: "Zun " -0x71c8: "Deng " -0x71c9: "Dun " -0x71ca: "Shen " -0x71cb: "Jiao " -0x71cc: "Fen " -0x71cd: "Si " -0x71ce: "Liao " -0x71cf: "Yu " -0x71d0: "Lin " -0x71d1: "Tong " -0x71d2: "Shao " -0x71d3: "Fen " -0x71d4: "Fan " -0x71d5: "Yan " -0x71d6: "Xun " -0x71d7: "Lan " -0x71d8: "Mei " -0x71d9: "Tang " -0x71da: "Yi " -0x71db: "Jing " -0x71dc: "Men " -0x71dd: "[?] " -0x71de: "[?] " -0x71df: "Ying " -0x71e0: "Yu " -0x71e1: "Yi " -0x71e2: "Xue " -0x71e3: "Lan " -0x71e4: "Tai " -0x71e5: "Zao " -0x71e6: "Can " -0x71e7: "Sui " -0x71e8: "Xi " -0x71e9: "Que " -0x71ea: "Cong " -0x71eb: "Lian " -0x71ec: "Hui " -0x71ed: "Zhu " -0x71ee: "Xie " -0x71ef: "Ling " -0x71f0: "Wei " -0x71f1: "Yi " -0x71f2: "Xie " -0x71f3: "Zhao " -0x71f4: "Hui " -0x71f5: "Tatsu " -0x71f6: "Nung " -0x71f7: "Lan " -0x71f8: "Ru " -0x71f9: "Xian " -0x71fa: "Kao " -0x71fb: "Xun " -0x71fc: "Jin " -0x71fd: "Chou " -0x71fe: "Chou " -0x71ff: "Yao " -/* x072 */ -0x7200: "He " -0x7201: "Lan " -0x7202: "Biao " -0x7203: "Rong " -0x7204: "Li " -0x7205: "Mo " -0x7206: "Bao " -0x7207: "Ruo " -0x7208: "Lu " -0x7209: "La " -0x720a: "Ao " -0x720b: "Xun " -0x720c: "Kuang " -0x720d: "Shuo " -0x720e: "[?] " -0x720f: "Li " -0x7210: "Lu " -0x7211: "Jue " -0x7212: "Liao " -0x7213: "Yan " -0x7214: "Xi " -0x7215: "Xie " -0x7216: "Long " -0x7217: "Ye " -0x7218: "[?] " -0x7219: "Rang " -0x721a: "Yue " -0x721b: "Lan " -0x721c: "Cong " -0x721d: "Jue " -0x721e: "Tong " -0x721f: "Guan " -0x7220: "[?] " -0x7221: "Che " -0x7222: "Mi " -0x7223: "Tang " -0x7224: "Lan " -0x7225: "Zhu " -0x7226: "[?] " -0x7227: "Ling " -0x7228: "Cuan " -0x7229: "Yu " -0x722a: "Zhua " -0x722b: "Tsumekanmuri " -0x722c: "Pa " -0x722d: "Zheng " -0x722e: "Pao " -0x722f: "Cheng " -0x7230: "Yuan " -0x7231: "Ai " -0x7232: "Wei " -0x7233: "[?] " -0x7234: "Jue " -0x7235: "Jue " -0x7236: "Fu " -0x7237: "Ye " -0x7238: "Ba " -0x7239: "Die " -0x723a: "Ye " -0x723b: "Yao " -0x723c: "Zu " -0x723d: "Shuang " -0x723e: "Er " -0x723f: "Qiang " -0x7240: "Chuang " -0x7241: "Ge " -0x7242: "Zang " -0x7243: "Die " -0x7244: "Qiang " -0x7245: "Yong " -0x7246: "Qiang " -0x7247: "Pian " -0x7248: "Ban " -0x7249: "Pan " -0x724a: "Shao " -0x724b: "Jian " -0x724c: "Pai " -0x724d: "Du " -0x724e: "Chuang " -0x724f: "Tou " -0x7250: "Zha " -0x7251: "Bian " -0x7252: "Die " -0x7253: "Bang " -0x7254: "Bo " -0x7255: "Chuang " -0x7256: "You " -0x7257: "[?] " -0x7258: "Du " -0x7259: "Ya " -0x725a: "Cheng " -0x725b: "Niu " -0x725c: "Ushihen " -0x725d: "Pin " -0x725e: "Jiu " -0x725f: "Mou " -0x7260: "Tuo " -0x7261: "Mu " -0x7262: "Lao " -0x7263: "Ren " -0x7264: "Mang " -0x7265: "Fang " -0x7266: "Mao " -0x7267: "Mu " -0x7268: "Gang " -0x7269: "Wu " -0x726a: "Yan " -0x726b: "Ge " -0x726c: "Bei " -0x726d: "Si " -0x726e: "Jian " -0x726f: "Gu " -0x7270: "You " -0x7271: "Ge " -0x7272: "Sheng " -0x7273: "Mu " -0x7274: "Di " -0x7275: "Qian " -0x7276: "Quan " -0x7277: "Quan " -0x7278: "Zi " -0x7279: "Te " -0x727a: "Xi " -0x727b: "Mang " -0x727c: "Keng " -0x727d: "Qian " -0x727e: "Wu " -0x727f: "Gu " -0x7280: "Xi " -0x7281: "Li " -0x7282: "Li " -0x7283: "Pou " -0x7284: "Ji " -0x7285: "Gang " -0x7286: "Zhi " -0x7287: "Ben " -0x7288: "Quan " -0x7289: "Run " -0x728a: "Du " -0x728b: "Ju " -0x728c: "Jia " -0x728d: "Jian " -0x728e: "Feng " -0x728f: "Pian " -0x7290: "Ke " -0x7291: "Ju " -0x7292: "Kao " -0x7293: "Chu " -0x7294: "Xi " -0x7295: "Bei " -0x7296: "Luo " -0x7297: "Jie " -0x7298: "Ma " -0x7299: "San " -0x729a: "Wei " -0x729b: "Li " -0x729c: "Dun " -0x729d: "Tong " -0x729e: "[?] " -0x729f: "Jiang " -0x72a0: "Ikenie " -0x72a1: "Li " -0x72a2: "Du " -0x72a3: "Lie " -0x72a4: "Pi " -0x72a5: "Piao " -0x72a6: "Bao " -0x72a7: "Xi " -0x72a8: "Chou " -0x72a9: "Wei " -0x72aa: "Kui " -0x72ab: "Chou " -0x72ac: "Quan " -0x72ad: "Fan " -0x72ae: "Ba " -0x72af: "Fan " -0x72b0: "Qiu " -0x72b1: "Ji " -0x72b2: "Cai " -0x72b3: "Chuo " -0x72b4: "An " -0x72b5: "Jie " -0x72b6: "Zhuang " -0x72b7: "Guang " -0x72b8: "Ma " -0x72b9: "You " -0x72ba: "Kang " -0x72bb: "Bo " -0x72bc: "Hou " -0x72bd: "Ya " -0x72be: "Yin " -0x72bf: "Huan " -0x72c0: "Zhuang " -0x72c1: "Yun " -0x72c2: "Kuang " -0x72c3: "Niu " -0x72c4: "Di " -0x72c5: "Qing " -0x72c6: "Zhong " -0x72c7: "Mu " -0x72c8: "Bei " -0x72c9: "Pi " -0x72ca: "Ju " -0x72cb: "Ni " -0x72cc: "Sheng " -0x72cd: "Pao " -0x72ce: "Xia " -0x72cf: "Tuo " -0x72d0: "Hu " -0x72d1: "Ling " -0x72d2: "Fei " -0x72d3: "Pi " -0x72d4: "Ni " -0x72d5: "Ao " -0x72d6: "You " -0x72d7: "Gou " -0x72d8: "Yue " -0x72d9: "Ju " -0x72da: "Dan " -0x72db: "Po " -0x72dc: "Gu " -0x72dd: "Xian " -0x72de: "Ning " -0x72df: "Huan " -0x72e0: "Hen " -0x72e1: "Jiao " -0x72e2: "He " -0x72e3: "Zhao " -0x72e4: "Ji " -0x72e5: "Xun " -0x72e6: "Shan " -0x72e7: "Ta " -0x72e8: "Rong " -0x72e9: "Shou " -0x72ea: "Tong " -0x72eb: "Lao " -0x72ec: "Du " -0x72ed: "Xia " -0x72ee: "Shi " -0x72ef: "Hua " -0x72f0: "Zheng " -0x72f1: "Yu " -0x72f2: "Sun " -0x72f3: "Yu " -0x72f4: "Bi " -0x72f5: "Mang " -0x72f6: "Xi " -0x72f7: "Juan " -0x72f8: "Li " -0x72f9: "Xia " -0x72fa: "Yin " -0x72fb: "Suan " -0x72fc: "Lang " -0x72fd: "Bei " -0x72fe: "Zhi " -0x72ff: "Yan " -/* x073 */ -0x7300: "Sha " -0x7301: "Li " -0x7302: "Han " -0x7303: "Xian " -0x7304: "Jing " -0x7305: "Pai " -0x7306: "Fei " -0x7307: "Yao " -0x7308: "Ba " -0x7309: "Qi " -0x730a: "Ni " -0x730b: "Biao " -0x730c: "Yin " -0x730d: "Lai " -0x730e: "Xi " -0x730f: "Jian " -0x7310: "Qiang " -0x7311: "Kun " -0x7312: "Yan " -0x7313: "Guo " -0x7314: "Zong " -0x7315: "Mi " -0x7316: "Chang " -0x7317: "Yi " -0x7318: "Zhi " -0x7319: "Zheng " -0x731a: "Ya " -0x731b: "Meng " -0x731c: "Cai " -0x731d: "Cu " -0x731e: "She " -0x731f: "Kari " -0x7320: "Cen " -0x7321: "Luo " -0x7322: "Hu " -0x7323: "Zong " -0x7324: "Ji " -0x7325: "Wei " -0x7326: "Feng " -0x7327: "Wo " -0x7328: "Yuan " -0x7329: "Xing " -0x732a: "Zhu " -0x732b: "Mao " -0x732c: "Wei " -0x732d: "Yuan " -0x732e: "Xian " -0x732f: "Tuan " -0x7330: "Ya " -0x7331: "Nao " -0x7332: "Xie " -0x7333: "Jia " -0x7334: "Hou " -0x7335: "Bian " -0x7336: "You " -0x7337: "You " -0x7338: "Mei " -0x7339: "Zha " -0x733a: "Yao " -0x733b: "Sun " -0x733c: "Bo " -0x733d: "Ming " -0x733e: "Hua " -0x733f: "Yuan " -0x7340: "Sou " -0x7341: "Ma " -0x7342: "Yuan " -0x7343: "Dai " -0x7344: "Yu " -0x7345: "Shi " -0x7346: "Hao " -0x7347: "[?] " -0x7348: "Yi " -0x7349: "Zhen " -0x734a: "Chuang " -0x734b: "Hao " -0x734c: "Man " -0x734d: "Jing " -0x734e: "Jiang " -0x734f: "Mu " -0x7350: "Zhang " -0x7351: "Chan " -0x7352: "Ao " -0x7353: "Ao " -0x7354: "Hao " -0x7355: "Cui " -0x7356: "Fen " -0x7357: "Jue " -0x7358: "Bi " -0x7359: "Bi " -0x735a: "Huang " -0x735b: "Pu " -0x735c: "Lin " -0x735d: "Yu " -0x735e: "Tong " -0x735f: "Yao " -0x7360: "Liao " -0x7361: "Shuo " -0x7362: "Xiao " -0x7363: "Swu " -0x7364: "Ton " -0x7365: "Xi " -0x7366: "Ge " -0x7367: "Juan " -0x7368: "Du " -0x7369: "Hui " -0x736a: "Kuai " -0x736b: "Xian " -0x736c: "Xie " -0x736d: "Ta " -0x736e: "Xian " -0x736f: "Xun " -0x7370: "Ning " -0x7371: "Pin " -0x7372: "Huo " -0x7373: "Nou " -0x7374: "Meng " -0x7375: "Lie " -0x7376: "Nao " -0x7377: "Guang " -0x7378: "Shou " -0x7379: "Lu " -0x737a: "Ta " -0x737b: "Xian " -0x737c: "Mi " -0x737d: "Rang " -0x737e: "Huan " -0x737f: "Nao " -0x7380: "Luo " -0x7381: "Xian " -0x7382: "Qi " -0x7383: "Jue " -0x7384: "Xuan " -0x7385: "Miao " -0x7386: "Zi " -0x7387: "Lu " -0x7388: "Lu " -0x7389: "Yu " -0x738a: "Su " -0x738b: "Wang " -0x738c: "Qiu " -0x738d: "Ga " -0x738e: "Ding " -0x738f: "Le " -0x7390: "Ba " -0x7391: "Ji " -0x7392: "Hong " -0x7393: "Di " -0x7394: "Quan " -0x7395: "Gan " -0x7396: "Jiu " -0x7397: "Yu " -0x7398: "Ji " -0x7399: "Yu " -0x739a: "Yang " -0x739b: "Ma " -0x739c: "Gong " -0x739d: "Wu " -0x739e: "Fu " -0x739f: "Wen " -0x73a0: "Jie " -0x73a1: "Ya " -0x73a2: "Fen " -0x73a3: "Bian " -0x73a4: "Beng " -0x73a5: "Yue " -0x73a6: "Jue " -0x73a7: "Yun " -0x73a8: "Jue " -0x73a9: "Wan " -0x73aa: "Jian " -0x73ab: "Mei " -0x73ac: "Dan " -0x73ad: "Pi " -0x73ae: "Wei " -0x73af: "Huan " -0x73b0: "Xian " -0x73b1: "Qiang " -0x73b2: "Ling " -0x73b3: "Dai " -0x73b4: "Yi " -0x73b5: "An " -0x73b6: "Ping " -0x73b7: "Dian " -0x73b8: "Fu " -0x73b9: "Xuan " -0x73ba: "Xi " -0x73bb: "Bo " -0x73bc: "Ci " -0x73bd: "Gou " -0x73be: "Jia " -0x73bf: "Shao " -0x73c0: "Po " -0x73c1: "Ci " -0x73c2: "Ke " -0x73c3: "Ran " -0x73c4: "Sheng " -0x73c5: "Shen " -0x73c6: "Yi " -0x73c7: "Zu " -0x73c8: "Jia " -0x73c9: "Min " -0x73ca: "Shan " -0x73cb: "Liu " -0x73cc: "Bi " -0x73cd: "Zhen " -0x73ce: "Zhen " -0x73cf: "Jue " -0x73d0: "Fa " -0x73d1: "Long " -0x73d2: "Jin " -0x73d3: "Jiao " -0x73d4: "Jian " -0x73d5: "Li " -0x73d6: "Guang " -0x73d7: "Xian " -0x73d8: "Zhou " -0x73d9: "Gong " -0x73da: "Yan " -0x73db: "Xiu " -0x73dc: "Yang " -0x73dd: "Xu " -0x73de: "Luo " -0x73df: "Su " -0x73e0: "Zhu " -0x73e1: "Qin " -0x73e2: "Ken " -0x73e3: "Xun " -0x73e4: "Bao " -0x73e5: "Er " -0x73e6: "Xiang " -0x73e7: "Yao " -0x73e8: "Xia " -0x73e9: "Heng " -0x73ea: "Gui " -0x73eb: "Chong " -0x73ec: "Xu " -0x73ed: "Ban " -0x73ee: "Pei " -0x73ef: "[?] " -0x73f0: "Dang " -0x73f1: "Ei " -0x73f2: "Hun " -0x73f3: "Wen " -0x73f4: "E " -0x73f5: "Cheng " -0x73f6: "Ti " -0x73f7: "Wu " -0x73f8: "Wu " -0x73f9: "Cheng " -0x73fa: "Jun " -0x73fb: "Mei " -0x73fc: "Bei " -0x73fd: "Ting " -0x73fe: "Xian " -0x73ff: "Chuo " -/* x074 */ -0x7400: "Han " -0x7401: "Xuan " -0x7402: "Yan " -0x7403: "Qiu " -0x7404: "Quan " -0x7405: "Lang " -0x7406: "Li " -0x7407: "Xiu " -0x7408: "Fu " -0x7409: "Liu " -0x740a: "Ye " -0x740b: "Xi " -0x740c: "Ling " -0x740d: "Li " -0x740e: "Jin " -0x740f: "Lian " -0x7410: "Suo " -0x7411: "Chiisai " -0x7412: "[?] " -0x7413: "Wan " -0x7414: "Dian " -0x7415: "Pin " -0x7416: "Zhan " -0x7417: "Cui " -0x7418: "Min " -0x7419: "Yu " -0x741a: "Ju " -0x741b: "Chen " -0x741c: "Lai " -0x741d: "Wen " -0x741e: "Sheng " -0x741f: "Wei " -0x7420: "Dian " -0x7421: "Chu " -0x7422: "Zhuo " -0x7423: "Pei " -0x7424: "Cheng " -0x7425: "Hu " -0x7426: "Qi " -0x7427: "E " -0x7428: "Kun " -0x7429: "Chang " -0x742a: "Qi " -0x742b: "Beng " -0x742c: "Wan " -0x742d: "Lu " -0x742e: "Cong " -0x742f: "Guan " -0x7430: "Yan " -0x7431: "Diao " -0x7432: "Bei " -0x7433: "Lin " -0x7434: "Qin " -0x7435: "Pi " -0x7436: "Pa " -0x7437: "Que " -0x7438: "Zhuo " -0x7439: "Qin " -0x743a: "Fa " -0x743b: "[?] " -0x743c: "Qiong " -0x743d: "Du " -0x743e: "Jie " -0x743f: "Hun " -0x7440: "Yu " -0x7441: "Mao " -0x7442: "Mei " -0x7443: "Chun " -0x7444: "Xuan " -0x7445: "Ti " -0x7446: "Xing " -0x7447: "Dai " -0x7448: "Rou " -0x7449: "Min " -0x744a: "Zhen " -0x744b: "Wei " -0x744c: "Ruan " -0x744d: "Huan " -0x744e: "Jie " -0x744f: "Chuan " -0x7450: "Jian " -0x7451: "Zhuan " -0x7452: "Yang " -0x7453: "Lian " -0x7454: "Quan " -0x7455: "Xia " -0x7456: "Duan " -0x7457: "Yuan " -0x7458: "Ye " -0x7459: "Nao " -0x745a: "Hu " -0x745b: "Ying " -0x745c: "Yu " -0x745d: "Huang " -0x745e: "Rui " -0x745f: "Se " -0x7460: "Liu " -0x7461: "Shi " -0x7462: "Rong " -0x7463: "Suo " -0x7464: "Yao " -0x7465: "Wen " -0x7466: "Wu " -0x7467: "Jin " -0x7468: "Jin " -0x7469: "Ying " -0x746a: "Ma " -0x746b: "Tao " -0x746c: "Liu " -0x746d: "Tang " -0x746e: "Li " -0x746f: "Lang " -0x7470: "Gui " -0x7471: "Zhen " -0x7472: "Qiang " -0x7473: "Cuo " -0x7474: "Jue " -0x7475: "Zhao " -0x7476: "Yao " -0x7477: "Ai " -0x7478: "Bin " -0x7479: "Tu " -0x747a: "Chang " -0x747b: "Kun " -0x747c: "Zhuan " -0x747d: "Cong " -0x747e: "Jin " -0x747f: "Yi " -0x7480: "Cui " -0x7481: "Cong " -0x7482: "Qi " -0x7483: "Li " -0x7484: "Ying " -0x7485: "Suo " -0x7486: "Qiu " -0x7487: "Xuan " -0x7488: "Ao " -0x7489: "Lian " -0x748a: "Man " -0x748b: "Zhang " -0x748c: "Yin " -0x748d: "[?] " -0x748e: "Ying " -0x748f: "Zhi " -0x7490: "Lu " -0x7491: "Wu " -0x7492: "Deng " -0x7493: "Xiou " -0x7494: "Zeng " -0x7495: "Xun " -0x7496: "Qu " -0x7497: "Dang " -0x7498: "Lin " -0x7499: "Liao " -0x749a: "Qiong " -0x749b: "Su " -0x749c: "Huang " -0x749d: "Gui " -0x749e: "Pu " -0x749f: "Jing " -0x74a0: "Fan " -0x74a1: "Jin " -0x74a2: "Liu " -0x74a3: "Ji " -0x74a4: "[?] " -0x74a5: "Jing " -0x74a6: "Ai " -0x74a7: "Bi " -0x74a8: "Can " -0x74a9: "Qu " -0x74aa: "Zao " -0x74ab: "Dang " -0x74ac: "Jiao " -0x74ad: "Gun " -0x74ae: "Tan " -0x74af: "Hui " -0x74b0: "Huan " -0x74b1: "Se " -0x74b2: "Sui " -0x74b3: "Tian " -0x74b4: "[?] " -0x74b5: "Yu " -0x74b6: "Jin " -0x74b7: "Lu " -0x74b8: "Bin " -0x74b9: "Shou " -0x74ba: "Wen " -0x74bb: "Zui " -0x74bc: "Lan " -0x74bd: "Xi " -0x74be: "Ji " -0x74bf: "Xuan " -0x74c0: "Ruan " -0x74c1: "Huo " -0x74c2: "Gai " -0x74c3: "Lei " -0x74c4: "Du " -0x74c5: "Li " -0x74c6: "Zhi " -0x74c7: "Rou " -0x74c8: "Li " -0x74c9: "Zan " -0x74ca: "Qiong " -0x74cb: "Zhe " -0x74cc: "Gui " -0x74cd: "Sui " -0x74ce: "La " -0x74cf: "Long " -0x74d0: "Lu " -0x74d1: "Li " -0x74d2: "Zan " -0x74d3: "Lan " -0x74d4: "Ying " -0x74d5: "Mi " -0x74d6: "Xiang " -0x74d7: "Xi " -0x74d8: "Guan " -0x74d9: "Dao " -0x74da: "Zan " -0x74db: "Huan " -0x74dc: "Gua " -0x74dd: "Bo " -0x74de: "Die " -0x74df: "Bao " -0x74e0: "Hu " -0x74e1: "Zhi " -0x74e2: "Piao " -0x74e3: "Ban " -0x74e4: "Rang " -0x74e5: "Li " -0x74e6: "Wa " -0x74e7: "Dekaguramu " -0x74e8: "Jiang " -0x74e9: "Qian " -0x74ea: "Fan " -0x74eb: "Pen " -0x74ec: "Fang " -0x74ed: "Dan " -0x74ee: "Weng " -0x74ef: "Ou " -0x74f0: "Deshiguramu " -0x74f1: "Miriguramu " -0x74f2: "Thon " -0x74f3: "Hu " -0x74f4: "Ling " -0x74f5: "Yi " -0x74f6: "Ping " -0x74f7: "Ci " -0x74f8: "Hekutogura " -0x74f9: "Juan " -0x74fa: "Chang " -0x74fb: "Chi " -0x74fc: "Sarake " -0x74fd: "Dang " -0x74fe: "Meng " -0x74ff: "Pou " -/* x075 */ -0x7500: "Zhui " -0x7501: "Ping " -0x7502: "Bian " -0x7503: "Zhou " -0x7504: "Zhen " -0x7505: "Senchigura " -0x7506: "Ci " -0x7507: "Ying " -0x7508: "Qi " -0x7509: "Xian " -0x750a: "Lou " -0x750b: "Di " -0x750c: "Ou " -0x750d: "Meng " -0x750e: "Zhuan " -0x750f: "Peng " -0x7510: "Lin " -0x7511: "Zeng " -0x7512: "Wu " -0x7513: "Pi " -0x7514: "Dan " -0x7515: "Weng " -0x7516: "Ying " -0x7517: "Yan " -0x7518: "Gan " -0x7519: "Dai " -0x751a: "Shen " -0x751b: "Tian " -0x751c: "Tian " -0x751d: "Han " -0x751e: "Chang " -0x751f: "Sheng " -0x7520: "Qing " -0x7521: "Sheng " -0x7522: "Chan " -0x7523: "Chan " -0x7524: "Rui " -0x7525: "Sheng " -0x7526: "Su " -0x7527: "Sen " -0x7528: "Yong " -0x7529: "Shuai " -0x752a: "Lu " -0x752b: "Fu " -0x752c: "Yong " -0x752d: "Beng " -0x752e: "Feng " -0x752f: "Ning " -0x7530: "Tian " -0x7531: "You " -0x7532: "Jia " -0x7533: "Shen " -0x7534: "Zha " -0x7535: "Dian " -0x7536: "Fu " -0x7537: "Nan " -0x7538: "Dian " -0x7539: "Ping " -0x753a: "Ting " -0x753b: "Hua " -0x753c: "Ting " -0x753d: "Quan " -0x753e: "Zi " -0x753f: "Meng " -0x7540: "Bi " -0x7541: "Qi " -0x7542: "Liu " -0x7543: "Xun " -0x7544: "Liu " -0x7545: "Chang " -0x7546: "Mu " -0x7547: "Yun " -0x7548: "Fan " -0x7549: "Fu " -0x754a: "Geng " -0x754b: "Tian " -0x754c: "Jie " -0x754d: "Jie " -0x754e: "Quan " -0x754f: "Wei " -0x7550: "Fu " -0x7551: "Tian " -0x7552: "Mu " -0x7553: "Tap " -0x7554: "Pan " -0x7555: "Jiang " -0x7556: "Wa " -0x7557: "Da " -0x7558: "Nan " -0x7559: "Liu " -0x755a: "Ben " -0x755b: "Zhen " -0x755c: "Chu " -0x755d: "Mu " -0x755e: "Mu " -0x755f: "Ce " -0x7560: "Cen " -0x7561: "Gai " -0x7562: "Bi " -0x7563: "Da " -0x7564: "Zhi " -0x7565: "Lue " -0x7566: "Qi " -0x7567: "Lue " -0x7568: "Pan " -0x7569: "Kesa " -0x756a: "Fan " -0x756b: "Hua " -0x756c: "Yu " -0x756d: "Yu " -0x756e: "Mu " -0x756f: "Jun " -0x7570: "Yi " -0x7571: "Liu " -0x7572: "Yu " -0x7573: "Die " -0x7574: "Chou " -0x7575: "Hua " -0x7576: "Dang " -0x7577: "Chuo " -0x7578: "Ji " -0x7579: "Wan " -0x757a: "Jiang " -0x757b: "Sheng " -0x757c: "Chang " -0x757d: "Tuan " -0x757e: "Lei " -0x757f: "Ji " -0x7580: "Cha " -0x7581: "Liu " -0x7582: "Tatamu " -0x7583: "Tuan " -0x7584: "Lin " -0x7585: "Jiang " -0x7586: "Jiang " -0x7587: "Chou " -0x7588: "Bo " -0x7589: "Die " -0x758a: "Die " -0x758b: "Pi " -0x758c: "Nie " -0x758d: "Dan " -0x758e: "Shu " -0x758f: "Shu " -0x7590: "Zhi " -0x7591: "Yi " -0x7592: "Chuang " -0x7593: "Nai " -0x7594: "Ding " -0x7595: "Bi " -0x7596: "Jie " -0x7597: "Liao " -0x7598: "Gong " -0x7599: "Ge " -0x759a: "Jiu " -0x759b: "Zhou " -0x759c: "Xia " -0x759d: "Shan " -0x759e: "Xu " -0x759f: "Nue " -0x75a0: "Li " -0x75a1: "Yang " -0x75a2: "Chen " -0x75a3: "You " -0x75a4: "Ba " -0x75a5: "Jie " -0x75a6: "Jue " -0x75a7: "Zhi " -0x75a8: "Xia " -0x75a9: "Cui " -0x75aa: "Bi " -0x75ab: "Yi " -0x75ac: "Li " -0x75ad: "Zong " -0x75ae: "Chuang " -0x75af: "Feng " -0x75b0: "Zhu " -0x75b1: "Pao " -0x75b2: "Pi " -0x75b3: "Gan " -0x75b4: "Ke " -0x75b5: "Ci " -0x75b6: "Xie " -0x75b7: "Qi " -0x75b8: "Dan " -0x75b9: "Zhen " -0x75ba: "Fa " -0x75bb: "Zhi " -0x75bc: "Teng " -0x75bd: "Ju " -0x75be: "Ji " -0x75bf: "Fei " -0x75c0: "Qu " -0x75c1: "Dian " -0x75c2: "Jia " -0x75c3: "Xian " -0x75c4: "Cha " -0x75c5: "Bing " -0x75c6: "Ni " -0x75c7: "Zheng " -0x75c8: "Yong " -0x75c9: "Jing " -0x75ca: "Quan " -0x75cb: "Chong " -0x75cc: "Tong " -0x75cd: "Yi " -0x75ce: "Kai " -0x75cf: "Wei " -0x75d0: "Hui " -0x75d1: "Duo " -0x75d2: "Yang " -0x75d3: "Chi " -0x75d4: "Zhi " -0x75d5: "Hen " -0x75d6: "Ya " -0x75d7: "Mei " -0x75d8: "Dou " -0x75d9: "Jing " -0x75da: "Xiao " -0x75db: "Tong " -0x75dc: "Tu " -0x75dd: "Mang " -0x75de: "Pi " -0x75df: "Xiao " -0x75e0: "Suan " -0x75e1: "Pu " -0x75e2: "Li " -0x75e3: "Zhi " -0x75e4: "Cuo " -0x75e5: "Duo " -0x75e6: "Wu " -0x75e7: "Sha " -0x75e8: "Lao " -0x75e9: "Shou " -0x75ea: "Huan " -0x75eb: "Xian " -0x75ec: "Yi " -0x75ed: "Peng " -0x75ee: "Zhang " -0x75ef: "Guan " -0x75f0: "Tan " -0x75f1: "Fei " -0x75f2: "Ma " -0x75f3: "Lin " -0x75f4: "Chi " -0x75f5: "Ji " -0x75f6: "Dian " -0x75f7: "An " -0x75f8: "Chi " -0x75f9: "Bi " -0x75fa: "Bei " -0x75fb: "Min " -0x75fc: "Gu " -0x75fd: "Dui " -0x75fe: "E " -0x75ff: "Wei " -/* x076 */ -0x7600: "Yu " -0x7601: "Cui " -0x7602: "Ya " -0x7603: "Zhu " -0x7604: "Cu " -0x7605: "Dan " -0x7606: "Shen " -0x7607: "Zhung " -0x7608: "Ji " -0x7609: "Yu " -0x760a: "Hou " -0x760b: "Feng " -0x760c: "La " -0x760d: "Yang " -0x760e: "Shen " -0x760f: "Tu " -0x7610: "Yu " -0x7611: "Gua " -0x7612: "Wen " -0x7613: "Huan " -0x7614: "Ku " -0x7615: "Jia " -0x7616: "Yin " -0x7617: "Yi " -0x7618: "Lu " -0x7619: "Sao " -0x761a: "Jue " -0x761b: "Chi " -0x761c: "Xi " -0x761d: "Guan " -0x761e: "Yi " -0x761f: "Wen " -0x7620: "Ji " -0x7621: "Chuang " -0x7622: "Ban " -0x7623: "Lei " -0x7624: "Liu " -0x7625: "Chai " -0x7626: "Shou " -0x7627: "Nue " -0x7628: "Dian " -0x7629: "Da " -0x762a: "Pie " -0x762b: "Tan " -0x762c: "Zhang " -0x762d: "Biao " -0x762e: "Shen " -0x762f: "Cu " -0x7630: "Luo " -0x7631: "Yi " -0x7632: "Zong " -0x7633: "Chou " -0x7634: "Zhang " -0x7635: "Zhai " -0x7636: "Sou " -0x7637: "Suo " -0x7638: "Que " -0x7639: "Diao " -0x763a: "Lou " -0x763b: "Lu " -0x763c: "Mo " -0x763d: "Jin " -0x763e: "Yin " -0x763f: "Ying " -0x7640: "Huang " -0x7641: "Fu " -0x7642: "Liao " -0x7643: "Long " -0x7644: "Qiao " -0x7645: "Liu " -0x7646: "Lao " -0x7647: "Xian " -0x7648: "Fei " -0x7649: "Dan " -0x764a: "Yin " -0x764b: "He " -0x764c: "Yan " -0x764d: "Ban " -0x764e: "Xian " -0x764f: "Guan " -0x7650: "Guai " -0x7651: "Nong " -0x7652: "Yu " -0x7653: "Wei " -0x7654: "Yi " -0x7655: "Yong " -0x7656: "Pi " -0x7657: "Lei " -0x7658: "Li " -0x7659: "Shu " -0x765a: "Dan " -0x765b: "Lin " -0x765c: "Dian " -0x765d: "Lin " -0x765e: "Lai " -0x765f: "Pie " -0x7660: "Ji " -0x7661: "Chi " -0x7662: "Yang " -0x7663: "Xian " -0x7664: "Jie " -0x7665: "Zheng " -0x7666: "[?] " -0x7667: "Li " -0x7668: "Huo " -0x7669: "Lai " -0x766a: "Shaku " -0x766b: "Dian " -0x766c: "Xian " -0x766d: "Ying " -0x766e: "Yin " -0x766f: "Qu " -0x7670: "Yong " -0x7671: "Tan " -0x7672: "Dian " -0x7673: "Luo " -0x7674: "Luan " -0x7675: "Luan " -0x7676: "Bo " -0x7677: "[?] " -0x7678: "Gui " -0x7679: "Po " -0x767a: "Fa " -0x767b: "Deng " -0x767c: "Fa " -0x767d: "Bai " -0x767e: "Bai " -0x767f: "Qie " -0x7680: "Bi " -0x7681: "Zao " -0x7682: "Zao " -0x7683: "Mao " -0x7684: "De " -0x7685: "Pa " -0x7686: "Jie " -0x7687: "Huang " -0x7688: "Gui " -0x7689: "Ci " -0x768a: "Ling " -0x768b: "Gao " -0x768c: "Mo " -0x768d: "Ji " -0x768e: "Jiao " -0x768f: "Peng " -0x7690: "Gao " -0x7691: "Ai " -0x7692: "E " -0x7693: "Hao " -0x7694: "Han " -0x7695: "Bi " -0x7696: "Wan " -0x7697: "Chou " -0x7698: "Qian " -0x7699: "Xi " -0x769a: "Ai " -0x769b: "Jiong " -0x769c: "Hao " -0x769d: "Huang " -0x769e: "Hao " -0x769f: "Ze " -0x76a0: "Cui " -0x76a1: "Hao " -0x76a2: "Xiao " -0x76a3: "Ye " -0x76a4: "Po " -0x76a5: "Hao " -0x76a6: "Jiao " -0x76a7: "Ai " -0x76a8: "Xing " -0x76a9: "Huang " -0x76aa: "Li " -0x76ab: "Piao " -0x76ac: "He " -0x76ad: "Jiao " -0x76ae: "Pi " -0x76af: "Gan " -0x76b0: "Pao " -0x76b1: "Zhou " -0x76b2: "Jun " -0x76b3: "Qiu " -0x76b4: "Cun " -0x76b5: "Que " -0x76b6: "Zha " -0x76b7: "Gu " -0x76b8: "Jun " -0x76b9: "Jun " -0x76ba: "Zhou " -0x76bb: "Zha " -0x76bc: "Gu " -0x76bd: "Zhan " -0x76be: "Du " -0x76bf: "Min " -0x76c0: "Qi " -0x76c1: "Ying " -0x76c2: "Yu " -0x76c3: "Bei " -0x76c4: "Zhao " -0x76c5: "Zhong " -0x76c6: "Pen " -0x76c7: "He " -0x76c8: "Ying " -0x76c9: "He " -0x76ca: "Yi " -0x76cb: "Bo " -0x76cc: "Wan " -0x76cd: "He " -0x76ce: "Ang " -0x76cf: "Zhan " -0x76d0: "Yan " -0x76d1: "Jian " -0x76d2: "He " -0x76d3: "Yu " -0x76d4: "Kui " -0x76d5: "Fan " -0x76d6: "Gai " -0x76d7: "Dao " -0x76d8: "Pan " -0x76d9: "Fu " -0x76da: "Qiu " -0x76db: "Sheng " -0x76dc: "Dao " -0x76dd: "Lu " -0x76de: "Zhan " -0x76df: "Meng " -0x76e0: "Li " -0x76e1: "Jin " -0x76e2: "Xu " -0x76e3: "Jian " -0x76e4: "Pan " -0x76e5: "Guan " -0x76e6: "An " -0x76e7: "Lu " -0x76e8: "Shu " -0x76e9: "Zhou " -0x76ea: "Dang " -0x76eb: "An " -0x76ec: "Gu " -0x76ed: "Li " -0x76ee: "Mu " -0x76ef: "Cheng " -0x76f0: "Gan " -0x76f1: "Xu " -0x76f2: "Mang " -0x76f3: "Mang " -0x76f4: "Zhi " -0x76f5: "Qi " -0x76f6: "Ruan " -0x76f7: "Tian " -0x76f8: "Xiang " -0x76f9: "Dun " -0x76fa: "Xin " -0x76fb: "Xi " -0x76fc: "Pan " -0x76fd: "Feng " -0x76fe: "Dun " -0x76ff: "Min " -/* x077 */ -0x7700: "Ming " -0x7701: "Sheng " -0x7702: "Shi " -0x7703: "Yun " -0x7704: "Mian " -0x7705: "Pan " -0x7706: "Fang " -0x7707: "Miao " -0x7708: "Dan " -0x7709: "Mei " -0x770a: "Mao " -0x770b: "Kan " -0x770c: "Xian " -0x770d: "Ou " -0x770e: "Shi " -0x770f: "Yang " -0x7710: "Zheng " -0x7711: "Yao " -0x7712: "Shen " -0x7713: "Huo " -0x7714: "Da " -0x7715: "Zhen " -0x7716: "Kuang " -0x7717: "Ju " -0x7718: "Shen " -0x7719: "Chi " -0x771a: "Sheng " -0x771b: "Mei " -0x771c: "Mo " -0x771d: "Zhu " -0x771e: "Zhen " -0x771f: "Zhen " -0x7720: "Mian " -0x7721: "Di " -0x7722: "Yuan " -0x7723: "Die " -0x7724: "Yi " -0x7725: "Zi " -0x7726: "Zi " -0x7727: "Chao " -0x7728: "Zha " -0x7729: "Xuan " -0x772a: "Bing " -0x772b: "Mi " -0x772c: "Long " -0x772d: "Sui " -0x772e: "Dong " -0x772f: "Mi " -0x7730: "Die " -0x7731: "Yi " -0x7732: "Er " -0x7733: "Ming " -0x7734: "Xuan " -0x7735: "Chi " -0x7736: "Kuang " -0x7737: "Juan " -0x7738: "Mou " -0x7739: "Zhen " -0x773a: "Tiao " -0x773b: "Yang " -0x773c: "Yan " -0x773d: "Mo " -0x773e: "Zhong " -0x773f: "Mai " -0x7740: "Zhao " -0x7741: "Zheng " -0x7742: "Mei " -0x7743: "Jun " -0x7744: "Shao " -0x7745: "Han " -0x7746: "Huan " -0x7747: "Di " -0x7748: "Cheng " -0x7749: "Cuo " -0x774a: "Juan " -0x774b: "E " -0x774c: "Wan " -0x774d: "Xian " -0x774e: "Xi " -0x774f: "Kun " -0x7750: "Lai " -0x7751: "Jian " -0x7752: "Shan " -0x7753: "Tian " -0x7754: "Hun " -0x7755: "Wan " -0x7756: "Ling " -0x7757: "Shi " -0x7758: "Qiong " -0x7759: "Lie " -0x775a: "Yai " -0x775b: "Jing " -0x775c: "Zheng " -0x775d: "Li " -0x775e: "Lai " -0x775f: "Sui " -0x7760: "Juan " -0x7761: "Shui " -0x7762: "Sui " -0x7763: "Du " -0x7764: "Bi " -0x7765: "Bi " -0x7766: "Mu " -0x7767: "Hun " -0x7768: "Ni " -0x7769: "Lu " -0x776a: "Yi " -0x776b: "Jie " -0x776c: "Cai " -0x776d: "Zhou " -0x776e: "Yu " -0x776f: "Hun " -0x7770: "Ma " -0x7771: "Xia " -0x7772: "Xing " -0x7773: "Xi " -0x7774: "Gun " -0x7775: "Cai " -0x7776: "Chun " -0x7777: "Jian " -0x7778: "Mei " -0x7779: "Du " -0x777a: "Hou " -0x777b: "Xuan " -0x777c: "Ti " -0x777d: "Kui " -0x777e: "Gao " -0x777f: "Rui " -0x7780: "Mou " -0x7781: "Xu " -0x7782: "Fa " -0x7783: "Wen " -0x7784: "Miao " -0x7785: "Chou " -0x7786: "Kui " -0x7787: "Mi " -0x7788: "Weng " -0x7789: "Kou " -0x778a: "Dang " -0x778b: "Chen " -0x778c: "Ke " -0x778d: "Sou " -0x778e: "Xia " -0x778f: "Qiong " -0x7790: "Mao " -0x7791: "Ming " -0x7792: "Man " -0x7793: "Shui " -0x7794: "Ze " -0x7795: "Zhang " -0x7796: "Yi " -0x7797: "Diao " -0x7798: "Ou " -0x7799: "Mo " -0x779a: "Shun " -0x779b: "Cong " -0x779c: "Lou " -0x779d: "Chi " -0x779e: "Man " -0x779f: "Piao " -0x77a0: "Cheng " -0x77a1: "Ji " -0x77a2: "Meng " -0x77a3: "[?] " -0x77a4: "Run " -0x77a5: "Pie " -0x77a6: "Xi " -0x77a7: "Qiao " -0x77a8: "Pu " -0x77a9: "Zhu " -0x77aa: "Deng " -0x77ab: "Shen " -0x77ac: "Shun " -0x77ad: "Liao " -0x77ae: "Che " -0x77af: "Xian " -0x77b0: "Kan " -0x77b1: "Ye " -0x77b2: "Xu " -0x77b3: "Tong " -0x77b4: "Mou " -0x77b5: "Lin " -0x77b6: "Kui " -0x77b7: "Xian " -0x77b8: "Ye " -0x77b9: "Ai " -0x77ba: "Hui " -0x77bb: "Zhan " -0x77bc: "Jian " -0x77bd: "Gu " -0x77be: "Zhao " -0x77bf: "Qu " -0x77c0: "Wei " -0x77c1: "Chou " -0x77c2: "Sao " -0x77c3: "Ning " -0x77c4: "Xun " -0x77c5: "Yao " -0x77c6: "Huo " -0x77c7: "Meng " -0x77c8: "Mian " -0x77c9: "Bin " -0x77ca: "Mian " -0x77cb: "Li " -0x77cc: "Kuang " -0x77cd: "Jue " -0x77ce: "Xuan " -0x77cf: "Mian " -0x77d0: "Huo " -0x77d1: "Lu " -0x77d2: "Meng " -0x77d3: "Long " -0x77d4: "Guan " -0x77d5: "Man " -0x77d6: "Xi " -0x77d7: "Chu " -0x77d8: "Tang " -0x77d9: "Kan " -0x77da: "Zhu " -0x77db: "Mao " -0x77dc: "Jin " -0x77dd: "Lin " -0x77de: "Yu " -0x77df: "Shuo " -0x77e0: "Ce " -0x77e1: "Jue " -0x77e2: "Shi " -0x77e3: "Yi " -0x77e4: "Shen " -0x77e5: "Zhi " -0x77e6: "Hou " -0x77e7: "Shen " -0x77e8: "Ying " -0x77e9: "Ju " -0x77ea: "Zhou " -0x77eb: "Jiao " -0x77ec: "Cuo " -0x77ed: "Duan " -0x77ee: "Ai " -0x77ef: "Jiao " -0x77f0: "Zeng " -0x77f1: "Huo " -0x77f2: "Bai " -0x77f3: "Shi " -0x77f4: "Ding " -0x77f5: "Qi " -0x77f6: "Ji " -0x77f7: "Zi " -0x77f8: "Gan " -0x77f9: "Wu " -0x77fa: "Tuo " -0x77fb: "Ku " -0x77fc: "Qiang " -0x77fd: "Xi " -0x77fe: "Fan " -0x77ff: "Kuang " -/* x078 */ -0x7800: "Dang " -0x7801: "Ma " -0x7802: "Sha " -0x7803: "Dan " -0x7804: "Jue " -0x7805: "Li " -0x7806: "Fu " -0x7807: "Min " -0x7808: "Nuo " -0x7809: "Huo " -0x780a: "Kang " -0x780b: "Zhi " -0x780c: "Qi " -0x780d: "Kan " -0x780e: "Jie " -0x780f: "Fen " -0x7810: "E " -0x7811: "Ya " -0x7812: "Pi " -0x7813: "Zhe " -0x7814: "Yan " -0x7815: "Sui " -0x7816: "Zhuan " -0x7817: "Che " -0x7818: "Dun " -0x7819: "Pan " -0x781a: "Yan " -0x781b: "[?] " -0x781c: "Feng " -0x781d: "Fa " -0x781e: "Mo " -0x781f: "Zha " -0x7820: "Qu " -0x7821: "Yu " -0x7822: "Luo " -0x7823: "Tuo " -0x7824: "Tuo " -0x7825: "Di " -0x7826: "Zhai " -0x7827: "Zhen " -0x7828: "Ai " -0x7829: "Fei " -0x782a: "Mu " -0x782b: "Zhu " -0x782c: "Li " -0x782d: "Bian " -0x782e: "Nu " -0x782f: "Ping " -0x7830: "Peng " -0x7831: "Ling " -0x7832: "Pao " -0x7833: "Le " -0x7834: "Po " -0x7835: "Bo " -0x7836: "Po " -0x7837: "Shen " -0x7838: "Za " -0x7839: "Nuo " -0x783a: "Li " -0x783b: "Long " -0x783c: "Tong " -0x783d: "[?] " -0x783e: "Li " -0x783f: "Aragane " -0x7840: "Chu " -0x7841: "Keng " -0x7842: "Quan " -0x7843: "Zhu " -0x7844: "Kuang " -0x7845: "Huo " -0x7846: "E " -0x7847: "Nao " -0x7848: "Jia " -0x7849: "Lu " -0x784a: "Wei " -0x784b: "Ai " -0x784c: "Luo " -0x784d: "Ken " -0x784e: "Xing " -0x784f: "Yan " -0x7850: "Tong " -0x7851: "Peng " -0x7852: "Xi " -0x7853: "[?] " -0x7854: "Hong " -0x7855: "Shuo " -0x7856: "Xia " -0x7857: "Qiao " -0x7858: "[?] " -0x7859: "Wei " -0x785a: "Qiao " -0x785b: "[?] " -0x785c: "Keng " -0x785d: "Xiao " -0x785e: "Que " -0x785f: "Chan " -0x7860: "Lang " -0x7861: "Hong " -0x7862: "Yu " -0x7863: "Xiao " -0x7864: "Xia " -0x7865: "Mang " -0x7866: "Long " -0x7867: "Iong " -0x7868: "Che " -0x7869: "Che " -0x786a: "E " -0x786b: "Liu " -0x786c: "Ying " -0x786d: "Mang " -0x786e: "Que " -0x786f: "Yan " -0x7870: "Sha " -0x7871: "Kun " -0x7872: "Yu " -0x7873: "[?] " -0x7874: "Kaki " -0x7875: "Lu " -0x7876: "Chen " -0x7877: "Jian " -0x7878: "Nue " -0x7879: "Song " -0x787a: "Zhuo " -0x787b: "Keng " -0x787c: "Peng " -0x787d: "Yan " -0x787e: "Zhui " -0x787f: "Kong " -0x7880: "Ceng " -0x7881: "Qi " -0x7882: "Zong " -0x7883: "Qing " -0x7884: "Lin " -0x7885: "Jun " -0x7886: "Bo " -0x7887: "Ding " -0x7888: "Min " -0x7889: "Diao " -0x788a: "Jian " -0x788b: "He " -0x788c: "Lu " -0x788d: "Ai " -0x788e: "Sui " -0x788f: "Que " -0x7890: "Ling " -0x7891: "Bei " -0x7892: "Yin " -0x7893: "Dui " -0x7894: "Wu " -0x7895: "Qi " -0x7896: "Lun " -0x7897: "Wan " -0x7898: "Dian " -0x7899: "Gang " -0x789a: "Pei " -0x789b: "Qi " -0x789c: "Chen " -0x789d: "Ruan " -0x789e: "Yan " -0x789f: "Die " -0x78a0: "Ding " -0x78a1: "Du " -0x78a2: "Tuo " -0x78a3: "Jie " -0x78a4: "Ying " -0x78a5: "Bian " -0x78a6: "Ke " -0x78a7: "Bi " -0x78a8: "Wei " -0x78a9: "Shuo " -0x78aa: "Zhen " -0x78ab: "Duan " -0x78ac: "Xia " -0x78ad: "Dang " -0x78ae: "Ti " -0x78af: "Nao " -0x78b0: "Peng " -0x78b1: "Jian " -0x78b2: "Di " -0x78b3: "Tan " -0x78b4: "Cha " -0x78b5: "Seki " -0x78b6: "Qi " -0x78b7: "[?] " -0x78b8: "Feng " -0x78b9: "Xuan " -0x78ba: "Que " -0x78bb: "Que " -0x78bc: "Ma " -0x78bd: "Gong " -0x78be: "Nian " -0x78bf: "Su " -0x78c0: "E " -0x78c1: "Ci " -0x78c2: "Liu " -0x78c3: "Si " -0x78c4: "Tang " -0x78c5: "Bang " -0x78c6: "Hua " -0x78c7: "Pi " -0x78c8: "Wei " -0x78c9: "Sang " -0x78ca: "Lei " -0x78cb: "Cuo " -0x78cc: "Zhen " -0x78cd: "Xia " -0x78ce: "Qi " -0x78cf: "Lian " -0x78d0: "Pan " -0x78d1: "Wei " -0x78d2: "Yun " -0x78d3: "Dui " -0x78d4: "Zhe " -0x78d5: "Ke " -0x78d6: "La " -0x78d7: "[?] " -0x78d8: "Qing " -0x78d9: "Gun " -0x78da: "Zhuan " -0x78db: "Chan " -0x78dc: "Qi " -0x78dd: "Ao " -0x78de: "Peng " -0x78df: "Lu " -0x78e0: "Lu " -0x78e1: "Kan " -0x78e2: "Qiang " -0x78e3: "Chen " -0x78e4: "Yin " -0x78e5: "Lei " -0x78e6: "Biao " -0x78e7: "Qi " -0x78e8: "Mo " -0x78e9: "Qi " -0x78ea: "Cui " -0x78eb: "Zong " -0x78ec: "Qing " -0x78ed: "Chuo " -0x78ee: "[?] " -0x78ef: "Ji " -0x78f0: "Shan " -0x78f1: "Lao " -0x78f2: "Qu " -0x78f3: "Zeng " -0x78f4: "Deng " -0x78f5: "Jian " -0x78f6: "Xi " -0x78f7: "Lin " -0x78f8: "Ding " -0x78f9: "Dian " -0x78fa: "Huang " -0x78fb: "Pan " -0x78fc: "Za " -0x78fd: "Qiao " -0x78fe: "Di " -0x78ff: "Li " -/* x079 */ -0x7900: "Tani " -0x7901: "Jiao " -0x7902: "[?] " -0x7903: "Zhang " -0x7904: "Qiao " -0x7905: "Dun " -0x7906: "Xian " -0x7907: "Yu " -0x7908: "Zhui " -0x7909: "He " -0x790a: "Huo " -0x790b: "Zhai " -0x790c: "Lei " -0x790d: "Ke " -0x790e: "Chu " -0x790f: "Ji " -0x7910: "Que " -0x7911: "Dang " -0x7912: "Yi " -0x7913: "Jiang " -0x7914: "Pi " -0x7915: "Pi " -0x7916: "Yu " -0x7917: "Pin " -0x7918: "Qi " -0x7919: "Ai " -0x791a: "Kai " -0x791b: "Jian " -0x791c: "Yu " -0x791d: "Ruan " -0x791e: "Meng " -0x791f: "Pao " -0x7920: "Ci " -0x7921: "[?] " -0x7922: "[?] " -0x7923: "Mie " -0x7924: "Ca " -0x7925: "Xian " -0x7926: "Kuang " -0x7927: "Lei " -0x7928: "Lei " -0x7929: "Zhi " -0x792a: "Li " -0x792b: "Li " -0x792c: "Fan " -0x792d: "Que " -0x792e: "Pao " -0x792f: "Ying " -0x7930: "Li " -0x7931: "Long " -0x7932: "Long " -0x7933: "Mo " -0x7934: "Bo " -0x7935: "Shuang " -0x7936: "Guan " -0x7937: "Lan " -0x7938: "Zan " -0x7939: "Yan " -0x793a: "Shi " -0x793b: "Shi " -0x793c: "Li " -0x793d: "Reng " -0x793e: "She " -0x793f: "Yue " -0x7940: "Si " -0x7941: "Qi " -0x7942: "Ta " -0x7943: "Ma " -0x7944: "Xie " -0x7945: "Xian " -0x7946: "Xian " -0x7947: "Zhi " -0x7948: "Qi " -0x7949: "Zhi " -0x794a: "Beng " -0x794b: "Dui " -0x794c: "Zhong " -0x794d: "[?] " -0x794e: "Yi " -0x794f: "Shi " -0x7950: "You " -0x7951: "Zhi " -0x7952: "Tiao " -0x7953: "Fu " -0x7954: "Fu " -0x7955: "Mi " -0x7956: "Zu " -0x7957: "Zhi " -0x7958: "Suan " -0x7959: "Mei " -0x795a: "Zuo " -0x795b: "Qu " -0x795c: "Hu " -0x795d: "Zhu " -0x795e: "Shen " -0x795f: "Sui " -0x7960: "Ci " -0x7961: "Chai " -0x7962: "Mi " -0x7963: "Lu " -0x7964: "Yu " -0x7965: "Xiang " -0x7966: "Wu " -0x7967: "Tiao " -0x7968: "Piao " -0x7969: "Zhu " -0x796a: "Gui " -0x796b: "Xia " -0x796c: "Zhi " -0x796d: "Ji " -0x796e: "Gao " -0x796f: "Zhen " -0x7970: "Gao " -0x7971: "Shui " -0x7972: "Jin " -0x7973: "Chen " -0x7974: "Gai " -0x7975: "Kun " -0x7976: "Di " -0x7977: "Dao " -0x7978: "Huo " -0x7979: "Tao " -0x797a: "Qi " -0x797b: "Gu " -0x797c: "Guan " -0x797d: "Zui " -0x797e: "Ling " -0x797f: "Lu " -0x7980: "Bing " -0x7981: "Jin " -0x7982: "Dao " -0x7983: "Zhi " -0x7984: "Lu " -0x7985: "Shan " -0x7986: "Bei " -0x7987: "Zhe " -0x7988: "Hui " -0x7989: "You " -0x798a: "Xi " -0x798b: "Yin " -0x798c: "Zi " -0x798d: "Huo " -0x798e: "Zhen " -0x798f: "Fu " -0x7990: "Yuan " -0x7991: "Wu " -0x7992: "Xian " -0x7993: "Yang " -0x7994: "Ti " -0x7995: "Yi " -0x7996: "Mei " -0x7997: "Si " -0x7998: "Di " -0x7999: "[?] " -0x799a: "Zhuo " -0x799b: "Zhen " -0x799c: "Yong " -0x799d: "Ji " -0x799e: "Gao " -0x799f: "Tang " -0x79a0: "Si " -0x79a1: "Ma " -0x79a2: "Ta " -0x79a3: "[?] " -0x79a4: "Xuan " -0x79a5: "Qi " -0x79a6: "Yu " -0x79a7: "Xi " -0x79a8: "Ji " -0x79a9: "Si " -0x79aa: "Chan " -0x79ab: "Tan " -0x79ac: "Kuai " -0x79ad: "Sui " -0x79ae: "Li " -0x79af: "Nong " -0x79b0: "Ni " -0x79b1: "Dao " -0x79b2: "Li " -0x79b3: "Rang " -0x79b4: "Yue " -0x79b5: "Ti " -0x79b6: "Zan " -0x79b7: "Lei " -0x79b8: "Rou " -0x79b9: "Yu " -0x79ba: "Yu " -0x79bb: "Chi " -0x79bc: "Xie " -0x79bd: "Qin " -0x79be: "He " -0x79bf: "Tu " -0x79c0: "Xiu " -0x79c1: "Si " -0x79c2: "Ren " -0x79c3: "Tu " -0x79c4: "Zi " -0x79c5: "Cha " -0x79c6: "Gan " -0x79c7: "Yi " -0x79c8: "Xian " -0x79c9: "Bing " -0x79ca: "Nian " -0x79cb: "Qiu " -0x79cc: "Qiu " -0x79cd: "Chong " -0x79ce: "Fen " -0x79cf: "Hao " -0x79d0: "Yun " -0x79d1: "Ke " -0x79d2: "Miao " -0x79d3: "Zhi " -0x79d4: "Geng " -0x79d5: "Bi " -0x79d6: "Zhi " -0x79d7: "Yu " -0x79d8: "Mi " -0x79d9: "Ku " -0x79da: "Ban " -0x79db: "Pi " -0x79dc: "Ni " -0x79dd: "Li " -0x79de: "You " -0x79df: "Zu " -0x79e0: "Pi " -0x79e1: "Ba " -0x79e2: "Ling " -0x79e3: "Mo " -0x79e4: "Cheng " -0x79e5: "Nian " -0x79e6: "Qin " -0x79e7: "Yang " -0x79e8: "Zuo " -0x79e9: "Zhi " -0x79ea: "Zhi " -0x79eb: "Shu " -0x79ec: "Ju " -0x79ed: "Zi " -0x79ee: "Huo " -0x79ef: "Ji " -0x79f0: "Cheng " -0x79f1: "Tong " -0x79f2: "Zhi " -0x79f3: "Huo " -0x79f4: "He " -0x79f5: "Yin " -0x79f6: "Zi " -0x79f7: "Zhi " -0x79f8: "Jie " -0x79f9: "Ren " -0x79fa: "Du " -0x79fb: "Yi " -0x79fc: "Zhu " -0x79fd: "Hui " -0x79fe: "Nong " -0x79ff: "Fu " -/* x07a */ -0x7a00: "Xi " -0x7a01: "Kao " -0x7a02: "Lang " -0x7a03: "Fu " -0x7a04: "Ze " -0x7a05: "Shui " -0x7a06: "Lu " -0x7a07: "Kun " -0x7a08: "Gan " -0x7a09: "Geng " -0x7a0a: "Ti " -0x7a0b: "Cheng " -0x7a0c: "Tu " -0x7a0d: "Shao " -0x7a0e: "Shui " -0x7a0f: "Ya " -0x7a10: "Lun " -0x7a11: "Lu " -0x7a12: "Gu " -0x7a13: "Zuo " -0x7a14: "Ren " -0x7a15: "Zhun " -0x7a16: "Bang " -0x7a17: "Bai " -0x7a18: "Ji " -0x7a19: "Zhi " -0x7a1a: "Zhi " -0x7a1b: "Kun " -0x7a1c: "Leng " -0x7a1d: "Peng " -0x7a1e: "Ke " -0x7a1f: "Bing " -0x7a20: "Chou " -0x7a21: "Zu " -0x7a22: "Yu " -0x7a23: "Su " -0x7a24: "Lue " -0x7a25: "[?] " -0x7a26: "Yi " -0x7a27: "Xi " -0x7a28: "Bian " -0x7a29: "Ji " -0x7a2a: "Fu " -0x7a2b: "Bi " -0x7a2c: "Nuo " -0x7a2d: "Jie " -0x7a2e: "Zhong " -0x7a2f: "Zong " -0x7a30: "Xu " -0x7a31: "Cheng " -0x7a32: "Dao " -0x7a33: "Wen " -0x7a34: "Lian " -0x7a35: "Zi " -0x7a36: "Yu " -0x7a37: "Ji " -0x7a38: "Xu " -0x7a39: "Zhen " -0x7a3a: "Zhi " -0x7a3b: "Dao " -0x7a3c: "Jia " -0x7a3d: "Ji " -0x7a3e: "Gao " -0x7a3f: "Gao " -0x7a40: "Gu " -0x7a41: "Rong " -0x7a42: "Sui " -0x7a43: "You " -0x7a44: "Ji " -0x7a45: "Kang " -0x7a46: "Mu " -0x7a47: "Shan " -0x7a48: "Men " -0x7a49: "Zhi " -0x7a4a: "Ji " -0x7a4b: "Lu " -0x7a4c: "Su " -0x7a4d: "Ji " -0x7a4e: "Ying " -0x7a4f: "Wen " -0x7a50: "Qiu " -0x7a51: "Se " -0x7a52: "[?] " -0x7a53: "Yi " -0x7a54: "Huang " -0x7a55: "Qie " -0x7a56: "Ji " -0x7a57: "Sui " -0x7a58: "Xiao " -0x7a59: "Pu " -0x7a5a: "Jiao " -0x7a5b: "Zhuo " -0x7a5c: "Tong " -0x7a5d: "Sai " -0x7a5e: "Lu " -0x7a5f: "Sui " -0x7a60: "Nong " -0x7a61: "Se " -0x7a62: "Hui " -0x7a63: "Rang " -0x7a64: "Nuo " -0x7a65: "Yu " -0x7a66: "Bin " -0x7a67: "Ji " -0x7a68: "Tui " -0x7a69: "Wen " -0x7a6a: "Cheng " -0x7a6b: "Huo " -0x7a6c: "Gong " -0x7a6d: "Lu " -0x7a6e: "Biao " -0x7a6f: "[?] " -0x7a70: "Rang " -0x7a71: "Zhuo " -0x7a72: "Li " -0x7a73: "Zan " -0x7a74: "Xue " -0x7a75: "Wa " -0x7a76: "Jiu " -0x7a77: "Qiong " -0x7a78: "Xi " -0x7a79: "Qiong " -0x7a7a: "Kong " -0x7a7b: "Yu " -0x7a7c: "Sen " -0x7a7d: "Jing " -0x7a7e: "Yao " -0x7a7f: "Chuan " -0x7a80: "Zhun " -0x7a81: "Tu " -0x7a82: "Lao " -0x7a83: "Qie " -0x7a84: "Zhai " -0x7a85: "Yao " -0x7a86: "Bian " -0x7a87: "Bao " -0x7a88: "Yao " -0x7a89: "Bing " -0x7a8a: "Wa " -0x7a8b: "Zhu " -0x7a8c: "Jiao " -0x7a8d: "Qiao " -0x7a8e: "Diao " -0x7a8f: "Wu " -0x7a90: "Gui " -0x7a91: "Yao " -0x7a92: "Zhi " -0x7a93: "Chuang " -0x7a94: "Yao " -0x7a95: "Tiao " -0x7a96: "Jiao " -0x7a97: "Chuang " -0x7a98: "Jiong " -0x7a99: "Xiao " -0x7a9a: "Cheng " -0x7a9b: "Kou " -0x7a9c: "Cuan " -0x7a9d: "Wo " -0x7a9e: "Dan " -0x7a9f: "Ku " -0x7aa0: "Ke " -0x7aa1: "Zhui " -0x7aa2: "Xu " -0x7aa3: "Su " -0x7aa4: "Guan " -0x7aa5: "Kui " -0x7aa6: "Dou " -0x7aa7: "[?] " -0x7aa8: "Yin " -0x7aa9: "Wo " -0x7aaa: "Wa " -0x7aab: "Ya " -0x7aac: "Yu " -0x7aad: "Ju " -0x7aae: "Qiong " -0x7aaf: "Yao " -0x7ab0: "Yao " -0x7ab1: "Tiao " -0x7ab2: "Chao " -0x7ab3: "Yu " -0x7ab4: "Tian " -0x7ab5: "Diao " -0x7ab6: "Ju " -0x7ab7: "Liao " -0x7ab8: "Xi " -0x7ab9: "Wu " -0x7aba: "Kui " -0x7abb: "Chuang " -0x7abc: "Zhao " -0x7abd: "[?] " -0x7abe: "Kuan " -0x7abf: "Long " -0x7ac0: "Cheng " -0x7ac1: "Cui " -0x7ac2: "Piao " -0x7ac3: "Zao " -0x7ac4: "Cuan " -0x7ac5: "Qiao " -0x7ac6: "Qiong " -0x7ac7: "Dou " -0x7ac8: "Zao " -0x7ac9: "Long " -0x7aca: "Qie " -0x7acb: "Li " -0x7acc: "Chu " -0x7acd: "Shi " -0x7ace: "Fou " -0x7acf: "Qian " -0x7ad0: "Chu " -0x7ad1: "Hong " -0x7ad2: "Qi " -0x7ad3: "Qian " -0x7ad4: "Gong " -0x7ad5: "Shi " -0x7ad6: "Shu " -0x7ad7: "Miao " -0x7ad8: "Ju " -0x7ad9: "Zhan " -0x7ada: "Zhu " -0x7adb: "Ling " -0x7adc: "Long " -0x7add: "Bing " -0x7ade: "Jing " -0x7adf: "Jing " -0x7ae0: "Zhang " -0x7ae1: "Yi " -0x7ae2: "Si " -0x7ae3: "Jun " -0x7ae4: "Hong " -0x7ae5: "Tong " -0x7ae6: "Song " -0x7ae7: "Jing " -0x7ae8: "Diao " -0x7ae9: "Yi " -0x7aea: "Shu " -0x7aeb: "Jing " -0x7aec: "Qu " -0x7aed: "Jie " -0x7aee: "Ping " -0x7aef: "Duan " -0x7af0: "Shao " -0x7af1: "Zhuan " -0x7af2: "Ceng " -0x7af3: "Deng " -0x7af4: "Cui " -0x7af5: "Huai " -0x7af6: "Jing " -0x7af7: "Kan " -0x7af8: "Jing " -0x7af9: "Zhu " -0x7afa: "Zhu " -0x7afb: "Le " -0x7afc: "Peng " -0x7afd: "Yu " -0x7afe: "Chi " -0x7aff: "Gan " -/* x07b */ -0x7b00: "Mang " -0x7b01: "Zhu " -0x7b02: "Utsubo " -0x7b03: "Du " -0x7b04: "Ji " -0x7b05: "Xiao " -0x7b06: "Ba " -0x7b07: "Suan " -0x7b08: "Ji " -0x7b09: "Zhen " -0x7b0a: "Zhao " -0x7b0b: "Sun " -0x7b0c: "Ya " -0x7b0d: "Zhui " -0x7b0e: "Yuan " -0x7b0f: "Hu " -0x7b10: "Gang " -0x7b11: "Xiao " -0x7b12: "Cen " -0x7b13: "Pi " -0x7b14: "Bi " -0x7b15: "Jian " -0x7b16: "Yi " -0x7b17: "Dong " -0x7b18: "Shan " -0x7b19: "Sheng " -0x7b1a: "Xia " -0x7b1b: "Di " -0x7b1c: "Zhu " -0x7b1d: "Na " -0x7b1e: "Chi " -0x7b1f: "Gu " -0x7b20: "Li " -0x7b21: "Qie " -0x7b22: "Min " -0x7b23: "Bao " -0x7b24: "Tiao " -0x7b25: "Si " -0x7b26: "Fu " -0x7b27: "Ce " -0x7b28: "Ben " -0x7b29: "Pei " -0x7b2a: "Da " -0x7b2b: "Zi " -0x7b2c: "Di " -0x7b2d: "Ling " -0x7b2e: "Ze " -0x7b2f: "Nu " -0x7b30: "Fu " -0x7b31: "Gou " -0x7b32: "Fan " -0x7b33: "Jia " -0x7b34: "Ge " -0x7b35: "Fan " -0x7b36: "Shi " -0x7b37: "Mao " -0x7b38: "Po " -0x7b39: "Sey " -0x7b3a: "Jian " -0x7b3b: "Qiong " -0x7b3c: "Long " -0x7b3d: "Souke " -0x7b3e: "Bian " -0x7b3f: "Luo " -0x7b40: "Gui " -0x7b41: "Qu " -0x7b42: "Chi " -0x7b43: "Yin " -0x7b44: "Yao " -0x7b45: "Xian " -0x7b46: "Bi " -0x7b47: "Qiong " -0x7b48: "Gua " -0x7b49: "Deng " -0x7b4a: "Jiao " -0x7b4b: "Jin " -0x7b4c: "Quan " -0x7b4d: "Sun " -0x7b4e: "Ru " -0x7b4f: "Fa " -0x7b50: "Kuang " -0x7b51: "Zhu " -0x7b52: "Tong " -0x7b53: "Ji " -0x7b54: "Da " -0x7b55: "Xing " -0x7b56: "Ce " -0x7b57: "Zhong " -0x7b58: "Kou " -0x7b59: "Lai " -0x7b5a: "Bi " -0x7b5b: "Shai " -0x7b5c: "Dang " -0x7b5d: "Zheng " -0x7b5e: "Ce " -0x7b5f: "Fu " -0x7b60: "Yun " -0x7b61: "Tu " -0x7b62: "Pa " -0x7b63: "Li " -0x7b64: "Lang " -0x7b65: "Ju " -0x7b66: "Guan " -0x7b67: "Jian " -0x7b68: "Han " -0x7b69: "Tong " -0x7b6a: "Xia " -0x7b6b: "Zhi " -0x7b6c: "Cheng " -0x7b6d: "Suan " -0x7b6e: "Shi " -0x7b6f: "Zhu " -0x7b70: "Zuo " -0x7b71: "Xiao " -0x7b72: "Shao " -0x7b73: "Ting " -0x7b74: "Ce " -0x7b75: "Yan " -0x7b76: "Gao " -0x7b77: "Kuai " -0x7b78: "Gan " -0x7b79: "Chou " -0x7b7a: "Kago " -0x7b7b: "Gang " -0x7b7c: "Yun " -0x7b7d: "O " -0x7b7e: "Qian " -0x7b7f: "Xiao " -0x7b80: "Jian " -0x7b81: "Pu " -0x7b82: "Lai " -0x7b83: "Zou " -0x7b84: "Bi " -0x7b85: "Bi " -0x7b86: "Bi " -0x7b87: "Ge " -0x7b88: "Chi " -0x7b89: "Guai " -0x7b8a: "Yu " -0x7b8b: "Jian " -0x7b8c: "Zhao " -0x7b8d: "Gu " -0x7b8e: "Chi " -0x7b8f: "Zheng " -0x7b90: "Jing " -0x7b91: "Sha " -0x7b92: "Zhou " -0x7b93: "Lu " -0x7b94: "Bo " -0x7b95: "Ji " -0x7b96: "Lin " -0x7b97: "Suan " -0x7b98: "Jun " -0x7b99: "Fu " -0x7b9a: "Zha " -0x7b9b: "Gu " -0x7b9c: "Kong " -0x7b9d: "Qian " -0x7b9e: "Quan " -0x7b9f: "Jun " -0x7ba0: "Chui " -0x7ba1: "Guan " -0x7ba2: "Yuan " -0x7ba3: "Ce " -0x7ba4: "Ju " -0x7ba5: "Bo " -0x7ba6: "Ze " -0x7ba7: "Qie " -0x7ba8: "Tuo " -0x7ba9: "Luo " -0x7baa: "Dan " -0x7bab: "Xiao " -0x7bac: "Ruo " -0x7bad: "Jian " -0x7bae: "Xuan " -0x7baf: "Bian " -0x7bb0: "Sun " -0x7bb1: "Xiang " -0x7bb2: "Xian " -0x7bb3: "Ping " -0x7bb4: "Zhen " -0x7bb5: "Sheng " -0x7bb6: "Hu " -0x7bb7: "Shi " -0x7bb8: "Zhu " -0x7bb9: "Yue " -0x7bba: "Chun " -0x7bbb: "Lu " -0x7bbc: "Wu " -0x7bbd: "Dong " -0x7bbe: "Xiao " -0x7bbf: "Ji " -0x7bc0: "Jie " -0x7bc1: "Huang " -0x7bc2: "Xing " -0x7bc3: "Mei " -0x7bc4: "Fan " -0x7bc5: "Chui " -0x7bc6: "Zhuan " -0x7bc7: "Pian " -0x7bc8: "Feng " -0x7bc9: "Zhu " -0x7bca: "Hong " -0x7bcb: "Qie " -0x7bcc: "Hou " -0x7bcd: "Qiu " -0x7bce: "Miao " -0x7bcf: "Qian " -0x7bd0: "[?] " -0x7bd1: "Kui " -0x7bd2: "Sik " -0x7bd3: "Lou " -0x7bd4: "Yun " -0x7bd5: "He " -0x7bd6: "Tang " -0x7bd7: "Yue " -0x7bd8: "Chou " -0x7bd9: "Gao " -0x7bda: "Fei " -0x7bdb: "Ruo " -0x7bdc: "Zheng " -0x7bdd: "Gou " -0x7bde: "Nie " -0x7bdf: "Qian " -0x7be0: "Xiao " -0x7be1: "Cuan " -0x7be2: "Gong " -0x7be3: "Pang " -0x7be4: "Du " -0x7be5: "Li " -0x7be6: "Bi " -0x7be7: "Zhuo " -0x7be8: "Chu " -0x7be9: "Shai " -0x7bea: "Chi " -0x7beb: "Zhu " -0x7bec: "Qiang " -0x7bed: "Long " -0x7bee: "Lan " -0x7bef: "Jian " -0x7bf0: "Bu " -0x7bf1: "Li " -0x7bf2: "Hui " -0x7bf3: "Bi " -0x7bf4: "Di " -0x7bf5: "Cong " -0x7bf6: "Yan " -0x7bf7: "Peng " -0x7bf8: "Sen " -0x7bf9: "Zhuan " -0x7bfa: "Pai " -0x7bfb: "Piao " -0x7bfc: "Dou " -0x7bfd: "Yu " -0x7bfe: "Mie " -0x7bff: "Zhuan " -/* x07c */ -0x7c00: "Ze " -0x7c01: "Xi " -0x7c02: "Guo " -0x7c03: "Yi " -0x7c04: "Hu " -0x7c05: "Chan " -0x7c06: "Kou " -0x7c07: "Cu " -0x7c08: "Ping " -0x7c09: "Chou " -0x7c0a: "Ji " -0x7c0b: "Gui " -0x7c0c: "Su " -0x7c0d: "Lou " -0x7c0e: "Zha " -0x7c0f: "Lu " -0x7c10: "Nian " -0x7c11: "Suo " -0x7c12: "Cuan " -0x7c13: "Sasara " -0x7c14: "Suo " -0x7c15: "Le " -0x7c16: "Duan " -0x7c17: "Yana " -0x7c18: "Xiao " -0x7c19: "Bo " -0x7c1a: "Mi " -0x7c1b: "Si " -0x7c1c: "Dang " -0x7c1d: "Liao " -0x7c1e: "Dan " -0x7c1f: "Dian " -0x7c20: "Fu " -0x7c21: "Jian " -0x7c22: "Min " -0x7c23: "Kui " -0x7c24: "Dai " -0x7c25: "Qiao " -0x7c26: "Deng " -0x7c27: "Huang " -0x7c28: "Sun " -0x7c29: "Lao " -0x7c2a: "Zan " -0x7c2b: "Xiao " -0x7c2c: "Du " -0x7c2d: "Shi " -0x7c2e: "Zan " -0x7c2f: "[?] " -0x7c30: "Pai " -0x7c31: "Hata " -0x7c32: "Pai " -0x7c33: "Gan " -0x7c34: "Ju " -0x7c35: "Du " -0x7c36: "Lu " -0x7c37: "Yan " -0x7c38: "Bo " -0x7c39: "Dang " -0x7c3a: "Sai " -0x7c3b: "Ke " -0x7c3c: "Long " -0x7c3d: "Qian " -0x7c3e: "Lian " -0x7c3f: "Bo " -0x7c40: "Zhou " -0x7c41: "Lai " -0x7c42: "[?] " -0x7c43: "Lan " -0x7c44: "Kui " -0x7c45: "Yu " -0x7c46: "Yue " -0x7c47: "Hao " -0x7c48: "Zhen " -0x7c49: "Tai " -0x7c4a: "Ti " -0x7c4b: "Mi " -0x7c4c: "Chou " -0x7c4d: "Ji " -0x7c4e: "[?] " -0x7c4f: "Hata " -0x7c50: "Teng " -0x7c51: "Zhuan " -0x7c52: "Zhou " -0x7c53: "Fan " -0x7c54: "Sou " -0x7c55: "Zhou " -0x7c56: "Kuji " -0x7c57: "Zhuo " -0x7c58: "Teng " -0x7c59: "Lu " -0x7c5a: "Lu " -0x7c5b: "Jian " -0x7c5c: "Tuo " -0x7c5d: "Ying " -0x7c5e: "Yu " -0x7c5f: "Lai " -0x7c60: "Long " -0x7c61: "Shinshi " -0x7c62: "Lian " -0x7c63: "Lan " -0x7c64: "Qian " -0x7c65: "Yue " -0x7c66: "Zhong " -0x7c67: "Qu " -0x7c68: "Lian " -0x7c69: "Bian " -0x7c6a: "Duan " -0x7c6b: "Zuan " -0x7c6c: "Li " -0x7c6d: "Si " -0x7c6e: "Luo " -0x7c6f: "Ying " -0x7c70: "Yue " -0x7c71: "Zhuo " -0x7c72: "Xu " -0x7c73: "Mi " -0x7c74: "Di " -0x7c75: "Fan " -0x7c76: "Shen " -0x7c77: "Zhe " -0x7c78: "Shen " -0x7c79: "Nu " -0x7c7a: "Xie " -0x7c7b: "Lei " -0x7c7c: "Xian " -0x7c7d: "Zi " -0x7c7e: "Ni " -0x7c7f: "Cun " -0x7c80: "[?] " -0x7c81: "Qian " -0x7c82: "Kume " -0x7c83: "Bi " -0x7c84: "Ban " -0x7c85: "Wu " -0x7c86: "Sha " -0x7c87: "Kang " -0x7c88: "Rou " -0x7c89: "Fen " -0x7c8a: "Bi " -0x7c8b: "Cui " -0x7c8c: "[?] " -0x7c8d: "Li " -0x7c8e: "Chi " -0x7c8f: "Nukamiso " -0x7c90: "Ro " -0x7c91: "Ba " -0x7c92: "Li " -0x7c93: "Gan " -0x7c94: "Ju " -0x7c95: "Po " -0x7c96: "Mo " -0x7c97: "Cu " -0x7c98: "Nian " -0x7c99: "Zhou " -0x7c9a: "Li " -0x7c9b: "Su " -0x7c9c: "Tiao " -0x7c9d: "Li " -0x7c9e: "Qi " -0x7c9f: "Su " -0x7ca0: "Hong " -0x7ca1: "Tong " -0x7ca2: "Zi " -0x7ca3: "Ce " -0x7ca4: "Yue " -0x7ca5: "Zhou " -0x7ca6: "Lin " -0x7ca7: "Zhuang " -0x7ca8: "Bai " -0x7ca9: "[?] " -0x7caa: "Fen " -0x7cab: "Ji " -0x7cac: "[?] " -0x7cad: "Sukumo " -0x7cae: "Liang " -0x7caf: "Xian " -0x7cb0: "Fu " -0x7cb1: "Liang " -0x7cb2: "Can " -0x7cb3: "Geng " -0x7cb4: "Li " -0x7cb5: "Yue " -0x7cb6: "Lu " -0x7cb7: "Ju " -0x7cb8: "Qi " -0x7cb9: "Cui " -0x7cba: "Bai " -0x7cbb: "Zhang " -0x7cbc: "Lin " -0x7cbd: "Zong " -0x7cbe: "Jing " -0x7cbf: "Guo " -0x7cc0: "Kouji " -0x7cc1: "San " -0x7cc2: "San " -0x7cc3: "Tang " -0x7cc4: "Bian " -0x7cc5: "Rou " -0x7cc6: "Mian " -0x7cc7: "Hou " -0x7cc8: "Xu " -0x7cc9: "Zong " -0x7cca: "Hu " -0x7ccb: "Jian " -0x7ccc: "Zan " -0x7ccd: "Ci " -0x7cce: "Li " -0x7ccf: "Xie " -0x7cd0: "Fu " -0x7cd1: "Ni " -0x7cd2: "Bei " -0x7cd3: "Gu " -0x7cd4: "Xiu " -0x7cd5: "Gao " -0x7cd6: "Tang " -0x7cd7: "Qiu " -0x7cd8: "Sukumo " -0x7cd9: "Cao " -0x7cda: "Zhuang " -0x7cdb: "Tang " -0x7cdc: "Mi " -0x7cdd: "San " -0x7cde: "Fen " -0x7cdf: "Zao " -0x7ce0: "Kang " -0x7ce1: "Jiang " -0x7ce2: "Mo " -0x7ce3: "San " -0x7ce4: "San " -0x7ce5: "Nuo " -0x7ce6: "Xi " -0x7ce7: "Liang " -0x7ce8: "Jiang " -0x7ce9: "Kuai " -0x7cea: "Bo " -0x7ceb: "Huan " -0x7cec: "[?] " -0x7ced: "Zong " -0x7cee: "Xian " -0x7cef: "Nuo " -0x7cf0: "Tuan " -0x7cf1: "Nie " -0x7cf2: "Li " -0x7cf3: "Zuo " -0x7cf4: "Di " -0x7cf5: "Nie " -0x7cf6: "Tiao " -0x7cf7: "Lan " -0x7cf8: "Mi " -0x7cf9: "Jiao " -0x7cfa: "Jiu " -0x7cfb: "Xi " -0x7cfc: "Gong " -0x7cfd: "Zheng " -0x7cfe: "Jiu " -0x7cff: "You " -/* x07d */ -0x7d00: "Ji " -0x7d01: "Cha " -0x7d02: "Zhou " -0x7d03: "Xun " -0x7d04: "Yue " -0x7d05: "Hong " -0x7d06: "Yu " -0x7d07: "He " -0x7d08: "Wan " -0x7d09: "Ren " -0x7d0a: "Wen " -0x7d0b: "Wen " -0x7d0c: "Qiu " -0x7d0d: "Na " -0x7d0e: "Zi " -0x7d0f: "Tou " -0x7d10: "Niu " -0x7d11: "Fou " -0x7d12: "Jie " -0x7d13: "Shu " -0x7d14: "Chun " -0x7d15: "Pi " -0x7d16: "Yin " -0x7d17: "Sha " -0x7d18: "Hong " -0x7d19: "Zhi " -0x7d1a: "Ji " -0x7d1b: "Fen " -0x7d1c: "Yun " -0x7d1d: "Ren " -0x7d1e: "Dan " -0x7d1f: "Jin " -0x7d20: "Su " -0x7d21: "Fang " -0x7d22: "Suo " -0x7d23: "Cui " -0x7d24: "Jiu " -0x7d25: "Zha " -0x7d26: "Kinu " -0x7d27: "Jin " -0x7d28: "Fu " -0x7d29: "Zhi " -0x7d2a: "Ci " -0x7d2b: "Zi " -0x7d2c: "Chou " -0x7d2d: "Hong " -0x7d2e: "Zha " -0x7d2f: "Lei " -0x7d30: "Xi " -0x7d31: "Fu " -0x7d32: "Xie " -0x7d33: "Shen " -0x7d34: "Bei " -0x7d35: "Zhu " -0x7d36: "Qu " -0x7d37: "Ling " -0x7d38: "Zhu " -0x7d39: "Shao " -0x7d3a: "Gan " -0x7d3b: "Yang " -0x7d3c: "Fu " -0x7d3d: "Tuo " -0x7d3e: "Zhen " -0x7d3f: "Dai " -0x7d40: "Zhuo " -0x7d41: "Shi " -0x7d42: "Zhong " -0x7d43: "Xian " -0x7d44: "Zu " -0x7d45: "Jiong " -0x7d46: "Ban " -0x7d47: "Ju " -0x7d48: "Mo " -0x7d49: "Shu " -0x7d4a: "Zui " -0x7d4b: "Wata " -0x7d4c: "Jing " -0x7d4d: "Ren " -0x7d4e: "Heng " -0x7d4f: "Xie " -0x7d50: "Jie " -0x7d51: "Zhu " -0x7d52: "Chou " -0x7d53: "Gua " -0x7d54: "Bai " -0x7d55: "Jue " -0x7d56: "Kuang " -0x7d57: "Hu " -0x7d58: "Ci " -0x7d59: "Geng " -0x7d5a: "Geng " -0x7d5b: "Tao " -0x7d5c: "Xie " -0x7d5d: "Ku " -0x7d5e: "Jiao " -0x7d5f: "Quan " -0x7d60: "Gai " -0x7d61: "Luo " -0x7d62: "Xuan " -0x7d63: "Bing " -0x7d64: "Xian " -0x7d65: "Fu " -0x7d66: "Gei " -0x7d67: "Tong " -0x7d68: "Rong " -0x7d69: "Tiao " -0x7d6a: "Yin " -0x7d6b: "Lei " -0x7d6c: "Xie " -0x7d6d: "Quan " -0x7d6e: "Xu " -0x7d6f: "Lun " -0x7d70: "Die " -0x7d71: "Tong " -0x7d72: "Si " -0x7d73: "Jiang " -0x7d74: "Xiang " -0x7d75: "Hui " -0x7d76: "Jue " -0x7d77: "Zhi " -0x7d78: "Jian " -0x7d79: "Juan " -0x7d7a: "Chi " -0x7d7b: "Mian " -0x7d7c: "Zhen " -0x7d7d: "Lu " -0x7d7e: "Cheng " -0x7d7f: "Qiu " -0x7d80: "Shu " -0x7d81: "Bang " -0x7d82: "Tong " -0x7d83: "Xiao " -0x7d84: "Wan " -0x7d85: "Qin " -0x7d86: "Geng " -0x7d87: "Xiu " -0x7d88: "Ti " -0x7d89: "Xiu " -0x7d8a: "Xie " -0x7d8b: "Hong " -0x7d8c: "Xi " -0x7d8d: "Fu " -0x7d8e: "Ting " -0x7d8f: "Sui " -0x7d90: "Dui " -0x7d91: "Kun " -0x7d92: "Fu " -0x7d93: "Jing " -0x7d94: "Hu " -0x7d95: "Zhi " -0x7d96: "Yan " -0x7d97: "Jiong " -0x7d98: "Feng " -0x7d99: "Ji " -0x7d9a: "Sok " -0x7d9b: "Kase " -0x7d9c: "Zong " -0x7d9d: "Lin " -0x7d9e: "Duo " -0x7d9f: "Li " -0x7da0: "Lu " -0x7da1: "Liang " -0x7da2: "Chou " -0x7da3: "Quan " -0x7da4: "Shao " -0x7da5: "Qi " -0x7da6: "Qi " -0x7da7: "Zhun " -0x7da8: "Qi " -0x7da9: "Wan " -0x7daa: "Qian " -0x7dab: "Xian " -0x7dac: "Shou " -0x7dad: "Wei " -0x7dae: "Qi " -0x7daf: "Tao " -0x7db0: "Wan " -0x7db1: "Gang " -0x7db2: "Wang " -0x7db3: "Beng " -0x7db4: "Zhui " -0x7db5: "Cai " -0x7db6: "Guo " -0x7db7: "Cui " -0x7db8: "Lun " -0x7db9: "Liu " -0x7dba: "Qi " -0x7dbb: "Zhan " -0x7dbc: "Bei " -0x7dbd: "Chuo " -0x7dbe: "Ling " -0x7dbf: "Mian " -0x7dc0: "Qi " -0x7dc1: "Qie " -0x7dc2: "Tan " -0x7dc3: "Zong " -0x7dc4: "Gun " -0x7dc5: "Zou " -0x7dc6: "Yi " -0x7dc7: "Zi " -0x7dc8: "Xing " -0x7dc9: "Liang " -0x7dca: "Jin " -0x7dcb: "Fei " -0x7dcc: "Rui " -0x7dcd: "Min " -0x7dce: "Yu " -0x7dcf: "Zong " -0x7dd0: "Fan " -0x7dd1: "Lu " -0x7dd2: "Xu " -0x7dd3: "Yingl " -0x7dd4: "Zhang " -0x7dd5: "Kasuri " -0x7dd6: "Xu " -0x7dd7: "Xiang " -0x7dd8: "Jian " -0x7dd9: "Ke " -0x7dda: "Xian " -0x7ddb: "Ruan " -0x7ddc: "Mian " -0x7ddd: "Qi " -0x7dde: "Duan " -0x7ddf: "Zhong " -0x7de0: "Di " -0x7de1: "Min " -0x7de2: "Miao " -0x7de3: "Yuan " -0x7de4: "Xie " -0x7de5: "Bao " -0x7de6: "Si " -0x7de7: "Qiu " -0x7de8: "Bian " -0x7de9: "Huan " -0x7dea: "Geng " -0x7deb: "Cong " -0x7dec: "Mian " -0x7ded: "Wei " -0x7dee: "Fu " -0x7def: "Wei " -0x7df0: "Yu " -0x7df1: "Gou " -0x7df2: "Miao " -0x7df3: "Xie " -0x7df4: "Lian " -0x7df5: "Zong " -0x7df6: "Bian " -0x7df7: "Yun " -0x7df8: "Yin " -0x7df9: "Ti " -0x7dfa: "Gua " -0x7dfb: "Zhi " -0x7dfc: "Yun " -0x7dfd: "Cheng " -0x7dfe: "Chan " -0x7dff: "Dai " -/* x07e */ -0x7e00: "Xia " -0x7e01: "Yuan " -0x7e02: "Zong " -0x7e03: "Xu " -0x7e04: "Nawa " -0x7e05: "Odoshi " -0x7e06: "Geng " -0x7e07: "Sen " -0x7e08: "Ying " -0x7e09: "Jin " -0x7e0a: "Yi " -0x7e0b: "Zhui " -0x7e0c: "Ni " -0x7e0d: "Bang " -0x7e0e: "Gu " -0x7e0f: "Pan " -0x7e10: "Zhou " -0x7e11: "Jian " -0x7e12: "Cuo " -0x7e13: "Quan " -0x7e14: "Shuang " -0x7e15: "Yun " -0x7e16: "Xia " -0x7e17: "Shuai " -0x7e18: "Xi " -0x7e19: "Rong " -0x7e1a: "Tao " -0x7e1b: "Fu " -0x7e1c: "Yun " -0x7e1d: "Zhen " -0x7e1e: "Gao " -0x7e1f: "Ru " -0x7e20: "Hu " -0x7e21: "Zai " -0x7e22: "Teng " -0x7e23: "Xian " -0x7e24: "Su " -0x7e25: "Zhen " -0x7e26: "Zong " -0x7e27: "Tao " -0x7e28: "Horo " -0x7e29: "Cai " -0x7e2a: "Bi " -0x7e2b: "Feng " -0x7e2c: "Cu " -0x7e2d: "Li " -0x7e2e: "Suo " -0x7e2f: "Yin " -0x7e30: "Xi " -0x7e31: "Zong " -0x7e32: "Lei " -0x7e33: "Zhuan " -0x7e34: "Qian " -0x7e35: "Man " -0x7e36: "Zhi " -0x7e37: "Lu " -0x7e38: "Mo " -0x7e39: "Piao " -0x7e3a: "Lian " -0x7e3b: "Mi " -0x7e3c: "Xuan " -0x7e3d: "Zong " -0x7e3e: "Ji " -0x7e3f: "Shan " -0x7e40: "Sui " -0x7e41: "Fan " -0x7e42: "Shuai " -0x7e43: "Beng " -0x7e44: "Yi " -0x7e45: "Sao " -0x7e46: "Mou " -0x7e47: "Zhou " -0x7e48: "Qiang " -0x7e49: "Hun " -0x7e4a: "Sem " -0x7e4b: "Xi " -0x7e4c: "Jung " -0x7e4d: "Xiu " -0x7e4e: "Ran " -0x7e4f: "Xuan " -0x7e50: "Hui " -0x7e51: "Qiao " -0x7e52: "Zeng " -0x7e53: "Zuo " -0x7e54: "Zhi " -0x7e55: "Shan " -0x7e56: "San " -0x7e57: "Lin " -0x7e58: "Yu " -0x7e59: "Fan " -0x7e5a: "Liao " -0x7e5b: "Chuo " -0x7e5c: "Zun " -0x7e5d: "Jian " -0x7e5e: "Rao " -0x7e5f: "Chan " -0x7e60: "Rui " -0x7e61: "Xiu " -0x7e62: "Hui " -0x7e63: "Hua " -0x7e64: "Zuan " -0x7e65: "Xi " -0x7e66: "Qiang " -0x7e67: "Un " -0x7e68: "Da " -0x7e69: "Sheng " -0x7e6a: "Hui " -0x7e6b: "Xi " -0x7e6c: "Se " -0x7e6d: "Jian " -0x7e6e: "Jiang " -0x7e6f: "Huan " -0x7e70: "Zao " -0x7e71: "Cong " -0x7e72: "Jie " -0x7e73: "Jiao " -0x7e74: "Bo " -0x7e75: "Chan " -0x7e76: "Yi " -0x7e77: "Nao " -0x7e78: "Sui " -0x7e79: "Yi " -0x7e7a: "Shai " -0x7e7b: "Xu " -0x7e7c: "Ji " -0x7e7d: "Bin " -0x7e7e: "Qian " -0x7e7f: "Lan " -0x7e80: "Pu " -0x7e81: "Xun " -0x7e82: "Zuan " -0x7e83: "Qi " -0x7e84: "Peng " -0x7e85: "Li " -0x7e86: "Mo " -0x7e87: "Lei " -0x7e88: "Xie " -0x7e89: "Zuan " -0x7e8a: "Kuang " -0x7e8b: "You " -0x7e8c: "Xu " -0x7e8d: "Lei " -0x7e8e: "Xian " -0x7e8f: "Chan " -0x7e90: "Kou " -0x7e91: "Lu " -0x7e92: "Chan " -0x7e93: "Ying " -0x7e94: "Cai " -0x7e95: "Xiang " -0x7e96: "Xian " -0x7e97: "Zui " -0x7e98: "Zuan " -0x7e99: "Luo " -0x7e9a: "Xi " -0x7e9b: "Dao " -0x7e9c: "Lan " -0x7e9d: "Lei " -0x7e9e: "Lian " -0x7e9f: "Si " -0x7ea0: "Jiu " -0x7ea1: "Yu " -0x7ea2: "Hong " -0x7ea3: "Zhou " -0x7ea4: "Xian " -0x7ea5: "He " -0x7ea6: "Yue " -0x7ea7: "Ji " -0x7ea8: "Wan " -0x7ea9: "Kuang " -0x7eaa: "Ji " -0x7eab: "Ren " -0x7eac: "Wei " -0x7ead: "Yun " -0x7eae: "Hong " -0x7eaf: "Chun " -0x7eb0: "Pi " -0x7eb1: "Sha " -0x7eb2: "Gang " -0x7eb3: "Na " -0x7eb4: "Ren " -0x7eb5: "Zong " -0x7eb6: "Lun " -0x7eb7: "Fen " -0x7eb8: "Zhi " -0x7eb9: "Wen " -0x7eba: "Fang " -0x7ebb: "Zhu " -0x7ebc: "Yin " -0x7ebd: "Niu " -0x7ebe: "Shu " -0x7ebf: "Xian " -0x7ec0: "Gan " -0x7ec1: "Xie " -0x7ec2: "Fu " -0x7ec3: "Lian " -0x7ec4: "Zu " -0x7ec5: "Shen " -0x7ec6: "Xi " -0x7ec7: "Zhi " -0x7ec8: "Zhong " -0x7ec9: "Zhou " -0x7eca: "Ban " -0x7ecb: "Fu " -0x7ecc: "Zhuo " -0x7ecd: "Shao " -0x7ece: "Yi " -0x7ecf: "Jing " -0x7ed0: "Dai " -0x7ed1: "Bang " -0x7ed2: "Rong " -0x7ed3: "Jie " -0x7ed4: "Ku " -0x7ed5: "Rao " -0x7ed6: "Die " -0x7ed7: "Heng " -0x7ed8: "Hui " -0x7ed9: "Gei " -0x7eda: "Xuan " -0x7edb: "Jiang " -0x7edc: "Luo " -0x7edd: "Jue " -0x7ede: "Jiao " -0x7edf: "Tong " -0x7ee0: "Geng " -0x7ee1: "Xiao " -0x7ee2: "Juan " -0x7ee3: "Xiu " -0x7ee4: "Xi " -0x7ee5: "Sui " -0x7ee6: "Tao " -0x7ee7: "Ji " -0x7ee8: "Ti " -0x7ee9: "Ji " -0x7eea: "Xu " -0x7eeb: "Ling " -0x7eec: "[?] " -0x7eed: "Xu " -0x7eee: "Qi " -0x7eef: "Fei " -0x7ef0: "Chuo " -0x7ef1: "Zhang " -0x7ef2: "Gun " -0x7ef3: "Sheng " -0x7ef4: "Wei " -0x7ef5: "Mian " -0x7ef6: "Shou " -0x7ef7: "Beng " -0x7ef8: "Chou " -0x7ef9: "Tao " -0x7efa: "Liu " -0x7efb: "Quan " -0x7efc: "Zong " -0x7efd: "Zhan " -0x7efe: "Wan " -0x7eff: "Lu " -/* x07f */ -0x7f00: "Zhui " -0x7f01: "Zi " -0x7f02: "Ke " -0x7f03: "Xiang " -0x7f04: "Jian " -0x7f05: "Mian " -0x7f06: "Lan " -0x7f07: "Ti " -0x7f08: "Miao " -0x7f09: "Qi " -0x7f0a: "Yun " -0x7f0b: "Hui " -0x7f0c: "Si " -0x7f0d: "Duo " -0x7f0e: "Duan " -0x7f0f: "Bian " -0x7f10: "Xian " -0x7f11: "Gou " -0x7f12: "Zhui " -0x7f13: "Huan " -0x7f14: "Di " -0x7f15: "Lu " -0x7f16: "Bian " -0x7f17: "Min " -0x7f18: "Yuan " -0x7f19: "Jin " -0x7f1a: "Fu " -0x7f1b: "Ru " -0x7f1c: "Zhen " -0x7f1d: "Feng " -0x7f1e: "Shuai " -0x7f1f: "Gao " -0x7f20: "Chan " -0x7f21: "Li " -0x7f22: "Yi " -0x7f23: "Jian " -0x7f24: "Bin " -0x7f25: "Piao " -0x7f26: "Man " -0x7f27: "Lei " -0x7f28: "Ying " -0x7f29: "Suo " -0x7f2a: "Mou " -0x7f2b: "Sao " -0x7f2c: "Xie " -0x7f2d: "Liao " -0x7f2e: "Shan " -0x7f2f: "Zeng " -0x7f30: "Jiang " -0x7f31: "Qian " -0x7f32: "Zao " -0x7f33: "Huan " -0x7f34: "Jiao " -0x7f35: "Zuan " -0x7f36: "Fou " -0x7f37: "Xie " -0x7f38: "Gang " -0x7f39: "Fou " -0x7f3a: "Que " -0x7f3b: "Fou " -0x7f3c: "Kaakeru " -0x7f3d: "Bo " -0x7f3e: "Ping " -0x7f3f: "Hou " -0x7f40: "[?] " -0x7f41: "Gang " -0x7f42: "Ying " -0x7f43: "Ying " -0x7f44: "Qing " -0x7f45: "Xia " -0x7f46: "Guan " -0x7f47: "Zun " -0x7f48: "Tan " -0x7f49: "Chang " -0x7f4a: "Qi " -0x7f4b: "Weng " -0x7f4c: "Ying " -0x7f4d: "Lei " -0x7f4e: "Tan " -0x7f4f: "Lu " -0x7f50: "Guan " -0x7f51: "Wang " -0x7f52: "Wang " -0x7f53: "Gang " -0x7f54: "Wang " -0x7f55: "Han " -0x7f56: "[?] " -0x7f57: "Luo " -0x7f58: "Fu " -0x7f59: "Mi " -0x7f5a: "Fa " -0x7f5b: "Gu " -0x7f5c: "Zhu " -0x7f5d: "Ju " -0x7f5e: "Mao " -0x7f5f: "Gu " -0x7f60: "Min " -0x7f61: "Gang " -0x7f62: "Ba " -0x7f63: "Gua " -0x7f64: "Ti " -0x7f65: "Juan " -0x7f66: "Fu " -0x7f67: "Lin " -0x7f68: "Yan " -0x7f69: "Zhao " -0x7f6a: "Zui " -0x7f6b: "Gua " -0x7f6c: "Zhuo " -0x7f6d: "Yu " -0x7f6e: "Zhi " -0x7f6f: "An " -0x7f70: "Fa " -0x7f71: "Nan " -0x7f72: "Shu " -0x7f73: "Si " -0x7f74: "Pi " -0x7f75: "Ma " -0x7f76: "Liu " -0x7f77: "Ba " -0x7f78: "Fa " -0x7f79: "Li " -0x7f7a: "Chao " -0x7f7b: "Wei " -0x7f7c: "Bi " -0x7f7d: "Ji " -0x7f7e: "Zeng " -0x7f7f: "Tong " -0x7f80: "Liu " -0x7f81: "Ji " -0x7f82: "Juan " -0x7f83: "Mi " -0x7f84: "Zhao " -0x7f85: "Luo " -0x7f86: "Pi " -0x7f87: "Ji " -0x7f88: "Ji " -0x7f89: "Luan " -0x7f8a: "Yang " -0x7f8b: "Mie " -0x7f8c: "Qiang " -0x7f8d: "Ta " -0x7f8e: "Mei " -0x7f8f: "Yang " -0x7f90: "You " -0x7f91: "You " -0x7f92: "Fen " -0x7f93: "Ba " -0x7f94: "Gao " -0x7f95: "Yang " -0x7f96: "Gu " -0x7f97: "Qiang " -0x7f98: "Zang " -0x7f99: "Gao " -0x7f9a: "Ling " -0x7f9b: "Yi " -0x7f9c: "Zhu " -0x7f9d: "Di " -0x7f9e: "Xiu " -0x7f9f: "Qian " -0x7fa0: "Yi " -0x7fa1: "Xian " -0x7fa2: "Rong " -0x7fa3: "Qun " -0x7fa4: "Qun " -0x7fa5: "Qian " -0x7fa6: "Huan " -0x7fa7: "Zui " -0x7fa8: "Xian " -0x7fa9: "Yi " -0x7faa: "Yashinau " -0x7fab: "Qiang " -0x7fac: "Xian " -0x7fad: "Yu " -0x7fae: "Geng " -0x7faf: "Jie " -0x7fb0: "Tang " -0x7fb1: "Yuan " -0x7fb2: "Xi " -0x7fb3: "Fan " -0x7fb4: "Shan " -0x7fb5: "Fen " -0x7fb6: "Shan " -0x7fb7: "Lian " -0x7fb8: "Lei " -0x7fb9: "Geng " -0x7fba: "Nou " -0x7fbb: "Qiang " -0x7fbc: "Chan " -0x7fbd: "Yu " -0x7fbe: "Gong " -0x7fbf: "Yi " -0x7fc0: "Chong " -0x7fc1: "Weng " -0x7fc2: "Fen " -0x7fc3: "Hong " -0x7fc4: "Chi " -0x7fc5: "Chi " -0x7fc6: "Cui " -0x7fc7: "Fu " -0x7fc8: "Xia " -0x7fc9: "Pen " -0x7fca: "Yi " -0x7fcb: "La " -0x7fcc: "Yi " -0x7fcd: "Pi " -0x7fce: "Ling " -0x7fcf: "Liu " -0x7fd0: "Zhi " -0x7fd1: "Qu " -0x7fd2: "Xi " -0x7fd3: "Xie " -0x7fd4: "Xiang " -0x7fd5: "Xi " -0x7fd6: "Xi " -0x7fd7: "Qi " -0x7fd8: "Qiao " -0x7fd9: "Hui " -0x7fda: "Hui " -0x7fdb: "Xiao " -0x7fdc: "Se " -0x7fdd: "Hong " -0x7fde: "Jiang " -0x7fdf: "Di " -0x7fe0: "Cui " -0x7fe1: "Fei " -0x7fe2: "Tao " -0x7fe3: "Sha " -0x7fe4: "Chi " -0x7fe5: "Zhu " -0x7fe6: "Jian " -0x7fe7: "Xuan " -0x7fe8: "Shi " -0x7fe9: "Pian " -0x7fea: "Zong " -0x7feb: "Wan " -0x7fec: "Hui " -0x7fed: "Hou " -0x7fee: "He " -0x7fef: "He " -0x7ff0: "Han " -0x7ff1: "Ao " -0x7ff2: "Piao " -0x7ff3: "Yi " -0x7ff4: "Lian " -0x7ff5: "Qu " -0x7ff6: "[?] " -0x7ff7: "Lin " -0x7ff8: "Pen " -0x7ff9: "Qiao " -0x7ffa: "Ao " -0x7ffb: "Fan " -0x7ffc: "Yi " -0x7ffd: "Hui " -0x7ffe: "Xuan " -0x7fff: "Dao " -/* x080 */ -0x8000: "Yao " -0x8001: "Lao " -0x8002: "[?] " -0x8003: "Kao " -0x8004: "Mao " -0x8005: "Zhe " -0x8006: "Qi " -0x8007: "Gou " -0x8008: "Gou " -0x8009: "Gou " -0x800a: "Die " -0x800b: "Die " -0x800c: "Er " -0x800d: "Shua " -0x800e: "Ruan " -0x800f: "Er " -0x8010: "Nai " -0x8011: "Zhuan " -0x8012: "Lei " -0x8013: "Ting " -0x8014: "Zi " -0x8015: "Geng " -0x8016: "Chao " -0x8017: "Hao " -0x8018: "Yun " -0x8019: "Pa " -0x801a: "Pi " -0x801b: "Chi " -0x801c: "Si " -0x801d: "Chu " -0x801e: "Jia " -0x801f: "Ju " -0x8020: "He " -0x8021: "Chu " -0x8022: "Lao " -0x8023: "Lun " -0x8024: "Ji " -0x8025: "Tang " -0x8026: "Ou " -0x8027: "Lou " -0x8028: "Nou " -0x8029: "Gou " -0x802a: "Pang " -0x802b: "Ze " -0x802c: "Lou " -0x802d: "Ji " -0x802e: "Lao " -0x802f: "Huo " -0x8030: "You " -0x8031: "Mo " -0x8032: "Huai " -0x8033: "Er " -0x8034: "Zhe " -0x8035: "Ting " -0x8036: "Ye " -0x8037: "Da " -0x8038: "Song " -0x8039: "Qin " -0x803a: "Yun " -0x803b: "Chi " -0x803c: "Dan " -0x803d: "Dan " -0x803e: "Hong " -0x803f: "Geng " -0x8040: "Zhi " -0x8041: "[?] " -0x8042: "Nie " -0x8043: "Dan " -0x8044: "Zhen " -0x8045: "Che " -0x8046: "Ling " -0x8047: "Zheng " -0x8048: "You " -0x8049: "Wa " -0x804a: "Liao " -0x804b: "Long " -0x804c: "Zhi " -0x804d: "Ning " -0x804e: "Tiao " -0x804f: "Er " -0x8050: "Ya " -0x8051: "Die " -0x8052: "Gua " -0x8053: "[?] " -0x8054: "Lian " -0x8055: "Hao " -0x8056: "Sheng " -0x8057: "Lie " -0x8058: "Pin " -0x8059: "Jing " -0x805a: "Ju " -0x805b: "Bi " -0x805c: "Di " -0x805d: "Guo " -0x805e: "Wen " -0x805f: "Xu " -0x8060: "Ping " -0x8061: "Cong " -0x8062: "Shikato " -0x8063: "[?] " -0x8064: "Ting " -0x8065: "Yu " -0x8066: "Cong " -0x8067: "Kui " -0x8068: "Tsuraneru " -0x8069: "Kui " -0x806a: "Cong " -0x806b: "Lian " -0x806c: "Weng " -0x806d: "Kui " -0x806e: "Lian " -0x806f: "Lian " -0x8070: "Cong " -0x8071: "Ao " -0x8072: "Sheng " -0x8073: "Song " -0x8074: "Ting " -0x8075: "Kui " -0x8076: "Nie " -0x8077: "Zhi " -0x8078: "Dan " -0x8079: "Ning " -0x807a: "Qie " -0x807b: "Ji " -0x807c: "Ting " -0x807d: "Ting " -0x807e: "Long " -0x807f: "Yu " -0x8080: "Yu " -0x8081: "Zhao " -0x8082: "Si " -0x8083: "Su " -0x8084: "Yi " -0x8085: "Su " -0x8086: "Si " -0x8087: "Zhao " -0x8088: "Zhao " -0x8089: "Rou " -0x808a: "Yi " -0x808b: "Le " -0x808c: "Ji " -0x808d: "Qiu " -0x808e: "Ken " -0x808f: "Cao " -0x8090: "Ge " -0x8091: "Di " -0x8092: "Huan " -0x8093: "Huang " -0x8094: "Yi " -0x8095: "Ren " -0x8096: "Xiao " -0x8097: "Ru " -0x8098: "Zhou " -0x8099: "Yuan " -0x809a: "Du " -0x809b: "Gang " -0x809c: "Rong " -0x809d: "Gan " -0x809e: "Cha " -0x809f: "Wo " -0x80a0: "Chang " -0x80a1: "Gu " -0x80a2: "Zhi " -0x80a3: "Han " -0x80a4: "Fu " -0x80a5: "Fei " -0x80a6: "Fen " -0x80a7: "Pei " -0x80a8: "Pang " -0x80a9: "Jian " -0x80aa: "Fang " -0x80ab: "Zhun " -0x80ac: "You " -0x80ad: "Na " -0x80ae: "Hang " -0x80af: "Ken " -0x80b0: "Ran " -0x80b1: "Gong " -0x80b2: "Yu " -0x80b3: "Wen " -0x80b4: "Yao " -0x80b5: "Jin " -0x80b6: "Pi " -0x80b7: "Qian " -0x80b8: "Xi " -0x80b9: "Xi " -0x80ba: "Fei " -0x80bb: "Ken " -0x80bc: "Jing " -0x80bd: "Tai " -0x80be: "Shen " -0x80bf: "Zhong " -0x80c0: "Zhang " -0x80c1: "Xie " -0x80c2: "Shen " -0x80c3: "Wei " -0x80c4: "Zhou " -0x80c5: "Die " -0x80c6: "Dan " -0x80c7: "Fei " -0x80c8: "Ba " -0x80c9: "Bo " -0x80ca: "Qu " -0x80cb: "Tian " -0x80cc: "Bei " -0x80cd: "Gua " -0x80ce: "Tai " -0x80cf: "Zi " -0x80d0: "Ku " -0x80d1: "Zhi " -0x80d2: "Ni " -0x80d3: "Ping " -0x80d4: "Zi " -0x80d5: "Fu " -0x80d6: "Pang " -0x80d7: "Zhen " -0x80d8: "Xian " -0x80d9: "Zuo " -0x80da: "Pei " -0x80db: "Jia " -0x80dc: "Sheng " -0x80dd: "Zhi " -0x80de: "Bao " -0x80df: "Mu " -0x80e0: "Qu " -0x80e1: "Hu " -0x80e2: "Ke " -0x80e3: "Yi " -0x80e4: "Yin " -0x80e5: "Xu " -0x80e6: "Yang " -0x80e7: "Long " -0x80e8: "Dong " -0x80e9: "Ka " -0x80ea: "Lu " -0x80eb: "Jing " -0x80ec: "Nu " -0x80ed: "Yan " -0x80ee: "Pang " -0x80ef: "Kua " -0x80f0: "Yi " -0x80f1: "Guang " -0x80f2: "Gai " -0x80f3: "Ge " -0x80f4: "Dong " -0x80f5: "Zhi " -0x80f6: "Xiao " -0x80f7: "Xiong " -0x80f8: "Xiong " -0x80f9: "Er " -0x80fa: "E " -0x80fb: "Xing " -0x80fc: "Pian " -0x80fd: "Neng " -0x80fe: "Zi " -0x80ff: "Gui " -/* x081 */ -0x8100: "Cheng " -0x8101: "Tiao " -0x8102: "Zhi " -0x8103: "Cui " -0x8104: "Mei " -0x8105: "Xie " -0x8106: "Cui " -0x8107: "Xie " -0x8108: "Mo " -0x8109: "Mai " -0x810a: "Ji " -0x810b: "Obiyaakasu " -0x810c: "[?] " -0x810d: "Kuai " -0x810e: "Sa " -0x810f: "Zang " -0x8110: "Qi " -0x8111: "Nao " -0x8112: "Mi " -0x8113: "Nong " -0x8114: "Luan " -0x8115: "Wan " -0x8116: "Bo " -0x8117: "Wen " -0x8118: "Guan " -0x8119: "Qiu " -0x811a: "Jiao " -0x811b: "Jing " -0x811c: "Rou " -0x811d: "Heng " -0x811e: "Cuo " -0x811f: "Lie " -0x8120: "Shan " -0x8121: "Ting " -0x8122: "Mei " -0x8123: "Chun " -0x8124: "Shen " -0x8125: "Xie " -0x8126: "De " -0x8127: "Zui " -0x8128: "Cu " -0x8129: "Xiu " -0x812a: "Xin " -0x812b: "Tuo " -0x812c: "Pao " -0x812d: "Cheng " -0x812e: "Nei " -0x812f: "Fu " -0x8130: "Dou " -0x8131: "Tuo " -0x8132: "Niao " -0x8133: "Noy " -0x8134: "Pi " -0x8135: "Gu " -0x8136: "Gua " -0x8137: "Li " -0x8138: "Lian " -0x8139: "Zhang " -0x813a: "Cui " -0x813b: "Jie " -0x813c: "Liang " -0x813d: "Zhou " -0x813e: "Pi " -0x813f: "Biao " -0x8140: "Lun " -0x8141: "Pian " -0x8142: "Guo " -0x8143: "Kui " -0x8144: "Chui " -0x8145: "Dan " -0x8146: "Tian " -0x8147: "Nei " -0x8148: "Jing " -0x8149: "Jie " -0x814a: "La " -0x814b: "Yi " -0x814c: "An " -0x814d: "Ren " -0x814e: "Shen " -0x814f: "Chuo " -0x8150: "Fu " -0x8151: "Fu " -0x8152: "Ju " -0x8153: "Fei " -0x8154: "Qiang " -0x8155: "Wan " -0x8156: "Dong " -0x8157: "Pi " -0x8158: "Guo " -0x8159: "Zong " -0x815a: "Ding " -0x815b: "Wu " -0x815c: "Mei " -0x815d: "Ruan " -0x815e: "Zhuan " -0x815f: "Zhi " -0x8160: "Cou " -0x8161: "Gua " -0x8162: "Ou " -0x8163: "Di " -0x8164: "An " -0x8165: "Xing " -0x8166: "Nao " -0x8167: "Yu " -0x8168: "Chuan " -0x8169: "Nan " -0x816a: "Yun " -0x816b: "Zhong " -0x816c: "Rou " -0x816d: "E " -0x816e: "Sai " -0x816f: "Tu " -0x8170: "Yao " -0x8171: "Jian " -0x8172: "Wei " -0x8173: "Jiao " -0x8174: "Yu " -0x8175: "Jia " -0x8176: "Duan " -0x8177: "Bi " -0x8178: "Chang " -0x8179: "Fu " -0x817a: "Xian " -0x817b: "Ni " -0x817c: "Mian " -0x817d: "Wa " -0x817e: "Teng " -0x817f: "Tui " -0x8180: "Bang " -0x8181: "Qian " -0x8182: "Lu " -0x8183: "Wa " -0x8184: "Sou " -0x8185: "Tang " -0x8186: "Su " -0x8187: "Zhui " -0x8188: "Ge " -0x8189: "Yi " -0x818a: "Bo " -0x818b: "Liao " -0x818c: "Ji " -0x818d: "Pi " -0x818e: "Xie " -0x818f: "Gao " -0x8190: "Lu " -0x8191: "Bin " -0x8192: "Ou " -0x8193: "Chang " -0x8194: "Lu " -0x8195: "Guo " -0x8196: "Pang " -0x8197: "Chuai " -0x8198: "Piao " -0x8199: "Jiang " -0x819a: "Fu " -0x819b: "Tang " -0x819c: "Mo " -0x819d: "Xi " -0x819e: "Zhuan " -0x819f: "Lu " -0x81a0: "Jiao " -0x81a1: "Ying " -0x81a2: "Lu " -0x81a3: "Zhi " -0x81a4: "Tara " -0x81a5: "Chun " -0x81a6: "Lian " -0x81a7: "Tong " -0x81a8: "Peng " -0x81a9: "Ni " -0x81aa: "Zha " -0x81ab: "Liao " -0x81ac: "Cui " -0x81ad: "Gui " -0x81ae: "Xiao " -0x81af: "Teng " -0x81b0: "Fan " -0x81b1: "Zhi " -0x81b2: "Jiao " -0x81b3: "Shan " -0x81b4: "Wu " -0x81b5: "Cui " -0x81b6: "Run " -0x81b7: "Xiang " -0x81b8: "Sui " -0x81b9: "Fen " -0x81ba: "Ying " -0x81bb: "Tan " -0x81bc: "Zhua " -0x81bd: "Dan " -0x81be: "Kuai " -0x81bf: "Nong " -0x81c0: "Tun " -0x81c1: "Lian " -0x81c2: "Bi " -0x81c3: "Yong " -0x81c4: "Jue " -0x81c5: "Chu " -0x81c6: "Yi " -0x81c7: "Juan " -0x81c8: "La " -0x81c9: "Lian " -0x81ca: "Sao " -0x81cb: "Tun " -0x81cc: "Gu " -0x81cd: "Qi " -0x81ce: "Cui " -0x81cf: "Bin " -0x81d0: "Xun " -0x81d1: "Ru " -0x81d2: "Huo " -0x81d3: "Zang " -0x81d4: "Xian " -0x81d5: "Biao " -0x81d6: "Xing " -0x81d7: "Kuan " -0x81d8: "La " -0x81d9: "Yan " -0x81da: "Lu " -0x81db: "Huo " -0x81dc: "Zang " -0x81dd: "Luo " -0x81de: "Qu " -0x81df: "Zang " -0x81e0: "Luan " -0x81e1: "Ni " -0x81e2: "Zang " -0x81e3: "Chen " -0x81e4: "Qian " -0x81e5: "Wo " -0x81e6: "Guang " -0x81e7: "Zang " -0x81e8: "Lin " -0x81e9: "Guang " -0x81ea: "Zi " -0x81eb: "Jiao " -0x81ec: "Nie " -0x81ed: "Chou " -0x81ee: "Ji " -0x81ef: "Gao " -0x81f0: "Chou " -0x81f1: "Mian " -0x81f2: "Nie " -0x81f3: "Zhi " -0x81f4: "Zhi " -0x81f5: "Ge " -0x81f6: "Jian " -0x81f7: "Die " -0x81f8: "Zhi " -0x81f9: "Xiu " -0x81fa: "Tai " -0x81fb: "Zhen " -0x81fc: "Jiu " -0x81fd: "Xian " -0x81fe: "Yu " -0x81ff: "Cha " -/* x082 */ -0x8200: "Yao " -0x8201: "Yu " -0x8202: "Chong " -0x8203: "Xi " -0x8204: "Xi " -0x8205: "Jiu " -0x8206: "Yu " -0x8207: "Yu " -0x8208: "Xing " -0x8209: "Ju " -0x820a: "Jiu " -0x820b: "Xin " -0x820c: "She " -0x820d: "She " -0x820e: "Yadoru " -0x820f: "Jiu " -0x8210: "Shi " -0x8211: "Tan " -0x8212: "Shu " -0x8213: "Shi " -0x8214: "Tian " -0x8215: "Dan " -0x8216: "Pu " -0x8217: "Pu " -0x8218: "Guan " -0x8219: "Hua " -0x821a: "Tan " -0x821b: "Chuan " -0x821c: "Shun " -0x821d: "Xia " -0x821e: "Wu " -0x821f: "Zhou " -0x8220: "Dao " -0x8221: "Gang " -0x8222: "Shan " -0x8223: "Yi " -0x8224: "[?] " -0x8225: "Pa " -0x8226: "Tai " -0x8227: "Fan " -0x8228: "Ban " -0x8229: "Chuan " -0x822a: "Hang " -0x822b: "Fang " -0x822c: "Ban " -0x822d: "Que " -0x822e: "Hesaki " -0x822f: "Zhong " -0x8230: "Jian " -0x8231: "Cang " -0x8232: "Ling " -0x8233: "Zhu " -0x8234: "Ze " -0x8235: "Duo " -0x8236: "Bo " -0x8237: "Xian " -0x8238: "Ge " -0x8239: "Chuan " -0x823a: "Jia " -0x823b: "Lu " -0x823c: "Hong " -0x823d: "Pang " -0x823e: "Xi " -0x823f: "[?] " -0x8240: "Fu " -0x8241: "Zao " -0x8242: "Feng " -0x8243: "Li " -0x8244: "Shao " -0x8245: "Yu " -0x8246: "Lang " -0x8247: "Ting " -0x8248: "[?] " -0x8249: "Wei " -0x824a: "Bo " -0x824b: "Meng " -0x824c: "Nian " -0x824d: "Ju " -0x824e: "Huang " -0x824f: "Shou " -0x8250: "Zong " -0x8251: "Bian " -0x8252: "Mao " -0x8253: "Die " -0x8254: "[?] " -0x8255: "Bang " -0x8256: "Cha " -0x8257: "Yi " -0x8258: "Sao " -0x8259: "Cang " -0x825a: "Cao " -0x825b: "Lou " -0x825c: "Dai " -0x825d: "Sori " -0x825e: "Yao " -0x825f: "Tong " -0x8260: "Yofune " -0x8261: "Dang " -0x8262: "Tan " -0x8263: "Lu " -0x8264: "Yi " -0x8265: "Jie " -0x8266: "Jian " -0x8267: "Huo " -0x8268: "Meng " -0x8269: "Qi " -0x826a: "Lu " -0x826b: "Lu " -0x826c: "Chan " -0x826d: "Shuang " -0x826e: "Gen " -0x826f: "Liang " -0x8270: "Jian " -0x8271: "Jian " -0x8272: "Se " -0x8273: "Yan " -0x8274: "Fu " -0x8275: "Ping " -0x8276: "Yan " -0x8277: "Yan " -0x8278: "Cao " -0x8279: "Cao " -0x827a: "Yi " -0x827b: "Le " -0x827c: "Ting " -0x827d: "Qiu " -0x827e: "Ai " -0x827f: "Nai " -0x8280: "Tiao " -0x8281: "Jiao " -0x8282: "Jie " -0x8283: "Peng " -0x8284: "Wan " -0x8285: "Yi " -0x8286: "Chai " -0x8287: "Mian " -0x8288: "Mie " -0x8289: "Gan " -0x828a: "Qian " -0x828b: "Yu " -0x828c: "Yu " -0x828d: "Shuo " -0x828e: "Qiong " -0x828f: "Tu " -0x8290: "Xia " -0x8291: "Qi " -0x8292: "Mang " -0x8293: "Zi " -0x8294: "Hui " -0x8295: "Sui " -0x8296: "Zhi " -0x8297: "Xiang " -0x8298: "Bi " -0x8299: "Fu " -0x829a: "Tun " -0x829b: "Wei " -0x829c: "Wu " -0x829d: "Zhi " -0x829e: "Qi " -0x829f: "Shan " -0x82a0: "Wen " -0x82a1: "Qian " -0x82a2: "Ren " -0x82a3: "Fou " -0x82a4: "Kou " -0x82a5: "Jie " -0x82a6: "Lu " -0x82a7: "Xu " -0x82a8: "Ji " -0x82a9: "Qin " -0x82aa: "Qi " -0x82ab: "Yuan " -0x82ac: "Fen " -0x82ad: "Ba " -0x82ae: "Rui " -0x82af: "Xin " -0x82b0: "Ji " -0x82b1: "Hua " -0x82b2: "Hua " -0x82b3: "Fang " -0x82b4: "Wu " -0x82b5: "Jue " -0x82b6: "Gou " -0x82b7: "Zhi " -0x82b8: "Yun " -0x82b9: "Qin " -0x82ba: "Ao " -0x82bb: "Chu " -0x82bc: "Mao " -0x82bd: "Ya " -0x82be: "Fei " -0x82bf: "Reng " -0x82c0: "Hang " -0x82c1: "Cong " -0x82c2: "Yin " -0x82c3: "You " -0x82c4: "Bian " -0x82c5: "Yi " -0x82c6: "Susa " -0x82c7: "Wei " -0x82c8: "Li " -0x82c9: "Pi " -0x82ca: "E " -0x82cb: "Xian " -0x82cc: "Chang " -0x82cd: "Cang " -0x82ce: "Meng " -0x82cf: "Su " -0x82d0: "Yi " -0x82d1: "Yuan " -0x82d2: "Ran " -0x82d3: "Ling " -0x82d4: "Tai " -0x82d5: "Tiao " -0x82d6: "Di " -0x82d7: "Miao " -0x82d8: "Qiong " -0x82d9: "Li " -0x82da: "Yong " -0x82db: "Ke " -0x82dc: "Mu " -0x82dd: "Pei " -0x82de: "Bao " -0x82df: "Gou " -0x82e0: "Min " -0x82e1: "Yi " -0x82e2: "Yi " -0x82e3: "Ju " -0x82e4: "Pi " -0x82e5: "Ruo " -0x82e6: "Ku " -0x82e7: "Zhu " -0x82e8: "Ni " -0x82e9: "Bo " -0x82ea: "Bing " -0x82eb: "Shan " -0x82ec: "Qiu " -0x82ed: "Yao " -0x82ee: "Xian " -0x82ef: "Ben " -0x82f0: "Hong " -0x82f1: "Ying " -0x82f2: "Zha " -0x82f3: "Dong " -0x82f4: "Ju " -0x82f5: "Die " -0x82f6: "Nie " -0x82f7: "Gan " -0x82f8: "Hu " -0x82f9: "Ping " -0x82fa: "Mei " -0x82fb: "Fu " -0x82fc: "Sheng " -0x82fd: "Gu " -0x82fe: "Bi " -0x82ff: "Wei " -/* x083 */ -0x8300: "Fu " -0x8301: "Zhuo " -0x8302: "Mao " -0x8303: "Fan " -0x8304: "Qie " -0x8305: "Mao " -0x8306: "Mao " -0x8307: "Ba " -0x8308: "Zi " -0x8309: "Mo " -0x830a: "Zi " -0x830b: "Di " -0x830c: "Chi " -0x830d: "Ji " -0x830e: "Jing " -0x830f: "Long " -0x8310: "[?] " -0x8311: "Niao " -0x8312: "[?] " -0x8313: "Xue " -0x8314: "Ying " -0x8315: "Qiong " -0x8316: "Ge " -0x8317: "Ming " -0x8318: "Li " -0x8319: "Rong " -0x831a: "Yin " -0x831b: "Gen " -0x831c: "Qian " -0x831d: "Chai " -0x831e: "Chen " -0x831f: "Yu " -0x8320: "Xiu " -0x8321: "Zi " -0x8322: "Lie " -0x8323: "Wu " -0x8324: "Ji " -0x8325: "Kui " -0x8326: "Ce " -0x8327: "Chong " -0x8328: "Ci " -0x8329: "Gou " -0x832a: "Guang " -0x832b: "Mang " -0x832c: "Chi " -0x832d: "Jiao " -0x832e: "Jiao " -0x832f: "Fu " -0x8330: "Yu " -0x8331: "Zhu " -0x8332: "Zi " -0x8333: "Jiang " -0x8334: "Hui " -0x8335: "Yin " -0x8336: "Cha " -0x8337: "Fa " -0x8338: "Rong " -0x8339: "Ru " -0x833a: "Chong " -0x833b: "Mang " -0x833c: "Tong " -0x833d: "Zhong " -0x833e: "[?] " -0x833f: "Zhu " -0x8340: "Xun " -0x8341: "Huan " -0x8342: "Kua " -0x8343: "Quan " -0x8344: "Gai " -0x8345: "Da " -0x8346: "Jing " -0x8347: "Xing " -0x8348: "Quan " -0x8349: "Cao " -0x834a: "Jing " -0x834b: "Er " -0x834c: "An " -0x834d: "Shou " -0x834e: "Chi " -0x834f: "Ren " -0x8350: "Jian " -0x8351: "Ti " -0x8352: "Huang " -0x8353: "Ping " -0x8354: "Li " -0x8355: "Jin " -0x8356: "Lao " -0x8357: "Shu " -0x8358: "Zhuang " -0x8359: "Da " -0x835a: "Jia " -0x835b: "Rao " -0x835c: "Bi " -0x835d: "Ze " -0x835e: "Qiao " -0x835f: "Hui " -0x8360: "Qi " -0x8361: "Dang " -0x8362: "[?] " -0x8363: "Rong " -0x8364: "Hun " -0x8365: "Ying " -0x8366: "Luo " -0x8367: "Ying " -0x8368: "Xun " -0x8369: "Jin " -0x836a: "Sun " -0x836b: "Yin " -0x836c: "Mai " -0x836d: "Hong " -0x836e: "Zhou " -0x836f: "Yao " -0x8370: "Du " -0x8371: "Wei " -0x8372: "Chu " -0x8373: "Dou " -0x8374: "Fu " -0x8375: "Ren " -0x8376: "Yin " -0x8377: "He " -0x8378: "Bi " -0x8379: "Bu " -0x837a: "Yun " -0x837b: "Di " -0x837c: "Tu " -0x837d: "Sui " -0x837e: "Sui " -0x837f: "Cheng " -0x8380: "Chen " -0x8381: "Wu " -0x8382: "Bie " -0x8383: "Xi " -0x8384: "Geng " -0x8385: "Li " -0x8386: "Fu " -0x8387: "Zhu " -0x8388: "Mo " -0x8389: "Li " -0x838a: "Zhuang " -0x838b: "Ji " -0x838c: "Duo " -0x838d: "Qiu " -0x838e: "Sha " -0x838f: "Suo " -0x8390: "Chen " -0x8391: "Feng " -0x8392: "Ju " -0x8393: "Mei " -0x8394: "Meng " -0x8395: "Xing " -0x8396: "Jing " -0x8397: "Che " -0x8398: "Xin " -0x8399: "Jun " -0x839a: "Yan " -0x839b: "Ting " -0x839c: "Diao " -0x839d: "Cuo " -0x839e: "Wan " -0x839f: "Han " -0x83a0: "You " -0x83a1: "Cuo " -0x83a2: "Jia " -0x83a3: "Wang " -0x83a4: "You " -0x83a5: "Niu " -0x83a6: "Shao " -0x83a7: "Xian " -0x83a8: "Lang " -0x83a9: "Fu " -0x83aa: "E " -0x83ab: "Mo " -0x83ac: "Wen " -0x83ad: "Jie " -0x83ae: "Nan " -0x83af: "Mu " -0x83b0: "Kan " -0x83b1: "Lai " -0x83b2: "Lian " -0x83b3: "Shi " -0x83b4: "Wo " -0x83b5: "Usagi " -0x83b6: "Lian " -0x83b7: "Huo " -0x83b8: "You " -0x83b9: "Ying " -0x83ba: "Ying " -0x83bb: "Nuc " -0x83bc: "Chun " -0x83bd: "Mang " -0x83be: "Mang " -0x83bf: "Ci " -0x83c0: "Wan " -0x83c1: "Jing " -0x83c2: "Di " -0x83c3: "Qu " -0x83c4: "Dong " -0x83c5: "Jian " -0x83c6: "Zou " -0x83c7: "Gu " -0x83c8: "La " -0x83c9: "Lu " -0x83ca: "Ju " -0x83cb: "Wei " -0x83cc: "Jun " -0x83cd: "Nie " -0x83ce: "Kun " -0x83cf: "He " -0x83d0: "Pu " -0x83d1: "Zi " -0x83d2: "Gao " -0x83d3: "Guo " -0x83d4: "Fu " -0x83d5: "Lun " -0x83d6: "Chang " -0x83d7: "Chou " -0x83d8: "Song " -0x83d9: "Chui " -0x83da: "Zhan " -0x83db: "Men " -0x83dc: "Cai " -0x83dd: "Ba " -0x83de: "Li " -0x83df: "Tu " -0x83e0: "Bo " -0x83e1: "Han " -0x83e2: "Bao " -0x83e3: "Qin " -0x83e4: "Juan " -0x83e5: "Xi " -0x83e6: "Qin " -0x83e7: "Di " -0x83e8: "Jie " -0x83e9: "Pu " -0x83ea: "Dang " -0x83eb: "Jin " -0x83ec: "Zhao " -0x83ed: "Tai " -0x83ee: "Geng " -0x83ef: "Hua " -0x83f0: "Gu " -0x83f1: "Ling " -0x83f2: "Fei " -0x83f3: "Jin " -0x83f4: "An " -0x83f5: "Wang " -0x83f6: "Beng " -0x83f7: "Zhou " -0x83f8: "Yan " -0x83f9: "Ju " -0x83fa: "Jian " -0x83fb: "Lin " -0x83fc: "Tan " -0x83fd: "Shu " -0x83fe: "Tian " -0x83ff: "Dao " -/* x084 */ -0x8400: "Hu " -0x8401: "Qi " -0x8402: "He " -0x8403: "Cui " -0x8404: "Tao " -0x8405: "Chun " -0x8406: "Bei " -0x8407: "Chang " -0x8408: "Huan " -0x8409: "Fei " -0x840a: "Lai " -0x840b: "Qi " -0x840c: "Meng " -0x840d: "Ping " -0x840e: "Wei " -0x840f: "Dan " -0x8410: "Sha " -0x8411: "Huan " -0x8412: "Yan " -0x8413: "Yi " -0x8414: "Tiao " -0x8415: "Qi " -0x8416: "Wan " -0x8417: "Ce " -0x8418: "Nai " -0x8419: "Kutabireru " -0x841a: "Tuo " -0x841b: "Jiu " -0x841c: "Tie " -0x841d: "Luo " -0x841e: "[?] " -0x841f: "[?] " -0x8420: "Meng " -0x8421: "[?] " -0x8422: "Yaji " -0x8423: "[?] " -0x8424: "Ying " -0x8425: "Ying " -0x8426: "Ying " -0x8427: "Xiao " -0x8428: "Sa " -0x8429: "Qiu " -0x842a: "Ke " -0x842b: "Xiang " -0x842c: "Wan " -0x842d: "Yu " -0x842e: "Yu " -0x842f: "Fu " -0x8430: "Lian " -0x8431: "Xuan " -0x8432: "Yuan " -0x8433: "Nan " -0x8434: "Ze " -0x8435: "Wo " -0x8436: "Chun " -0x8437: "Xiao " -0x8438: "Yu " -0x8439: "Pian " -0x843a: "Mao " -0x843b: "An " -0x843c: "E " -0x843d: "Luo " -0x843e: "Ying " -0x843f: "Huo " -0x8440: "Gua " -0x8441: "Jiang " -0x8442: "Mian " -0x8443: "Zuo " -0x8444: "Zuo " -0x8445: "Ju " -0x8446: "Bao " -0x8447: "Rou " -0x8448: "Xi " -0x8449: "Xie " -0x844a: "An " -0x844b: "Qu " -0x844c: "Jian " -0x844d: "Fu " -0x844e: "Lu " -0x844f: "Jing " -0x8450: "Pen " -0x8451: "Feng " -0x8452: "Hong " -0x8453: "Hong " -0x8454: "Hou " -0x8455: "Yan " -0x8456: "Tu " -0x8457: "Zhu " -0x8458: "Zi " -0x8459: "Xiang " -0x845a: "Shen " -0x845b: "Ge " -0x845c: "Jie " -0x845d: "Jing " -0x845e: "Mi " -0x845f: "Huang " -0x8460: "Shen " -0x8461: "Pu " -0x8462: "Gai " -0x8463: "Dong " -0x8464: "Zhou " -0x8465: "Qian " -0x8466: "Wei " -0x8467: "Bo " -0x8468: "Wei " -0x8469: "Pa " -0x846a: "Ji " -0x846b: "Hu " -0x846c: "Zang " -0x846d: "Jia " -0x846e: "Duan " -0x846f: "Yao " -0x8470: "Jun " -0x8471: "Cong " -0x8472: "Quan " -0x8473: "Wei " -0x8474: "Xian " -0x8475: "Kui " -0x8476: "Ting " -0x8477: "Hun " -0x8478: "Xi " -0x8479: "Shi " -0x847a: "Qi " -0x847b: "Lan " -0x847c: "Zong " -0x847d: "Yao " -0x847e: "Yuan " -0x847f: "Mei " -0x8480: "Yun " -0x8481: "Shu " -0x8482: "Di " -0x8483: "Zhuan " -0x8484: "Guan " -0x8485: "Sukumo " -0x8486: "Xue " -0x8487: "Chan " -0x8488: "Kai " -0x8489: "Kui " -0x848a: "[?] " -0x848b: "Jiang " -0x848c: "Lou " -0x848d: "Wei " -0x848e: "Pai " -0x848f: "[?] " -0x8490: "Sou " -0x8491: "Yin " -0x8492: "Shi " -0x8493: "Chun " -0x8494: "Shi " -0x8495: "Yun " -0x8496: "Zhen " -0x8497: "Lang " -0x8498: "Nu " -0x8499: "Meng " -0x849a: "He " -0x849b: "Que " -0x849c: "Suan " -0x849d: "Yuan " -0x849e: "Li " -0x849f: "Ju " -0x84a0: "Xi " -0x84a1: "Pang " -0x84a2: "Chu " -0x84a3: "Xu " -0x84a4: "Tu " -0x84a5: "Liu " -0x84a6: "Wo " -0x84a7: "Zhen " -0x84a8: "Qian " -0x84a9: "Zu " -0x84aa: "Po " -0x84ab: "Cuo " -0x84ac: "Yuan " -0x84ad: "Chu " -0x84ae: "Yu " -0x84af: "Kuai " -0x84b0: "Pan " -0x84b1: "Pu " -0x84b2: "Pu " -0x84b3: "Na " -0x84b4: "Shuo " -0x84b5: "Xi " -0x84b6: "Fen " -0x84b7: "Yun " -0x84b8: "Zheng " -0x84b9: "Jian " -0x84ba: "Ji " -0x84bb: "Ruo " -0x84bc: "Cang " -0x84bd: "En " -0x84be: "Mi " -0x84bf: "Hao " -0x84c0: "Sun " -0x84c1: "Zhen " -0x84c2: "Ming " -0x84c3: "Sou " -0x84c4: "Xu " -0x84c5: "Liu " -0x84c6: "Xi " -0x84c7: "Gu " -0x84c8: "Lang " -0x84c9: "Rong " -0x84ca: "Weng " -0x84cb: "Gai " -0x84cc: "Cuo " -0x84cd: "Shi " -0x84ce: "Tang " -0x84cf: "Luo " -0x84d0: "Ru " -0x84d1: "Suo " -0x84d2: "Xian " -0x84d3: "Bei " -0x84d4: "Yao " -0x84d5: "Gui " -0x84d6: "Bi " -0x84d7: "Zong " -0x84d8: "Gun " -0x84d9: "Za " -0x84da: "Xiu " -0x84db: "Ce " -0x84dc: "Hai " -0x84dd: "Lan " -0x84de: "[?] " -0x84df: "Ji " -0x84e0: "Li " -0x84e1: "Can " -0x84e2: "Lang " -0x84e3: "Yu " -0x84e4: "[?] " -0x84e5: "Ying " -0x84e6: "Mo " -0x84e7: "Diao " -0x84e8: "Tiao " -0x84e9: "Mao " -0x84ea: "Tong " -0x84eb: "Zhu " -0x84ec: "Peng " -0x84ed: "An " -0x84ee: "Lian " -0x84ef: "Cong " -0x84f0: "Xi " -0x84f1: "Ping " -0x84f2: "Qiu " -0x84f3: "Jin " -0x84f4: "Chun " -0x84f5: "Jie " -0x84f6: "Wei " -0x84f7: "Tui " -0x84f8: "Cao " -0x84f9: "Yu " -0x84fa: "Yi " -0x84fb: "Ji " -0x84fc: "Liao " -0x84fd: "Bi " -0x84fe: "Lu " -0x84ff: "Su " -/* x085 */ -0x8500: "Bu " -0x8501: "Zhang " -0x8502: "Luo " -0x8503: "Jiang " -0x8504: "Man " -0x8505: "Yan " -0x8506: "Ling " -0x8507: "Ji " -0x8508: "Piao " -0x8509: "Gun " -0x850a: "Han " -0x850b: "Di " -0x850c: "Su " -0x850d: "Lu " -0x850e: "She " -0x850f: "Shang " -0x8510: "Di " -0x8511: "Mie " -0x8512: "Xun " -0x8513: "Man " -0x8514: "Bo " -0x8515: "Di " -0x8516: "Cuo " -0x8517: "Zhe " -0x8518: "Sen " -0x8519: "Xuan " -0x851a: "Wei " -0x851b: "Hu " -0x851c: "Ao " -0x851d: "Mi " -0x851e: "Lou " -0x851f: "Cu " -0x8520: "Zhong " -0x8521: "Cai " -0x8522: "Po " -0x8523: "Jiang " -0x8524: "Mi " -0x8525: "Cong " -0x8526: "Niao " -0x8527: "Hui " -0x8528: "Jun " -0x8529: "Yin " -0x852a: "Jian " -0x852b: "Yan " -0x852c: "Shu " -0x852d: "Yin " -0x852e: "Kui " -0x852f: "Chen " -0x8530: "Hu " -0x8531: "Sha " -0x8532: "Kou " -0x8533: "Qian " -0x8534: "Ma " -0x8535: "Zang " -0x8536: "Sonoko " -0x8537: "Qiang " -0x8538: "Dou " -0x8539: "Lian " -0x853a: "Lin " -0x853b: "Kou " -0x853c: "Ai " -0x853d: "Bi " -0x853e: "Li " -0x853f: "Wei " -0x8540: "Ji " -0x8541: "Xun " -0x8542: "Sheng " -0x8543: "Fan " -0x8544: "Meng " -0x8545: "Ou " -0x8546: "Chan " -0x8547: "Dian " -0x8548: "Xun " -0x8549: "Jiao " -0x854a: "Rui " -0x854b: "Rui " -0x854c: "Lei " -0x854d: "Yu " -0x854e: "Qiao " -0x854f: "Chu " -0x8550: "Hua " -0x8551: "Jian " -0x8552: "Mai " -0x8553: "Yun " -0x8554: "Bao " -0x8555: "You " -0x8556: "Qu " -0x8557: "Lu " -0x8558: "Rao " -0x8559: "Hui " -0x855a: "E " -0x855b: "Teng " -0x855c: "Fei " -0x855d: "Jue " -0x855e: "Zui " -0x855f: "Fa " -0x8560: "Ru " -0x8561: "Fen " -0x8562: "Kui " -0x8563: "Shun " -0x8564: "Rui " -0x8565: "Ya " -0x8566: "Xu " -0x8567: "Fu " -0x8568: "Jue " -0x8569: "Dang " -0x856a: "Wu " -0x856b: "Tong " -0x856c: "Si " -0x856d: "Xiao " -0x856e: "Xi " -0x856f: "Long " -0x8570: "Yun " -0x8571: "[?] " -0x8572: "Qi " -0x8573: "Jian " -0x8574: "Yun " -0x8575: "Sun " -0x8576: "Ling " -0x8577: "Yu " -0x8578: "Xia " -0x8579: "Yong " -0x857a: "Ji " -0x857b: "Hong " -0x857c: "Si " -0x857d: "Nong " -0x857e: "Lei " -0x857f: "Xuan " -0x8580: "Yun " -0x8581: "Yu " -0x8582: "Xi " -0x8583: "Hao " -0x8584: "Bo " -0x8585: "Hao " -0x8586: "Ai " -0x8587: "Wei " -0x8588: "Hui " -0x8589: "Wei " -0x858a: "Ji " -0x858b: "Ci " -0x858c: "Xiang " -0x858d: "Luan " -0x858e: "Mie " -0x858f: "Yi " -0x8590: "Leng " -0x8591: "Jiang " -0x8592: "Can " -0x8593: "Shen " -0x8594: "Qiang " -0x8595: "Lian " -0x8596: "Ke " -0x8597: "Yuan " -0x8598: "Da " -0x8599: "Ti " -0x859a: "Tang " -0x859b: "Xie " -0x859c: "Bi " -0x859d: "Zhan " -0x859e: "Sun " -0x859f: "Lian " -0x85a0: "Fan " -0x85a1: "Ding " -0x85a2: "Jie " -0x85a3: "Gu " -0x85a4: "Xie " -0x85a5: "Shu " -0x85a6: "Jian " -0x85a7: "Kao " -0x85a8: "Hong " -0x85a9: "Sa " -0x85aa: "Xin " -0x85ab: "Xun " -0x85ac: "Yao " -0x85ad: "Hie " -0x85ae: "Sou " -0x85af: "Shu " -0x85b0: "Xun " -0x85b1: "Dui " -0x85b2: "Pin " -0x85b3: "Wei " -0x85b4: "Neng " -0x85b5: "Chou " -0x85b6: "Mai " -0x85b7: "Ru " -0x85b8: "Piao " -0x85b9: "Tai " -0x85ba: "Qi " -0x85bb: "Zao " -0x85bc: "Chen " -0x85bd: "Zhen " -0x85be: "Er " -0x85bf: "Ni " -0x85c0: "Ying " -0x85c1: "Gao " -0x85c2: "Cong " -0x85c3: "Xiao " -0x85c4: "Qi " -0x85c5: "Fa " -0x85c6: "Jian " -0x85c7: "Xu " -0x85c8: "Kui " -0x85c9: "Jie " -0x85ca: "Bian " -0x85cb: "Diao " -0x85cc: "Mi " -0x85cd: "Lan " -0x85ce: "Jin " -0x85cf: "Cang " -0x85d0: "Miao " -0x85d1: "Qiong " -0x85d2: "Qie " -0x85d3: "Xian " -0x85d4: "[?] " -0x85d5: "Ou " -0x85d6: "Xian " -0x85d7: "Su " -0x85d8: "Lu " -0x85d9: "Yi " -0x85da: "Xu " -0x85db: "Xie " -0x85dc: "Li " -0x85dd: "Yi " -0x85de: "La " -0x85df: "Lei " -0x85e0: "Xiao " -0x85e1: "Di " -0x85e2: "Zhi " -0x85e3: "Bei " -0x85e4: "Teng " -0x85e5: "Yao " -0x85e6: "Mo " -0x85e7: "Huan " -0x85e8: "Piao " -0x85e9: "Fan " -0x85ea: "Sou " -0x85eb: "Tan " -0x85ec: "Tui " -0x85ed: "Qiong " -0x85ee: "Qiao " -0x85ef: "Wei " -0x85f0: "Liu " -0x85f1: "Hui " -0x85f2: "[?] " -0x85f3: "Gao " -0x85f4: "Yun " -0x85f5: "[?] " -0x85f6: "Li " -0x85f7: "Shu " -0x85f8: "Chu " -0x85f9: "Ai " -0x85fa: "Lin " -0x85fb: "Zao " -0x85fc: "Xuan " -0x85fd: "Chen " -0x85fe: "Lai " -0x85ff: "Huo " -/* x086 */ -0x8600: "Tuo " -0x8601: "Wu " -0x8602: "Rui " -0x8603: "Rui " -0x8604: "Qi " -0x8605: "Heng " -0x8606: "Lu " -0x8607: "Su " -0x8608: "Tui " -0x8609: "Mang " -0x860a: "Yun " -0x860b: "Pin " -0x860c: "Yu " -0x860d: "Xun " -0x860e: "Ji " -0x860f: "Jiong " -0x8610: "Xian " -0x8611: "Mo " -0x8612: "Hagi " -0x8613: "Su " -0x8614: "Jiong " -0x8615: "[?] " -0x8616: "Nie " -0x8617: "Bo " -0x8618: "Rang " -0x8619: "Yi " -0x861a: "Xian " -0x861b: "Yu " -0x861c: "Ju " -0x861d: "Lian " -0x861e: "Lian " -0x861f: "Yin " -0x8620: "Qiang " -0x8621: "Ying " -0x8622: "Long " -0x8623: "Tong " -0x8624: "Wei " -0x8625: "Yue " -0x8626: "Ling " -0x8627: "Qu " -0x8628: "Yao " -0x8629: "Fan " -0x862a: "Mi " -0x862b: "Lan " -0x862c: "Kui " -0x862d: "Lan " -0x862e: "Ji " -0x862f: "Dang " -0x8630: "Katsura " -0x8631: "Lei " -0x8632: "Lei " -0x8633: "Hua " -0x8634: "Feng " -0x8635: "Zhi " -0x8636: "Wei " -0x8637: "Kui " -0x8638: "Zhan " -0x8639: "Huai " -0x863a: "Li " -0x863b: "Ji " -0x863c: "Mi " -0x863d: "Lei " -0x863e: "Huai " -0x863f: "Luo " -0x8640: "Ji " -0x8641: "Kui " -0x8642: "Lu " -0x8643: "Jian " -0x8644: "San " -0x8645: "[?] " -0x8646: "Lei " -0x8647: "Quan " -0x8648: "Xiao " -0x8649: "Yi " -0x864a: "Luan " -0x864b: "Men " -0x864c: "Bie " -0x864d: "Hu " -0x864e: "Hu " -0x864f: "Lu " -0x8650: "Nue " -0x8651: "Lu " -0x8652: "Si " -0x8653: "Xiao " -0x8654: "Qian " -0x8655: "Chu " -0x8656: "Hu " -0x8657: "Xu " -0x8658: "Cuo " -0x8659: "Fu " -0x865a: "Xu " -0x865b: "Xu " -0x865c: "Lu " -0x865d: "Hu " -0x865e: "Yu " -0x865f: "Hao " -0x8660: "Jiao " -0x8661: "Ju " -0x8662: "Guo " -0x8663: "Bao " -0x8664: "Yan " -0x8665: "Zhan " -0x8666: "Zhan " -0x8667: "Kui " -0x8668: "Ban " -0x8669: "Xi " -0x866a: "Shu " -0x866b: "Chong " -0x866c: "Qiu " -0x866d: "Diao " -0x866e: "Ji " -0x866f: "Qiu " -0x8670: "Cheng " -0x8671: "Shi " -0x8672: "[?] " -0x8673: "Di " -0x8674: "Zhe " -0x8675: "She " -0x8676: "Yu " -0x8677: "Gan " -0x8678: "Zi " -0x8679: "Hong " -0x867a: "Hui " -0x867b: "Meng " -0x867c: "Ge " -0x867d: "Sui " -0x867e: "Xia " -0x867f: "Chai " -0x8680: "Shi " -0x8681: "Yi " -0x8682: "Ma " -0x8683: "Xiang " -0x8684: "Fang " -0x8685: "E " -0x8686: "Pa " -0x8687: "Chi " -0x8688: "Qian " -0x8689: "Wen " -0x868a: "Wen " -0x868b: "Rui " -0x868c: "Bang " -0x868d: "Bi " -0x868e: "Yue " -0x868f: "Yue " -0x8690: "Jun " -0x8691: "Qi " -0x8692: "Ran " -0x8693: "Yin " -0x8694: "Qi " -0x8695: "Tian " -0x8696: "Yuan " -0x8697: "Jue " -0x8698: "Hui " -0x8699: "Qin " -0x869a: "Qi " -0x869b: "Zhong " -0x869c: "Ya " -0x869d: "Ci " -0x869e: "Mu " -0x869f: "Wang " -0x86a0: "Fen " -0x86a1: "Fen " -0x86a2: "Hang " -0x86a3: "Gong " -0x86a4: "Zao " -0x86a5: "Fu " -0x86a6: "Ran " -0x86a7: "Jie " -0x86a8: "Fu " -0x86a9: "Chi " -0x86aa: "Dou " -0x86ab: "Piao " -0x86ac: "Xian " -0x86ad: "Ni " -0x86ae: "Te " -0x86af: "Qiu " -0x86b0: "You " -0x86b1: "Zha " -0x86b2: "Ping " -0x86b3: "Chi " -0x86b4: "You " -0x86b5: "He " -0x86b6: "Han " -0x86b7: "Ju " -0x86b8: "Li " -0x86b9: "Fu " -0x86ba: "Ran " -0x86bb: "Zha " -0x86bc: "Gou " -0x86bd: "Pi " -0x86be: "Bo " -0x86bf: "Xian " -0x86c0: "Zhu " -0x86c1: "Diao " -0x86c2: "Bie " -0x86c3: "Bing " -0x86c4: "Gu " -0x86c5: "Ran " -0x86c6: "Qu " -0x86c7: "She " -0x86c8: "Tie " -0x86c9: "Ling " -0x86ca: "Gu " -0x86cb: "Dan " -0x86cc: "Gu " -0x86cd: "Ying " -0x86ce: "Li " -0x86cf: "Cheng " -0x86d0: "Qu " -0x86d1: "Mou " -0x86d2: "Ge " -0x86d3: "Ci " -0x86d4: "Hui " -0x86d5: "Hui " -0x86d6: "Mang " -0x86d7: "Fu " -0x86d8: "Yang " -0x86d9: "Wa " -0x86da: "Lie " -0x86db: "Zhu " -0x86dc: "Yi " -0x86dd: "Xian " -0x86de: "Kuo " -0x86df: "Jiao " -0x86e0: "Li " -0x86e1: "Yi " -0x86e2: "Ping " -0x86e3: "Ji " -0x86e4: "Ha " -0x86e5: "She " -0x86e6: "Yi " -0x86e7: "Wang " -0x86e8: "Mo " -0x86e9: "Qiong " -0x86ea: "Qie " -0x86eb: "Gui " -0x86ec: "Gong " -0x86ed: "Zhi " -0x86ee: "Man " -0x86ef: "Ebi " -0x86f0: "Zhi " -0x86f1: "Jia " -0x86f2: "Rao " -0x86f3: "Si " -0x86f4: "Qi " -0x86f5: "Xing " -0x86f6: "Lie " -0x86f7: "Qiu " -0x86f8: "Shao " -0x86f9: "Yong " -0x86fa: "Jia " -0x86fb: "Shui " -0x86fc: "Che " -0x86fd: "Bai " -0x86fe: "E " -0x86ff: "Han " -/* x087 */ -0x8700: "Shu " -0x8701: "Xuan " -0x8702: "Feng " -0x8703: "Shen " -0x8704: "Zhen " -0x8705: "Fu " -0x8706: "Xian " -0x8707: "Zhe " -0x8708: "Wu " -0x8709: "Fu " -0x870a: "Li " -0x870b: "Lang " -0x870c: "Bi " -0x870d: "Chu " -0x870e: "Yuan " -0x870f: "You " -0x8710: "Jie " -0x8711: "Dan " -0x8712: "Yan " -0x8713: "Ting " -0x8714: "Dian " -0x8715: "Shui " -0x8716: "Hui " -0x8717: "Gua " -0x8718: "Zhi " -0x8719: "Song " -0x871a: "Fei " -0x871b: "Ju " -0x871c: "Mi " -0x871d: "Qi " -0x871e: "Qi " -0x871f: "Yu " -0x8720: "Jun " -0x8721: "Zha " -0x8722: "Meng " -0x8723: "Qiang " -0x8724: "Si " -0x8725: "Xi " -0x8726: "Lun " -0x8727: "Li " -0x8728: "Die " -0x8729: "Tiao " -0x872a: "Tao " -0x872b: "Kun " -0x872c: "Gan " -0x872d: "Han " -0x872e: "Yu " -0x872f: "Bang " -0x8730: "Fei " -0x8731: "Pi " -0x8732: "Wei " -0x8733: "Dun " -0x8734: "Yi " -0x8735: "Yuan " -0x8736: "Su " -0x8737: "Quan " -0x8738: "Qian " -0x8739: "Rui " -0x873a: "Ni " -0x873b: "Qing " -0x873c: "Wei " -0x873d: "Liang " -0x873e: "Guo " -0x873f: "Wan " -0x8740: "Dong " -0x8741: "E " -0x8742: "Ban " -0x8743: "Di " -0x8744: "Wang " -0x8745: "Can " -0x8746: "Yang " -0x8747: "Ying " -0x8748: "Guo " -0x8749: "Chan " -0x874a: "[?] " -0x874b: "La " -0x874c: "Ke " -0x874d: "Ji " -0x874e: "He " -0x874f: "Ting " -0x8750: "Mai " -0x8751: "Xu " -0x8752: "Mian " -0x8753: "Yu " -0x8754: "Jie " -0x8755: "Shi " -0x8756: "Xuan " -0x8757: "Huang " -0x8758: "Yan " -0x8759: "Bian " -0x875a: "Rou " -0x875b: "Wei " -0x875c: "Fu " -0x875d: "Yuan " -0x875e: "Mei " -0x875f: "Wei " -0x8760: "Fu " -0x8761: "Ruan " -0x8762: "Xie " -0x8763: "You " -0x8764: "Qiu " -0x8765: "Mao " -0x8766: "Xia " -0x8767: "Ying " -0x8768: "Shi " -0x8769: "Chong " -0x876a: "Tang " -0x876b: "Zhu " -0x876c: "Zong " -0x876d: "Ti " -0x876e: "Fu " -0x876f: "Yuan " -0x8770: "Hui " -0x8771: "Meng " -0x8772: "La " -0x8773: "Du " -0x8774: "Hu " -0x8775: "Qiu " -0x8776: "Die " -0x8777: "Li " -0x8778: "Gua " -0x8779: "Yun " -0x877a: "Ju " -0x877b: "Nan " -0x877c: "Lou " -0x877d: "Qun " -0x877e: "Rong " -0x877f: "Ying " -0x8780: "Jiang " -0x8781: "[?] " -0x8782: "Lang " -0x8783: "Pang " -0x8784: "Si " -0x8785: "Xi " -0x8786: "Ci " -0x8787: "Xi " -0x8788: "Yuan " -0x8789: "Weng " -0x878a: "Lian " -0x878b: "Sou " -0x878c: "Ban " -0x878d: "Rong " -0x878e: "Rong " -0x878f: "Ji " -0x8790: "Wu " -0x8791: "Qiu " -0x8792: "Han " -0x8793: "Qin " -0x8794: "Yi " -0x8795: "Bi " -0x8796: "Hua " -0x8797: "Tang " -0x8798: "Yi " -0x8799: "Du " -0x879a: "Nai " -0x879b: "He " -0x879c: "Hu " -0x879d: "Hui " -0x879e: "Ma " -0x879f: "Ming " -0x87a0: "Yi " -0x87a1: "Wen " -0x87a2: "Ying " -0x87a3: "Teng " -0x87a4: "Yu " -0x87a5: "Cang " -0x87a6: "So " -0x87a7: "Ebi " -0x87a8: "Man " -0x87a9: "[?] " -0x87aa: "Shang " -0x87ab: "Zhe " -0x87ac: "Cao " -0x87ad: "Chi " -0x87ae: "Di " -0x87af: "Ao " -0x87b0: "Lu " -0x87b1: "Wei " -0x87b2: "Zhi " -0x87b3: "Tang " -0x87b4: "Chen " -0x87b5: "Piao " -0x87b6: "Qu " -0x87b7: "Pi " -0x87b8: "Yu " -0x87b9: "Jian " -0x87ba: "Luo " -0x87bb: "Lou " -0x87bc: "Qin " -0x87bd: "Zhong " -0x87be: "Yin " -0x87bf: "Jiang " -0x87c0: "Shuai " -0x87c1: "Wen " -0x87c2: "Jiao " -0x87c3: "Wan " -0x87c4: "Zhi " -0x87c5: "Zhe " -0x87c6: "Ma " -0x87c7: "Ma " -0x87c8: "Guo " -0x87c9: "Liu " -0x87ca: "Mao " -0x87cb: "Xi " -0x87cc: "Cong " -0x87cd: "Li " -0x87ce: "Man " -0x87cf: "Xiao " -0x87d0: "Kamakiri " -0x87d1: "Zhang " -0x87d2: "Mang " -0x87d3: "Xiang " -0x87d4: "Mo " -0x87d5: "Zui " -0x87d6: "Si " -0x87d7: "Qiu " -0x87d8: "Te " -0x87d9: "Zhi " -0x87da: "Peng " -0x87db: "Peng " -0x87dc: "Jiao " -0x87dd: "Qu " -0x87de: "Bie " -0x87df: "Liao " -0x87e0: "Pan " -0x87e1: "Gui " -0x87e2: "Xi " -0x87e3: "Ji " -0x87e4: "Zhuan " -0x87e5: "Huang " -0x87e6: "Fei " -0x87e7: "Lao " -0x87e8: "Jue " -0x87e9: "Jue " -0x87ea: "Hui " -0x87eb: "Yin " -0x87ec: "Chan " -0x87ed: "Jiao " -0x87ee: "Shan " -0x87ef: "Rao " -0x87f0: "Xiao " -0x87f1: "Mou " -0x87f2: "Chong " -0x87f3: "Xun " -0x87f4: "Si " -0x87f5: "[?] " -0x87f6: "Cheng " -0x87f7: "Dang " -0x87f8: "Li " -0x87f9: "Xie " -0x87fa: "Shan " -0x87fb: "Yi " -0x87fc: "Jing " -0x87fd: "Da " -0x87fe: "Chan " -0x87ff: "Qi " -/* x088 */ -0x8800: "Ci " -0x8801: "Xiang " -0x8802: "She " -0x8803: "Luo " -0x8804: "Qin " -0x8805: "Ying " -0x8806: "Chai " -0x8807: "Li " -0x8808: "Ze " -0x8809: "Xuan " -0x880a: "Lian " -0x880b: "Zhu " -0x880c: "Ze " -0x880d: "Xie " -0x880e: "Mang " -0x880f: "Xie " -0x8810: "Qi " -0x8811: "Rong " -0x8812: "Jian " -0x8813: "Meng " -0x8814: "Hao " -0x8815: "Ruan " -0x8816: "Huo " -0x8817: "Zhuo " -0x8818: "Jie " -0x8819: "Bin " -0x881a: "He " -0x881b: "Mie " -0x881c: "Fan " -0x881d: "Lei " -0x881e: "Jie " -0x881f: "La " -0x8820: "Mi " -0x8821: "Li " -0x8822: "Chun " -0x8823: "Li " -0x8824: "Qiu " -0x8825: "Nie " -0x8826: "Lu " -0x8827: "Du " -0x8828: "Xiao " -0x8829: "Zhu " -0x882a: "Long " -0x882b: "Li " -0x882c: "Long " -0x882d: "Feng " -0x882e: "Ye " -0x882f: "Beng " -0x8830: "Shang " -0x8831: "Gu " -0x8832: "Juan " -0x8833: "Ying " -0x8834: "[?] " -0x8835: "Xi " -0x8836: "Can " -0x8837: "Qu " -0x8838: "Quan " -0x8839: "Du " -0x883a: "Can " -0x883b: "Man " -0x883c: "Jue " -0x883d: "Jie " -0x883e: "Zhu " -0x883f: "Zha " -0x8840: "Xie " -0x8841: "Huang " -0x8842: "Niu " -0x8843: "Pei " -0x8844: "Nu " -0x8845: "Xin " -0x8846: "Zhong " -0x8847: "Mo " -0x8848: "Er " -0x8849: "Ke " -0x884a: "Mie " -0x884b: "Xi " -0x884c: "Xing " -0x884d: "Yan " -0x884e: "Kan " -0x884f: "Yuan " -0x8850: "[?] " -0x8851: "Ling " -0x8852: "Xuan " -0x8853: "Shu " -0x8854: "Xian " -0x8855: "Tong " -0x8856: "Long " -0x8857: "Jie " -0x8858: "Xian " -0x8859: "Ya " -0x885a: "Hu " -0x885b: "Wei " -0x885c: "Dao " -0x885d: "Chong " -0x885e: "Wei " -0x885f: "Dao " -0x8860: "Zhun " -0x8861: "Heng " -0x8862: "Qu " -0x8863: "Yi " -0x8864: "Yi " -0x8865: "Bu " -0x8866: "Gan " -0x8867: "Yu " -0x8868: "Biao " -0x8869: "Cha " -0x886a: "Yi " -0x886b: "Shan " -0x886c: "Chen " -0x886d: "Fu " -0x886e: "Gun " -0x886f: "Fen " -0x8870: "Shuai " -0x8871: "Jie " -0x8872: "Na " -0x8873: "Zhong " -0x8874: "Dan " -0x8875: "Ri " -0x8876: "Zhong " -0x8877: "Zhong " -0x8878: "Xie " -0x8879: "Qi " -0x887a: "Xie " -0x887b: "Ran " -0x887c: "Zhi " -0x887d: "Ren " -0x887e: "Qin " -0x887f: "Jin " -0x8880: "Jun " -0x8881: "Yuan " -0x8882: "Mei " -0x8883: "Chai " -0x8884: "Ao " -0x8885: "Niao " -0x8886: "Hui " -0x8887: "Ran " -0x8888: "Jia " -0x8889: "Tuo " -0x888a: "Ling " -0x888b: "Dai " -0x888c: "Bao " -0x888d: "Pao " -0x888e: "Yao " -0x888f: "Zuo " -0x8890: "Bi " -0x8891: "Shao " -0x8892: "Tan " -0x8893: "Ju " -0x8894: "He " -0x8895: "Shu " -0x8896: "Xiu " -0x8897: "Zhen " -0x8898: "Yi " -0x8899: "Pa " -0x889a: "Bo " -0x889b: "Di " -0x889c: "Wa " -0x889d: "Fu " -0x889e: "Gun " -0x889f: "Zhi " -0x88a0: "Zhi " -0x88a1: "Ran " -0x88a2: "Pan " -0x88a3: "Yi " -0x88a4: "Mao " -0x88a5: "Tuo " -0x88a6: "Na " -0x88a7: "Kou " -0x88a8: "Xian " -0x88a9: "Chan " -0x88aa: "Qu " -0x88ab: "Bei " -0x88ac: "Gun " -0x88ad: "Xi " -0x88ae: "Ne " -0x88af: "Bo " -0x88b0: "Horo " -0x88b1: "Fu " -0x88b2: "Yi " -0x88b3: "Chi " -0x88b4: "Ku " -0x88b5: "Ren " -0x88b6: "Jiang " -0x88b7: "Jia " -0x88b8: "Cun " -0x88b9: "Mo " -0x88ba: "Jie " -0x88bb: "Er " -0x88bc: "Luo " -0x88bd: "Ru " -0x88be: "Zhu " -0x88bf: "Gui " -0x88c0: "Yin " -0x88c1: "Cai " -0x88c2: "Lie " -0x88c3: "Kamishimo " -0x88c4: "Yuki " -0x88c5: "Zhuang " -0x88c6: "Dang " -0x88c7: "[?] " -0x88c8: "Kun " -0x88c9: "Ken " -0x88ca: "Niao " -0x88cb: "Shu " -0x88cc: "Jia " -0x88cd: "Kun " -0x88ce: "Cheng " -0x88cf: "Li " -0x88d0: "Juan " -0x88d1: "Shen " -0x88d2: "Pou " -0x88d3: "Ge " -0x88d4: "Yi " -0x88d5: "Yu " -0x88d6: "Zhen " -0x88d7: "Liu " -0x88d8: "Qiu " -0x88d9: "Qun " -0x88da: "Ji " -0x88db: "Yi " -0x88dc: "Bu " -0x88dd: "Zhuang " -0x88de: "Shui " -0x88df: "Sha " -0x88e0: "Qun " -0x88e1: "Li " -0x88e2: "Lian " -0x88e3: "Lian " -0x88e4: "Ku " -0x88e5: "Jian " -0x88e6: "Fou " -0x88e7: "Chan " -0x88e8: "Bi " -0x88e9: "Gun " -0x88ea: "Tao " -0x88eb: "Yuan " -0x88ec: "Ling " -0x88ed: "Chi " -0x88ee: "Chang " -0x88ef: "Chou " -0x88f0: "Duo " -0x88f1: "Biao " -0x88f2: "Liang " -0x88f3: "Chang " -0x88f4: "Pei " -0x88f5: "Pei " -0x88f6: "Fei " -0x88f7: "Yuan " -0x88f8: "Luo " -0x88f9: "Guo " -0x88fa: "Yan " -0x88fb: "Du " -0x88fc: "Xi " -0x88fd: "Zhi " -0x88fe: "Ju " -0x88ff: "Qi " -/* x089 */ -0x8900: "Ji " -0x8901: "Zhi " -0x8902: "Gua " -0x8903: "Ken " -0x8904: "Che " -0x8905: "Ti " -0x8906: "Ti " -0x8907: "Fu " -0x8908: "Chong " -0x8909: "Xie " -0x890a: "Bian " -0x890b: "Die " -0x890c: "Kun " -0x890d: "Duan " -0x890e: "Xiu " -0x890f: "Xiu " -0x8910: "He " -0x8911: "Yuan " -0x8912: "Bao " -0x8913: "Bao " -0x8914: "Fu " -0x8915: "Yu " -0x8916: "Tuan " -0x8917: "Yan " -0x8918: "Hui " -0x8919: "Bei " -0x891a: "Chu " -0x891b: "Lu " -0x891c: "Ena " -0x891d: "Hitoe " -0x891e: "Yun " -0x891f: "Da " -0x8920: "Gou " -0x8921: "Da " -0x8922: "Huai " -0x8923: "Rong " -0x8924: "Yuan " -0x8925: "Ru " -0x8926: "Nai " -0x8927: "Jiong " -0x8928: "Suo " -0x8929: "Ban " -0x892a: "Tun " -0x892b: "Chi " -0x892c: "Sang " -0x892d: "Niao " -0x892e: "Ying " -0x892f: "Jie " -0x8930: "Qian " -0x8931: "Huai " -0x8932: "Ku " -0x8933: "Lian " -0x8934: "Bao " -0x8935: "Li " -0x8936: "Zhe " -0x8937: "Shi " -0x8938: "Lu " -0x8939: "Yi " -0x893a: "Die " -0x893b: "Xie " -0x893c: "Xian " -0x893d: "Wei " -0x893e: "Biao " -0x893f: "Cao " -0x8940: "Ji " -0x8941: "Jiang " -0x8942: "Sen " -0x8943: "Bao " -0x8944: "Xiang " -0x8945: "Chihaya " -0x8946: "Pu " -0x8947: "Jian " -0x8948: "Zhuan " -0x8949: "Jian " -0x894a: "Zui " -0x894b: "Ji " -0x894c: "Dan " -0x894d: "Za " -0x894e: "Fan " -0x894f: "Bo " -0x8950: "Xiang " -0x8951: "Xin " -0x8952: "Bie " -0x8953: "Rao " -0x8954: "Man " -0x8955: "Lan " -0x8956: "Ao " -0x8957: "Duo " -0x8958: "Gui " -0x8959: "Cao " -0x895a: "Sui " -0x895b: "Nong " -0x895c: "Chan " -0x895d: "Lian " -0x895e: "Bi " -0x895f: "Jin " -0x8960: "Dang " -0x8961: "Shu " -0x8962: "Tan " -0x8963: "Bi " -0x8964: "Lan " -0x8965: "Pu " -0x8966: "Ru " -0x8967: "Zhi " -0x8968: "[?] " -0x8969: "Shu " -0x896a: "Wa " -0x896b: "Shi " -0x896c: "Bai " -0x896d: "Xie " -0x896e: "Bo " -0x896f: "Chen " -0x8970: "Lai " -0x8971: "Long " -0x8972: "Xi " -0x8973: "Xian " -0x8974: "Lan " -0x8975: "Zhe " -0x8976: "Dai " -0x8977: "Tasuki " -0x8978: "Zan " -0x8979: "Shi " -0x897a: "Jian " -0x897b: "Pan " -0x897c: "Yi " -0x897d: "Ran " -0x897e: "Ya " -0x897f: "Xi " -0x8980: "Xi " -0x8981: "Yao " -0x8982: "Feng " -0x8983: "Tan " -0x8984: "[?] " -0x8985: "Biao " -0x8986: "Fu " -0x8987: "Ba " -0x8988: "He " -0x8989: "Ji " -0x898a: "Ji " -0x898b: "Jian " -0x898c: "Guan " -0x898d: "Bian " -0x898e: "Yan " -0x898f: "Gui " -0x8990: "Jue " -0x8991: "Pian " -0x8992: "Mao " -0x8993: "Mi " -0x8994: "Mi " -0x8995: "Mie " -0x8996: "Shi " -0x8997: "Si " -0x8998: "Zhan " -0x8999: "Luo " -0x899a: "Jue " -0x899b: "Mi " -0x899c: "Tiao " -0x899d: "Lian " -0x899e: "Yao " -0x899f: "Zhi " -0x89a0: "Jun " -0x89a1: "Xi " -0x89a2: "Shan " -0x89a3: "Wei " -0x89a4: "Xi " -0x89a5: "Tian " -0x89a6: "Yu " -0x89a7: "Lan " -0x89a8: "E " -0x89a9: "Du " -0x89aa: "Qin " -0x89ab: "Pang " -0x89ac: "Ji " -0x89ad: "Ming " -0x89ae: "Ying " -0x89af: "Gou " -0x89b0: "Qu " -0x89b1: "Zhan " -0x89b2: "Jin " -0x89b3: "Guan " -0x89b4: "Deng " -0x89b5: "Jian " -0x89b6: "Luo " -0x89b7: "Qu " -0x89b8: "Jian " -0x89b9: "Wei " -0x89ba: "Jue " -0x89bb: "Qu " -0x89bc: "Luo " -0x89bd: "Lan " -0x89be: "Shen " -0x89bf: "Di " -0x89c0: "Guan " -0x89c1: "Jian " -0x89c2: "Guan " -0x89c3: "Yan " -0x89c4: "Gui " -0x89c5: "Mi " -0x89c6: "Shi " -0x89c7: "Zhan " -0x89c8: "Lan " -0x89c9: "Jue " -0x89ca: "Ji " -0x89cb: "Xi " -0x89cc: "Di " -0x89cd: "Tian " -0x89ce: "Yu " -0x89cf: "Gou " -0x89d0: "Jin " -0x89d1: "Qu " -0x89d2: "Jiao " -0x89d3: "Jiu " -0x89d4: "Jin " -0x89d5: "Cu " -0x89d6: "Jue " -0x89d7: "Zhi " -0x89d8: "Chao " -0x89d9: "Ji " -0x89da: "Gu " -0x89db: "Dan " -0x89dc: "Zui " -0x89dd: "Di " -0x89de: "Shang " -0x89df: "Hua " -0x89e0: "Quan " -0x89e1: "Ge " -0x89e2: "Chi " -0x89e3: "Jie " -0x89e4: "Gui " -0x89e5: "Gong " -0x89e6: "Hong " -0x89e7: "Jie " -0x89e8: "Hun " -0x89e9: "Qiu " -0x89ea: "Xing " -0x89eb: "Su " -0x89ec: "Ni " -0x89ed: "Ji " -0x89ee: "Lu " -0x89ef: "Zhi " -0x89f0: "Zha " -0x89f1: "Bi " -0x89f2: "Xing " -0x89f3: "Hu " -0x89f4: "Shang " -0x89f5: "Gong " -0x89f6: "Zhi " -0x89f7: "Xue " -0x89f8: "Chu " -0x89f9: "Xi " -0x89fa: "Yi " -0x89fb: "Lu " -0x89fc: "Jue " -0x89fd: "Xi " -0x89fe: "Yan " -0x89ff: "Xi " -/* x08a */ -0x8a00: "Yan " -0x8a01: "Yan " -0x8a02: "Ding " -0x8a03: "Fu " -0x8a04: "Qiu " -0x8a05: "Qiu " -0x8a06: "Jiao " -0x8a07: "Hong " -0x8a08: "Ji " -0x8a09: "Fan " -0x8a0a: "Xun " -0x8a0b: "Diao " -0x8a0c: "Hong " -0x8a0d: "Cha " -0x8a0e: "Tao " -0x8a0f: "Xu " -0x8a10: "Jie " -0x8a11: "Yi " -0x8a12: "Ren " -0x8a13: "Xun " -0x8a14: "Yin " -0x8a15: "Shan " -0x8a16: "Qi " -0x8a17: "Tuo " -0x8a18: "Ji " -0x8a19: "Xun " -0x8a1a: "Yin " -0x8a1b: "E " -0x8a1c: "Fen " -0x8a1d: "Ya " -0x8a1e: "Yao " -0x8a1f: "Song " -0x8a20: "Shen " -0x8a21: "Yin " -0x8a22: "Xin " -0x8a23: "Jue " -0x8a24: "Xiao " -0x8a25: "Ne " -0x8a26: "Chen " -0x8a27: "You " -0x8a28: "Zhi " -0x8a29: "Xiong " -0x8a2a: "Fang " -0x8a2b: "Xin " -0x8a2c: "Chao " -0x8a2d: "She " -0x8a2e: "Xian " -0x8a2f: "Sha " -0x8a30: "Tun " -0x8a31: "Xu " -0x8a32: "Yi " -0x8a33: "Yi " -0x8a34: "Su " -0x8a35: "Chi " -0x8a36: "He " -0x8a37: "Shen " -0x8a38: "He " -0x8a39: "Xu " -0x8a3a: "Zhen " -0x8a3b: "Zhu " -0x8a3c: "Zheng " -0x8a3d: "Gou " -0x8a3e: "Zi " -0x8a3f: "Zi " -0x8a40: "Zhan " -0x8a41: "Gu " -0x8a42: "Fu " -0x8a43: "Quan " -0x8a44: "Die " -0x8a45: "Ling " -0x8a46: "Di " -0x8a47: "Yang " -0x8a48: "Li " -0x8a49: "Nao " -0x8a4a: "Pan " -0x8a4b: "Zhou " -0x8a4c: "Gan " -0x8a4d: "Yi " -0x8a4e: "Ju " -0x8a4f: "Ao " -0x8a50: "Zha " -0x8a51: "Tuo " -0x8a52: "Yi " -0x8a53: "Qu " -0x8a54: "Zhao " -0x8a55: "Ping " -0x8a56: "Bi " -0x8a57: "Xiong " -0x8a58: "Qu " -0x8a59: "Ba " -0x8a5a: "Da " -0x8a5b: "Zu " -0x8a5c: "Tao " -0x8a5d: "Zhu " -0x8a5e: "Ci " -0x8a5f: "Zhe " -0x8a60: "Yong " -0x8a61: "Xu " -0x8a62: "Xun " -0x8a63: "Yi " -0x8a64: "Huang " -0x8a65: "He " -0x8a66: "Shi " -0x8a67: "Cha " -0x8a68: "Jiao " -0x8a69: "Shi " -0x8a6a: "Hen " -0x8a6b: "Cha " -0x8a6c: "Gou " -0x8a6d: "Gui " -0x8a6e: "Quan " -0x8a6f: "Hui " -0x8a70: "Jie " -0x8a71: "Hua " -0x8a72: "Gai " -0x8a73: "Xiang " -0x8a74: "Wei " -0x8a75: "Shen " -0x8a76: "Chou " -0x8a77: "Tong " -0x8a78: "Mi " -0x8a79: "Zhan " -0x8a7a: "Ming " -0x8a7b: "E " -0x8a7c: "Hui " -0x8a7d: "Yan " -0x8a7e: "Xiong " -0x8a7f: "Gua " -0x8a80: "Er " -0x8a81: "Beng " -0x8a82: "Tiao " -0x8a83: "Chi " -0x8a84: "Lei " -0x8a85: "Zhu " -0x8a86: "Kuang " -0x8a87: "Kua " -0x8a88: "Wu " -0x8a89: "Yu " -0x8a8a: "Teng " -0x8a8b: "Ji " -0x8a8c: "Zhi " -0x8a8d: "Ren " -0x8a8e: "Su " -0x8a8f: "Lang " -0x8a90: "E " -0x8a91: "Kuang " -0x8a92: "E " -0x8a93: "Shi " -0x8a94: "Ting " -0x8a95: "Dan " -0x8a96: "Bo " -0x8a97: "Chan " -0x8a98: "You " -0x8a99: "Heng " -0x8a9a: "Qiao " -0x8a9b: "Qin " -0x8a9c: "Shua " -0x8a9d: "An " -0x8a9e: "Yu " -0x8a9f: "Xiao " -0x8aa0: "Cheng " -0x8aa1: "Jie " -0x8aa2: "Xian " -0x8aa3: "Wu " -0x8aa4: "Wu " -0x8aa5: "Gao " -0x8aa6: "Song " -0x8aa7: "Pu " -0x8aa8: "Hui " -0x8aa9: "Jing " -0x8aaa: "Shuo " -0x8aab: "Zhen " -0x8aac: "Shuo " -0x8aad: "Du " -0x8aae: "Yasashi " -0x8aaf: "Chang " -0x8ab0: "Shui " -0x8ab1: "Jie " -0x8ab2: "Ke " -0x8ab3: "Qu " -0x8ab4: "Cong " -0x8ab5: "Xiao " -0x8ab6: "Sui " -0x8ab7: "Wang " -0x8ab8: "Xuan " -0x8ab9: "Fei " -0x8aba: "Chi " -0x8abb: "Ta " -0x8abc: "Yi " -0x8abd: "Na " -0x8abe: "Yin " -0x8abf: "Diao " -0x8ac0: "Pi " -0x8ac1: "Chuo " -0x8ac2: "Chan " -0x8ac3: "Chen " -0x8ac4: "Zhun " -0x8ac5: "Ji " -0x8ac6: "Qi " -0x8ac7: "Tan " -0x8ac8: "Zhui " -0x8ac9: "Wei " -0x8aca: "Ju " -0x8acb: "Qing " -0x8acc: "Jian " -0x8acd: "Zheng " -0x8ace: "Ze " -0x8acf: "Zou " -0x8ad0: "Qian " -0x8ad1: "Zhuo " -0x8ad2: "Liang " -0x8ad3: "Jian " -0x8ad4: "Zhu " -0x8ad5: "Hao " -0x8ad6: "Lun " -0x8ad7: "Shen " -0x8ad8: "Biao " -0x8ad9: "Huai " -0x8ada: "Pian " -0x8adb: "Yu " -0x8adc: "Die " -0x8add: "Xu " -0x8ade: "Pian " -0x8adf: "Shi " -0x8ae0: "Xuan " -0x8ae1: "Shi " -0x8ae2: "Hun " -0x8ae3: "Hua " -0x8ae4: "E " -0x8ae5: "Zhong " -0x8ae6: "Di " -0x8ae7: "Xie " -0x8ae8: "Fu " -0x8ae9: "Pu " -0x8aea: "Ting " -0x8aeb: "Jian " -0x8aec: "Qi " -0x8aed: "Yu " -0x8aee: "Zi " -0x8aef: "Chuan " -0x8af0: "Xi " -0x8af1: "Hui " -0x8af2: "Yin " -0x8af3: "An " -0x8af4: "Xian " -0x8af5: "Nan " -0x8af6: "Chen " -0x8af7: "Feng " -0x8af8: "Zhu " -0x8af9: "Yang " -0x8afa: "Yan " -0x8afb: "Heng " -0x8afc: "Xuan " -0x8afd: "Ge " -0x8afe: "Nuo " -0x8aff: "Qi " -/* x08b */ -0x8b00: "Mou " -0x8b01: "Ye " -0x8b02: "Wei " -0x8b03: "[?] " -0x8b04: "Teng " -0x8b05: "Zou " -0x8b06: "Shan " -0x8b07: "Jian " -0x8b08: "Bo " -0x8b09: "Ku " -0x8b0a: "Huang " -0x8b0b: "Huo " -0x8b0c: "Ge " -0x8b0d: "Ying " -0x8b0e: "Mi " -0x8b0f: "Xiao " -0x8b10: "Mi " -0x8b11: "Xi " -0x8b12: "Qiang " -0x8b13: "Chen " -0x8b14: "Nue " -0x8b15: "Ti " -0x8b16: "Su " -0x8b17: "Bang " -0x8b18: "Chi " -0x8b19: "Qian " -0x8b1a: "Shi " -0x8b1b: "Jiang " -0x8b1c: "Yuan " -0x8b1d: "Xie " -0x8b1e: "Xue " -0x8b1f: "Tao " -0x8b20: "Yao " -0x8b21: "Yao " -0x8b22: "[?] " -0x8b23: "Yu " -0x8b24: "Biao " -0x8b25: "Cong " -0x8b26: "Qing " -0x8b27: "Li " -0x8b28: "Mo " -0x8b29: "Mo " -0x8b2a: "Shang " -0x8b2b: "Zhe " -0x8b2c: "Miu " -0x8b2d: "Jian " -0x8b2e: "Ze " -0x8b2f: "Jie " -0x8b30: "Lian " -0x8b31: "Lou " -0x8b32: "Can " -0x8b33: "Ou " -0x8b34: "Guan " -0x8b35: "Xi " -0x8b36: "Zhuo " -0x8b37: "Ao " -0x8b38: "Ao " -0x8b39: "Jin " -0x8b3a: "Zhe " -0x8b3b: "Yi " -0x8b3c: "Hu " -0x8b3d: "Jiang " -0x8b3e: "Man " -0x8b3f: "Chao " -0x8b40: "Han " -0x8b41: "Hua " -0x8b42: "Chan " -0x8b43: "Xu " -0x8b44: "Zeng " -0x8b45: "Se " -0x8b46: "Xi " -0x8b47: "She " -0x8b48: "Dui " -0x8b49: "Zheng " -0x8b4a: "Nao " -0x8b4b: "Lan " -0x8b4c: "E " -0x8b4d: "Ying " -0x8b4e: "Jue " -0x8b4f: "Ji " -0x8b50: "Zun " -0x8b51: "Jiao " -0x8b52: "Bo " -0x8b53: "Hui " -0x8b54: "Zhuan " -0x8b55: "Mu " -0x8b56: "Zen " -0x8b57: "Zha " -0x8b58: "Shi " -0x8b59: "Qiao " -0x8b5a: "Tan " -0x8b5b: "Zen " -0x8b5c: "Pu " -0x8b5d: "Sheng " -0x8b5e: "Xuan " -0x8b5f: "Zao " -0x8b60: "Tan " -0x8b61: "Dang " -0x8b62: "Sui " -0x8b63: "Qian " -0x8b64: "Ji " -0x8b65: "Jiao " -0x8b66: "Jing " -0x8b67: "Lian " -0x8b68: "Nou " -0x8b69: "Yi " -0x8b6a: "Ai " -0x8b6b: "Zhan " -0x8b6c: "Pi " -0x8b6d: "Hui " -0x8b6e: "Hua " -0x8b6f: "Yi " -0x8b70: "Yi " -0x8b71: "Shan " -0x8b72: "Rang " -0x8b73: "Nou " -0x8b74: "Qian " -0x8b75: "Zhui " -0x8b76: "Ta " -0x8b77: "Hu " -0x8b78: "Zhou " -0x8b79: "Hao " -0x8b7a: "Ye " -0x8b7b: "Ying " -0x8b7c: "Jian " -0x8b7d: "Yu " -0x8b7e: "Jian " -0x8b7f: "Hui " -0x8b80: "Du " -0x8b81: "Zhe " -0x8b82: "Xuan " -0x8b83: "Zan " -0x8b84: "Lei " -0x8b85: "Shen " -0x8b86: "Wei " -0x8b87: "Chan " -0x8b88: "Li " -0x8b89: "Yi " -0x8b8a: "Bian " -0x8b8b: "Zhe " -0x8b8c: "Yan " -0x8b8d: "E " -0x8b8e: "Chou " -0x8b8f: "Wei " -0x8b90: "Chou " -0x8b91: "Yao " -0x8b92: "Chan " -0x8b93: "Rang " -0x8b94: "Yin " -0x8b95: "Lan " -0x8b96: "Chen " -0x8b97: "Huo " -0x8b98: "Zhe " -0x8b99: "Huan " -0x8b9a: "Zan " -0x8b9b: "Yi " -0x8b9c: "Dang " -0x8b9d: "Zhan " -0x8b9e: "Yan " -0x8b9f: "Du " -0x8ba0: "Yan " -0x8ba1: "Ji " -0x8ba2: "Ding " -0x8ba3: "Fu " -0x8ba4: "Ren " -0x8ba5: "Ji " -0x8ba6: "Jie " -0x8ba7: "Hong " -0x8ba8: "Tao " -0x8ba9: "Rang " -0x8baa: "Shan " -0x8bab: "Qi " -0x8bac: "Tuo " -0x8bad: "Xun " -0x8bae: "Yi " -0x8baf: "Xun " -0x8bb0: "Ji " -0x8bb1: "Ren " -0x8bb2: "Jiang " -0x8bb3: "Hui " -0x8bb4: "Ou " -0x8bb5: "Ju " -0x8bb6: "Ya " -0x8bb7: "Ne " -0x8bb8: "Xu " -0x8bb9: "E " -0x8bba: "Lun " -0x8bbb: "Xiong " -0x8bbc: "Song " -0x8bbd: "Feng " -0x8bbe: "She " -0x8bbf: "Fang " -0x8bc0: "Jue " -0x8bc1: "Zheng " -0x8bc2: "Gu " -0x8bc3: "He " -0x8bc4: "Ping " -0x8bc5: "Zu " -0x8bc6: "Shi " -0x8bc7: "Xiong " -0x8bc8: "Zha " -0x8bc9: "Su " -0x8bca: "Zhen " -0x8bcb: "Di " -0x8bcc: "Zou " -0x8bcd: "Ci " -0x8bce: "Qu " -0x8bcf: "Zhao " -0x8bd0: "Bi " -0x8bd1: "Yi " -0x8bd2: "Yi " -0x8bd3: "Kuang " -0x8bd4: "Lei " -0x8bd5: "Shi " -0x8bd6: "Gua " -0x8bd7: "Shi " -0x8bd8: "Jie " -0x8bd9: "Hui " -0x8bda: "Cheng " -0x8bdb: "Zhu " -0x8bdc: "Shen " -0x8bdd: "Hua " -0x8bde: "Dan " -0x8bdf: "Gou " -0x8be0: "Quan " -0x8be1: "Gui " -0x8be2: "Xun " -0x8be3: "Yi " -0x8be4: "Zheng " -0x8be5: "Gai " -0x8be6: "Xiang " -0x8be7: "Cha " -0x8be8: "Hun " -0x8be9: "Xu " -0x8bea: "Zhou " -0x8beb: "Jie " -0x8bec: "Wu " -0x8bed: "Yu " -0x8bee: "Qiao " -0x8bef: "Wu " -0x8bf0: "Gao " -0x8bf1: "You " -0x8bf2: "Hui " -0x8bf3: "Kuang " -0x8bf4: "Shuo " -0x8bf5: "Song " -0x8bf6: "Ai " -0x8bf7: "Qing " -0x8bf8: "Zhu " -0x8bf9: "Zou " -0x8bfa: "Nuo " -0x8bfb: "Du " -0x8bfc: "Zhuo " -0x8bfd: "Fei " -0x8bfe: "Ke " -0x8bff: "Wei " -/* x08c */ -0x8c00: "Yu " -0x8c01: "Shui " -0x8c02: "Shen " -0x8c03: "Diao " -0x8c04: "Chan " -0x8c05: "Liang " -0x8c06: "Zhun " -0x8c07: "Sui " -0x8c08: "Tan " -0x8c09: "Shen " -0x8c0a: "Yi " -0x8c0b: "Mou " -0x8c0c: "Chen " -0x8c0d: "Die " -0x8c0e: "Huang " -0x8c0f: "Jian " -0x8c10: "Xie " -0x8c11: "Nue " -0x8c12: "Ye " -0x8c13: "Wei " -0x8c14: "E " -0x8c15: "Yu " -0x8c16: "Xuan " -0x8c17: "Chan " -0x8c18: "Zi " -0x8c19: "An " -0x8c1a: "Yan " -0x8c1b: "Di " -0x8c1c: "Mi " -0x8c1d: "Pian " -0x8c1e: "Xu " -0x8c1f: "Mo " -0x8c20: "Dang " -0x8c21: "Su " -0x8c22: "Xie " -0x8c23: "Yao " -0x8c24: "Bang " -0x8c25: "Shi " -0x8c26: "Qian " -0x8c27: "Mi " -0x8c28: "Jin " -0x8c29: "Man " -0x8c2a: "Zhe " -0x8c2b: "Jian " -0x8c2c: "Miu " -0x8c2d: "Tan " -0x8c2e: "Zen " -0x8c2f: "Qiao " -0x8c30: "Lan " -0x8c31: "Pu " -0x8c32: "Jue " -0x8c33: "Yan " -0x8c34: "Qian " -0x8c35: "Zhan " -0x8c36: "Chen " -0x8c37: "Gu " -0x8c38: "Qian " -0x8c39: "Hong " -0x8c3a: "Xia " -0x8c3b: "Jue " -0x8c3c: "Hong " -0x8c3d: "Han " -0x8c3e: "Hong " -0x8c3f: "Xi " -0x8c40: "Xi " -0x8c41: "Huo " -0x8c42: "Liao " -0x8c43: "Han " -0x8c44: "Du " -0x8c45: "Long " -0x8c46: "Dou " -0x8c47: "Jiang " -0x8c48: "Qi " -0x8c49: "Shi " -0x8c4a: "Li " -0x8c4b: "Deng " -0x8c4c: "Wan " -0x8c4d: "Bi " -0x8c4e: "Shu " -0x8c4f: "Xian " -0x8c50: "Feng " -0x8c51: "Zhi " -0x8c52: "Zhi " -0x8c53: "Yan " -0x8c54: "Yan " -0x8c55: "Shi " -0x8c56: "Chu " -0x8c57: "Hui " -0x8c58: "Tun " -0x8c59: "Yi " -0x8c5a: "Tun " -0x8c5b: "Yi " -0x8c5c: "Jian " -0x8c5d: "Ba " -0x8c5e: "Hou " -0x8c5f: "E " -0x8c60: "Cu " -0x8c61: "Xiang " -0x8c62: "Huan " -0x8c63: "Jian " -0x8c64: "Ken " -0x8c65: "Gai " -0x8c66: "Qu " -0x8c67: "Fu " -0x8c68: "Xi " -0x8c69: "Bin " -0x8c6a: "Hao " -0x8c6b: "Yu " -0x8c6c: "Zhu " -0x8c6d: "Jia " -0x8c6e: "[?] " -0x8c6f: "Xi " -0x8c70: "Bo " -0x8c71: "Wen " -0x8c72: "Huan " -0x8c73: "Bin " -0x8c74: "Di " -0x8c75: "Zong " -0x8c76: "Fen " -0x8c77: "Yi " -0x8c78: "Zhi " -0x8c79: "Bao " -0x8c7a: "Chai " -0x8c7b: "Han " -0x8c7c: "Pi " -0x8c7d: "Na " -0x8c7e: "Pi " -0x8c7f: "Gou " -0x8c80: "Na " -0x8c81: "You " -0x8c82: "Diao " -0x8c83: "Mo " -0x8c84: "Si " -0x8c85: "Xiu " -0x8c86: "Huan " -0x8c87: "Kun " -0x8c88: "He " -0x8c89: "He " -0x8c8a: "Mo " -0x8c8b: "Han " -0x8c8c: "Mao " -0x8c8d: "Li " -0x8c8e: "Ni " -0x8c8f: "Bi " -0x8c90: "Yu " -0x8c91: "Jia " -0x8c92: "Tuan " -0x8c93: "Mao " -0x8c94: "Pi " -0x8c95: "Xi " -0x8c96: "E " -0x8c97: "Ju " -0x8c98: "Mo " -0x8c99: "Chu " -0x8c9a: "Tan " -0x8c9b: "Huan " -0x8c9c: "Jue " -0x8c9d: "Bei " -0x8c9e: "Zhen " -0x8c9f: "Yuan " -0x8ca0: "Fu " -0x8ca1: "Cai " -0x8ca2: "Gong " -0x8ca3: "Te " -0x8ca4: "Yi " -0x8ca5: "Hang " -0x8ca6: "Wan " -0x8ca7: "Pin " -0x8ca8: "Huo " -0x8ca9: "Fan " -0x8caa: "Tan " -0x8cab: "Guan " -0x8cac: "Ze " -0x8cad: "Zhi " -0x8cae: "Er " -0x8caf: "Zhu " -0x8cb0: "Shi " -0x8cb1: "Bi " -0x8cb2: "Zi " -0x8cb3: "Er " -0x8cb4: "Gui " -0x8cb5: "Pian " -0x8cb6: "Bian " -0x8cb7: "Mai " -0x8cb8: "Dai " -0x8cb9: "Sheng " -0x8cba: "Kuang " -0x8cbb: "Fei " -0x8cbc: "Tie " -0x8cbd: "Yi " -0x8cbe: "Chi " -0x8cbf: "Mao " -0x8cc0: "He " -0x8cc1: "Bi " -0x8cc2: "Lu " -0x8cc3: "Ren " -0x8cc4: "Hui " -0x8cc5: "Gai " -0x8cc6: "Pian " -0x8cc7: "Zi " -0x8cc8: "Jia " -0x8cc9: "Xu " -0x8cca: "Zei " -0x8ccb: "Jiao " -0x8ccc: "Gai " -0x8ccd: "Zang " -0x8cce: "Jian " -0x8ccf: "Ying " -0x8cd0: "Xun " -0x8cd1: "Zhen " -0x8cd2: "She " -0x8cd3: "Bin " -0x8cd4: "Bin " -0x8cd5: "Qiu " -0x8cd6: "She " -0x8cd7: "Chuan " -0x8cd8: "Zang " -0x8cd9: "Zhou " -0x8cda: "Lai " -0x8cdb: "Zan " -0x8cdc: "Si " -0x8cdd: "Chen " -0x8cde: "Shang " -0x8cdf: "Tian " -0x8ce0: "Pei " -0x8ce1: "Geng " -0x8ce2: "Xian " -0x8ce3: "Mai " -0x8ce4: "Jian " -0x8ce5: "Sui " -0x8ce6: "Fu " -0x8ce7: "Tan " -0x8ce8: "Cong " -0x8ce9: "Cong " -0x8cea: "Zhi " -0x8ceb: "Ji " -0x8cec: "Zhang " -0x8ced: "Du " -0x8cee: "Jin " -0x8cef: "Xiong " -0x8cf0: "Shun " -0x8cf1: "Yun " -0x8cf2: "Bao " -0x8cf3: "Zai " -0x8cf4: "Lai " -0x8cf5: "Feng " -0x8cf6: "Cang " -0x8cf7: "Ji " -0x8cf8: "Sheng " -0x8cf9: "Ai " -0x8cfa: "Zhuan " -0x8cfb: "Fu " -0x8cfc: "Gou " -0x8cfd: "Sai " -0x8cfe: "Ze " -0x8cff: "Liao " -/* x08d */ -0x8d00: "Wei " -0x8d01: "Bai " -0x8d02: "Chen " -0x8d03: "Zhuan " -0x8d04: "Zhi " -0x8d05: "Zhui " -0x8d06: "Biao " -0x8d07: "Yun " -0x8d08: "Zeng " -0x8d09: "Tan " -0x8d0a: "Zan " -0x8d0b: "Yan " -0x8d0c: "[?] " -0x8d0d: "Shan " -0x8d0e: "Wan " -0x8d0f: "Ying " -0x8d10: "Jin " -0x8d11: "Gan " -0x8d12: "Xian " -0x8d13: "Zang " -0x8d14: "Bi " -0x8d15: "Du " -0x8d16: "Shu " -0x8d17: "Yan " -0x8d18: "[?] " -0x8d19: "Xuan " -0x8d1a: "Long " -0x8d1b: "Gan " -0x8d1c: "Zang " -0x8d1d: "Bei " -0x8d1e: "Zhen " -0x8d1f: "Fu " -0x8d20: "Yuan " -0x8d21: "Gong " -0x8d22: "Cai " -0x8d23: "Ze " -0x8d24: "Xian " -0x8d25: "Bai " -0x8d26: "Zhang " -0x8d27: "Huo " -0x8d28: "Zhi " -0x8d29: "Fan " -0x8d2a: "Tan " -0x8d2b: "Pin " -0x8d2c: "Bian " -0x8d2d: "Gou " -0x8d2e: "Zhu " -0x8d2f: "Guan " -0x8d30: "Er " -0x8d31: "Jian " -0x8d32: "Bi " -0x8d33: "Shi " -0x8d34: "Tie " -0x8d35: "Gui " -0x8d36: "Kuang " -0x8d37: "Dai " -0x8d38: "Mao " -0x8d39: "Fei " -0x8d3a: "He " -0x8d3b: "Yi " -0x8d3c: "Zei " -0x8d3d: "Zhi " -0x8d3e: "Jia " -0x8d3f: "Hui " -0x8d40: "Zi " -0x8d41: "Ren " -0x8d42: "Lu " -0x8d43: "Zang " -0x8d44: "Zi " -0x8d45: "Gai " -0x8d46: "Jin " -0x8d47: "Qiu " -0x8d48: "Zhen " -0x8d49: "Lai " -0x8d4a: "She " -0x8d4b: "Fu " -0x8d4c: "Du " -0x8d4d: "Ji " -0x8d4e: "Shu " -0x8d4f: "Shang " -0x8d50: "Si " -0x8d51: "Bi " -0x8d52: "Zhou " -0x8d53: "Geng " -0x8d54: "Pei " -0x8d55: "Tan " -0x8d56: "Lai " -0x8d57: "Feng " -0x8d58: "Zhui " -0x8d59: "Fu " -0x8d5a: "Zhuan " -0x8d5b: "Sai " -0x8d5c: "Ze " -0x8d5d: "Yan " -0x8d5e: "Zan " -0x8d5f: "Yun " -0x8d60: "Zeng " -0x8d61: "Shan " -0x8d62: "Ying " -0x8d63: "Gan " -0x8d64: "Chi " -0x8d65: "Xi " -0x8d66: "She " -0x8d67: "Nan " -0x8d68: "Xiong " -0x8d69: "Xi " -0x8d6a: "Cheng " -0x8d6b: "He " -0x8d6c: "Cheng " -0x8d6d: "Zhe " -0x8d6e: "Xia " -0x8d6f: "Tang " -0x8d70: "Zou " -0x8d71: "Zou " -0x8d72: "Li " -0x8d73: "Jiu " -0x8d74: "Fu " -0x8d75: "Zhao " -0x8d76: "Gan " -0x8d77: "Qi " -0x8d78: "Shan " -0x8d79: "Qiong " -0x8d7a: "Qin " -0x8d7b: "Xian " -0x8d7c: "Ci " -0x8d7d: "Jue " -0x8d7e: "Qin " -0x8d7f: "Chi " -0x8d80: "Ci " -0x8d81: "Chen " -0x8d82: "Chen " -0x8d83: "Die " -0x8d84: "Ju " -0x8d85: "Chao " -0x8d86: "Di " -0x8d87: "Se " -0x8d88: "Zhan " -0x8d89: "Zhu " -0x8d8a: "Yue " -0x8d8b: "Qu " -0x8d8c: "Jie " -0x8d8d: "Chi " -0x8d8e: "Chu " -0x8d8f: "Gua " -0x8d90: "Xue " -0x8d91: "Ci " -0x8d92: "Tiao " -0x8d93: "Duo " -0x8d94: "Lie " -0x8d95: "Gan " -0x8d96: "Suo " -0x8d97: "Cu " -0x8d98: "Xi " -0x8d99: "Zhao " -0x8d9a: "Su " -0x8d9b: "Yin " -0x8d9c: "Ju " -0x8d9d: "Jian " -0x8d9e: "Que " -0x8d9f: "Tang " -0x8da0: "Chuo " -0x8da1: "Cui " -0x8da2: "Lu " -0x8da3: "Qu " -0x8da4: "Dang " -0x8da5: "Qiu " -0x8da6: "Zi " -0x8da7: "Ti " -0x8da8: "Qu " -0x8da9: "Chi " -0x8daa: "Huang " -0x8dab: "Qiao " -0x8dac: "Qiao " -0x8dad: "Yao " -0x8dae: "Zao " -0x8daf: "Ti " -0x8db0: "[?] " -0x8db1: "Zan " -0x8db2: "Zan " -0x8db3: "Zu " -0x8db4: "Pa " -0x8db5: "Bao " -0x8db6: "Ku " -0x8db7: "Ke " -0x8db8: "Dun " -0x8db9: "Jue " -0x8dba: "Fu " -0x8dbb: "Chen " -0x8dbc: "Jian " -0x8dbd: "Fang " -0x8dbe: "Zhi " -0x8dbf: "Sa " -0x8dc0: "Yue " -0x8dc1: "Pa " -0x8dc2: "Qi " -0x8dc3: "Yue " -0x8dc4: "Qiang " -0x8dc5: "Tuo " -0x8dc6: "Tai " -0x8dc7: "Yi " -0x8dc8: "Nian " -0x8dc9: "Ling " -0x8dca: "Mei " -0x8dcb: "Ba " -0x8dcc: "Die " -0x8dcd: "Ku " -0x8dce: "Tuo " -0x8dcf: "Jia " -0x8dd0: "Ci " -0x8dd1: "Pao " -0x8dd2: "Qia " -0x8dd3: "Zhu " -0x8dd4: "Ju " -0x8dd5: "Die " -0x8dd6: "Zhi " -0x8dd7: "Fu " -0x8dd8: "Pan " -0x8dd9: "Ju " -0x8dda: "Shan " -0x8ddb: "Bo " -0x8ddc: "Ni " -0x8ddd: "Ju " -0x8dde: "Li " -0x8ddf: "Gen " -0x8de0: "Yi " -0x8de1: "Ji " -0x8de2: "Dai " -0x8de3: "Xian " -0x8de4: "Jiao " -0x8de5: "Duo " -0x8de6: "Zhu " -0x8de7: "Zhuan " -0x8de8: "Kua " -0x8de9: "Zhuai " -0x8dea: "Gui " -0x8deb: "Qiong " -0x8dec: "Kui " -0x8ded: "Xiang " -0x8dee: "Chi " -0x8def: "Lu " -0x8df0: "Beng " -0x8df1: "Zhi " -0x8df2: "Jia " -0x8df3: "Tiao " -0x8df4: "Cai " -0x8df5: "Jian " -0x8df6: "Ta " -0x8df7: "Qiao " -0x8df8: "Bi " -0x8df9: "Xian " -0x8dfa: "Duo " -0x8dfb: "Ji " -0x8dfc: "Ju " -0x8dfd: "Ji " -0x8dfe: "Shu " -0x8dff: "Tu " -/* x08e */ -0x8e00: "Chu " -0x8e01: "Jing " -0x8e02: "Nie " -0x8e03: "Xiao " -0x8e04: "Bo " -0x8e05: "Chi " -0x8e06: "Qun " -0x8e07: "Mou " -0x8e08: "Shu " -0x8e09: "Lang " -0x8e0a: "Yong " -0x8e0b: "Jiao " -0x8e0c: "Chou " -0x8e0d: "Qiao " -0x8e0e: "[?] " -0x8e0f: "Ta " -0x8e10: "Jian " -0x8e11: "Qi " -0x8e12: "Wo " -0x8e13: "Wei " -0x8e14: "Zhuo " -0x8e15: "Jie " -0x8e16: "Ji " -0x8e17: "Nie " -0x8e18: "Ju " -0x8e19: "Ju " -0x8e1a: "Lun " -0x8e1b: "Lu " -0x8e1c: "Leng " -0x8e1d: "Huai " -0x8e1e: "Ju " -0x8e1f: "Chi " -0x8e20: "Wan " -0x8e21: "Quan " -0x8e22: "Ti " -0x8e23: "Bo " -0x8e24: "Zu " -0x8e25: "Qie " -0x8e26: "Ji " -0x8e27: "Cu " -0x8e28: "Zong " -0x8e29: "Cai " -0x8e2a: "Zong " -0x8e2b: "Peng " -0x8e2c: "Zhi " -0x8e2d: "Zheng " -0x8e2e: "Dian " -0x8e2f: "Zhi " -0x8e30: "Yu " -0x8e31: "Duo " -0x8e32: "Dun " -0x8e33: "Chun " -0x8e34: "Yong " -0x8e35: "Zhong " -0x8e36: "Di " -0x8e37: "Zhe " -0x8e38: "Chen " -0x8e39: "Chuai " -0x8e3a: "Jian " -0x8e3b: "Gua " -0x8e3c: "Tang " -0x8e3d: "Ju " -0x8e3e: "Fu " -0x8e3f: "Zu " -0x8e40: "Die " -0x8e41: "Pian " -0x8e42: "Rou " -0x8e43: "Nuo " -0x8e44: "Ti " -0x8e45: "Cha " -0x8e46: "Tui " -0x8e47: "Jian " -0x8e48: "Dao " -0x8e49: "Cuo " -0x8e4a: "Xi " -0x8e4b: "Ta " -0x8e4c: "Qiang " -0x8e4d: "Zhan " -0x8e4e: "Dian " -0x8e4f: "Ti " -0x8e50: "Ji " -0x8e51: "Nie " -0x8e52: "Man " -0x8e53: "Liu " -0x8e54: "Zhan " -0x8e55: "Bi " -0x8e56: "Chong " -0x8e57: "Lu " -0x8e58: "Liao " -0x8e59: "Cu " -0x8e5a: "Tang " -0x8e5b: "Dai " -0x8e5c: "Suo " -0x8e5d: "Xi " -0x8e5e: "Kui " -0x8e5f: "Ji " -0x8e60: "Zhi " -0x8e61: "Qiang " -0x8e62: "Di " -0x8e63: "Man " -0x8e64: "Zong " -0x8e65: "Lian " -0x8e66: "Beng " -0x8e67: "Zao " -0x8e68: "Nian " -0x8e69: "Bie " -0x8e6a: "Tui " -0x8e6b: "Ju " -0x8e6c: "Deng " -0x8e6d: "Ceng " -0x8e6e: "Xian " -0x8e6f: "Fan " -0x8e70: "Chu " -0x8e71: "Zhong " -0x8e72: "Dun " -0x8e73: "Bo " -0x8e74: "Cu " -0x8e75: "Zu " -0x8e76: "Jue " -0x8e77: "Jue " -0x8e78: "Lin " -0x8e79: "Ta " -0x8e7a: "Qiao " -0x8e7b: "Qiao " -0x8e7c: "Pu " -0x8e7d: "Liao " -0x8e7e: "Dun " -0x8e7f: "Cuan " -0x8e80: "Kuang " -0x8e81: "Zao " -0x8e82: "Ta " -0x8e83: "Bi " -0x8e84: "Bi " -0x8e85: "Zhu " -0x8e86: "Ju " -0x8e87: "Chu " -0x8e88: "Qiao " -0x8e89: "Dun " -0x8e8a: "Chou " -0x8e8b: "Ji " -0x8e8c: "Wu " -0x8e8d: "Yue " -0x8e8e: "Nian " -0x8e8f: "Lin " -0x8e90: "Lie " -0x8e91: "Zhi " -0x8e92: "Li " -0x8e93: "Zhi " -0x8e94: "Chan " -0x8e95: "Chu " -0x8e96: "Duan " -0x8e97: "Wei " -0x8e98: "Long " -0x8e99: "Lin " -0x8e9a: "Xian " -0x8e9b: "Wei " -0x8e9c: "Zuan " -0x8e9d: "Lan " -0x8e9e: "Xie " -0x8e9f: "Rang " -0x8ea0: "Xie " -0x8ea1: "Nie " -0x8ea2: "Ta " -0x8ea3: "Qu " -0x8ea4: "Jie " -0x8ea5: "Cuan " -0x8ea6: "Zuan " -0x8ea7: "Xi " -0x8ea8: "Kui " -0x8ea9: "Jue " -0x8eaa: "Lin " -0x8eab: "Shen " -0x8eac: "Gong " -0x8ead: "Dan " -0x8eae: "Segare " -0x8eaf: "Qu " -0x8eb0: "Ti " -0x8eb1: "Duo " -0x8eb2: "Duo " -0x8eb3: "Gong " -0x8eb4: "Lang " -0x8eb5: "Nerau " -0x8eb6: "Luo " -0x8eb7: "Ai " -0x8eb8: "Ji " -0x8eb9: "Ju " -0x8eba: "Tang " -0x8ebb: "Utsuke " -0x8ebc: "[?] " -0x8ebd: "Yan " -0x8ebe: "Shitsuke " -0x8ebf: "Kang " -0x8ec0: "Qu " -0x8ec1: "Lou " -0x8ec2: "Lao " -0x8ec3: "Tuo " -0x8ec4: "Zhi " -0x8ec5: "Yagate " -0x8ec6: "Ti " -0x8ec7: "Dao " -0x8ec8: "Yagate " -0x8ec9: "Yu " -0x8eca: "Che " -0x8ecb: "Ya " -0x8ecc: "Gui " -0x8ecd: "Jun " -0x8ece: "Wei " -0x8ecf: "Yue " -0x8ed0: "Xin " -0x8ed1: "Di " -0x8ed2: "Xuan " -0x8ed3: "Fan " -0x8ed4: "Ren " -0x8ed5: "Shan " -0x8ed6: "Qiang " -0x8ed7: "Shu " -0x8ed8: "Tun " -0x8ed9: "Chen " -0x8eda: "Dai " -0x8edb: "E " -0x8edc: "Na " -0x8edd: "Qi " -0x8ede: "Mao " -0x8edf: "Ruan " -0x8ee0: "Ren " -0x8ee1: "Fan " -0x8ee2: "Zhuan " -0x8ee3: "Hong " -0x8ee4: "Hu " -0x8ee5: "Qu " -0x8ee6: "Huang " -0x8ee7: "Di " -0x8ee8: "Ling " -0x8ee9: "Dai " -0x8eea: "Ao " -0x8eeb: "Zhen " -0x8eec: "Fan " -0x8eed: "Kuang " -0x8eee: "Ang " -0x8eef: "Peng " -0x8ef0: "Bei " -0x8ef1: "Gu " -0x8ef2: "Ku " -0x8ef3: "Pao " -0x8ef4: "Zhu " -0x8ef5: "Rong " -0x8ef6: "E " -0x8ef7: "Ba " -0x8ef8: "Zhou " -0x8ef9: "Zhi " -0x8efa: "Yao " -0x8efb: "Ke " -0x8efc: "Yi " -0x8efd: "Qing " -0x8efe: "Shi " -0x8eff: "Ping " -/* x08f */ -0x8f00: "Er " -0x8f01: "Qiong " -0x8f02: "Ju " -0x8f03: "Jiao " -0x8f04: "Guang " -0x8f05: "Lu " -0x8f06: "Kai " -0x8f07: "Quan " -0x8f08: "Zhou " -0x8f09: "Zai " -0x8f0a: "Zhi " -0x8f0b: "She " -0x8f0c: "Liang " -0x8f0d: "Yu " -0x8f0e: "Shao " -0x8f0f: "You " -0x8f10: "Huan " -0x8f11: "Yun " -0x8f12: "Zhe " -0x8f13: "Wan " -0x8f14: "Fu " -0x8f15: "Qing " -0x8f16: "Zhou " -0x8f17: "Ni " -0x8f18: "Ling " -0x8f19: "Zhe " -0x8f1a: "Zhan " -0x8f1b: "Liang " -0x8f1c: "Zi " -0x8f1d: "Hui " -0x8f1e: "Wang " -0x8f1f: "Chuo " -0x8f20: "Guo " -0x8f21: "Kan " -0x8f22: "Yi " -0x8f23: "Peng " -0x8f24: "Qian " -0x8f25: "Gun " -0x8f26: "Nian " -0x8f27: "Pian " -0x8f28: "Guan " -0x8f29: "Bei " -0x8f2a: "Lun " -0x8f2b: "Pai " -0x8f2c: "Liang " -0x8f2d: "Ruan " -0x8f2e: "Rou " -0x8f2f: "Ji " -0x8f30: "Yang " -0x8f31: "Xian " -0x8f32: "Chuan " -0x8f33: "Cou " -0x8f34: "Qun " -0x8f35: "Ge " -0x8f36: "You " -0x8f37: "Hong " -0x8f38: "Shu " -0x8f39: "Fu " -0x8f3a: "Zi " -0x8f3b: "Fu " -0x8f3c: "Wen " -0x8f3d: "Ben " -0x8f3e: "Zhan " -0x8f3f: "Yu " -0x8f40: "Wen " -0x8f41: "Tao " -0x8f42: "Gu " -0x8f43: "Zhen " -0x8f44: "Xia " -0x8f45: "Yuan " -0x8f46: "Lu " -0x8f47: "Jiu " -0x8f48: "Chao " -0x8f49: "Zhuan " -0x8f4a: "Wei " -0x8f4b: "Hun " -0x8f4c: "Sori " -0x8f4d: "Che " -0x8f4e: "Jiao " -0x8f4f: "Zhan " -0x8f50: "Pu " -0x8f51: "Lao " -0x8f52: "Fen " -0x8f53: "Fan " -0x8f54: "Lin " -0x8f55: "Ge " -0x8f56: "Se " -0x8f57: "Kan " -0x8f58: "Huan " -0x8f59: "Yi " -0x8f5a: "Ji " -0x8f5b: "Dui " -0x8f5c: "Er " -0x8f5d: "Yu " -0x8f5e: "Xian " -0x8f5f: "Hong " -0x8f60: "Lei " -0x8f61: "Pei " -0x8f62: "Li " -0x8f63: "Li " -0x8f64: "Lu " -0x8f65: "Lin " -0x8f66: "Che " -0x8f67: "Ya " -0x8f68: "Gui " -0x8f69: "Xuan " -0x8f6a: "Di " -0x8f6b: "Ren " -0x8f6c: "Zhuan " -0x8f6d: "E " -0x8f6e: "Lun " -0x8f6f: "Ruan " -0x8f70: "Hong " -0x8f71: "Ku " -0x8f72: "Ke " -0x8f73: "Lu " -0x8f74: "Zhou " -0x8f75: "Zhi " -0x8f76: "Yi " -0x8f77: "Hu " -0x8f78: "Zhen " -0x8f79: "Li " -0x8f7a: "Yao " -0x8f7b: "Qing " -0x8f7c: "Shi " -0x8f7d: "Zai " -0x8f7e: "Zhi " -0x8f7f: "Jiao " -0x8f80: "Zhou " -0x8f81: "Quan " -0x8f82: "Lu " -0x8f83: "Jiao " -0x8f84: "Zhe " -0x8f85: "Fu " -0x8f86: "Liang " -0x8f87: "Nian " -0x8f88: "Bei " -0x8f89: "Hui " -0x8f8a: "Gun " -0x8f8b: "Wang " -0x8f8c: "Liang " -0x8f8d: "Chuo " -0x8f8e: "Zi " -0x8f8f: "Cou " -0x8f90: "Fu " -0x8f91: "Ji " -0x8f92: "Wen " -0x8f93: "Shu " -0x8f94: "Pei " -0x8f95: "Yuan " -0x8f96: "Xia " -0x8f97: "Zhan " -0x8f98: "Lu " -0x8f99: "Che " -0x8f9a: "Lin " -0x8f9b: "Xin " -0x8f9c: "Gu " -0x8f9d: "Ci " -0x8f9e: "Ci " -0x8f9f: "Pi " -0x8fa0: "Zui " -0x8fa1: "Bian " -0x8fa2: "La " -0x8fa3: "La " -0x8fa4: "Ci " -0x8fa5: "Xue " -0x8fa6: "Ban " -0x8fa7: "Bian " -0x8fa8: "Bian " -0x8fa9: "Bian " -0x8faa: "[?] " -0x8fab: "Bian " -0x8fac: "Ban " -0x8fad: "Ci " -0x8fae: "Bian " -0x8faf: "Bian " -0x8fb0: "Chen " -0x8fb1: "Ru " -0x8fb2: "Nong " -0x8fb3: "Nong " -0x8fb4: "Zhen " -0x8fb5: "Chuo " -0x8fb6: "Chuo " -0x8fb7: "Suberu " -0x8fb8: "Reng " -0x8fb9: "Bian " -0x8fba: "Bian " -0x8fbb: "Sip " -0x8fbc: "Ip " -0x8fbd: "Liao " -0x8fbe: "Da " -0x8fbf: "Chan " -0x8fc0: "Gan " -0x8fc1: "Qian " -0x8fc2: "Yu " -0x8fc3: "Yu " -0x8fc4: "Qi " -0x8fc5: "Xun " -0x8fc6: "Yi " -0x8fc7: "Guo " -0x8fc8: "Mai " -0x8fc9: "Qi " -0x8fca: "Za " -0x8fcb: "Wang " -0x8fcc: "Jia " -0x8fcd: "Zhun " -0x8fce: "Ying " -0x8fcf: "Ti " -0x8fd0: "Yun " -0x8fd1: "Jin " -0x8fd2: "Hang " -0x8fd3: "Ya " -0x8fd4: "Fan " -0x8fd5: "Wu " -0x8fd6: "Da " -0x8fd7: "E " -0x8fd8: "Huan " -0x8fd9: "Zhe " -0x8fda: "Totemo " -0x8fdb: "Jin " -0x8fdc: "Yuan " -0x8fdd: "Wei " -0x8fde: "Lian " -0x8fdf: "Chi " -0x8fe0: "Che " -0x8fe1: "Ni " -0x8fe2: "Tiao " -0x8fe3: "Zhi " -0x8fe4: "Yi " -0x8fe5: "Jiong " -0x8fe6: "Jia " -0x8fe7: "Chen " -0x8fe8: "Dai " -0x8fe9: "Er " -0x8fea: "Di " -0x8feb: "Po " -0x8fec: "Wang " -0x8fed: "Die " -0x8fee: "Ze " -0x8fef: "Tao " -0x8ff0: "Shu " -0x8ff1: "Tuo " -0x8ff2: "Kep " -0x8ff3: "Jing " -0x8ff4: "Hui " -0x8ff5: "Tong " -0x8ff6: "You " -0x8ff7: "Mi " -0x8ff8: "Beng " -0x8ff9: "Ji " -0x8ffa: "Nai " -0x8ffb: "Yi " -0x8ffc: "Jie " -0x8ffd: "Zhui " -0x8ffe: "Lie " -0x8fff: "Xun " -/* x090 */ -0x9000: "Tui " -0x9001: "Song " -0x9002: "Gua " -0x9003: "Tao " -0x9004: "Pang " -0x9005: "Hou " -0x9006: "Ni " -0x9007: "Dun " -0x9008: "Jiong " -0x9009: "Xuan " -0x900a: "Xun " -0x900b: "Bu " -0x900c: "You " -0x900d: "Xiao " -0x900e: "Qiu " -0x900f: "Tou " -0x9010: "Zhu " -0x9011: "Qiu " -0x9012: "Di " -0x9013: "Di " -0x9014: "Tu " -0x9015: "Jing " -0x9016: "Ti " -0x9017: "Dou " -0x9018: "Yi " -0x9019: "Zhe " -0x901a: "Tong " -0x901b: "Guang " -0x901c: "Wu " -0x901d: "Shi " -0x901e: "Cheng " -0x901f: "Su " -0x9020: "Zao " -0x9021: "Qun " -0x9022: "Feng " -0x9023: "Lian " -0x9024: "Suo " -0x9025: "Hui " -0x9026: "Li " -0x9027: "Sako " -0x9028: "Lai " -0x9029: "Ben " -0x902a: "Cuo " -0x902b: "Jue " -0x902c: "Beng " -0x902d: "Huan " -0x902e: "Dai " -0x902f: "Lu " -0x9030: "You " -0x9031: "Zhou " -0x9032: "Jin " -0x9033: "Yu " -0x9034: "Chuo " -0x9035: "Kui " -0x9036: "Wei " -0x9037: "Ti " -0x9038: "Yi " -0x9039: "Da " -0x903a: "Yuan " -0x903b: "Luo " -0x903c: "Bi " -0x903d: "Nuo " -0x903e: "Yu " -0x903f: "Dang " -0x9040: "Sui " -0x9041: "Dun " -0x9042: "Sui " -0x9043: "Yan " -0x9044: "Chuan " -0x9045: "Chi " -0x9046: "Ti " -0x9047: "Yu " -0x9048: "Shi " -0x9049: "Zhen " -0x904a: "You " -0x904b: "Yun " -0x904c: "E " -0x904d: "Bian " -0x904e: "Guo " -0x904f: "E " -0x9050: "Xia " -0x9051: "Huang " -0x9052: "Qiu " -0x9053: "Dao " -0x9054: "Da " -0x9055: "Wei " -0x9056: "Appare " -0x9057: "Yi " -0x9058: "Gou " -0x9059: "Yao " -0x905a: "Chu " -0x905b: "Liu " -0x905c: "Xun " -0x905d: "Ta " -0x905e: "Di " -0x905f: "Chi " -0x9060: "Yuan " -0x9061: "Su " -0x9062: "Ta " -0x9063: "Qian " -0x9064: "[?] " -0x9065: "Yao " -0x9066: "Guan " -0x9067: "Zhang " -0x9068: "Ao " -0x9069: "Shi " -0x906a: "Ce " -0x906b: "Chi " -0x906c: "Su " -0x906d: "Zao " -0x906e: "Zhe " -0x906f: "Dun " -0x9070: "Di " -0x9071: "Lou " -0x9072: "Chi " -0x9073: "Cuo " -0x9074: "Lin " -0x9075: "Zun " -0x9076: "Rao " -0x9077: "Qian " -0x9078: "Xuan " -0x9079: "Yu " -0x907a: "Yi " -0x907b: "Wu " -0x907c: "Liao " -0x907d: "Ju " -0x907e: "Shi " -0x907f: "Bi " -0x9080: "Yao " -0x9081: "Mai " -0x9082: "Xie " -0x9083: "Sui " -0x9084: "Huan " -0x9085: "Zhan " -0x9086: "Teng " -0x9087: "Er " -0x9088: "Miao " -0x9089: "Bian " -0x908a: "Bian " -0x908b: "La " -0x908c: "Li " -0x908d: "Yuan " -0x908e: "Yao " -0x908f: "Luo " -0x9090: "Li " -0x9091: "Yi " -0x9092: "Ting " -0x9093: "Deng " -0x9094: "Qi " -0x9095: "Yong " -0x9096: "Shan " -0x9097: "Han " -0x9098: "Yu " -0x9099: "Mang " -0x909a: "Ru " -0x909b: "Qiong " -0x909c: "[?] " -0x909d: "Kuang " -0x909e: "Fu " -0x909f: "Kang " -0x90a0: "Bin " -0x90a1: "Fang " -0x90a2: "Xing " -0x90a3: "Na " -0x90a4: "Xin " -0x90a5: "Shen " -0x90a6: "Bang " -0x90a7: "Yuan " -0x90a8: "Cun " -0x90a9: "Huo " -0x90aa: "Xie " -0x90ab: "Bang " -0x90ac: "Wu " -0x90ad: "Ju " -0x90ae: "You " -0x90af: "Han " -0x90b0: "Tai " -0x90b1: "Qiu " -0x90b2: "Bi " -0x90b3: "Pei " -0x90b4: "Bing " -0x90b5: "Shao " -0x90b6: "Bei " -0x90b7: "Wa " -0x90b8: "Di " -0x90b9: "Zou " -0x90ba: "Ye " -0x90bb: "Lin " -0x90bc: "Kuang " -0x90bd: "Gui " -0x90be: "Zhu " -0x90bf: "Shi " -0x90c0: "Ku " -0x90c1: "Yu " -0x90c2: "Gai " -0x90c3: "Ge " -0x90c4: "Xi " -0x90c5: "Zhi " -0x90c6: "Ji " -0x90c7: "Xun " -0x90c8: "Hou " -0x90c9: "Xing " -0x90ca: "Jiao " -0x90cb: "Xi " -0x90cc: "Gui " -0x90cd: "Nuo " -0x90ce: "Lang " -0x90cf: "Jia " -0x90d0: "Kuai " -0x90d1: "Zheng " -0x90d2: "Otoko " -0x90d3: "Yun " -0x90d4: "Yan " -0x90d5: "Cheng " -0x90d6: "Dou " -0x90d7: "Chi " -0x90d8: "Lu " -0x90d9: "Fu " -0x90da: "Wu " -0x90db: "Fu " -0x90dc: "Gao " -0x90dd: "Hao " -0x90de: "Lang " -0x90df: "Jia " -0x90e0: "Geng " -0x90e1: "Jun " -0x90e2: "Ying " -0x90e3: "Bo " -0x90e4: "Xi " -0x90e5: "Bei " -0x90e6: "Li " -0x90e7: "Yun " -0x90e8: "Bu " -0x90e9: "Xiao " -0x90ea: "Qi " -0x90eb: "Pi " -0x90ec: "Qing " -0x90ed: "Guo " -0x90ee: "Zhou " -0x90ef: "Tan " -0x90f0: "Zou " -0x90f1: "Ping " -0x90f2: "Lai " -0x90f3: "Ni " -0x90f4: "Chen " -0x90f5: "You " -0x90f6: "Bu " -0x90f7: "Xiang " -0x90f8: "Dan " -0x90f9: "Ju " -0x90fa: "Yong " -0x90fb: "Qiao " -0x90fc: "Yi " -0x90fd: "Du " -0x90fe: "Yan " -0x90ff: "Mei " -/* x091 */ -0x9100: "Ruo " -0x9101: "Bei " -0x9102: "E " -0x9103: "Yu " -0x9104: "Juan " -0x9105: "Yu " -0x9106: "Yun " -0x9107: "Hou " -0x9108: "Kui " -0x9109: "Xiang " -0x910a: "Xiang " -0x910b: "Sou " -0x910c: "Tang " -0x910d: "Ming " -0x910e: "Xi " -0x910f: "Ru " -0x9110: "Chu " -0x9111: "Zi " -0x9112: "Zou " -0x9113: "Ju " -0x9114: "Wu " -0x9115: "Xiang " -0x9116: "Yun " -0x9117: "Hao " -0x9118: "Yong " -0x9119: "Bi " -0x911a: "Mo " -0x911b: "Chao " -0x911c: "Fu " -0x911d: "Liao " -0x911e: "Yin " -0x911f: "Zhuan " -0x9120: "Hu " -0x9121: "Qiao " -0x9122: "Yan " -0x9123: "Zhang " -0x9124: "Fan " -0x9125: "Qiao " -0x9126: "Xu " -0x9127: "Deng " -0x9128: "Bi " -0x9129: "Xin " -0x912a: "Bi " -0x912b: "Ceng " -0x912c: "Wei " -0x912d: "Zheng " -0x912e: "Mao " -0x912f: "Shan " -0x9130: "Lin " -0x9131: "Po " -0x9132: "Dan " -0x9133: "Meng " -0x9134: "Ye " -0x9135: "Cao " -0x9136: "Kuai " -0x9137: "Feng " -0x9138: "Meng " -0x9139: "Zou " -0x913a: "Kuang " -0x913b: "Lian " -0x913c: "Zan " -0x913d: "Chan " -0x913e: "You " -0x913f: "Qi " -0x9140: "Yan " -0x9141: "Chan " -0x9142: "Zan " -0x9143: "Ling " -0x9144: "Huan " -0x9145: "Xi " -0x9146: "Feng " -0x9147: "Zan " -0x9148: "Li " -0x9149: "You " -0x914a: "Ding " -0x914b: "Qiu " -0x914c: "Zhuo " -0x914d: "Pei " -0x914e: "Zhou " -0x914f: "Yi " -0x9150: "Hang " -0x9151: "Yu " -0x9152: "Jiu " -0x9153: "Yan " -0x9154: "Zui " -0x9155: "Mao " -0x9156: "Dan " -0x9157: "Xu " -0x9158: "Tou " -0x9159: "Zhen " -0x915a: "Fen " -0x915b: "Sakenomoto " -0x915c: "[?] " -0x915d: "Yun " -0x915e: "Tai " -0x915f: "Tian " -0x9160: "Qia " -0x9161: "Tuo " -0x9162: "Zuo " -0x9163: "Han " -0x9164: "Gu " -0x9165: "Su " -0x9166: "Po " -0x9167: "Chou " -0x9168: "Zai " -0x9169: "Ming " -0x916a: "Luo " -0x916b: "Chuo " -0x916c: "Chou " -0x916d: "You " -0x916e: "Tong " -0x916f: "Zhi " -0x9170: "Xian " -0x9171: "Jiang " -0x9172: "Cheng " -0x9173: "Yin " -0x9174: "Tu " -0x9175: "Xiao " -0x9176: "Mei " -0x9177: "Ku " -0x9178: "Suan " -0x9179: "Lei " -0x917a: "Pu " -0x917b: "Zui " -0x917c: "Hai " -0x917d: "Yan " -0x917e: "Xi " -0x917f: "Niang " -0x9180: "Wei " -0x9181: "Lu " -0x9182: "Lan " -0x9183: "Yan " -0x9184: "Tao " -0x9185: "Pei " -0x9186: "Zhan " -0x9187: "Chun " -0x9188: "Tan " -0x9189: "Zui " -0x918a: "Chuo " -0x918b: "Cu " -0x918c: "Kun " -0x918d: "Ti " -0x918e: "Mian " -0x918f: "Du " -0x9190: "Hu " -0x9191: "Xu " -0x9192: "Xing " -0x9193: "Tan " -0x9194: "Jiu " -0x9195: "Chun " -0x9196: "Yun " -0x9197: "Po " -0x9198: "Ke " -0x9199: "Sou " -0x919a: "Mi " -0x919b: "Quan " -0x919c: "Chou " -0x919d: "Cuo " -0x919e: "Yun " -0x919f: "Yong " -0x91a0: "Ang " -0x91a1: "Zha " -0x91a2: "Hai " -0x91a3: "Tang " -0x91a4: "Jiang " -0x91a5: "Piao " -0x91a6: "Shan " -0x91a7: "Yu " -0x91a8: "Li " -0x91a9: "Zao " -0x91aa: "Lao " -0x91ab: "Yi " -0x91ac: "Jiang " -0x91ad: "Pu " -0x91ae: "Jiao " -0x91af: "Xi " -0x91b0: "Tan " -0x91b1: "Po " -0x91b2: "Nong " -0x91b3: "Yi " -0x91b4: "Li " -0x91b5: "Ju " -0x91b6: "Jiao " -0x91b7: "Yi " -0x91b8: "Niang " -0x91b9: "Ru " -0x91ba: "Xun " -0x91bb: "Chou " -0x91bc: "Yan " -0x91bd: "Ling " -0x91be: "Mi " -0x91bf: "Mi " -0x91c0: "Niang " -0x91c1: "Xin " -0x91c2: "Jiao " -0x91c3: "Xi " -0x91c4: "Mi " -0x91c5: "Yan " -0x91c6: "Bian " -0x91c7: "Cai " -0x91c8: "Shi " -0x91c9: "You " -0x91ca: "Shi " -0x91cb: "Shi " -0x91cc: "Li " -0x91cd: "Zhong " -0x91ce: "Ye " -0x91cf: "Liang " -0x91d0: "Li " -0x91d1: "Jin " -0x91d2: "Jin " -0x91d3: "Qiu " -0x91d4: "Yi " -0x91d5: "Diao " -0x91d6: "Dao " -0x91d7: "Zhao " -0x91d8: "Ding " -0x91d9: "Po " -0x91da: "Qiu " -0x91db: "He " -0x91dc: "Fu " -0x91dd: "Zhen " -0x91de: "Zhi " -0x91df: "Ba " -0x91e0: "Luan " -0x91e1: "Fu " -0x91e2: "Nai " -0x91e3: "Diao " -0x91e4: "Shan " -0x91e5: "Qiao " -0x91e6: "Kou " -0x91e7: "Chuan " -0x91e8: "Zi " -0x91e9: "Fan " -0x91ea: "Yu " -0x91eb: "Hua " -0x91ec: "Han " -0x91ed: "Gong " -0x91ee: "Qi " -0x91ef: "Mang " -0x91f0: "Ri " -0x91f1: "Di " -0x91f2: "Si " -0x91f3: "Xi " -0x91f4: "Yi " -0x91f5: "Chai " -0x91f6: "Shi " -0x91f7: "Tu " -0x91f8: "Xi " -0x91f9: "Nu " -0x91fa: "Qian " -0x91fb: "Ishiyumi " -0x91fc: "Jian " -0x91fd: "Pi " -0x91fe: "Ye " -0x91ff: "Yin " -/* x092 */ -0x9200: "Ba " -0x9201: "Fang " -0x9202: "Chen " -0x9203: "Xing " -0x9204: "Tou " -0x9205: "Yue " -0x9206: "Yan " -0x9207: "Fu " -0x9208: "Pi " -0x9209: "Na " -0x920a: "Xin " -0x920b: "E " -0x920c: "Jue " -0x920d: "Dun " -0x920e: "Gou " -0x920f: "Yin " -0x9210: "Qian " -0x9211: "Ban " -0x9212: "Ji " -0x9213: "Ren " -0x9214: "Chao " -0x9215: "Niu " -0x9216: "Fen " -0x9217: "Yun " -0x9218: "Ji " -0x9219: "Qin " -0x921a: "Pi " -0x921b: "Guo " -0x921c: "Hong " -0x921d: "Yin " -0x921e: "Jun " -0x921f: "Shi " -0x9220: "Yi " -0x9221: "Zhong " -0x9222: "Nie " -0x9223: "Gai " -0x9224: "Ri " -0x9225: "Huo " -0x9226: "Tai " -0x9227: "Kang " -0x9228: "Habaki " -0x9229: "Irori " -0x922a: "Ngaak " -0x922b: "[?] " -0x922c: "Duo " -0x922d: "Zi " -0x922e: "Ni " -0x922f: "Tu " -0x9230: "Shi " -0x9231: "Min " -0x9232: "Gu " -0x9233: "E " -0x9234: "Ling " -0x9235: "Bing " -0x9236: "Yi " -0x9237: "Gu " -0x9238: "Ba " -0x9239: "Pi " -0x923a: "Yu " -0x923b: "Si " -0x923c: "Zuo " -0x923d: "Bu " -0x923e: "You " -0x923f: "Dian " -0x9240: "Jia " -0x9241: "Zhen " -0x9242: "Shi " -0x9243: "Shi " -0x9244: "Tie " -0x9245: "Ju " -0x9246: "Zhan " -0x9247: "Shi " -0x9248: "She " -0x9249: "Xuan " -0x924a: "Zhao " -0x924b: "Bao " -0x924c: "He " -0x924d: "Bi " -0x924e: "Sheng " -0x924f: "Chu " -0x9250: "Shi " -0x9251: "Bo " -0x9252: "Zhu " -0x9253: "Chi " -0x9254: "Za " -0x9255: "Po " -0x9256: "Tong " -0x9257: "Qian " -0x9258: "Fu " -0x9259: "Zhai " -0x925a: "Liu " -0x925b: "Qian " -0x925c: "Fu " -0x925d: "Li " -0x925e: "Yue " -0x925f: "Pi " -0x9260: "Yang " -0x9261: "Ban " -0x9262: "Bo " -0x9263: "Jie " -0x9264: "Gou " -0x9265: "Shu " -0x9266: "Zheng " -0x9267: "Mu " -0x9268: "Ni " -0x9269: "Nie " -0x926a: "Di " -0x926b: "Jia " -0x926c: "Mu " -0x926d: "Dan " -0x926e: "Shen " -0x926f: "Yi " -0x9270: "Si " -0x9271: "Kuang " -0x9272: "Ka " -0x9273: "Bei " -0x9274: "Jian " -0x9275: "Tong " -0x9276: "Xing " -0x9277: "Hong " -0x9278: "Jiao " -0x9279: "Chi " -0x927a: "Er " -0x927b: "Ge " -0x927c: "Bing " -0x927d: "Shi " -0x927e: "Mou " -0x927f: "Jia " -0x9280: "Yin " -0x9281: "Jun " -0x9282: "Zhou " -0x9283: "Chong " -0x9284: "Shang " -0x9285: "Tong " -0x9286: "Mo " -0x9287: "Lei " -0x9288: "Ji " -0x9289: "Yu " -0x928a: "Xu " -0x928b: "Ren " -0x928c: "Zun " -0x928d: "Zhi " -0x928e: "Qiong " -0x928f: "Shan " -0x9290: "Chi " -0x9291: "Xian " -0x9292: "Xing " -0x9293: "Quan " -0x9294: "Pi " -0x9295: "Tie " -0x9296: "Zhu " -0x9297: "Hou " -0x9298: "Ming " -0x9299: "Kua " -0x929a: "Yao " -0x929b: "Xian " -0x929c: "Xian " -0x929d: "Xiu " -0x929e: "Jun " -0x929f: "Cha " -0x92a0: "Lao " -0x92a1: "Ji " -0x92a2: "Pi " -0x92a3: "Ru " -0x92a4: "Mi " -0x92a5: "Yi " -0x92a6: "Yin " -0x92a7: "Guang " -0x92a8: "An " -0x92a9: "Diou " -0x92aa: "You " -0x92ab: "Se " -0x92ac: "Kao " -0x92ad: "Qian " -0x92ae: "Luan " -0x92af: "Kasugai " -0x92b0: "Ai " -0x92b1: "Diao " -0x92b2: "Han " -0x92b3: "Rui " -0x92b4: "Shi " -0x92b5: "Keng " -0x92b6: "Qiu " -0x92b7: "Xiao " -0x92b8: "Zhe " -0x92b9: "Xiu " -0x92ba: "Zang " -0x92bb: "Ti " -0x92bc: "Cuo " -0x92bd: "Gua " -0x92be: "Gong " -0x92bf: "Zhong " -0x92c0: "Dou " -0x92c1: "Lu " -0x92c2: "Mei " -0x92c3: "Lang " -0x92c4: "Wan " -0x92c5: "Xin " -0x92c6: "Yun " -0x92c7: "Bei " -0x92c8: "Wu " -0x92c9: "Su " -0x92ca: "Yu " -0x92cb: "Chan " -0x92cc: "Ting " -0x92cd: "Bo " -0x92ce: "Han " -0x92cf: "Jia " -0x92d0: "Hong " -0x92d1: "Cuan " -0x92d2: "Feng " -0x92d3: "Chan " -0x92d4: "Wan " -0x92d5: "Zhi " -0x92d6: "Si " -0x92d7: "Xuan " -0x92d8: "Wu " -0x92d9: "Wu " -0x92da: "Tiao " -0x92db: "Gong " -0x92dc: "Zhuo " -0x92dd: "Lue " -0x92de: "Xing " -0x92df: "Qian " -0x92e0: "Shen " -0x92e1: "Han " -0x92e2: "Lue " -0x92e3: "Xie " -0x92e4: "Chu " -0x92e5: "Zheng " -0x92e6: "Ju " -0x92e7: "Xian " -0x92e8: "Tie " -0x92e9: "Mang " -0x92ea: "Pu " -0x92eb: "Li " -0x92ec: "Pan " -0x92ed: "Rui " -0x92ee: "Cheng " -0x92ef: "Gao " -0x92f0: "Li " -0x92f1: "Te " -0x92f2: "Pyeng " -0x92f3: "Zhu " -0x92f4: "[?] " -0x92f5: "Tu " -0x92f6: "Liu " -0x92f7: "Zui " -0x92f8: "Ju " -0x92f9: "Chang " -0x92fa: "Yuan " -0x92fb: "Jian " -0x92fc: "Gang " -0x92fd: "Diao " -0x92fe: "Tao " -0x92ff: "Chang " -/* x093 */ -0x9300: "Lun " -0x9301: "Kua " -0x9302: "Ling " -0x9303: "Bei " -0x9304: "Lu " -0x9305: "Li " -0x9306: "Qiang " -0x9307: "Pou " -0x9308: "Juan " -0x9309: "Min " -0x930a: "Zui " -0x930b: "Peng " -0x930c: "An " -0x930d: "Pi " -0x930e: "Xian " -0x930f: "Ya " -0x9310: "Zhui " -0x9311: "Lei " -0x9312: "A " -0x9313: "Kong " -0x9314: "Ta " -0x9315: "Kun " -0x9316: "Du " -0x9317: "Wei " -0x9318: "Chui " -0x9319: "Zi " -0x931a: "Zheng " -0x931b: "Ben " -0x931c: "Nie " -0x931d: "Cong " -0x931e: "Qun " -0x931f: "Tan " -0x9320: "Ding " -0x9321: "Qi " -0x9322: "Qian " -0x9323: "Zhuo " -0x9324: "Qi " -0x9325: "Yu " -0x9326: "Jin " -0x9327: "Guan " -0x9328: "Mao " -0x9329: "Chang " -0x932a: "Tian " -0x932b: "Xi " -0x932c: "Lian " -0x932d: "Tao " -0x932e: "Gu " -0x932f: "Cuo " -0x9330: "Shu " -0x9331: "Zhen " -0x9332: "Lu " -0x9333: "Meng " -0x9334: "Lu " -0x9335: "Hua " -0x9336: "Biao " -0x9337: "Ga " -0x9338: "Lai " -0x9339: "Ken " -0x933a: "Kazari " -0x933b: "Bu " -0x933c: "Nai " -0x933d: "Wan " -0x933e: "Zan " -0x933f: "[?] " -0x9340: "De " -0x9341: "Xian " -0x9342: "[?] " -0x9343: "Huo " -0x9344: "Liang " -0x9345: "[?] " -0x9346: "Men " -0x9347: "Kai " -0x9348: "Ying " -0x9349: "Di " -0x934a: "Lian " -0x934b: "Guo " -0x934c: "Xian " -0x934d: "Du " -0x934e: "Tu " -0x934f: "Wei " -0x9350: "Cong " -0x9351: "Fu " -0x9352: "Rou " -0x9353: "Ji " -0x9354: "E " -0x9355: "Rou " -0x9356: "Chen " -0x9357: "Ti " -0x9358: "Zha " -0x9359: "Hong " -0x935a: "Yang " -0x935b: "Duan " -0x935c: "Xia " -0x935d: "Yu " -0x935e: "Keng " -0x935f: "Xing " -0x9360: "Huang " -0x9361: "Wei " -0x9362: "Fu " -0x9363: "Zhao " -0x9364: "Cha " -0x9365: "Qie " -0x9366: "She " -0x9367: "Hong " -0x9368: "Kui " -0x9369: "Tian " -0x936a: "Mou " -0x936b: "Qiao " -0x936c: "Qiao " -0x936d: "Hou " -0x936e: "Tou " -0x936f: "Cong " -0x9370: "Huan " -0x9371: "Ye " -0x9372: "Min " -0x9373: "Jian " -0x9374: "Duan " -0x9375: "Jian " -0x9376: "Song " -0x9377: "Kui " -0x9378: "Hu " -0x9379: "Xuan " -0x937a: "Duo " -0x937b: "Jie " -0x937c: "Zhen " -0x937d: "Bian " -0x937e: "Zhong " -0x937f: "Zi " -0x9380: "Xiu " -0x9381: "Ye " -0x9382: "Mei " -0x9383: "Pai " -0x9384: "Ai " -0x9385: "Jie " -0x9386: "[?] " -0x9387: "Mei " -0x9388: "Chuo " -0x9389: "Ta " -0x938a: "Bang " -0x938b: "Xia " -0x938c: "Lian " -0x938d: "Suo " -0x938e: "Xi " -0x938f: "Liu " -0x9390: "Zu " -0x9391: "Ye " -0x9392: "Nou " -0x9393: "Weng " -0x9394: "Rong " -0x9395: "Tang " -0x9396: "Suo " -0x9397: "Qiang " -0x9398: "Ge " -0x9399: "Shuo " -0x939a: "Chui " -0x939b: "Bo " -0x939c: "Pan " -0x939d: "Sa " -0x939e: "Bi " -0x939f: "Sang " -0x93a0: "Gang " -0x93a1: "Zi " -0x93a2: "Wu " -0x93a3: "Ying " -0x93a4: "Huang " -0x93a5: "Tiao " -0x93a6: "Liu " -0x93a7: "Kai " -0x93a8: "Sun " -0x93a9: "Sha " -0x93aa: "Sou " -0x93ab: "Wan " -0x93ac: "Hao " -0x93ad: "Zhen " -0x93ae: "Zhen " -0x93af: "Luo " -0x93b0: "Yi " -0x93b1: "Yuan " -0x93b2: "Tang " -0x93b3: "Nie " -0x93b4: "Xi " -0x93b5: "Jia " -0x93b6: "Ge " -0x93b7: "Ma " -0x93b8: "Juan " -0x93b9: "Kasugai " -0x93ba: "Habaki " -0x93bb: "Suo " -0x93bc: "[?] " -0x93bd: "[?] " -0x93be: "[?] " -0x93bf: "Na " -0x93c0: "Lu " -0x93c1: "Suo " -0x93c2: "Ou " -0x93c3: "Zu " -0x93c4: "Tuan " -0x93c5: "Xiu " -0x93c6: "Guan " -0x93c7: "Xuan " -0x93c8: "Lian " -0x93c9: "Shou " -0x93ca: "Ao " -0x93cb: "Man " -0x93cc: "Mo " -0x93cd: "Luo " -0x93ce: "Bi " -0x93cf: "Wei " -0x93d0: "Liu " -0x93d1: "Di " -0x93d2: "Qiao " -0x93d3: "Cong " -0x93d4: "Yi " -0x93d5: "Lu " -0x93d6: "Ao " -0x93d7: "Keng " -0x93d8: "Qiang " -0x93d9: "Cui " -0x93da: "Qi " -0x93db: "Chang " -0x93dc: "Tang " -0x93dd: "Man " -0x93de: "Yong " -0x93df: "Chan " -0x93e0: "Feng " -0x93e1: "Jing " -0x93e2: "Biao " -0x93e3: "Shu " -0x93e4: "Lou " -0x93e5: "Xiu " -0x93e6: "Cong " -0x93e7: "Long " -0x93e8: "Zan " -0x93e9: "Jian " -0x93ea: "Cao " -0x93eb: "Li " -0x93ec: "Xia " -0x93ed: "Xi " -0x93ee: "Kang " -0x93ef: "[?] " -0x93f0: "Beng " -0x93f1: "[?] " -0x93f2: "[?] " -0x93f3: "Zheng " -0x93f4: "Lu " -0x93f5: "Hua " -0x93f6: "Ji " -0x93f7: "Pu " -0x93f8: "Hui " -0x93f9: "Qiang " -0x93fa: "Po " -0x93fb: "Lin " -0x93fc: "Suo " -0x93fd: "Xiu " -0x93fe: "San " -0x93ff: "Cheng " -/* x094 */ -0x9400: "Kui " -0x9401: "Si " -0x9402: "Liu " -0x9403: "Nao " -0x9404: "Heng " -0x9405: "Pie " -0x9406: "Sui " -0x9407: "Fan " -0x9408: "Qiao " -0x9409: "Quan " -0x940a: "Yang " -0x940b: "Tang " -0x940c: "Xiang " -0x940d: "Jue " -0x940e: "Jiao " -0x940f: "Zun " -0x9410: "Liao " -0x9411: "Jie " -0x9412: "Lao " -0x9413: "Dui " -0x9414: "Tan " -0x9415: "Zan " -0x9416: "Ji " -0x9417: "Jian " -0x9418: "Zhong " -0x9419: "Deng " -0x941a: "Ya " -0x941b: "Ying " -0x941c: "Dui " -0x941d: "Jue " -0x941e: "Nou " -0x941f: "Ti " -0x9420: "Pu " -0x9421: "Tie " -0x9422: "[?] " -0x9423: "[?] " -0x9424: "Ding " -0x9425: "Shan " -0x9426: "Kai " -0x9427: "Jian " -0x9428: "Fei " -0x9429: "Sui " -0x942a: "Lu " -0x942b: "Juan " -0x942c: "Hui " -0x942d: "Yu " -0x942e: "Lian " -0x942f: "Zhuo " -0x9430: "Qiao " -0x9431: "Qian " -0x9432: "Zhuo " -0x9433: "Lei " -0x9434: "Bi " -0x9435: "Tie " -0x9436: "Huan " -0x9437: "Ye " -0x9438: "Duo " -0x9439: "Guo " -0x943a: "Dang " -0x943b: "Ju " -0x943c: "Fen " -0x943d: "Da " -0x943e: "Bei " -0x943f: "Yi " -0x9440: "Ai " -0x9441: "Zong " -0x9442: "Xun " -0x9443: "Diao " -0x9444: "Zhu " -0x9445: "Heng " -0x9446: "Zhui " -0x9447: "Ji " -0x9448: "Nie " -0x9449: "Ta " -0x944a: "Huo " -0x944b: "Qing " -0x944c: "Bin " -0x944d: "Ying " -0x944e: "Kui " -0x944f: "Ning " -0x9450: "Xu " -0x9451: "Jian " -0x9452: "Jian " -0x9453: "Yari " -0x9454: "Cha " -0x9455: "Zhi " -0x9456: "Mie " -0x9457: "Li " -0x9458: "Lei " -0x9459: "Ji " -0x945a: "Zuan " -0x945b: "Kuang " -0x945c: "Shang " -0x945d: "Peng " -0x945e: "La " -0x945f: "Du " -0x9460: "Shuo " -0x9461: "Chuo " -0x9462: "Lu " -0x9463: "Biao " -0x9464: "Bao " -0x9465: "Lu " -0x9466: "[?] " -0x9467: "[?] " -0x9468: "Long " -0x9469: "E " -0x946a: "Lu " -0x946b: "Xin " -0x946c: "Jian " -0x946d: "Lan " -0x946e: "Bo " -0x946f: "Jian " -0x9470: "Yao " -0x9471: "Chan " -0x9472: "Xiang " -0x9473: "Jian " -0x9474: "Xi " -0x9475: "Guan " -0x9476: "Cang " -0x9477: "Nie " -0x9478: "Lei " -0x9479: "Cuan " -0x947a: "Qu " -0x947b: "Pan " -0x947c: "Luo " -0x947d: "Zuan " -0x947e: "Luan " -0x947f: "Zao " -0x9480: "Nie " -0x9481: "Jue " -0x9482: "Tang " -0x9483: "Shu " -0x9484: "Lan " -0x9485: "Jin " -0x9486: "Qiu " -0x9487: "Yi " -0x9488: "Zhen " -0x9489: "Ding " -0x948a: "Zhao " -0x948b: "Po " -0x948c: "Diao " -0x948d: "Tu " -0x948e: "Qian " -0x948f: "Chuan " -0x9490: "Shan " -0x9491: "Ji " -0x9492: "Fan " -0x9493: "Diao " -0x9494: "Men " -0x9495: "Nu " -0x9496: "Xi " -0x9497: "Chai " -0x9498: "Xing " -0x9499: "Gai " -0x949a: "Bu " -0x949b: "Tai " -0x949c: "Ju " -0x949d: "Dun " -0x949e: "Chao " -0x949f: "Zhong " -0x94a0: "Na " -0x94a1: "Bei " -0x94a2: "Gang " -0x94a3: "Ban " -0x94a4: "Qian " -0x94a5: "Yao " -0x94a6: "Qin " -0x94a7: "Jun " -0x94a8: "Wu " -0x94a9: "Gou " -0x94aa: "Kang " -0x94ab: "Fang " -0x94ac: "Huo " -0x94ad: "Tou " -0x94ae: "Niu " -0x94af: "Ba " -0x94b0: "Yu " -0x94b1: "Qian " -0x94b2: "Zheng " -0x94b3: "Qian " -0x94b4: "Gu " -0x94b5: "Bo " -0x94b6: "E " -0x94b7: "Po " -0x94b8: "Bu " -0x94b9: "Ba " -0x94ba: "Yue " -0x94bb: "Zuan " -0x94bc: "Mu " -0x94bd: "Dan " -0x94be: "Jia " -0x94bf: "Dian " -0x94c0: "You " -0x94c1: "Tie " -0x94c2: "Bo " -0x94c3: "Ling " -0x94c4: "Shuo " -0x94c5: "Qian " -0x94c6: "Liu " -0x94c7: "Bao " -0x94c8: "Shi " -0x94c9: "Xuan " -0x94ca: "She " -0x94cb: "Bi " -0x94cc: "Ni " -0x94cd: "Pi " -0x94ce: "Duo " -0x94cf: "Xing " -0x94d0: "Kao " -0x94d1: "Lao " -0x94d2: "Er " -0x94d3: "Mang " -0x94d4: "Ya " -0x94d5: "You " -0x94d6: "Cheng " -0x94d7: "Jia " -0x94d8: "Ye " -0x94d9: "Nao " -0x94da: "Zhi " -0x94db: "Dang " -0x94dc: "Tong " -0x94dd: "Lu " -0x94de: "Diao " -0x94df: "Yin " -0x94e0: "Kai " -0x94e1: "Zha " -0x94e2: "Zhu " -0x94e3: "Xian " -0x94e4: "Ting " -0x94e5: "Diu " -0x94e6: "Xian " -0x94e7: "Hua " -0x94e8: "Quan " -0x94e9: "Sha " -0x94ea: "Jia " -0x94eb: "Yao " -0x94ec: "Ge " -0x94ed: "Ming " -0x94ee: "Zheng " -0x94ef: "Se " -0x94f0: "Jiao " -0x94f1: "Yi " -0x94f2: "Chan " -0x94f3: "Chong " -0x94f4: "Tang " -0x94f5: "An " -0x94f6: "Yin " -0x94f7: "Ru " -0x94f8: "Zhu " -0x94f9: "Lao " -0x94fa: "Pu " -0x94fb: "Wu " -0x94fc: "Lai " -0x94fd: "Te " -0x94fe: "Lian " -0x94ff: "Keng " -/* x095 */ -0x9500: "Xiao " -0x9501: "Suo " -0x9502: "Li " -0x9503: "Zheng " -0x9504: "Chu " -0x9505: "Guo " -0x9506: "Gao " -0x9507: "Tie " -0x9508: "Xiu " -0x9509: "Cuo " -0x950a: "Lue " -0x950b: "Feng " -0x950c: "Xin " -0x950d: "Liu " -0x950e: "Kai " -0x950f: "Jian " -0x9510: "Rui " -0x9511: "Ti " -0x9512: "Lang " -0x9513: "Qian " -0x9514: "Ju " -0x9515: "A " -0x9516: "Qiang " -0x9517: "Duo " -0x9518: "Tian " -0x9519: "Cuo " -0x951a: "Mao " -0x951b: "Ben " -0x951c: "Qi " -0x951d: "De " -0x951e: "Kua " -0x951f: "Kun " -0x9520: "Chang " -0x9521: "Xi " -0x9522: "Gu " -0x9523: "Luo " -0x9524: "Chui " -0x9525: "Zhui " -0x9526: "Jin " -0x9527: "Zhi " -0x9528: "Xian " -0x9529: "Juan " -0x952a: "Huo " -0x952b: "Pou " -0x952c: "Tan " -0x952d: "Ding " -0x952e: "Jian " -0x952f: "Ju " -0x9530: "Meng " -0x9531: "Zi " -0x9532: "Qie " -0x9533: "Ying " -0x9534: "Kai " -0x9535: "Qiang " -0x9536: "Song " -0x9537: "E " -0x9538: "Cha " -0x9539: "Qiao " -0x953a: "Zhong " -0x953b: "Duan " -0x953c: "Sou " -0x953d: "Huang " -0x953e: "Huan " -0x953f: "Ai " -0x9540: "Du " -0x9541: "Mei " -0x9542: "Lou " -0x9543: "Zi " -0x9544: "Fei " -0x9545: "Mei " -0x9546: "Mo " -0x9547: "Zhen " -0x9548: "Bo " -0x9549: "Ge " -0x954a: "Nie " -0x954b: "Tang " -0x954c: "Juan " -0x954d: "Nie " -0x954e: "Na " -0x954f: "Liu " -0x9550: "Hao " -0x9551: "Bang " -0x9552: "Yi " -0x9553: "Jia " -0x9554: "Bin " -0x9555: "Rong " -0x9556: "Biao " -0x9557: "Tang " -0x9558: "Man " -0x9559: "Luo " -0x955a: "Beng " -0x955b: "Yong " -0x955c: "Jing " -0x955d: "Di " -0x955e: "Zu " -0x955f: "Xuan " -0x9560: "Liu " -0x9561: "Tan " -0x9562: "Jue " -0x9563: "Liao " -0x9564: "Pu " -0x9565: "Lu " -0x9566: "Dui " -0x9567: "Lan " -0x9568: "Pu " -0x9569: "Cuan " -0x956a: "Qiang " -0x956b: "Deng " -0x956c: "Huo " -0x956d: "Lei " -0x956e: "Huan " -0x956f: "Zhuo " -0x9570: "Lian " -0x9571: "Yi " -0x9572: "Cha " -0x9573: "Biao " -0x9574: "La " -0x9575: "Chan " -0x9576: "Xiang " -0x9577: "Chang " -0x9578: "Chang " -0x9579: "Jiu " -0x957a: "Ao " -0x957b: "Die " -0x957c: "Qu " -0x957d: "Liao " -0x957e: "Mi " -0x957f: "Chang " -0x9580: "Men " -0x9581: "Ma " -0x9582: "Shuan " -0x9583: "Shan " -0x9584: "Huo " -0x9585: "Men " -0x9586: "Yan " -0x9587: "Bi " -0x9588: "Han " -0x9589: "Bi " -0x958a: "San " -0x958b: "Kai " -0x958c: "Kang " -0x958d: "Beng " -0x958e: "Hong " -0x958f: "Run " -0x9590: "San " -0x9591: "Xian " -0x9592: "Xian " -0x9593: "Jian " -0x9594: "Min " -0x9595: "Xia " -0x9596: "Yuru " -0x9597: "Dou " -0x9598: "Zha " -0x9599: "Nao " -0x959a: "Jian " -0x959b: "Peng " -0x959c: "Xia " -0x959d: "Ling " -0x959e: "Bian " -0x959f: "Bi " -0x95a0: "Run " -0x95a1: "He " -0x95a2: "Guan " -0x95a3: "Ge " -0x95a4: "Ge " -0x95a5: "Fa " -0x95a6: "Chu " -0x95a7: "Hong " -0x95a8: "Gui " -0x95a9: "Min " -0x95aa: "Se " -0x95ab: "Kun " -0x95ac: "Lang " -0x95ad: "Lu " -0x95ae: "Ting " -0x95af: "Sha " -0x95b0: "Ju " -0x95b1: "Yue " -0x95b2: "Yue " -0x95b3: "Chan " -0x95b4: "Qu " -0x95b5: "Lin " -0x95b6: "Chang " -0x95b7: "Shai " -0x95b8: "Kun " -0x95b9: "Yan " -0x95ba: "Min " -0x95bb: "Yan " -0x95bc: "E " -0x95bd: "Hun " -0x95be: "Yu " -0x95bf: "Wen " -0x95c0: "Xiang " -0x95c1: "Bao " -0x95c2: "Xiang " -0x95c3: "Qu " -0x95c4: "Yao " -0x95c5: "Wen " -0x95c6: "Ban " -0x95c7: "An " -0x95c8: "Wei " -0x95c9: "Yin " -0x95ca: "Kuo " -0x95cb: "Que " -0x95cc: "Lan " -0x95cd: "Du " -0x95ce: "[?] " -0x95cf: "Phwung " -0x95d0: "Tian " -0x95d1: "Nie " -0x95d2: "Ta " -0x95d3: "Kai " -0x95d4: "He " -0x95d5: "Que " -0x95d6: "Chuang " -0x95d7: "Guan " -0x95d8: "Dou " -0x95d9: "Qi " -0x95da: "Kui " -0x95db: "Tang " -0x95dc: "Guan " -0x95dd: "Piao " -0x95de: "Kan " -0x95df: "Xi " -0x95e0: "Hui " -0x95e1: "Chan " -0x95e2: "Pi " -0x95e3: "Dang " -0x95e4: "Huan " -0x95e5: "Ta " -0x95e6: "Wen " -0x95e7: "[?] " -0x95e8: "Men " -0x95e9: "Shuan " -0x95ea: "Shan " -0x95eb: "Yan " -0x95ec: "Han " -0x95ed: "Bi " -0x95ee: "Wen " -0x95ef: "Chuang " -0x95f0: "Run " -0x95f1: "Wei " -0x95f2: "Xian " -0x95f3: "Hong " -0x95f4: "Jian " -0x95f5: "Min " -0x95f6: "Kang " -0x95f7: "Men " -0x95f8: "Zha " -0x95f9: "Nao " -0x95fa: "Gui " -0x95fb: "Wen " -0x95fc: "Ta " -0x95fd: "Min " -0x95fe: "Lu " -0x95ff: "Kai " -/* x096 */ -0x9600: "Fa " -0x9601: "Ge " -0x9602: "He " -0x9603: "Kun " -0x9604: "Jiu " -0x9605: "Yue " -0x9606: "Lang " -0x9607: "Du " -0x9608: "Yu " -0x9609: "Yan " -0x960a: "Chang " -0x960b: "Xi " -0x960c: "Wen " -0x960d: "Hun " -0x960e: "Yan " -0x960f: "E " -0x9610: "Chan " -0x9611: "Lan " -0x9612: "Qu " -0x9613: "Hui " -0x9614: "Kuo " -0x9615: "Que " -0x9616: "Ge " -0x9617: "Tian " -0x9618: "Ta " -0x9619: "Que " -0x961a: "Kan " -0x961b: "Huan " -0x961c: "Fu " -0x961d: "Fu " -0x961e: "Le " -0x961f: "Dui " -0x9620: "Xin " -0x9621: "Qian " -0x9622: "Wu " -0x9623: "Yi " -0x9624: "Tuo " -0x9625: "Yin " -0x9626: "Yang " -0x9627: "Dou " -0x9628: "E " -0x9629: "Sheng " -0x962a: "Ban " -0x962b: "Pei " -0x962c: "Keng " -0x962d: "Yun " -0x962e: "Ruan " -0x962f: "Zhi " -0x9630: "Pi " -0x9631: "Jing " -0x9632: "Fang " -0x9633: "Yang " -0x9634: "Yin " -0x9635: "Zhen " -0x9636: "Jie " -0x9637: "Cheng " -0x9638: "E " -0x9639: "Qu " -0x963a: "Di " -0x963b: "Zu " -0x963c: "Zuo " -0x963d: "Dian " -0x963e: "Ling " -0x963f: "A " -0x9640: "Tuo " -0x9641: "Tuo " -0x9642: "Po " -0x9643: "Bing " -0x9644: "Fu " -0x9645: "Ji " -0x9646: "Lu " -0x9647: "Long " -0x9648: "Chen " -0x9649: "Xing " -0x964a: "Duo " -0x964b: "Lou " -0x964c: "Mo " -0x964d: "Jiang " -0x964e: "Shu " -0x964f: "Duo " -0x9650: "Xian " -0x9651: "Er " -0x9652: "Gui " -0x9653: "Yu " -0x9654: "Gai " -0x9655: "Shan " -0x9656: "Xun " -0x9657: "Qiao " -0x9658: "Xing " -0x9659: "Chun " -0x965a: "Fu " -0x965b: "Bi " -0x965c: "Xia " -0x965d: "Shan " -0x965e: "Sheng " -0x965f: "Zhi " -0x9660: "Pu " -0x9661: "Dou " -0x9662: "Yuan " -0x9663: "Zhen " -0x9664: "Chu " -0x9665: "Xian " -0x9666: "Tou " -0x9667: "Nie " -0x9668: "Yun " -0x9669: "Xian " -0x966a: "Pei " -0x966b: "Pei " -0x966c: "Zou " -0x966d: "Yi " -0x966e: "Dui " -0x966f: "Lun " -0x9670: "Yin " -0x9671: "Ju " -0x9672: "Chui " -0x9673: "Chen " -0x9674: "Pi " -0x9675: "Ling " -0x9676: "Tao " -0x9677: "Xian " -0x9678: "Lu " -0x9679: "Sheng " -0x967a: "Xian " -0x967b: "Yin " -0x967c: "Zhu " -0x967d: "Yang " -0x967e: "Reng " -0x967f: "Shan " -0x9680: "Chong " -0x9681: "Yan " -0x9682: "Yin " -0x9683: "Yu " -0x9684: "Ti " -0x9685: "Yu " -0x9686: "Long " -0x9687: "Wei " -0x9688: "Wei " -0x9689: "Nie " -0x968a: "Dui " -0x968b: "Sui " -0x968c: "An " -0x968d: "Huang " -0x968e: "Jie " -0x968f: "Sui " -0x9690: "Yin " -0x9691: "Gai " -0x9692: "Yan " -0x9693: "Hui " -0x9694: "Ge " -0x9695: "Yun " -0x9696: "Wu " -0x9697: "Wei " -0x9698: "Ai " -0x9699: "Xi " -0x969a: "Tang " -0x969b: "Ji " -0x969c: "Zhang " -0x969d: "Dao " -0x969e: "Ao " -0x969f: "Xi " -0x96a0: "Yin " -0x96a1: "[?] " -0x96a2: "Rao " -0x96a3: "Lin " -0x96a4: "Tui " -0x96a5: "Deng " -0x96a6: "Pi " -0x96a7: "Sui " -0x96a8: "Sui " -0x96a9: "Yu " -0x96aa: "Xian " -0x96ab: "Fen " -0x96ac: "Ni " -0x96ad: "Er " -0x96ae: "Ji " -0x96af: "Dao " -0x96b0: "Xi " -0x96b1: "Yin " -0x96b2: "E " -0x96b3: "Hui " -0x96b4: "Long " -0x96b5: "Xi " -0x96b6: "Li " -0x96b7: "Li " -0x96b8: "Li " -0x96b9: "Zhui " -0x96ba: "He " -0x96bb: "Zhi " -0x96bc: "Zhun " -0x96bd: "Jun " -0x96be: "Nan " -0x96bf: "Yi " -0x96c0: "Que " -0x96c1: "Yan " -0x96c2: "Qian " -0x96c3: "Ya " -0x96c4: "Xiong " -0x96c5: "Ya " -0x96c6: "Ji " -0x96c7: "Gu " -0x96c8: "Huan " -0x96c9: "Zhi " -0x96ca: "Gou " -0x96cb: "Jun " -0x96cc: "Ci " -0x96cd: "Yong " -0x96ce: "Ju " -0x96cf: "Chu " -0x96d0: "Hu " -0x96d1: "Za " -0x96d2: "Luo " -0x96d3: "Yu " -0x96d4: "Chou " -0x96d5: "Diao " -0x96d6: "Sui " -0x96d7: "Han " -0x96d8: "Huo " -0x96d9: "Shuang " -0x96da: "Guan " -0x96db: "Chu " -0x96dc: "Za " -0x96dd: "Yong " -0x96de: "Ji " -0x96df: "Xi " -0x96e0: "Chou " -0x96e1: "Liu " -0x96e2: "Li " -0x96e3: "Nan " -0x96e4: "Xue " -0x96e5: "Za " -0x96e6: "Ji " -0x96e7: "Ji " -0x96e8: "Yu " -0x96e9: "Yu " -0x96ea: "Xue " -0x96eb: "Na " -0x96ec: "Fou " -0x96ed: "Se " -0x96ee: "Mu " -0x96ef: "Wen " -0x96f0: "Fen " -0x96f1: "Pang " -0x96f2: "Yun " -0x96f3: "Li " -0x96f4: "Li " -0x96f5: "Ang " -0x96f6: "Ling " -0x96f7: "Lei " -0x96f8: "An " -0x96f9: "Bao " -0x96fa: "Meng " -0x96fb: "Dian " -0x96fc: "Dang " -0x96fd: "Xing " -0x96fe: "Wu " -0x96ff: "Zhao " -/* x097 */ -0x9700: "Xu " -0x9701: "Ji " -0x9702: "Mu " -0x9703: "Chen " -0x9704: "Xiao " -0x9705: "Zha " -0x9706: "Ting " -0x9707: "Zhen " -0x9708: "Pei " -0x9709: "Mei " -0x970a: "Ling " -0x970b: "Qi " -0x970c: "Chou " -0x970d: "Huo " -0x970e: "Sha " -0x970f: "Fei " -0x9710: "Weng " -0x9711: "Zhan " -0x9712: "Yin " -0x9713: "Ni " -0x9714: "Chou " -0x9715: "Tun " -0x9716: "Lin " -0x9717: "[?] " -0x9718: "Dong " -0x9719: "Ying " -0x971a: "Wu " -0x971b: "Ling " -0x971c: "Shuang " -0x971d: "Ling " -0x971e: "Xia " -0x971f: "Hong " -0x9720: "Yin " -0x9721: "Mo " -0x9722: "Mai " -0x9723: "Yun " -0x9724: "Liu " -0x9725: "Meng " -0x9726: "Bin " -0x9727: "Wu " -0x9728: "Wei " -0x9729: "Huo " -0x972a: "Yin " -0x972b: "Xi " -0x972c: "Yi " -0x972d: "Ai " -0x972e: "Dan " -0x972f: "Deng " -0x9730: "Xian " -0x9731: "Yu " -0x9732: "Lu " -0x9733: "Long " -0x9734: "Dai " -0x9735: "Ji " -0x9736: "Pang " -0x9737: "Yang " -0x9738: "Ba " -0x9739: "Pi " -0x973a: "Wei " -0x973b: "[?] " -0x973c: "Xi " -0x973d: "Ji " -0x973e: "Mai " -0x973f: "Meng " -0x9740: "Meng " -0x9741: "Lei " -0x9742: "Li " -0x9743: "Huo " -0x9744: "Ai " -0x9745: "Fei " -0x9746: "Dai " -0x9747: "Long " -0x9748: "Ling " -0x9749: "Ai " -0x974a: "Feng " -0x974b: "Li " -0x974c: "Bao " -0x974d: "[?] " -0x974e: "He " -0x974f: "He " -0x9750: "Bing " -0x9751: "Qing " -0x9752: "Qing " -0x9753: "Jing " -0x9754: "Tian " -0x9755: "Zhen " -0x9756: "Jing " -0x9757: "Cheng " -0x9758: "Qing " -0x9759: "Jing " -0x975a: "Jing " -0x975b: "Dian " -0x975c: "Jing " -0x975d: "Tian " -0x975e: "Fei " -0x975f: "Fei " -0x9760: "Kao " -0x9761: "Mi " -0x9762: "Mian " -0x9763: "Mian " -0x9764: "Pao " -0x9765: "Ye " -0x9766: "Tian " -0x9767: "Hui " -0x9768: "Ye " -0x9769: "Ge " -0x976a: "Ding " -0x976b: "Cha " -0x976c: "Jian " -0x976d: "Ren " -0x976e: "Di " -0x976f: "Du " -0x9770: "Wu " -0x9771: "Ren " -0x9772: "Qin " -0x9773: "Jin " -0x9774: "Xue " -0x9775: "Niu " -0x9776: "Ba " -0x9777: "Yin " -0x9778: "Sa " -0x9779: "Na " -0x977a: "Mo " -0x977b: "Zu " -0x977c: "Da " -0x977d: "Ban " -0x977e: "Yi " -0x977f: "Yao " -0x9780: "Tao " -0x9781: "Tuo " -0x9782: "Jia " -0x9783: "Hong " -0x9784: "Pao " -0x9785: "Yang " -0x9786: "Tomo " -0x9787: "Yin " -0x9788: "Jia " -0x9789: "Tao " -0x978a: "Ji " -0x978b: "Xie " -0x978c: "An " -0x978d: "An " -0x978e: "Hen " -0x978f: "Gong " -0x9790: "Kohaze " -0x9791: "Da " -0x9792: "Qiao " -0x9793: "Ting " -0x9794: "Wan " -0x9795: "Ying " -0x9796: "Sui " -0x9797: "Tiao " -0x9798: "Qiao " -0x9799: "Xuan " -0x979a: "Kong " -0x979b: "Beng " -0x979c: "Ta " -0x979d: "Zhang " -0x979e: "Bing " -0x979f: "Kuo " -0x97a0: "Ju " -0x97a1: "La " -0x97a2: "Xie " -0x97a3: "Rou " -0x97a4: "Bang " -0x97a5: "Yi " -0x97a6: "Qiu " -0x97a7: "Qiu " -0x97a8: "He " -0x97a9: "Xiao " -0x97aa: "Mu " -0x97ab: "Ju " -0x97ac: "Jian " -0x97ad: "Bian " -0x97ae: "Di " -0x97af: "Jian " -0x97b0: "On " -0x97b1: "Tao " -0x97b2: "Gou " -0x97b3: "Ta " -0x97b4: "Bei " -0x97b5: "Xie " -0x97b6: "Pan " -0x97b7: "Ge " -0x97b8: "Bi " -0x97b9: "Kuo " -0x97ba: "Tang " -0x97bb: "Lou " -0x97bc: "Gui " -0x97bd: "Qiao " -0x97be: "Xue " -0x97bf: "Ji " -0x97c0: "Jian " -0x97c1: "Jiang " -0x97c2: "Chan " -0x97c3: "Da " -0x97c4: "Huo " -0x97c5: "Xian " -0x97c6: "Qian " -0x97c7: "Du " -0x97c8: "Wa " -0x97c9: "Jian " -0x97ca: "Lan " -0x97cb: "Wei " -0x97cc: "Ren " -0x97cd: "Fu " -0x97ce: "Mei " -0x97cf: "Juan " -0x97d0: "Ge " -0x97d1: "Wei " -0x97d2: "Qiao " -0x97d3: "Han " -0x97d4: "Chang " -0x97d5: "[?] " -0x97d6: "Rou " -0x97d7: "Xun " -0x97d8: "She " -0x97d9: "Wei " -0x97da: "Ge " -0x97db: "Bei " -0x97dc: "Tao " -0x97dd: "Gou " -0x97de: "Yun " -0x97df: "[?] " -0x97e0: "Bi " -0x97e1: "Wei " -0x97e2: "Hui " -0x97e3: "Du " -0x97e4: "Wa " -0x97e5: "Du " -0x97e6: "Wei " -0x97e7: "Ren " -0x97e8: "Fu " -0x97e9: "Han " -0x97ea: "Wei " -0x97eb: "Yun " -0x97ec: "Tao " -0x97ed: "Jiu " -0x97ee: "Jiu " -0x97ef: "Xian " -0x97f0: "Xie " -0x97f1: "Xian " -0x97f2: "Ji " -0x97f3: "Yin " -0x97f4: "Za " -0x97f5: "Yun " -0x97f6: "Shao " -0x97f7: "Le " -0x97f8: "Peng " -0x97f9: "Heng " -0x97fa: "Ying " -0x97fb: "Yun " -0x97fc: "Peng " -0x97fd: "Yin " -0x97fe: "Yin " -0x97ff: "Xiang " -/* x098 */ -0x9800: "Hu " -0x9801: "Ye " -0x9802: "Ding " -0x9803: "Qing " -0x9804: "Pan " -0x9805: "Xiang " -0x9806: "Shun " -0x9807: "Han " -0x9808: "Xu " -0x9809: "Yi " -0x980a: "Xu " -0x980b: "Gu " -0x980c: "Song " -0x980d: "Kui " -0x980e: "Qi " -0x980f: "Hang " -0x9810: "Yu " -0x9811: "Wan " -0x9812: "Ban " -0x9813: "Dun " -0x9814: "Di " -0x9815: "Dan " -0x9816: "Pan " -0x9817: "Po " -0x9818: "Ling " -0x9819: "Ce " -0x981a: "Jing " -0x981b: "Lei " -0x981c: "He " -0x981d: "Qiao " -0x981e: "E " -0x981f: "E " -0x9820: "Wei " -0x9821: "Jie " -0x9822: "Gua " -0x9823: "Shen " -0x9824: "Yi " -0x9825: "Shen " -0x9826: "Hai " -0x9827: "Dui " -0x9828: "Pian " -0x9829: "Ping " -0x982a: "Lei " -0x982b: "Fu " -0x982c: "Jia " -0x982d: "Tou " -0x982e: "Hui " -0x982f: "Kui " -0x9830: "Jia " -0x9831: "Le " -0x9832: "Tian " -0x9833: "Cheng " -0x9834: "Ying " -0x9835: "Jun " -0x9836: "Hu " -0x9837: "Han " -0x9838: "Jing " -0x9839: "Tui " -0x983a: "Tui " -0x983b: "Pin " -0x983c: "Lai " -0x983d: "Tui " -0x983e: "Zi " -0x983f: "Zi " -0x9840: "Chui " -0x9841: "Ding " -0x9842: "Lai " -0x9843: "Yan " -0x9844: "Han " -0x9845: "Jian " -0x9846: "Ke " -0x9847: "Cui " -0x9848: "Jiong " -0x9849: "Qin " -0x984a: "Yi " -0x984b: "Sai " -0x984c: "Ti " -0x984d: "E " -0x984e: "E " -0x984f: "Yan " -0x9850: "Hun " -0x9851: "Kan " -0x9852: "Yong " -0x9853: "Zhuan " -0x9854: "Yan " -0x9855: "Xian " -0x9856: "Xin " -0x9857: "Yi " -0x9858: "Yuan " -0x9859: "Sang " -0x985a: "Dian " -0x985b: "Dian " -0x985c: "Jiang " -0x985d: "Ku " -0x985e: "Lei " -0x985f: "Liao " -0x9860: "Piao " -0x9861: "Yi " -0x9862: "Man " -0x9863: "Qi " -0x9864: "Rao " -0x9865: "Hao " -0x9866: "Qiao " -0x9867: "Gu " -0x9868: "Xun " -0x9869: "Qian " -0x986a: "Hui " -0x986b: "Zhan " -0x986c: "Ru " -0x986d: "Hong " -0x986e: "Bin " -0x986f: "Xian " -0x9870: "Pin " -0x9871: "Lu " -0x9872: "Lan " -0x9873: "Nie " -0x9874: "Quan " -0x9875: "Ye " -0x9876: "Ding " -0x9877: "Qing " -0x9878: "Han " -0x9879: "Xiang " -0x987a: "Shun " -0x987b: "Xu " -0x987c: "Xu " -0x987d: "Wan " -0x987e: "Gu " -0x987f: "Dun " -0x9880: "Qi " -0x9881: "Ban " -0x9882: "Song " -0x9883: "Hang " -0x9884: "Yu " -0x9885: "Lu " -0x9886: "Ling " -0x9887: "Po " -0x9888: "Jing " -0x9889: "Jie " -0x988a: "Jia " -0x988b: "Tian " -0x988c: "Han " -0x988d: "Ying " -0x988e: "Jiong " -0x988f: "Hai " -0x9890: "Yi " -0x9891: "Pin " -0x9892: "Hui " -0x9893: "Tui " -0x9894: "Han " -0x9895: "Ying " -0x9896: "Ying " -0x9897: "Ke " -0x9898: "Ti " -0x9899: "Yong " -0x989a: "E " -0x989b: "Zhuan " -0x989c: "Yan " -0x989d: "E " -0x989e: "Nie " -0x989f: "Man " -0x98a0: "Dian " -0x98a1: "Sang " -0x98a2: "Hao " -0x98a3: "Lei " -0x98a4: "Zhan " -0x98a5: "Ru " -0x98a6: "Pin " -0x98a7: "Quan " -0x98a8: "Feng " -0x98a9: "Biao " -0x98aa: "Oroshi " -0x98ab: "Fu " -0x98ac: "Xia " -0x98ad: "Zhan " -0x98ae: "Biao " -0x98af: "Sa " -0x98b0: "Ba " -0x98b1: "Tai " -0x98b2: "Lie " -0x98b3: "Gua " -0x98b4: "Xuan " -0x98b5: "Shao " -0x98b6: "Ju " -0x98b7: "Bi " -0x98b8: "Si " -0x98b9: "Wei " -0x98ba: "Yang " -0x98bb: "Yao " -0x98bc: "Sou " -0x98bd: "Kai " -0x98be: "Sao " -0x98bf: "Fan " -0x98c0: "Liu " -0x98c1: "Xi " -0x98c2: "Liao " -0x98c3: "Piao " -0x98c4: "Piao " -0x98c5: "Liu " -0x98c6: "Biao " -0x98c7: "Biao " -0x98c8: "Biao " -0x98c9: "Liao " -0x98ca: "[?] " -0x98cb: "Se " -0x98cc: "Feng " -0x98cd: "Biao " -0x98ce: "Feng " -0x98cf: "Yang " -0x98d0: "Zhan " -0x98d1: "Biao " -0x98d2: "Sa " -0x98d3: "Ju " -0x98d4: "Si " -0x98d5: "Sou " -0x98d6: "Yao " -0x98d7: "Liu " -0x98d8: "Piao " -0x98d9: "Biao " -0x98da: "Biao " -0x98db: "Fei " -0x98dc: "Fan " -0x98dd: "Fei " -0x98de: "Fei " -0x98df: "Shi " -0x98e0: "Shi " -0x98e1: "Can " -0x98e2: "Ji " -0x98e3: "Ding " -0x98e4: "Si " -0x98e5: "Tuo " -0x98e6: "Zhan " -0x98e7: "Sun " -0x98e8: "Xiang " -0x98e9: "Tun " -0x98ea: "Ren " -0x98eb: "Yu " -0x98ec: "Juan " -0x98ed: "Chi " -0x98ee: "Yin " -0x98ef: "Fan " -0x98f0: "Fan " -0x98f1: "Sun " -0x98f2: "Yin " -0x98f3: "Zhu " -0x98f4: "Yi " -0x98f5: "Zhai " -0x98f6: "Bi " -0x98f7: "Jie " -0x98f8: "Tao " -0x98f9: "Liu " -0x98fa: "Ci " -0x98fb: "Tie " -0x98fc: "Si " -0x98fd: "Bao " -0x98fe: "Shi " -0x98ff: "Duo " -/* x099 */ -0x9900: "Hai " -0x9901: "Ren " -0x9902: "Tian " -0x9903: "Jiao " -0x9904: "Jia " -0x9905: "Bing " -0x9906: "Yao " -0x9907: "Tong " -0x9908: "Ci " -0x9909: "Xiang " -0x990a: "Yang " -0x990b: "Yang " -0x990c: "Er " -0x990d: "Yan " -0x990e: "Le " -0x990f: "Yi " -0x9910: "Can " -0x9911: "Bo " -0x9912: "Nei " -0x9913: "E " -0x9914: "Bu " -0x9915: "Jun " -0x9916: "Dou " -0x9917: "Su " -0x9918: "Yu " -0x9919: "Shi " -0x991a: "Yao " -0x991b: "Hun " -0x991c: "Guo " -0x991d: "Shi " -0x991e: "Jian " -0x991f: "Zhui " -0x9920: "Bing " -0x9921: "Xian " -0x9922: "Bu " -0x9923: "Ye " -0x9924: "Tan " -0x9925: "Fei " -0x9926: "Zhang " -0x9927: "Wei " -0x9928: "Guan " -0x9929: "E " -0x992a: "Nuan " -0x992b: "Hun " -0x992c: "Hu " -0x992d: "Huang " -0x992e: "Tie " -0x992f: "Hui " -0x9930: "Jian " -0x9931: "Hou " -0x9932: "He " -0x9933: "Xing " -0x9934: "Fen " -0x9935: "Wei " -0x9936: "Gu " -0x9937: "Cha " -0x9938: "Song " -0x9939: "Tang " -0x993a: "Bo " -0x993b: "Gao " -0x993c: "Xi " -0x993d: "Kui " -0x993e: "Liu " -0x993f: "Sou " -0x9940: "Tao " -0x9941: "Ye " -0x9942: "Yun " -0x9943: "Mo " -0x9944: "Tang " -0x9945: "Man " -0x9946: "Bi " -0x9947: "Yu " -0x9948: "Xiu " -0x9949: "Jin " -0x994a: "San " -0x994b: "Kui " -0x994c: "Zhuan " -0x994d: "Shan " -0x994e: "Chi " -0x994f: "Dan " -0x9950: "Yi " -0x9951: "Ji " -0x9952: "Rao " -0x9953: "Cheng " -0x9954: "Yong " -0x9955: "Tao " -0x9956: "Hui " -0x9957: "Xiang " -0x9958: "Zhan " -0x9959: "Fen " -0x995a: "Hai " -0x995b: "Meng " -0x995c: "Yan " -0x995d: "Mo " -0x995e: "Chan " -0x995f: "Xiang " -0x9960: "Luo " -0x9961: "Zuan " -0x9962: "Nang " -0x9963: "Shi " -0x9964: "Ding " -0x9965: "Ji " -0x9966: "Tuo " -0x9967: "Xing " -0x9968: "Tun " -0x9969: "Xi " -0x996a: "Ren " -0x996b: "Yu " -0x996c: "Chi " -0x996d: "Fan " -0x996e: "Yin " -0x996f: "Jian " -0x9970: "Shi " -0x9971: "Bao " -0x9972: "Si " -0x9973: "Duo " -0x9974: "Yi " -0x9975: "Er " -0x9976: "Rao " -0x9977: "Xiang " -0x9978: "Jia " -0x9979: "Le " -0x997a: "Jiao " -0x997b: "Yi " -0x997c: "Bing " -0x997d: "Bo " -0x997e: "Dou " -0x997f: "E " -0x9980: "Yu " -0x9981: "Nei " -0x9982: "Jun " -0x9983: "Guo " -0x9984: "Hun " -0x9985: "Xian " -0x9986: "Guan " -0x9987: "Cha " -0x9988: "Kui " -0x9989: "Gu " -0x998a: "Sou " -0x998b: "Chan " -0x998c: "Ye " -0x998d: "Mo " -0x998e: "Bo " -0x998f: "Liu " -0x9990: "Xiu " -0x9991: "Jin " -0x9992: "Man " -0x9993: "San " -0x9994: "Zhuan " -0x9995: "Nang " -0x9996: "Shou " -0x9997: "Kui " -0x9998: "Guo " -0x9999: "Xiang " -0x999a: "Fen " -0x999b: "Ba " -0x999c: "Ni " -0x999d: "Bi " -0x999e: "Bo " -0x999f: "Tu " -0x99a0: "Han " -0x99a1: "Fei " -0x99a2: "Jian " -0x99a3: "An " -0x99a4: "Ai " -0x99a5: "Fu " -0x99a6: "Xian " -0x99a7: "Wen " -0x99a8: "Xin " -0x99a9: "Fen " -0x99aa: "Bin " -0x99ab: "Xing " -0x99ac: "Ma " -0x99ad: "Yu " -0x99ae: "Feng " -0x99af: "Han " -0x99b0: "Di " -0x99b1: "Tuo " -0x99b2: "Tuo " -0x99b3: "Chi " -0x99b4: "Xun " -0x99b5: "Zhu " -0x99b6: "Zhi " -0x99b7: "Pei " -0x99b8: "Xin " -0x99b9: "Ri " -0x99ba: "Sa " -0x99bb: "Yin " -0x99bc: "Wen " -0x99bd: "Zhi " -0x99be: "Dan " -0x99bf: "Lu " -0x99c0: "You " -0x99c1: "Bo " -0x99c2: "Bao " -0x99c3: "Kuai " -0x99c4: "Tuo " -0x99c5: "Yi " -0x99c6: "Qu " -0x99c7: "[?] " -0x99c8: "Qu " -0x99c9: "Jiong " -0x99ca: "Bo " -0x99cb: "Zhao " -0x99cc: "Yuan " -0x99cd: "Peng " -0x99ce: "Zhou " -0x99cf: "Ju " -0x99d0: "Zhu " -0x99d1: "Nu " -0x99d2: "Ju " -0x99d3: "Pi " -0x99d4: "Zang " -0x99d5: "Jia " -0x99d6: "Ling " -0x99d7: "Zhen " -0x99d8: "Tai " -0x99d9: "Fu " -0x99da: "Yang " -0x99db: "Shi " -0x99dc: "Bi " -0x99dd: "Tuo " -0x99de: "Tuo " -0x99df: "Si " -0x99e0: "Liu " -0x99e1: "Ma " -0x99e2: "Pian " -0x99e3: "Tao " -0x99e4: "Zhi " -0x99e5: "Rong " -0x99e6: "Teng " -0x99e7: "Dong " -0x99e8: "Xun " -0x99e9: "Quan " -0x99ea: "Shen " -0x99eb: "Jiong " -0x99ec: "Er " -0x99ed: "Hai " -0x99ee: "Bo " -0x99ef: "Zhu " -0x99f0: "Yin " -0x99f1: "Luo " -0x99f2: "Shuu " -0x99f3: "Dan " -0x99f4: "Xie " -0x99f5: "Liu " -0x99f6: "Ju " -0x99f7: "Song " -0x99f8: "Qin " -0x99f9: "Mang " -0x99fa: "Liang " -0x99fb: "Han " -0x99fc: "Tu " -0x99fd: "Xuan " -0x99fe: "Tui " -0x99ff: "Jun " -/* x09a */ -0x9a00: "E " -0x9a01: "Cheng " -0x9a02: "Xin " -0x9a03: "Ai " -0x9a04: "Lu " -0x9a05: "Zhui " -0x9a06: "Zhou " -0x9a07: "She " -0x9a08: "Pian " -0x9a09: "Kun " -0x9a0a: "Tao " -0x9a0b: "Lai " -0x9a0c: "Zong " -0x9a0d: "Ke " -0x9a0e: "Qi " -0x9a0f: "Qi " -0x9a10: "Yan " -0x9a11: "Fei " -0x9a12: "Sao " -0x9a13: "Yan " -0x9a14: "Jie " -0x9a15: "Yao " -0x9a16: "Wu " -0x9a17: "Pian " -0x9a18: "Cong " -0x9a19: "Pian " -0x9a1a: "Qian " -0x9a1b: "Fei " -0x9a1c: "Huang " -0x9a1d: "Jian " -0x9a1e: "Huo " -0x9a1f: "Yu " -0x9a20: "Ti " -0x9a21: "Quan " -0x9a22: "Xia " -0x9a23: "Zong " -0x9a24: "Kui " -0x9a25: "Rou " -0x9a26: "Si " -0x9a27: "Gua " -0x9a28: "Tuo " -0x9a29: "Kui " -0x9a2a: "Sou " -0x9a2b: "Qian " -0x9a2c: "Cheng " -0x9a2d: "Zhi " -0x9a2e: "Liu " -0x9a2f: "Pang " -0x9a30: "Teng " -0x9a31: "Xi " -0x9a32: "Cao " -0x9a33: "Du " -0x9a34: "Yan " -0x9a35: "Yuan " -0x9a36: "Zou " -0x9a37: "Sao " -0x9a38: "Shan " -0x9a39: "Li " -0x9a3a: "Zhi " -0x9a3b: "Shuang " -0x9a3c: "Lu " -0x9a3d: "Xi " -0x9a3e: "Luo " -0x9a3f: "Zhang " -0x9a40: "Mo " -0x9a41: "Ao " -0x9a42: "Can " -0x9a43: "Piao " -0x9a44: "Cong " -0x9a45: "Qu " -0x9a46: "Bi " -0x9a47: "Zhi " -0x9a48: "Yu " -0x9a49: "Xu " -0x9a4a: "Hua " -0x9a4b: "Bo " -0x9a4c: "Su " -0x9a4d: "Xiao " -0x9a4e: "Lin " -0x9a4f: "Chan " -0x9a50: "Dun " -0x9a51: "Liu " -0x9a52: "Tuo " -0x9a53: "Zeng " -0x9a54: "Tan " -0x9a55: "Jiao " -0x9a56: "Tie " -0x9a57: "Yan " -0x9a58: "Luo " -0x9a59: "Zhan " -0x9a5a: "Jing " -0x9a5b: "Yi " -0x9a5c: "Ye " -0x9a5d: "Tuo " -0x9a5e: "Bin " -0x9a5f: "Zou " -0x9a60: "Yan " -0x9a61: "Peng " -0x9a62: "Lu " -0x9a63: "Teng " -0x9a64: "Xiang " -0x9a65: "Ji " -0x9a66: "Shuang " -0x9a67: "Ju " -0x9a68: "Xi " -0x9a69: "Huan " -0x9a6a: "Li " -0x9a6b: "Biao " -0x9a6c: "Ma " -0x9a6d: "Yu " -0x9a6e: "Tuo " -0x9a6f: "Xun " -0x9a70: "Chi " -0x9a71: "Qu " -0x9a72: "Ri " -0x9a73: "Bo " -0x9a74: "Lu " -0x9a75: "Zang " -0x9a76: "Shi " -0x9a77: "Si " -0x9a78: "Fu " -0x9a79: "Ju " -0x9a7a: "Zou " -0x9a7b: "Zhu " -0x9a7c: "Tuo " -0x9a7d: "Nu " -0x9a7e: "Jia " -0x9a7f: "Yi " -0x9a80: "Tai " -0x9a81: "Xiao " -0x9a82: "Ma " -0x9a83: "Yin " -0x9a84: "Jiao " -0x9a85: "Hua " -0x9a86: "Luo " -0x9a87: "Hai " -0x9a88: "Pian " -0x9a89: "Biao " -0x9a8a: "Li " -0x9a8b: "Cheng " -0x9a8c: "Yan " -0x9a8d: "Xin " -0x9a8e: "Qin " -0x9a8f: "Jun " -0x9a90: "Qi " -0x9a91: "Qi " -0x9a92: "Ke " -0x9a93: "Zhui " -0x9a94: "Zong " -0x9a95: "Su " -0x9a96: "Can " -0x9a97: "Pian " -0x9a98: "Zhi " -0x9a99: "Kui " -0x9a9a: "Sao " -0x9a9b: "Wu " -0x9a9c: "Ao " -0x9a9d: "Liu " -0x9a9e: "Qian " -0x9a9f: "Shan " -0x9aa0: "Piao " -0x9aa1: "Luo " -0x9aa2: "Cong " -0x9aa3: "Chan " -0x9aa4: "Zou " -0x9aa5: "Ji " -0x9aa6: "Shuang " -0x9aa7: "Xiang " -0x9aa8: "Gu " -0x9aa9: "Wei " -0x9aaa: "Wei " -0x9aab: "Wei " -0x9aac: "Yu " -0x9aad: "Gan " -0x9aae: "Yi " -0x9aaf: "Ang " -0x9ab0: "Tou " -0x9ab1: "Xie " -0x9ab2: "Bao " -0x9ab3: "Bi " -0x9ab4: "Chi " -0x9ab5: "Ti " -0x9ab6: "Di " -0x9ab7: "Ku " -0x9ab8: "Hai " -0x9ab9: "Qiao " -0x9aba: "Gou " -0x9abb: "Kua " -0x9abc: "Ge " -0x9abd: "Tui " -0x9abe: "Geng " -0x9abf: "Pian " -0x9ac0: "Bi " -0x9ac1: "Ke " -0x9ac2: "Ka " -0x9ac3: "Yu " -0x9ac4: "Sui " -0x9ac5: "Lou " -0x9ac6: "Bo " -0x9ac7: "Xiao " -0x9ac8: "Pang " -0x9ac9: "Bo " -0x9aca: "Ci " -0x9acb: "Kuan " -0x9acc: "Bin " -0x9acd: "Mo " -0x9ace: "Liao " -0x9acf: "Lou " -0x9ad0: "Nao " -0x9ad1: "Du " -0x9ad2: "Zang " -0x9ad3: "Sui " -0x9ad4: "Ti " -0x9ad5: "Bin " -0x9ad6: "Kuan " -0x9ad7: "Lu " -0x9ad8: "Gao " -0x9ad9: "Gao " -0x9ada: "Qiao " -0x9adb: "Kao " -0x9adc: "Qiao " -0x9add: "Lao " -0x9ade: "Zao " -0x9adf: "Biao " -0x9ae0: "Kun " -0x9ae1: "Kun " -0x9ae2: "Ti " -0x9ae3: "Fang " -0x9ae4: "Xiu " -0x9ae5: "Ran " -0x9ae6: "Mao " -0x9ae7: "Dan " -0x9ae8: "Kun " -0x9ae9: "Bin " -0x9aea: "Fa " -0x9aeb: "Tiao " -0x9aec: "Peng " -0x9aed: "Zi " -0x9aee: "Fa " -0x9aef: "Ran " -0x9af0: "Ti " -0x9af1: "Pao " -0x9af2: "Pi " -0x9af3: "Mao " -0x9af4: "Fu " -0x9af5: "Er " -0x9af6: "Rong " -0x9af7: "Qu " -0x9af8: "Gong " -0x9af9: "Xiu " -0x9afa: "Gua " -0x9afb: "Ji " -0x9afc: "Peng " -0x9afd: "Zhua " -0x9afe: "Shao " -0x9aff: "Sha " -/* x09b */ -0x9b00: "Ti " -0x9b01: "Li " -0x9b02: "Bin " -0x9b03: "Zong " -0x9b04: "Ti " -0x9b05: "Peng " -0x9b06: "Song " -0x9b07: "Zheng " -0x9b08: "Quan " -0x9b09: "Zong " -0x9b0a: "Shun " -0x9b0b: "Jian " -0x9b0c: "Duo " -0x9b0d: "Hu " -0x9b0e: "La " -0x9b0f: "Jiu " -0x9b10: "Qi " -0x9b11: "Lian " -0x9b12: "Zhen " -0x9b13: "Bin " -0x9b14: "Peng " -0x9b15: "Mo " -0x9b16: "San " -0x9b17: "Man " -0x9b18: "Man " -0x9b19: "Seng " -0x9b1a: "Xu " -0x9b1b: "Lie " -0x9b1c: "Qian " -0x9b1d: "Qian " -0x9b1e: "Nong " -0x9b1f: "Huan " -0x9b20: "Kuai " -0x9b21: "Ning " -0x9b22: "Bin " -0x9b23: "Lie " -0x9b24: "Rang " -0x9b25: "Dou " -0x9b26: "Dou " -0x9b27: "Nao " -0x9b28: "Hong " -0x9b29: "Xi " -0x9b2a: "Dou " -0x9b2b: "Han " -0x9b2c: "Dou " -0x9b2d: "Dou " -0x9b2e: "Jiu " -0x9b2f: "Chang " -0x9b30: "Yu " -0x9b31: "Yu " -0x9b32: "Li " -0x9b33: "Juan " -0x9b34: "Fu " -0x9b35: "Qian " -0x9b36: "Gui " -0x9b37: "Zong " -0x9b38: "Liu " -0x9b39: "Gui " -0x9b3a: "Shang " -0x9b3b: "Yu " -0x9b3c: "Gui " -0x9b3d: "Mei " -0x9b3e: "Ji " -0x9b3f: "Qi " -0x9b40: "Jie " -0x9b41: "Kui " -0x9b42: "Hun " -0x9b43: "Ba " -0x9b44: "Po " -0x9b45: "Mei " -0x9b46: "Xu " -0x9b47: "Yan " -0x9b48: "Xiao " -0x9b49: "Liang " -0x9b4a: "Yu " -0x9b4b: "Tui " -0x9b4c: "Qi " -0x9b4d: "Wang " -0x9b4e: "Liang " -0x9b4f: "Wei " -0x9b50: "Jian " -0x9b51: "Chi " -0x9b52: "Piao " -0x9b53: "Bi " -0x9b54: "Mo " -0x9b55: "Ji " -0x9b56: "Xu " -0x9b57: "Chou " -0x9b58: "Yan " -0x9b59: "Zhan " -0x9b5a: "Yu " -0x9b5b: "Dao " -0x9b5c: "Ren " -0x9b5d: "Ji " -0x9b5e: "Eri " -0x9b5f: "Gong " -0x9b60: "Tuo " -0x9b61: "Diao " -0x9b62: "Ji " -0x9b63: "Xu " -0x9b64: "E " -0x9b65: "E " -0x9b66: "Sha " -0x9b67: "Hang " -0x9b68: "Tun " -0x9b69: "Mo " -0x9b6a: "Jie " -0x9b6b: "Shen " -0x9b6c: "Fan " -0x9b6d: "Yuan " -0x9b6e: "Bi " -0x9b6f: "Lu " -0x9b70: "Wen " -0x9b71: "Hu " -0x9b72: "Lu " -0x9b73: "Za " -0x9b74: "Fang " -0x9b75: "Fen " -0x9b76: "Na " -0x9b77: "You " -0x9b78: "Namazu " -0x9b79: "Todo " -0x9b7a: "He " -0x9b7b: "Xia " -0x9b7c: "Qu " -0x9b7d: "Han " -0x9b7e: "Pi " -0x9b7f: "Ling " -0x9b80: "Tuo " -0x9b81: "Bo " -0x9b82: "Qiu " -0x9b83: "Ping " -0x9b84: "Fu " -0x9b85: "Bi " -0x9b86: "Ji " -0x9b87: "Wei " -0x9b88: "Ju " -0x9b89: "Diao " -0x9b8a: "Bo " -0x9b8b: "You " -0x9b8c: "Gun " -0x9b8d: "Pi " -0x9b8e: "Nian " -0x9b8f: "Xing " -0x9b90: "Tai " -0x9b91: "Bao " -0x9b92: "Fu " -0x9b93: "Zha " -0x9b94: "Ju " -0x9b95: "Gu " -0x9b96: "Kajika " -0x9b97: "Tong " -0x9b98: "[?] " -0x9b99: "Ta " -0x9b9a: "Jie " -0x9b9b: "Shu " -0x9b9c: "Hou " -0x9b9d: "Xiang " -0x9b9e: "Er " -0x9b9f: "An " -0x9ba0: "Wei " -0x9ba1: "Tiao " -0x9ba2: "Zhu " -0x9ba3: "Yin " -0x9ba4: "Lie " -0x9ba5: "Luo " -0x9ba6: "Tong " -0x9ba7: "Yi " -0x9ba8: "Qi " -0x9ba9: "Bing " -0x9baa: "Wei " -0x9bab: "Jiao " -0x9bac: "Bu " -0x9bad: "Gui " -0x9bae: "Xian " -0x9baf: "Ge " -0x9bb0: "Hui " -0x9bb1: "Bora " -0x9bb2: "Mate " -0x9bb3: "Kao " -0x9bb4: "Gori " -0x9bb5: "Duo " -0x9bb6: "Jun " -0x9bb7: "Ti " -0x9bb8: "Man " -0x9bb9: "Xiao " -0x9bba: "Za " -0x9bbb: "Sha " -0x9bbc: "Qin " -0x9bbd: "Yu " -0x9bbe: "Nei " -0x9bbf: "Zhe " -0x9bc0: "Gun " -0x9bc1: "Geng " -0x9bc2: "Su " -0x9bc3: "Wu " -0x9bc4: "Qiu " -0x9bc5: "Ting " -0x9bc6: "Fu " -0x9bc7: "Wan " -0x9bc8: "You " -0x9bc9: "Li " -0x9bca: "Sha " -0x9bcb: "Sha " -0x9bcc: "Gao " -0x9bcd: "Meng " -0x9bce: "Ugui " -0x9bcf: "Asari " -0x9bd0: "Subashiri " -0x9bd1: "Kazunoko " -0x9bd2: "Yong " -0x9bd3: "Ni " -0x9bd4: "Zi " -0x9bd5: "Qi " -0x9bd6: "Qing " -0x9bd7: "Xiang " -0x9bd8: "Nei " -0x9bd9: "Chun " -0x9bda: "Ji " -0x9bdb: "Diao " -0x9bdc: "Qie " -0x9bdd: "Gu " -0x9bde: "Zhou " -0x9bdf: "Dong " -0x9be0: "Lai " -0x9be1: "Fei " -0x9be2: "Ni " -0x9be3: "Yi " -0x9be4: "Kun " -0x9be5: "Lu " -0x9be6: "Jiu " -0x9be7: "Chang " -0x9be8: "Jing " -0x9be9: "Lun " -0x9bea: "Ling " -0x9beb: "Zou " -0x9bec: "Li " -0x9bed: "Meng " -0x9bee: "Zong " -0x9bef: "Zhi " -0x9bf0: "Nian " -0x9bf1: "Shachi " -0x9bf2: "Dojou " -0x9bf3: "Sukesou " -0x9bf4: "Shi " -0x9bf5: "Shen " -0x9bf6: "Hun " -0x9bf7: "Shi " -0x9bf8: "Hou " -0x9bf9: "Xing " -0x9bfa: "Zhu " -0x9bfb: "La " -0x9bfc: "Zong " -0x9bfd: "Ji " -0x9bfe: "Bian " -0x9bff: "Bian " -/* x09c */ -0x9c00: "Huan " -0x9c01: "Quan " -0x9c02: "Ze " -0x9c03: "Wei " -0x9c04: "Wei " -0x9c05: "Yu " -0x9c06: "Qun " -0x9c07: "Rou " -0x9c08: "Die " -0x9c09: "Huang " -0x9c0a: "Lian " -0x9c0b: "Yan " -0x9c0c: "Qiu " -0x9c0d: "Qiu " -0x9c0e: "Jian " -0x9c0f: "Bi " -0x9c10: "E " -0x9c11: "Yang " -0x9c12: "Fu " -0x9c13: "Sai " -0x9c14: "Jian " -0x9c15: "Xia " -0x9c16: "Tuo " -0x9c17: "Hu " -0x9c18: "Muroaji " -0x9c19: "Ruo " -0x9c1a: "Haraka " -0x9c1b: "Wen " -0x9c1c: "Jian " -0x9c1d: "Hao " -0x9c1e: "Wu " -0x9c1f: "Fang " -0x9c20: "Sao " -0x9c21: "Liu " -0x9c22: "Ma " -0x9c23: "Shi " -0x9c24: "Shi " -0x9c25: "Yin " -0x9c26: "Z " -0x9c27: "Teng " -0x9c28: "Ta " -0x9c29: "Yao " -0x9c2a: "Ge " -0x9c2b: "Rong " -0x9c2c: "Qian " -0x9c2d: "Qi " -0x9c2e: "Wen " -0x9c2f: "Ruo " -0x9c30: "Hatahata " -0x9c31: "Lian " -0x9c32: "Ao " -0x9c33: "Le " -0x9c34: "Hui " -0x9c35: "Min " -0x9c36: "Ji " -0x9c37: "Tiao " -0x9c38: "Qu " -0x9c39: "Jian " -0x9c3a: "Sao " -0x9c3b: "Man " -0x9c3c: "Xi " -0x9c3d: "Qiu " -0x9c3e: "Biao " -0x9c3f: "Ji " -0x9c40: "Ji " -0x9c41: "Zhu " -0x9c42: "Jiang " -0x9c43: "Qiu " -0x9c44: "Zhuan " -0x9c45: "Yong " -0x9c46: "Zhang " -0x9c47: "Kang " -0x9c48: "Xue " -0x9c49: "Bie " -0x9c4a: "Jue " -0x9c4b: "Qu " -0x9c4c: "Xiang " -0x9c4d: "Bo " -0x9c4e: "Jiao " -0x9c4f: "Xun " -0x9c50: "Su " -0x9c51: "Huang " -0x9c52: "Zun " -0x9c53: "Shan " -0x9c54: "Shan " -0x9c55: "Fan " -0x9c56: "Jue " -0x9c57: "Lin " -0x9c58: "Xun " -0x9c59: "Miao " -0x9c5a: "Xi " -0x9c5b: "Eso " -0x9c5c: "Kyou " -0x9c5d: "Fen " -0x9c5e: "Guan " -0x9c5f: "Hou " -0x9c60: "Kuai " -0x9c61: "Zei " -0x9c62: "Sao " -0x9c63: "Zhan " -0x9c64: "Gan " -0x9c65: "Gui " -0x9c66: "Sheng " -0x9c67: "Li " -0x9c68: "Chang " -0x9c69: "Hatahata " -0x9c6a: "Shiira " -0x9c6b: "Mutsu " -0x9c6c: "Ru " -0x9c6d: "Ji " -0x9c6e: "Xu " -0x9c6f: "Huo " -0x9c70: "Shiira " -0x9c71: "Li " -0x9c72: "Lie " -0x9c73: "Li " -0x9c74: "Mie " -0x9c75: "Zhen " -0x9c76: "Xiang " -0x9c77: "E " -0x9c78: "Lu " -0x9c79: "Guan " -0x9c7a: "Li " -0x9c7b: "Xian " -0x9c7c: "Yu " -0x9c7d: "Dao " -0x9c7e: "Ji " -0x9c7f: "You " -0x9c80: "Tun " -0x9c81: "Lu " -0x9c82: "Fang " -0x9c83: "Ba " -0x9c84: "He " -0x9c85: "Bo " -0x9c86: "Ping " -0x9c87: "Nian " -0x9c88: "Lu " -0x9c89: "You " -0x9c8a: "Zha " -0x9c8b: "Fu " -0x9c8c: "Bo " -0x9c8d: "Bao " -0x9c8e: "Hou " -0x9c8f: "Pi " -0x9c90: "Tai " -0x9c91: "Gui " -0x9c92: "Jie " -0x9c93: "Kao " -0x9c94: "Wei " -0x9c95: "Er " -0x9c96: "Tong " -0x9c97: "Ze " -0x9c98: "Hou " -0x9c99: "Kuai " -0x9c9a: "Ji " -0x9c9b: "Jiao " -0x9c9c: "Xian " -0x9c9d: "Za " -0x9c9e: "Xiang " -0x9c9f: "Xun " -0x9ca0: "Geng " -0x9ca1: "Li " -0x9ca2: "Lian " -0x9ca3: "Jian " -0x9ca4: "Li " -0x9ca5: "Shi " -0x9ca6: "Tiao " -0x9ca7: "Gun " -0x9ca8: "Sha " -0x9ca9: "Wan " -0x9caa: "Jun " -0x9cab: "Ji " -0x9cac: "Yong " -0x9cad: "Qing " -0x9cae: "Ling " -0x9caf: "Qi " -0x9cb0: "Zou " -0x9cb1: "Fei " -0x9cb2: "Kun " -0x9cb3: "Chang " -0x9cb4: "Gu " -0x9cb5: "Ni " -0x9cb6: "Nian " -0x9cb7: "Diao " -0x9cb8: "Jing " -0x9cb9: "Shen " -0x9cba: "Shi " -0x9cbb: "Zi " -0x9cbc: "Fen " -0x9cbd: "Die " -0x9cbe: "Bi " -0x9cbf: "Chang " -0x9cc0: "Shi " -0x9cc1: "Wen " -0x9cc2: "Wei " -0x9cc3: "Sai " -0x9cc4: "E " -0x9cc5: "Qiu " -0x9cc6: "Fu " -0x9cc7: "Huang " -0x9cc8: "Quan " -0x9cc9: "Jiang " -0x9cca: "Bian " -0x9ccb: "Sao " -0x9ccc: "Ao " -0x9ccd: "Qi " -0x9cce: "Ta " -0x9ccf: "Yin " -0x9cd0: "Yao " -0x9cd1: "Fang " -0x9cd2: "Jian " -0x9cd3: "Le " -0x9cd4: "Biao " -0x9cd5: "Xue " -0x9cd6: "Bie " -0x9cd7: "Man " -0x9cd8: "Min " -0x9cd9: "Yong " -0x9cda: "Wei " -0x9cdb: "Xi " -0x9cdc: "Jue " -0x9cdd: "Shan " -0x9cde: "Lin " -0x9cdf: "Zun " -0x9ce0: "Huo " -0x9ce1: "Gan " -0x9ce2: "Li " -0x9ce3: "Zhan " -0x9ce4: "Guan " -0x9ce5: "Niao " -0x9ce6: "Yi " -0x9ce7: "Fu " -0x9ce8: "Li " -0x9ce9: "Jiu " -0x9cea: "Bu " -0x9ceb: "Yan " -0x9cec: "Fu " -0x9ced: "Diao " -0x9cee: "Ji " -0x9cef: "Feng " -0x9cf0: "Nio " -0x9cf1: "Gan " -0x9cf2: "Shi " -0x9cf3: "Feng " -0x9cf4: "Ming " -0x9cf5: "Bao " -0x9cf6: "Yuan " -0x9cf7: "Zhi " -0x9cf8: "Hu " -0x9cf9: "Qin " -0x9cfa: "Fu " -0x9cfb: "Fen " -0x9cfc: "Wen " -0x9cfd: "Jian " -0x9cfe: "Shi " -0x9cff: "Yu " -/* x09d */ -0x9d00: "Fou " -0x9d01: "Yiao " -0x9d02: "Jue " -0x9d03: "Jue " -0x9d04: "Pi " -0x9d05: "Huan " -0x9d06: "Zhen " -0x9d07: "Bao " -0x9d08: "Yan " -0x9d09: "Ya " -0x9d0a: "Zheng " -0x9d0b: "Fang " -0x9d0c: "Feng " -0x9d0d: "Wen " -0x9d0e: "Ou " -0x9d0f: "Te " -0x9d10: "Jia " -0x9d11: "Nu " -0x9d12: "Ling " -0x9d13: "Mie " -0x9d14: "Fu " -0x9d15: "Tuo " -0x9d16: "Wen " -0x9d17: "Li " -0x9d18: "Bian " -0x9d19: "Zhi " -0x9d1a: "Ge " -0x9d1b: "Yuan " -0x9d1c: "Zi " -0x9d1d: "Qu " -0x9d1e: "Xiao " -0x9d1f: "Zhi " -0x9d20: "Dan " -0x9d21: "Ju " -0x9d22: "You " -0x9d23: "Gu " -0x9d24: "Zhong " -0x9d25: "Yu " -0x9d26: "Yang " -0x9d27: "Rong " -0x9d28: "Ya " -0x9d29: "Tie " -0x9d2a: "Yu " -0x9d2b: "Shigi " -0x9d2c: "Ying " -0x9d2d: "Zhui " -0x9d2e: "Wu " -0x9d2f: "Er " -0x9d30: "Gua " -0x9d31: "Ai " -0x9d32: "Zhi " -0x9d33: "Yan " -0x9d34: "Heng " -0x9d35: "Jiao " -0x9d36: "Ji " -0x9d37: "Lie " -0x9d38: "Zhu " -0x9d39: "Ren " -0x9d3a: "Yi " -0x9d3b: "Hong " -0x9d3c: "Luo " -0x9d3d: "Ru " -0x9d3e: "Mou " -0x9d3f: "Ge " -0x9d40: "Ren " -0x9d41: "Jiao " -0x9d42: "Xiu " -0x9d43: "Zhou " -0x9d44: "Zhi " -0x9d45: "Luo " -0x9d46: "Chidori " -0x9d47: "Toki " -0x9d48: "Ten " -0x9d49: "Luan " -0x9d4a: "Jia " -0x9d4b: "Ji " -0x9d4c: "Yu " -0x9d4d: "Huan " -0x9d4e: "Tuo " -0x9d4f: "Bu " -0x9d50: "Wu " -0x9d51: "Juan " -0x9d52: "Yu " -0x9d53: "Bo " -0x9d54: "Xun " -0x9d55: "Xun " -0x9d56: "Bi " -0x9d57: "Xi " -0x9d58: "Jun " -0x9d59: "Ju " -0x9d5a: "Tu " -0x9d5b: "Jing " -0x9d5c: "Ti " -0x9d5d: "E " -0x9d5e: "E " -0x9d5f: "Kuang " -0x9d60: "Hu " -0x9d61: "Wu " -0x9d62: "Shen " -0x9d63: "Lai " -0x9d64: "Ikaruga " -0x9d65: "Kakesu " -0x9d66: "Lu " -0x9d67: "Ping " -0x9d68: "Shu " -0x9d69: "Fu " -0x9d6a: "An " -0x9d6b: "Zhao " -0x9d6c: "Peng " -0x9d6d: "Qin " -0x9d6e: "Qian " -0x9d6f: "Bei " -0x9d70: "Diao " -0x9d71: "Lu " -0x9d72: "Que " -0x9d73: "Jian " -0x9d74: "Ju " -0x9d75: "Tu " -0x9d76: "Ya " -0x9d77: "Yuan " -0x9d78: "Qi " -0x9d79: "Li " -0x9d7a: "Ye " -0x9d7b: "Zhui " -0x9d7c: "Kong " -0x9d7d: "Zhui " -0x9d7e: "Kun " -0x9d7f: "Sheng " -0x9d80: "Qi " -0x9d81: "Jing " -0x9d82: "Yi " -0x9d83: "Yi " -0x9d84: "Jing " -0x9d85: "Zi " -0x9d86: "Lai " -0x9d87: "Dong " -0x9d88: "Qi " -0x9d89: "Chun " -0x9d8a: "Geng " -0x9d8b: "Ju " -0x9d8c: "Qu " -0x9d8d: "Isuka " -0x9d8e: "Kikuitadaki " -0x9d8f: "Ji " -0x9d90: "Shu " -0x9d91: "[?] " -0x9d92: "Chi " -0x9d93: "Miao " -0x9d94: "Rou " -0x9d95: "An " -0x9d96: "Qiu " -0x9d97: "Ti " -0x9d98: "Hu " -0x9d99: "Ti " -0x9d9a: "E " -0x9d9b: "Jie " -0x9d9c: "Mao " -0x9d9d: "Fu " -0x9d9e: "Chun " -0x9d9f: "Tu " -0x9da0: "Yan " -0x9da1: "He " -0x9da2: "Yuan " -0x9da3: "Pian " -0x9da4: "Yun " -0x9da5: "Mei " -0x9da6: "Hu " -0x9da7: "Ying " -0x9da8: "Dun " -0x9da9: "Mu " -0x9daa: "Ju " -0x9dab: "Tsugumi " -0x9dac: "Cang " -0x9dad: "Fang " -0x9dae: "Gu " -0x9daf: "Ying " -0x9db0: "Yuan " -0x9db1: "Xuan " -0x9db2: "Weng " -0x9db3: "Shi " -0x9db4: "He " -0x9db5: "Chu " -0x9db6: "Tang " -0x9db7: "Xia " -0x9db8: "Ruo " -0x9db9: "Liu " -0x9dba: "Ji " -0x9dbb: "Gu " -0x9dbc: "Jian " -0x9dbd: "Zhun " -0x9dbe: "Han " -0x9dbf: "Zi " -0x9dc0: "Zi " -0x9dc1: "Ni " -0x9dc2: "Yao " -0x9dc3: "Yan " -0x9dc4: "Ji " -0x9dc5: "Li " -0x9dc6: "Tian " -0x9dc7: "Kou " -0x9dc8: "Ti " -0x9dc9: "Ti " -0x9dca: "Ni " -0x9dcb: "Tu " -0x9dcc: "Ma " -0x9dcd: "Jiao " -0x9dce: "Gao " -0x9dcf: "Tian " -0x9dd0: "Chen " -0x9dd1: "Li " -0x9dd2: "Zhuan " -0x9dd3: "Zhe " -0x9dd4: "Ao " -0x9dd5: "Yao " -0x9dd6: "Yi " -0x9dd7: "Ou " -0x9dd8: "Chi " -0x9dd9: "Zhi " -0x9dda: "Liao " -0x9ddb: "Rong " -0x9ddc: "Lou " -0x9ddd: "Bi " -0x9dde: "Shuang " -0x9ddf: "Zhuo " -0x9de0: "Yu " -0x9de1: "Wu " -0x9de2: "Jue " -0x9de3: "Yin " -0x9de4: "Quan " -0x9de5: "Si " -0x9de6: "Jiao " -0x9de7: "Yi " -0x9de8: "Hua " -0x9de9: "Bi " -0x9dea: "Ying " -0x9deb: "Su " -0x9dec: "Huang " -0x9ded: "Fan " -0x9dee: "Jiao " -0x9def: "Liao " -0x9df0: "Yan " -0x9df1: "Kao " -0x9df2: "Jiu " -0x9df3: "Xian " -0x9df4: "Xian " -0x9df5: "Tu " -0x9df6: "Mai " -0x9df7: "Zun " -0x9df8: "Yu " -0x9df9: "Ying " -0x9dfa: "Lu " -0x9dfb: "Tuan " -0x9dfc: "Xian " -0x9dfd: "Xue " -0x9dfe: "Yi " -0x9dff: "Pi " -/* x09e */ -0x9e00: "Shu " -0x9e01: "Luo " -0x9e02: "Qi " -0x9e03: "Yi " -0x9e04: "Ji " -0x9e05: "Zhe " -0x9e06: "Yu " -0x9e07: "Zhan " -0x9e08: "Ye " -0x9e09: "Yang " -0x9e0a: "Pi " -0x9e0b: "Ning " -0x9e0c: "Huo " -0x9e0d: "Mi " -0x9e0e: "Ying " -0x9e0f: "Meng " -0x9e10: "Di " -0x9e11: "Yue " -0x9e12: "Yu " -0x9e13: "Lei " -0x9e14: "Bao " -0x9e15: "Lu " -0x9e16: "He " -0x9e17: "Long " -0x9e18: "Shuang " -0x9e19: "Yue " -0x9e1a: "Ying " -0x9e1b: "Guan " -0x9e1c: "Qu " -0x9e1d: "Li " -0x9e1e: "Luan " -0x9e1f: "Niao " -0x9e20: "Jiu " -0x9e21: "Ji " -0x9e22: "Yuan " -0x9e23: "Ming " -0x9e24: "Shi " -0x9e25: "Ou " -0x9e26: "Ya " -0x9e27: "Cang " -0x9e28: "Bao " -0x9e29: "Zhen " -0x9e2a: "Gu " -0x9e2b: "Dong " -0x9e2c: "Lu " -0x9e2d: "Ya " -0x9e2e: "Xiao " -0x9e2f: "Yang " -0x9e30: "Ling " -0x9e31: "Zhi " -0x9e32: "Qu " -0x9e33: "Yuan " -0x9e34: "Xue " -0x9e35: "Tuo " -0x9e36: "Si " -0x9e37: "Zhi " -0x9e38: "Er " -0x9e39: "Gua " -0x9e3a: "Xiu " -0x9e3b: "Heng " -0x9e3c: "Zhou " -0x9e3d: "Ge " -0x9e3e: "Luan " -0x9e3f: "Hong " -0x9e40: "Wu " -0x9e41: "Bo " -0x9e42: "Li " -0x9e43: "Juan " -0x9e44: "Hu " -0x9e45: "E " -0x9e46: "Yu " -0x9e47: "Xian " -0x9e48: "Ti " -0x9e49: "Wu " -0x9e4a: "Que " -0x9e4b: "Miao " -0x9e4c: "An " -0x9e4d: "Kun " -0x9e4e: "Bei " -0x9e4f: "Peng " -0x9e50: "Qian " -0x9e51: "Chun " -0x9e52: "Geng " -0x9e53: "Yuan " -0x9e54: "Su " -0x9e55: "Hu " -0x9e56: "He " -0x9e57: "E " -0x9e58: "Gu " -0x9e59: "Qiu " -0x9e5a: "Zi " -0x9e5b: "Mei " -0x9e5c: "Mu " -0x9e5d: "Ni " -0x9e5e: "Yao " -0x9e5f: "Weng " -0x9e60: "Liu " -0x9e61: "Ji " -0x9e62: "Ni " -0x9e63: "Jian " -0x9e64: "He " -0x9e65: "Yi " -0x9e66: "Ying " -0x9e67: "Zhe " -0x9e68: "Liao " -0x9e69: "Liao " -0x9e6a: "Jiao " -0x9e6b: "Jiu " -0x9e6c: "Yu " -0x9e6d: "Lu " -0x9e6e: "Xuan " -0x9e6f: "Zhan " -0x9e70: "Ying " -0x9e71: "Huo " -0x9e72: "Meng " -0x9e73: "Guan " -0x9e74: "Shuang " -0x9e75: "Lu " -0x9e76: "Jin " -0x9e77: "Ling " -0x9e78: "Jian " -0x9e79: "Xian " -0x9e7a: "Cuo " -0x9e7b: "Jian " -0x9e7c: "Jian " -0x9e7d: "Yan " -0x9e7e: "Cuo " -0x9e7f: "Lu " -0x9e80: "You " -0x9e81: "Cu " -0x9e82: "Ji " -0x9e83: "Biao " -0x9e84: "Cu " -0x9e85: "Biao " -0x9e86: "Zhu " -0x9e87: "Jun " -0x9e88: "Zhu " -0x9e89: "Jian " -0x9e8a: "Mi " -0x9e8b: "Mi " -0x9e8c: "Wu " -0x9e8d: "Liu " -0x9e8e: "Chen " -0x9e8f: "Jun " -0x9e90: "Lin " -0x9e91: "Ni " -0x9e92: "Qi " -0x9e93: "Lu " -0x9e94: "Jiu " -0x9e95: "Jun " -0x9e96: "Jing " -0x9e97: "Li " -0x9e98: "Xiang " -0x9e99: "Yan " -0x9e9a: "Jia " -0x9e9b: "Mi " -0x9e9c: "Li " -0x9e9d: "She " -0x9e9e: "Zhang " -0x9e9f: "Lin " -0x9ea0: "Jing " -0x9ea1: "Ji " -0x9ea2: "Ling " -0x9ea3: "Yan " -0x9ea4: "Cu " -0x9ea5: "Mai " -0x9ea6: "Mai " -0x9ea7: "Ge " -0x9ea8: "Chao " -0x9ea9: "Fu " -0x9eaa: "Mian " -0x9eab: "Mian " -0x9eac: "Fu " -0x9ead: "Pao " -0x9eae: "Qu " -0x9eaf: "Qu " -0x9eb0: "Mou " -0x9eb1: "Fu " -0x9eb2: "Xian " -0x9eb3: "Lai " -0x9eb4: "Qu " -0x9eb5: "Mian " -0x9eb6: "[?] " -0x9eb7: "Feng " -0x9eb8: "Fu " -0x9eb9: "Qu " -0x9eba: "Mian " -0x9ebb: "Ma " -0x9ebc: "Mo " -0x9ebd: "Mo " -0x9ebe: "Hui " -0x9ebf: "Ma " -0x9ec0: "Zou " -0x9ec1: "Nen " -0x9ec2: "Fen " -0x9ec3: "Huang " -0x9ec4: "Huang " -0x9ec5: "Jin " -0x9ec6: "Guang " -0x9ec7: "Tian " -0x9ec8: "Tou " -0x9ec9: "Heng " -0x9eca: "Xi " -0x9ecb: "Kuang " -0x9ecc: "Heng " -0x9ecd: "Shu " -0x9ece: "Li " -0x9ecf: "Nian " -0x9ed0: "Chi " -0x9ed1: "Hei " -0x9ed2: "Hei " -0x9ed3: "Yi " -0x9ed4: "Qian " -0x9ed5: "Dan " -0x9ed6: "Xi " -0x9ed7: "Tuan " -0x9ed8: "Mo " -0x9ed9: "Mo " -0x9eda: "Qian " -0x9edb: "Dai " -0x9edc: "Chu " -0x9edd: "You " -0x9ede: "Dian " -0x9edf: "Yi " -0x9ee0: "Xia " -0x9ee1: "Yan " -0x9ee2: "Qu " -0x9ee3: "Mei " -0x9ee4: "Yan " -0x9ee5: "Jing " -0x9ee6: "Yu " -0x9ee7: "Li " -0x9ee8: "Dang " -0x9ee9: "Du " -0x9eea: "Can " -0x9eeb: "Yin " -0x9eec: "An " -0x9eed: "Yan " -0x9eee: "Tan " -0x9eef: "An " -0x9ef0: "Zhen " -0x9ef1: "Dai " -0x9ef2: "Can " -0x9ef3: "Yi " -0x9ef4: "Mei " -0x9ef5: "Dan " -0x9ef6: "Yan " -0x9ef7: "Du " -0x9ef8: "Lu " -0x9ef9: "Zhi " -0x9efa: "Fen " -0x9efb: "Fu " -0x9efc: "Fu " -0x9efd: "Min " -0x9efe: "Min " -0x9eff: "Yuan " -/* x09f */ -0x9f00: "Cu " -0x9f01: "Qu " -0x9f02: "Chao " -0x9f03: "Wa " -0x9f04: "Zhu " -0x9f05: "Zhi " -0x9f06: "Mang " -0x9f07: "Ao " -0x9f08: "Bie " -0x9f09: "Tuo " -0x9f0a: "Bi " -0x9f0b: "Yuan " -0x9f0c: "Chao " -0x9f0d: "Tuo " -0x9f0e: "Ding " -0x9f0f: "Mi " -0x9f10: "Nai " -0x9f11: "Ding " -0x9f12: "Zi " -0x9f13: "Gu " -0x9f14: "Gu " -0x9f15: "Dong " -0x9f16: "Fen " -0x9f17: "Tao " -0x9f18: "Yuan " -0x9f19: "Pi " -0x9f1a: "Chang " -0x9f1b: "Gao " -0x9f1c: "Qi " -0x9f1d: "Yuan " -0x9f1e: "Tang " -0x9f1f: "Teng " -0x9f20: "Shu " -0x9f21: "Shu " -0x9f22: "Fen " -0x9f23: "Fei " -0x9f24: "Wen " -0x9f25: "Ba " -0x9f26: "Diao " -0x9f27: "Tuo " -0x9f28: "Tong " -0x9f29: "Qu " -0x9f2a: "Sheng " -0x9f2b: "Shi " -0x9f2c: "You " -0x9f2d: "Shi " -0x9f2e: "Ting " -0x9f2f: "Wu " -0x9f30: "Nian " -0x9f31: "Jing " -0x9f32: "Hun " -0x9f33: "Ju " -0x9f34: "Yan " -0x9f35: "Tu " -0x9f36: "Ti " -0x9f37: "Xi " -0x9f38: "Xian " -0x9f39: "Yan " -0x9f3a: "Lei " -0x9f3b: "Bi " -0x9f3c: "Yao " -0x9f3d: "Qiu " -0x9f3e: "Han " -0x9f3f: "Wu " -0x9f40: "Wu " -0x9f41: "Hou " -0x9f42: "Xi " -0x9f43: "Ge " -0x9f44: "Zha " -0x9f45: "Xiu " -0x9f46: "Weng " -0x9f47: "Zha " -0x9f48: "Nong " -0x9f49: "Nang " -0x9f4a: "Qi " -0x9f4b: "Zhai " -0x9f4c: "Ji " -0x9f4d: "Zi " -0x9f4e: "Ji " -0x9f4f: "Ji " -0x9f50: "Qi " -0x9f51: "Ji " -0x9f52: "Chi " -0x9f53: "Chen " -0x9f54: "Chen " -0x9f55: "He " -0x9f56: "Ya " -0x9f57: "Ken " -0x9f58: "Xie " -0x9f59: "Pao " -0x9f5a: "Cuo " -0x9f5b: "Shi " -0x9f5c: "Zi " -0x9f5d: "Chi " -0x9f5e: "Nian " -0x9f5f: "Ju " -0x9f60: "Tiao " -0x9f61: "Ling " -0x9f62: "Ling " -0x9f63: "Chu " -0x9f64: "Quan " -0x9f65: "Xie " -0x9f66: "Ken " -0x9f67: "Nie " -0x9f68: "Jiu " -0x9f69: "Yao " -0x9f6a: "Chuo " -0x9f6b: "Kun " -0x9f6c: "Yu " -0x9f6d: "Chu " -0x9f6e: "Yi " -0x9f6f: "Ni " -0x9f70: "Cuo " -0x9f71: "Zou " -0x9f72: "Qu " -0x9f73: "Nen " -0x9f74: "Xian " -0x9f75: "Ou " -0x9f76: "E " -0x9f77: "Wo " -0x9f78: "Yi " -0x9f79: "Chuo " -0x9f7a: "Zou " -0x9f7b: "Dian " -0x9f7c: "Chu " -0x9f7d: "Jin " -0x9f7e: "Ya " -0x9f7f: "Chi " -0x9f80: "Chen " -0x9f81: "He " -0x9f82: "Ken " -0x9f83: "Ju " -0x9f84: "Ling " -0x9f85: "Pao " -0x9f86: "Tiao " -0x9f87: "Zi " -0x9f88: "Ken " -0x9f89: "Yu " -0x9f8a: "Chuo " -0x9f8b: "Qu " -0x9f8c: "Wo " -0x9f8d: "Long " -0x9f8e: "Pang " -0x9f8f: "Gong " -0x9f90: "Pang " -0x9f91: "Yan " -0x9f92: "Long " -0x9f93: "Long " -0x9f94: "Gong " -0x9f95: "Kan " -0x9f96: "Ta " -0x9f97: "Ling " -0x9f98: "Ta " -0x9f99: "Long " -0x9f9a: "Gong " -0x9f9b: "Kan " -0x9f9c: "Gui " -0x9f9d: "Qiu " -0x9f9e: "Bie " -0x9f9f: "Gui " -0x9fa0: "Yue " -0x9fa1: "Chui " -0x9fa2: "He " -0x9fa3: "Jue " -0x9fa4: "Xie " -0x9fa5: "Yu " -0x9fa6: "[?]" -0x9fa7: "[?]" -0x9fa8: "[?]" -0x9fa9: "[?]" -0x9faa: "[?]" -0x9fab: "[?]" -0x9fac: "[?]" -0x9fad: "[?]" -0x9fae: "[?]" -0x9faf: "[?]" -0x9fb0: "[?]" -0x9fb1: "[?]" -0x9fb2: "[?]" -0x9fb3: "[?]" -0x9fb4: "[?]" -0x9fb5: "[?]" -0x9fb6: "[?]" -0x9fb7: "[?]" -0x9fb8: "[?]" -0x9fb9: "[?]" -0x9fba: "[?]" -0x9fbb: "[?]" -0x9fbc: "[?]" -0x9fbd: "[?]" -0x9fbe: "[?]" -0x9fbf: "[?]" -0x9fc0: "[?]" -0x9fc1: "[?]" -0x9fc2: "[?]" -0x9fc3: "[?]" -0x9fc4: "[?]" -0x9fc5: "[?]" -0x9fc6: "[?]" -0x9fc7: "[?]" -0x9fc8: "[?]" -0x9fc9: "[?]" -0x9fca: "[?]" -0x9fcb: "[?]" -0x9fcc: "[?]" -0x9fcd: "[?]" -0x9fce: "[?]" -0x9fcf: "[?]" -0x9fd0: "[?]" -0x9fd1: "[?]" -0x9fd2: "[?]" -0x9fd3: "[?]" -0x9fd4: "[?]" -0x9fd5: "[?]" -0x9fd6: "[?]" -0x9fd7: "[?]" -0x9fd8: "[?]" -0x9fd9: "[?]" -0x9fda: "[?]" -0x9fdb: "[?]" -0x9fdc: "[?]" -0x9fdd: "[?]" -0x9fde: "[?]" -0x9fdf: "[?]" -0x9fe0: "[?]" -0x9fe1: "[?]" -0x9fe2: "[?]" -0x9fe3: "[?]" -0x9fe4: "[?]" -0x9fe5: "[?]" -0x9fe6: "[?]" -0x9fe7: "[?]" -0x9fe8: "[?]" -0x9fe9: "[?]" -0x9fea: "[?]" -0x9feb: "[?]" -0x9fec: "[?]" -0x9fed: "[?]" -0x9fee: "[?]" -0x9fef: "[?]" -0x9ff0: "[?]" -0x9ff1: "[?]" -0x9ff2: "[?]" -0x9ff3: "[?]" -0x9ff4: "[?]" -0x9ff5: "[?]" -0x9ff6: "[?]" -0x9ff7: "[?]" -0x9ff8: "[?]" -0x9ff9: "[?]" -0x9ffa: "[?]" -0x9ffb: "[?]" -0x9ffc: "[?]" -0x9ffd: "[?]" -0x9ffe: "[?]" -/* x0a0 */ -0xa000: "it" -0xa001: "ix" -0xa002: "i" -0xa003: "ip" -0xa004: "iet" -0xa005: "iex" -0xa006: "ie" -0xa007: "iep" -0xa008: "at" -0xa009: "ax" -0xa00a: "a" -0xa00b: "ap" -0xa00c: "uox" -0xa00d: "uo" -0xa00e: "uop" -0xa00f: "ot" -0xa010: "ox" -0xa011: "o" -0xa012: "op" -0xa013: "ex" -0xa014: "e" -0xa015: "wu" -0xa016: "bit" -0xa017: "bix" -0xa018: "bi" -0xa019: "bip" -0xa01a: "biet" -0xa01b: "biex" -0xa01c: "bie" -0xa01d: "biep" -0xa01e: "bat" -0xa01f: "bax" -0xa020: "ba" -0xa021: "bap" -0xa022: "buox" -0xa023: "buo" -0xa024: "buop" -0xa025: "bot" -0xa026: "box" -0xa027: "bo" -0xa028: "bop" -0xa029: "bex" -0xa02a: "be" -0xa02b: "bep" -0xa02c: "but" -0xa02d: "bux" -0xa02e: "bu" -0xa02f: "bup" -0xa030: "burx" -0xa031: "bur" -0xa032: "byt" -0xa033: "byx" -0xa034: "by" -0xa035: "byp" -0xa036: "byrx" -0xa037: "byr" -0xa038: "pit" -0xa039: "pix" -0xa03a: "pi" -0xa03b: "pip" -0xa03c: "piex" -0xa03d: "pie" -0xa03e: "piep" -0xa03f: "pat" -0xa040: "pax" -0xa041: "pa" -0xa042: "pap" -0xa043: "puox" -0xa044: "puo" -0xa045: "puop" -0xa046: "pot" -0xa047: "pox" -0xa048: "po" -0xa049: "pop" -0xa04a: "put" -0xa04b: "pux" -0xa04c: "pu" -0xa04d: "pup" -0xa04e: "purx" -0xa04f: "pur" -0xa050: "pyt" -0xa051: "pyx" -0xa052: "py" -0xa053: "pyp" -0xa054: "pyrx" -0xa055: "pyr" -0xa056: "bbit" -0xa057: "bbix" -0xa058: "bbi" -0xa059: "bbip" -0xa05a: "bbiet" -0xa05b: "bbiex" -0xa05c: "bbie" -0xa05d: "bbiep" -0xa05e: "bbat" -0xa05f: "bbax" -0xa060: "bba" -0xa061: "bbap" -0xa062: "bbuox" -0xa063: "bbuo" -0xa064: "bbuop" -0xa065: "bbot" -0xa066: "bbox" -0xa067: "bbo" -0xa068: "bbop" -0xa069: "bbex" -0xa06a: "bbe" -0xa06b: "bbep" -0xa06c: "bbut" -0xa06d: "bbux" -0xa06e: "bbu" -0xa06f: "bbup" -0xa070: "bburx" -0xa071: "bbur" -0xa072: "bbyt" -0xa073: "bbyx" -0xa074: "bby" -0xa075: "bbyp" -0xa076: "nbit" -0xa077: "nbix" -0xa078: "nbi" -0xa079: "nbip" -0xa07a: "nbiex" -0xa07b: "nbie" -0xa07c: "nbiep" -0xa07d: "nbat" -0xa07e: "nbax" -0xa07f: "nba" -0xa080: "nbap" -0xa081: "nbot" -0xa082: "nbox" -0xa083: "nbo" -0xa084: "nbop" -0xa085: "nbut" -0xa086: "nbux" -0xa087: "nbu" -0xa088: "nbup" -0xa089: "nburx" -0xa08a: "nbur" -0xa08b: "nbyt" -0xa08c: "nbyx" -0xa08d: "nby" -0xa08e: "nbyp" -0xa08f: "nbyrx" -0xa090: "nbyr" -0xa091: "hmit" -0xa092: "hmix" -0xa093: "hmi" -0xa094: "hmip" -0xa095: "hmiex" -0xa096: "hmie" -0xa097: "hmiep" -0xa098: "hmat" -0xa099: "hmax" -0xa09a: "hma" -0xa09b: "hmap" -0xa09c: "hmuox" -0xa09d: "hmuo" -0xa09e: "hmuop" -0xa09f: "hmot" -0xa0a0: "hmox" -0xa0a1: "hmo" -0xa0a2: "hmop" -0xa0a3: "hmut" -0xa0a4: "hmux" -0xa0a5: "hmu" -0xa0a6: "hmup" -0xa0a7: "hmurx" -0xa0a8: "hmur" -0xa0a9: "hmyx" -0xa0aa: "hmy" -0xa0ab: "hmyp" -0xa0ac: "hmyrx" -0xa0ad: "hmyr" -0xa0ae: "mit" -0xa0af: "mix" -0xa0b0: "mi" -0xa0b1: "mip" -0xa0b2: "miex" -0xa0b3: "mie" -0xa0b4: "miep" -0xa0b5: "mat" -0xa0b6: "max" -0xa0b7: "ma" -0xa0b8: "map" -0xa0b9: "muot" -0xa0ba: "muox" -0xa0bb: "muo" -0xa0bc: "muop" -0xa0bd: "mot" -0xa0be: "mox" -0xa0bf: "mo" -0xa0c0: "mop" -0xa0c1: "mex" -0xa0c2: "me" -0xa0c3: "mut" -0xa0c4: "mux" -0xa0c5: "mu" -0xa0c6: "mup" -0xa0c7: "murx" -0xa0c8: "mur" -0xa0c9: "myt" -0xa0ca: "myx" -0xa0cb: "my" -0xa0cc: "myp" -0xa0cd: "fit" -0xa0ce: "fix" -0xa0cf: "fi" -0xa0d0: "fip" -0xa0d1: "fat" -0xa0d2: "fax" -0xa0d3: "fa" -0xa0d4: "fap" -0xa0d5: "fox" -0xa0d6: "fo" -0xa0d7: "fop" -0xa0d8: "fut" -0xa0d9: "fux" -0xa0da: "fu" -0xa0db: "fup" -0xa0dc: "furx" -0xa0dd: "fur" -0xa0de: "fyt" -0xa0df: "fyx" -0xa0e0: "fy" -0xa0e1: "fyp" -0xa0e2: "vit" -0xa0e3: "vix" -0xa0e4: "vi" -0xa0e5: "vip" -0xa0e6: "viet" -0xa0e7: "viex" -0xa0e8: "vie" -0xa0e9: "viep" -0xa0ea: "vat" -0xa0eb: "vax" -0xa0ec: "va" -0xa0ed: "vap" -0xa0ee: "vot" -0xa0ef: "vox" -0xa0f0: "vo" -0xa0f1: "vop" -0xa0f2: "vex" -0xa0f3: "vep" -0xa0f4: "vut" -0xa0f5: "vux" -0xa0f6: "vu" -0xa0f7: "vup" -0xa0f8: "vurx" -0xa0f9: "vur" -0xa0fa: "vyt" -0xa0fb: "vyx" -0xa0fc: "vy" -0xa0fd: "vyp" -0xa0fe: "vyrx" -0xa0ff: "vyr" -/* x0a1 */ -0xa100: "dit" -0xa101: "dix" -0xa102: "di" -0xa103: "dip" -0xa104: "diex" -0xa105: "die" -0xa106: "diep" -0xa107: "dat" -0xa108: "dax" -0xa109: "da" -0xa10a: "dap" -0xa10b: "duox" -0xa10c: "duo" -0xa10d: "dot" -0xa10e: "dox" -0xa10f: "do" -0xa110: "dop" -0xa111: "dex" -0xa112: "de" -0xa113: "dep" -0xa114: "dut" -0xa115: "dux" -0xa116: "du" -0xa117: "dup" -0xa118: "durx" -0xa119: "dur" -0xa11a: "tit" -0xa11b: "tix" -0xa11c: "ti" -0xa11d: "tip" -0xa11e: "tiex" -0xa11f: "tie" -0xa120: "tiep" -0xa121: "tat" -0xa122: "tax" -0xa123: "ta" -0xa124: "tap" -0xa125: "tuot" -0xa126: "tuox" -0xa127: "tuo" -0xa128: "tuop" -0xa129: "tot" -0xa12a: "tox" -0xa12b: "to" -0xa12c: "top" -0xa12d: "tex" -0xa12e: "te" -0xa12f: "tep" -0xa130: "tut" -0xa131: "tux" -0xa132: "tu" -0xa133: "tup" -0xa134: "turx" -0xa135: "tur" -0xa136: "ddit" -0xa137: "ddix" -0xa138: "ddi" -0xa139: "ddip" -0xa13a: "ddiex" -0xa13b: "ddie" -0xa13c: "ddiep" -0xa13d: "ddat" -0xa13e: "ddax" -0xa13f: "dda" -0xa140: "ddap" -0xa141: "dduox" -0xa142: "dduo" -0xa143: "dduop" -0xa144: "ddot" -0xa145: "ddox" -0xa146: "ddo" -0xa147: "ddop" -0xa148: "ddex" -0xa149: "dde" -0xa14a: "ddep" -0xa14b: "ddut" -0xa14c: "ddux" -0xa14d: "ddu" -0xa14e: "ddup" -0xa14f: "ddurx" -0xa150: "ddur" -0xa151: "ndit" -0xa152: "ndix" -0xa153: "ndi" -0xa154: "ndip" -0xa155: "ndiex" -0xa156: "ndie" -0xa157: "ndat" -0xa158: "ndax" -0xa159: "nda" -0xa15a: "ndap" -0xa15b: "ndot" -0xa15c: "ndox" -0xa15d: "ndo" -0xa15e: "ndop" -0xa15f: "ndex" -0xa160: "nde" -0xa161: "ndep" -0xa162: "ndut" -0xa163: "ndux" -0xa164: "ndu" -0xa165: "ndup" -0xa166: "ndurx" -0xa167: "ndur" -0xa168: "hnit" -0xa169: "hnix" -0xa16a: "hni" -0xa16b: "hnip" -0xa16c: "hniet" -0xa16d: "hniex" -0xa16e: "hnie" -0xa16f: "hniep" -0xa170: "hnat" -0xa171: "hnax" -0xa172: "hna" -0xa173: "hnap" -0xa174: "hnuox" -0xa175: "hnuo" -0xa176: "hnot" -0xa177: "hnox" -0xa178: "hnop" -0xa179: "hnex" -0xa17a: "hne" -0xa17b: "hnep" -0xa17c: "hnut" -0xa17d: "nit" -0xa17e: "nix" -0xa17f: "ni" -0xa180: "nip" -0xa181: "niex" -0xa182: "nie" -0xa183: "niep" -0xa184: "nax" -0xa185: "na" -0xa186: "nap" -0xa187: "nuox" -0xa188: "nuo" -0xa189: "nuop" -0xa18a: "not" -0xa18b: "nox" -0xa18c: "no" -0xa18d: "nop" -0xa18e: "nex" -0xa18f: "ne" -0xa190: "nep" -0xa191: "nut" -0xa192: "nux" -0xa193: "nu" -0xa194: "nup" -0xa195: "nurx" -0xa196: "nur" -0xa197: "hlit" -0xa198: "hlix" -0xa199: "hli" -0xa19a: "hlip" -0xa19b: "hliex" -0xa19c: "hlie" -0xa19d: "hliep" -0xa19e: "hlat" -0xa19f: "hlax" -0xa1a0: "hla" -0xa1a1: "hlap" -0xa1a2: "hluox" -0xa1a3: "hluo" -0xa1a4: "hluop" -0xa1a5: "hlox" -0xa1a6: "hlo" -0xa1a7: "hlop" -0xa1a8: "hlex" -0xa1a9: "hle" -0xa1aa: "hlep" -0xa1ab: "hlut" -0xa1ac: "hlux" -0xa1ad: "hlu" -0xa1ae: "hlup" -0xa1af: "hlurx" -0xa1b0: "hlur" -0xa1b1: "hlyt" -0xa1b2: "hlyx" -0xa1b3: "hly" -0xa1b4: "hlyp" -0xa1b5: "hlyrx" -0xa1b6: "hlyr" -0xa1b7: "lit" -0xa1b8: "lix" -0xa1b9: "li" -0xa1ba: "lip" -0xa1bb: "liet" -0xa1bc: "liex" -0xa1bd: "lie" -0xa1be: "liep" -0xa1bf: "lat" -0xa1c0: "lax" -0xa1c1: "la" -0xa1c2: "lap" -0xa1c3: "luot" -0xa1c4: "luox" -0xa1c5: "luo" -0xa1c6: "luop" -0xa1c7: "lot" -0xa1c8: "lox" -0xa1c9: "lo" -0xa1ca: "lop" -0xa1cb: "lex" -0xa1cc: "le" -0xa1cd: "lep" -0xa1ce: "lut" -0xa1cf: "lux" -0xa1d0: "lu" -0xa1d1: "lup" -0xa1d2: "lurx" -0xa1d3: "lur" -0xa1d4: "lyt" -0xa1d5: "lyx" -0xa1d6: "ly" -0xa1d7: "lyp" -0xa1d8: "lyrx" -0xa1d9: "lyr" -0xa1da: "git" -0xa1db: "gix" -0xa1dc: "gi" -0xa1dd: "gip" -0xa1de: "giet" -0xa1df: "giex" -0xa1e0: "gie" -0xa1e1: "giep" -0xa1e2: "gat" -0xa1e3: "gax" -0xa1e4: "ga" -0xa1e5: "gap" -0xa1e6: "guot" -0xa1e7: "guox" -0xa1e8: "guo" -0xa1e9: "guop" -0xa1ea: "got" -0xa1eb: "gox" -0xa1ec: "go" -0xa1ed: "gop" -0xa1ee: "get" -0xa1ef: "gex" -0xa1f0: "ge" -0xa1f1: "gep" -0xa1f2: "gut" -0xa1f3: "gux" -0xa1f4: "gu" -0xa1f5: "gup" -0xa1f6: "gurx" -0xa1f7: "gur" -0xa1f8: "kit" -0xa1f9: "kix" -0xa1fa: "ki" -0xa1fb: "kip" -0xa1fc: "kiex" -0xa1fd: "kie" -0xa1fe: "kiep" -0xa1ff: "kat" -/* x0a2 */ -0xa200: "kax" -0xa201: "ka" -0xa202: "kap" -0xa203: "kuox" -0xa204: "kuo" -0xa205: "kuop" -0xa206: "kot" -0xa207: "kox" -0xa208: "ko" -0xa209: "kop" -0xa20a: "ket" -0xa20b: "kex" -0xa20c: "ke" -0xa20d: "kep" -0xa20e: "kut" -0xa20f: "kux" -0xa210: "ku" -0xa211: "kup" -0xa212: "kurx" -0xa213: "kur" -0xa214: "ggit" -0xa215: "ggix" -0xa216: "ggi" -0xa217: "ggiex" -0xa218: "ggie" -0xa219: "ggiep" -0xa21a: "ggat" -0xa21b: "ggax" -0xa21c: "gga" -0xa21d: "ggap" -0xa21e: "gguot" -0xa21f: "gguox" -0xa220: "gguo" -0xa221: "gguop" -0xa222: "ggot" -0xa223: "ggox" -0xa224: "ggo" -0xa225: "ggop" -0xa226: "gget" -0xa227: "ggex" -0xa228: "gge" -0xa229: "ggep" -0xa22a: "ggut" -0xa22b: "ggux" -0xa22c: "ggu" -0xa22d: "ggup" -0xa22e: "ggurx" -0xa22f: "ggur" -0xa230: "mgiex" -0xa231: "mgie" -0xa232: "mgat" -0xa233: "mgax" -0xa234: "mga" -0xa235: "mgap" -0xa236: "mguox" -0xa237: "mguo" -0xa238: "mguop" -0xa239: "mgot" -0xa23a: "mgox" -0xa23b: "mgo" -0xa23c: "mgop" -0xa23d: "mgex" -0xa23e: "mge" -0xa23f: "mgep" -0xa240: "mgut" -0xa241: "mgux" -0xa242: "mgu" -0xa243: "mgup" -0xa244: "mgurx" -0xa245: "mgur" -0xa246: "hxit" -0xa247: "hxix" -0xa248: "hxi" -0xa249: "hxip" -0xa24a: "hxiet" -0xa24b: "hxiex" -0xa24c: "hxie" -0xa24d: "hxiep" -0xa24e: "hxat" -0xa24f: "hxax" -0xa250: "hxa" -0xa251: "hxap" -0xa252: "hxuot" -0xa253: "hxuox" -0xa254: "hxuo" -0xa255: "hxuop" -0xa256: "hxot" -0xa257: "hxox" -0xa258: "hxo" -0xa259: "hxop" -0xa25a: "hxex" -0xa25b: "hxe" -0xa25c: "hxep" -0xa25d: "ngiex" -0xa25e: "ngie" -0xa25f: "ngiep" -0xa260: "ngat" -0xa261: "ngax" -0xa262: "nga" -0xa263: "ngap" -0xa264: "nguot" -0xa265: "nguox" -0xa266: "nguo" -0xa267: "ngot" -0xa268: "ngox" -0xa269: "ngo" -0xa26a: "ngop" -0xa26b: "ngex" -0xa26c: "nge" -0xa26d: "ngep" -0xa26e: "hit" -0xa26f: "hiex" -0xa270: "hie" -0xa271: "hat" -0xa272: "hax" -0xa273: "ha" -0xa274: "hap" -0xa275: "huot" -0xa276: "huox" -0xa277: "huo" -0xa278: "huop" -0xa279: "hot" -0xa27a: "hox" -0xa27b: "ho" -0xa27c: "hop" -0xa27d: "hex" -0xa27e: "he" -0xa27f: "hep" -0xa280: "wat" -0xa281: "wax" -0xa282: "wa" -0xa283: "wap" -0xa284: "wuox" -0xa285: "wuo" -0xa286: "wuop" -0xa287: "wox" -0xa288: "wo" -0xa289: "wop" -0xa28a: "wex" -0xa28b: "we" -0xa28c: "wep" -0xa28d: "zit" -0xa28e: "zix" -0xa28f: "zi" -0xa290: "zip" -0xa291: "ziex" -0xa292: "zie" -0xa293: "ziep" -0xa294: "zat" -0xa295: "zax" -0xa296: "za" -0xa297: "zap" -0xa298: "zuox" -0xa299: "zuo" -0xa29a: "zuop" -0xa29b: "zot" -0xa29c: "zox" -0xa29d: "zo" -0xa29e: "zop" -0xa29f: "zex" -0xa2a0: "ze" -0xa2a1: "zep" -0xa2a2: "zut" -0xa2a3: "zux" -0xa2a4: "zu" -0xa2a5: "zup" -0xa2a6: "zurx" -0xa2a7: "zur" -0xa2a8: "zyt" -0xa2a9: "zyx" -0xa2aa: "zy" -0xa2ab: "zyp" -0xa2ac: "zyrx" -0xa2ad: "zyr" -0xa2ae: "cit" -0xa2af: "cix" -0xa2b0: "ci" -0xa2b1: "cip" -0xa2b2: "ciet" -0xa2b3: "ciex" -0xa2b4: "cie" -0xa2b5: "ciep" -0xa2b6: "cat" -0xa2b7: "cax" -0xa2b8: "ca" -0xa2b9: "cap" -0xa2ba: "cuox" -0xa2bb: "cuo" -0xa2bc: "cuop" -0xa2bd: "cot" -0xa2be: "cox" -0xa2bf: "co" -0xa2c0: "cop" -0xa2c1: "cex" -0xa2c2: "ce" -0xa2c3: "cep" -0xa2c4: "cut" -0xa2c5: "cux" -0xa2c6: "cu" -0xa2c7: "cup" -0xa2c8: "curx" -0xa2c9: "cur" -0xa2ca: "cyt" -0xa2cb: "cyx" -0xa2cc: "cy" -0xa2cd: "cyp" -0xa2ce: "cyrx" -0xa2cf: "cyr" -0xa2d0: "zzit" -0xa2d1: "zzix" -0xa2d2: "zzi" -0xa2d3: "zzip" -0xa2d4: "zziet" -0xa2d5: "zziex" -0xa2d6: "zzie" -0xa2d7: "zziep" -0xa2d8: "zzat" -0xa2d9: "zzax" -0xa2da: "zza" -0xa2db: "zzap" -0xa2dc: "zzox" -0xa2dd: "zzo" -0xa2de: "zzop" -0xa2df: "zzex" -0xa2e0: "zze" -0xa2e1: "zzep" -0xa2e2: "zzux" -0xa2e3: "zzu" -0xa2e4: "zzup" -0xa2e5: "zzurx" -0xa2e6: "zzur" -0xa2e7: "zzyt" -0xa2e8: "zzyx" -0xa2e9: "zzy" -0xa2ea: "zzyp" -0xa2eb: "zzyrx" -0xa2ec: "zzyr" -0xa2ed: "nzit" -0xa2ee: "nzix" -0xa2ef: "nzi" -0xa2f0: "nzip" -0xa2f1: "nziex" -0xa2f2: "nzie" -0xa2f3: "nziep" -0xa2f4: "nzat" -0xa2f5: "nzax" -0xa2f6: "nza" -0xa2f7: "nzap" -0xa2f8: "nzuox" -0xa2f9: "nzuo" -0xa2fa: "nzox" -0xa2fb: "nzop" -0xa2fc: "nzex" -0xa2fd: "nze" -0xa2fe: "nzux" -0xa2ff: "nzu" -/* x0a3 */ -0xa300: "nzup" -0xa301: "nzurx" -0xa302: "nzur" -0xa303: "nzyt" -0xa304: "nzyx" -0xa305: "nzy" -0xa306: "nzyp" -0xa307: "nzyrx" -0xa308: "nzyr" -0xa309: "sit" -0xa30a: "six" -0xa30b: "si" -0xa30c: "sip" -0xa30d: "siex" -0xa30e: "sie" -0xa30f: "siep" -0xa310: "sat" -0xa311: "sax" -0xa312: "sa" -0xa313: "sap" -0xa314: "suox" -0xa315: "suo" -0xa316: "suop" -0xa317: "sot" -0xa318: "sox" -0xa319: "so" -0xa31a: "sop" -0xa31b: "sex" -0xa31c: "se" -0xa31d: "sep" -0xa31e: "sut" -0xa31f: "sux" -0xa320: "su" -0xa321: "sup" -0xa322: "surx" -0xa323: "sur" -0xa324: "syt" -0xa325: "syx" -0xa326: "sy" -0xa327: "syp" -0xa328: "syrx" -0xa329: "syr" -0xa32a: "ssit" -0xa32b: "ssix" -0xa32c: "ssi" -0xa32d: "ssip" -0xa32e: "ssiex" -0xa32f: "ssie" -0xa330: "ssiep" -0xa331: "ssat" -0xa332: "ssax" -0xa333: "ssa" -0xa334: "ssap" -0xa335: "ssot" -0xa336: "ssox" -0xa337: "sso" -0xa338: "ssop" -0xa339: "ssex" -0xa33a: "sse" -0xa33b: "ssep" -0xa33c: "ssut" -0xa33d: "ssux" -0xa33e: "ssu" -0xa33f: "ssup" -0xa340: "ssyt" -0xa341: "ssyx" -0xa342: "ssy" -0xa343: "ssyp" -0xa344: "ssyrx" -0xa345: "ssyr" -0xa346: "zhat" -0xa347: "zhax" -0xa348: "zha" -0xa349: "zhap" -0xa34a: "zhuox" -0xa34b: "zhuo" -0xa34c: "zhuop" -0xa34d: "zhot" -0xa34e: "zhox" -0xa34f: "zho" -0xa350: "zhop" -0xa351: "zhet" -0xa352: "zhex" -0xa353: "zhe" -0xa354: "zhep" -0xa355: "zhut" -0xa356: "zhux" -0xa357: "zhu" -0xa358: "zhup" -0xa359: "zhurx" -0xa35a: "zhur" -0xa35b: "zhyt" -0xa35c: "zhyx" -0xa35d: "zhy" -0xa35e: "zhyp" -0xa35f: "zhyrx" -0xa360: "zhyr" -0xa361: "chat" -0xa362: "chax" -0xa363: "cha" -0xa364: "chap" -0xa365: "chuot" -0xa366: "chuox" -0xa367: "chuo" -0xa368: "chuop" -0xa369: "chot" -0xa36a: "chox" -0xa36b: "cho" -0xa36c: "chop" -0xa36d: "chet" -0xa36e: "chex" -0xa36f: "che" -0xa370: "chep" -0xa371: "chux" -0xa372: "chu" -0xa373: "chup" -0xa374: "churx" -0xa375: "chur" -0xa376: "chyt" -0xa377: "chyx" -0xa378: "chy" -0xa379: "chyp" -0xa37a: "chyrx" -0xa37b: "chyr" -0xa37c: "rrax" -0xa37d: "rra" -0xa37e: "rruox" -0xa37f: "rruo" -0xa380: "rrot" -0xa381: "rrox" -0xa382: "rro" -0xa383: "rrop" -0xa384: "rret" -0xa385: "rrex" -0xa386: "rre" -0xa387: "rrep" -0xa388: "rrut" -0xa389: "rrux" -0xa38a: "rru" -0xa38b: "rrup" -0xa38c: "rrurx" -0xa38d: "rrur" -0xa38e: "rryt" -0xa38f: "rryx" -0xa390: "rry" -0xa391: "rryp" -0xa392: "rryrx" -0xa393: "rryr" -0xa394: "nrat" -0xa395: "nrax" -0xa396: "nra" -0xa397: "nrap" -0xa398: "nrox" -0xa399: "nro" -0xa39a: "nrop" -0xa39b: "nret" -0xa39c: "nrex" -0xa39d: "nre" -0xa39e: "nrep" -0xa39f: "nrut" -0xa3a0: "nrux" -0xa3a1: "nru" -0xa3a2: "nrup" -0xa3a3: "nrurx" -0xa3a4: "nrur" -0xa3a5: "nryt" -0xa3a6: "nryx" -0xa3a7: "nry" -0xa3a8: "nryp" -0xa3a9: "nryrx" -0xa3aa: "nryr" -0xa3ab: "shat" -0xa3ac: "shax" -0xa3ad: "sha" -0xa3ae: "shap" -0xa3af: "shuox" -0xa3b0: "shuo" -0xa3b1: "shuop" -0xa3b2: "shot" -0xa3b3: "shox" -0xa3b4: "sho" -0xa3b5: "shop" -0xa3b6: "shet" -0xa3b7: "shex" -0xa3b8: "she" -0xa3b9: "shep" -0xa3ba: "shut" -0xa3bb: "shux" -0xa3bc: "shu" -0xa3bd: "shup" -0xa3be: "shurx" -0xa3bf: "shur" -0xa3c0: "shyt" -0xa3c1: "shyx" -0xa3c2: "shy" -0xa3c3: "shyp" -0xa3c4: "shyrx" -0xa3c5: "shyr" -0xa3c6: "rat" -0xa3c7: "rax" -0xa3c8: "ra" -0xa3c9: "rap" -0xa3ca: "ruox" -0xa3cb: "ruo" -0xa3cc: "ruop" -0xa3cd: "rot" -0xa3ce: "rox" -0xa3cf: "ro" -0xa3d0: "rop" -0xa3d1: "rex" -0xa3d2: "re" -0xa3d3: "rep" -0xa3d4: "rut" -0xa3d5: "rux" -0xa3d6: "ru" -0xa3d7: "rup" -0xa3d8: "rurx" -0xa3d9: "rur" -0xa3da: "ryt" -0xa3db: "ryx" -0xa3dc: "ry" -0xa3dd: "ryp" -0xa3de: "ryrx" -0xa3df: "ryr" -0xa3e0: "jit" -0xa3e1: "jix" -0xa3e2: "ji" -0xa3e3: "jip" -0xa3e4: "jiet" -0xa3e5: "jiex" -0xa3e6: "jie" -0xa3e7: "jiep" -0xa3e8: "juot" -0xa3e9: "juox" -0xa3ea: "juo" -0xa3eb: "juop" -0xa3ec: "jot" -0xa3ed: "jox" -0xa3ee: "jo" -0xa3ef: "jop" -0xa3f0: "jut" -0xa3f1: "jux" -0xa3f2: "ju" -0xa3f3: "jup" -0xa3f4: "jurx" -0xa3f5: "jur" -0xa3f6: "jyt" -0xa3f7: "jyx" -0xa3f8: "jy" -0xa3f9: "jyp" -0xa3fa: "jyrx" -0xa3fb: "jyr" -0xa3fc: "qit" -0xa3fd: "qix" -0xa3fe: "qi" -0xa3ff: "qip" -/* x0a4 */ -0xa400: "qiet" -0xa401: "qiex" -0xa402: "qie" -0xa403: "qiep" -0xa404: "quot" -0xa405: "quox" -0xa406: "quo" -0xa407: "quop" -0xa408: "qot" -0xa409: "qox" -0xa40a: "qo" -0xa40b: "qop" -0xa40c: "qut" -0xa40d: "qux" -0xa40e: "qu" -0xa40f: "qup" -0xa410: "qurx" -0xa411: "qur" -0xa412: "qyt" -0xa413: "qyx" -0xa414: "qy" -0xa415: "qyp" -0xa416: "qyrx" -0xa417: "qyr" -0xa418: "jjit" -0xa419: "jjix" -0xa41a: "jji" -0xa41b: "jjip" -0xa41c: "jjiet" -0xa41d: "jjiex" -0xa41e: "jjie" -0xa41f: "jjiep" -0xa420: "jjuox" -0xa421: "jjuo" -0xa422: "jjuop" -0xa423: "jjot" -0xa424: "jjox" -0xa425: "jjo" -0xa426: "jjop" -0xa427: "jjut" -0xa428: "jjux" -0xa429: "jju" -0xa42a: "jjup" -0xa42b: "jjurx" -0xa42c: "jjur" -0xa42d: "jjyt" -0xa42e: "jjyx" -0xa42f: "jjy" -0xa430: "jjyp" -0xa431: "njit" -0xa432: "njix" -0xa433: "nji" -0xa434: "njip" -0xa435: "njiet" -0xa436: "njiex" -0xa437: "njie" -0xa438: "njiep" -0xa439: "njuox" -0xa43a: "njuo" -0xa43b: "njot" -0xa43c: "njox" -0xa43d: "njo" -0xa43e: "njop" -0xa43f: "njux" -0xa440: "nju" -0xa441: "njup" -0xa442: "njurx" -0xa443: "njur" -0xa444: "njyt" -0xa445: "njyx" -0xa446: "njy" -0xa447: "njyp" -0xa448: "njyrx" -0xa449: "njyr" -0xa44a: "nyit" -0xa44b: "nyix" -0xa44c: "nyi" -0xa44d: "nyip" -0xa44e: "nyiet" -0xa44f: "nyiex" -0xa450: "nyie" -0xa451: "nyiep" -0xa452: "nyuox" -0xa453: "nyuo" -0xa454: "nyuop" -0xa455: "nyot" -0xa456: "nyox" -0xa457: "nyo" -0xa458: "nyop" -0xa459: "nyut" -0xa45a: "nyux" -0xa45b: "nyu" -0xa45c: "nyup" -0xa45d: "xit" -0xa45e: "xix" -0xa45f: "xi" -0xa460: "xip" -0xa461: "xiet" -0xa462: "xiex" -0xa463: "xie" -0xa464: "xiep" -0xa465: "xuox" -0xa466: "xuo" -0xa467: "xot" -0xa468: "xox" -0xa469: "xo" -0xa46a: "xop" -0xa46b: "xyt" -0xa46c: "xyx" -0xa46d: "xy" -0xa46e: "xyp" -0xa46f: "xyrx" -0xa470: "xyr" -0xa471: "yit" -0xa472: "yix" -0xa473: "yi" -0xa474: "yip" -0xa475: "yiet" -0xa476: "yiex" -0xa477: "yie" -0xa478: "yiep" -0xa479: "yuot" -0xa47a: "yuox" -0xa47b: "yuo" -0xa47c: "yuop" -0xa47d: "yot" -0xa47e: "yox" -0xa47f: "yo" -0xa480: "yop" -0xa481: "yut" -0xa482: "yux" -0xa483: "yu" -0xa484: "yup" -0xa485: "yurx" -0xa486: "yur" -0xa487: "yyt" -0xa488: "yyx" -0xa489: "yy" -0xa48a: "yyp" -0xa48b: "yyrx" -0xa48c: "yyr" -0xa48d: "[?]" -0xa48e: "[?]" -0xa48f: "[?]" -0xa490: "Qot" -0xa491: "Li" -0xa492: "Kit" -0xa493: "Nyip" -0xa494: "Cyp" -0xa495: "Ssi" -0xa496: "Ggop" -0xa497: "Gep" -0xa498: "Mi" -0xa499: "Hxit" -0xa49a: "Lyr" -0xa49b: "Bbut" -0xa49c: "Mop" -0xa49d: "Yo" -0xa49e: "Put" -0xa49f: "Hxuo" -0xa4a0: "Tat" -0xa4a1: "Ga" -0xa4a2: "[?]" -0xa4a3: "[?]" -0xa4a4: "Ddur" -0xa4a5: "Bur" -0xa4a6: "Gguo" -0xa4a7: "Nyop" -0xa4a8: "Tu" -0xa4a9: "Op" -0xa4aa: "Jjut" -0xa4ab: "Zot" -0xa4ac: "Pyt" -0xa4ad: "Hmo" -0xa4ae: "Yit" -0xa4af: "Vur" -0xa4b0: "Shy" -0xa4b1: "Vep" -0xa4b2: "Za" -0xa4b3: "Jo" -0xa4b4: "[?]" -0xa4b5: "Jjy" -0xa4b6: "Got" -0xa4b7: "Jjie" -0xa4b8: "Wo" -0xa4b9: "Du" -0xa4ba: "Shur" -0xa4bb: "Lie" -0xa4bc: "Cy" -0xa4bd: "Cuop" -0xa4be: "Cip" -0xa4bf: "Hxop" -0xa4c0: "Shat" -0xa4c1: "[?]" -0xa4c2: "Shop" -0xa4c3: "Che" -0xa4c4: "Zziet" -0xa4c5: "[?]" -0xa4c6: "Ke" -0xa4c7: "[?]" -0xa4c8: "[?]" -0xa4c9: "[?]" -0xa4ca: "[?]" -0xa4cb: "[?]" -0xa4cc: "[?]" -0xa4cd: "[?]" -0xa4ce: "[?]" -0xa4cf: "[?]" -0xa4d0: "[?]" -0xa4d1: "[?]" -0xa4d2: "[?]" -0xa4d3: "[?]" -0xa4d4: "[?]" -0xa4d5: "[?]" -0xa4d6: "[?]" -0xa4d7: "[?]" -0xa4d8: "[?]" -0xa4d9: "[?]" -0xa4da: "[?]" -0xa4db: "[?]" -0xa4dc: "[?]" -0xa4dd: "[?]" -0xa4de: "[?]" -0xa4df: "[?]" -0xa4e0: "[?]" -0xa4e1: "[?]" -0xa4e2: "[?]" -0xa4e3: "[?]" -0xa4e4: "[?]" -0xa4e5: "[?]" -0xa4e6: "[?]" -0xa4e7: "[?]" -0xa4e8: "[?]" -0xa4e9: "[?]" -0xa4ea: "[?]" -0xa4eb: "[?]" -0xa4ec: "[?]" -0xa4ed: "[?]" -0xa4ee: "[?]" -0xa4ef: "[?]" -0xa4f0: "[?]" -0xa4f1: "[?]" -0xa4f2: "[?]" -0xa4f3: "[?]" -0xa4f4: "[?]" -0xa4f5: "[?]" -0xa4f6: "[?]" -0xa4f7: "[?]" -0xa4f8: "[?]" -0xa4f9: "[?]" -0xa4fa: "[?]" -0xa4fb: "[?]" -0xa4fc: "[?]" -0xa4fd: "[?]" -0xa4fe: "[?]" -/* x0ac */ -0xac00: "ga" -0xac01: "gag" -0xac02: "gagg" -0xac03: "gags" -0xac04: "gan" -0xac05: "ganj" -0xac06: "ganh" -0xac07: "gad" -0xac08: "gal" -0xac09: "galg" -0xac0a: "galm" -0xac0b: "galb" -0xac0c: "gals" -0xac0d: "galt" -0xac0e: "galp" -0xac0f: "galh" -0xac10: "gam" -0xac11: "gab" -0xac12: "gabs" -0xac13: "gas" -0xac14: "gass" -0xac15: "gang" -0xac16: "gaj" -0xac17: "gac" -0xac18: "gak" -0xac19: "gat" -0xac1a: "gap" -0xac1b: "gah" -0xac1c: "gae" -0xac1d: "gaeg" -0xac1e: "gaegg" -0xac1f: "gaegs" -0xac20: "gaen" -0xac21: "gaenj" -0xac22: "gaenh" -0xac23: "gaed" -0xac24: "gael" -0xac25: "gaelg" -0xac26: "gaelm" -0xac27: "gaelb" -0xac28: "gaels" -0xac29: "gaelt" -0xac2a: "gaelp" -0xac2b: "gaelh" -0xac2c: "gaem" -0xac2d: "gaeb" -0xac2e: "gaebs" -0xac2f: "gaes" -0xac30: "gaess" -0xac31: "gaeng" -0xac32: "gaej" -0xac33: "gaec" -0xac34: "gaek" -0xac35: "gaet" -0xac36: "gaep" -0xac37: "gaeh" -0xac38: "gya" -0xac39: "gyag" -0xac3a: "gyagg" -0xac3b: "gyags" -0xac3c: "gyan" -0xac3d: "gyanj" -0xac3e: "gyanh" -0xac3f: "gyad" -0xac40: "gyal" -0xac41: "gyalg" -0xac42: "gyalm" -0xac43: "gyalb" -0xac44: "gyals" -0xac45: "gyalt" -0xac46: "gyalp" -0xac47: "gyalh" -0xac48: "gyam" -0xac49: "gyab" -0xac4a: "gyabs" -0xac4b: "gyas" -0xac4c: "gyass" -0xac4d: "gyang" -0xac4e: "gyaj" -0xac4f: "gyac" -0xac50: "gyak" -0xac51: "gyat" -0xac52: "gyap" -0xac53: "gyah" -0xac54: "gyae" -0xac55: "gyaeg" -0xac56: "gyaegg" -0xac57: "gyaegs" -0xac58: "gyaen" -0xac59: "gyaenj" -0xac5a: "gyaenh" -0xac5b: "gyaed" -0xac5c: "gyael" -0xac5d: "gyaelg" -0xac5e: "gyaelm" -0xac5f: "gyaelb" -0xac60: "gyaels" -0xac61: "gyaelt" -0xac62: "gyaelp" -0xac63: "gyaelh" -0xac64: "gyaem" -0xac65: "gyaeb" -0xac66: "gyaebs" -0xac67: "gyaes" -0xac68: "gyaess" -0xac69: "gyaeng" -0xac6a: "gyaej" -0xac6b: "gyaec" -0xac6c: "gyaek" -0xac6d: "gyaet" -0xac6e: "gyaep" -0xac6f: "gyaeh" -0xac70: "geo" -0xac71: "geog" -0xac72: "geogg" -0xac73: "geogs" -0xac74: "geon" -0xac75: "geonj" -0xac76: "geonh" -0xac77: "geod" -0xac78: "geol" -0xac79: "geolg" -0xac7a: "geolm" -0xac7b: "geolb" -0xac7c: "geols" -0xac7d: "geolt" -0xac7e: "geolp" -0xac7f: "geolh" -0xac80: "geom" -0xac81: "geob" -0xac82: "geobs" -0xac83: "geos" -0xac84: "geoss" -0xac85: "geong" -0xac86: "geoj" -0xac87: "geoc" -0xac88: "geok" -0xac89: "geot" -0xac8a: "geop" -0xac8b: "geoh" -0xac8c: "ge" -0xac8d: "geg" -0xac8e: "gegg" -0xac8f: "gegs" -0xac90: "gen" -0xac91: "genj" -0xac92: "genh" -0xac93: "ged" -0xac94: "gel" -0xac95: "gelg" -0xac96: "gelm" -0xac97: "gelb" -0xac98: "gels" -0xac99: "gelt" -0xac9a: "gelp" -0xac9b: "gelh" -0xac9c: "gem" -0xac9d: "geb" -0xac9e: "gebs" -0xac9f: "ges" -0xaca0: "gess" -0xaca1: "geng" -0xaca2: "gej" -0xaca3: "gec" -0xaca4: "gek" -0xaca5: "get" -0xaca6: "gep" -0xaca7: "geh" -0xaca8: "gyeo" -0xaca9: "gyeog" -0xacaa: "gyeogg" -0xacab: "gyeogs" -0xacac: "gyeon" -0xacad: "gyeonj" -0xacae: "gyeonh" -0xacaf: "gyeod" -0xacb0: "gyeol" -0xacb1: "gyeolg" -0xacb2: "gyeolm" -0xacb3: "gyeolb" -0xacb4: "gyeols" -0xacb5: "gyeolt" -0xacb6: "gyeolp" -0xacb7: "gyeolh" -0xacb8: "gyeom" -0xacb9: "gyeob" -0xacba: "gyeobs" -0xacbb: "gyeos" -0xacbc: "gyeoss" -0xacbd: "gyeong" -0xacbe: "gyeoj" -0xacbf: "gyeoc" -0xacc0: "gyeok" -0xacc1: "gyeot" -0xacc2: "gyeop" -0xacc3: "gyeoh" -0xacc4: "gye" -0xacc5: "gyeg" -0xacc6: "gyegg" -0xacc7: "gyegs" -0xacc8: "gyen" -0xacc9: "gyenj" -0xacca: "gyenh" -0xaccb: "gyed" -0xaccc: "gyel" -0xaccd: "gyelg" -0xacce: "gyelm" -0xaccf: "gyelb" -0xacd0: "gyels" -0xacd1: "gyelt" -0xacd2: "gyelp" -0xacd3: "gyelh" -0xacd4: "gyem" -0xacd5: "gyeb" -0xacd6: "gyebs" -0xacd7: "gyes" -0xacd8: "gyess" -0xacd9: "gyeng" -0xacda: "gyej" -0xacdb: "gyec" -0xacdc: "gyek" -0xacdd: "gyet" -0xacde: "gyep" -0xacdf: "gyeh" -0xace0: "go" -0xace1: "gog" -0xace2: "gogg" -0xace3: "gogs" -0xace4: "gon" -0xace5: "gonj" -0xace6: "gonh" -0xace7: "god" -0xace8: "gol" -0xace9: "golg" -0xacea: "golm" -0xaceb: "golb" -0xacec: "gols" -0xaced: "golt" -0xacee: "golp" -0xacef: "golh" -0xacf0: "gom" -0xacf1: "gob" -0xacf2: "gobs" -0xacf3: "gos" -0xacf4: "goss" -0xacf5: "gong" -0xacf6: "goj" -0xacf7: "goc" -0xacf8: "gok" -0xacf9: "got" -0xacfa: "gop" -0xacfb: "goh" -0xacfc: "gwa" -0xacfd: "gwag" -0xacfe: "gwagg" -0xacff: "gwags" -/* x0ad */ -0xad00: "gwan" -0xad01: "gwanj" -0xad02: "gwanh" -0xad03: "gwad" -0xad04: "gwal" -0xad05: "gwalg" -0xad06: "gwalm" -0xad07: "gwalb" -0xad08: "gwals" -0xad09: "gwalt" -0xad0a: "gwalp" -0xad0b: "gwalh" -0xad0c: "gwam" -0xad0d: "gwab" -0xad0e: "gwabs" -0xad0f: "gwas" -0xad10: "gwass" -0xad11: "gwang" -0xad12: "gwaj" -0xad13: "gwac" -0xad14: "gwak" -0xad15: "gwat" -0xad16: "gwap" -0xad17: "gwah" -0xad18: "gwae" -0xad19: "gwaeg" -0xad1a: "gwaegg" -0xad1b: "gwaegs" -0xad1c: "gwaen" -0xad1d: "gwaenj" -0xad1e: "gwaenh" -0xad1f: "gwaed" -0xad20: "gwael" -0xad21: "gwaelg" -0xad22: "gwaelm" -0xad23: "gwaelb" -0xad24: "gwaels" -0xad25: "gwaelt" -0xad26: "gwaelp" -0xad27: "gwaelh" -0xad28: "gwaem" -0xad29: "gwaeb" -0xad2a: "gwaebs" -0xad2b: "gwaes" -0xad2c: "gwaess" -0xad2d: "gwaeng" -0xad2e: "gwaej" -0xad2f: "gwaec" -0xad30: "gwaek" -0xad31: "gwaet" -0xad32: "gwaep" -0xad33: "gwaeh" -0xad34: "goe" -0xad35: "goeg" -0xad36: "goegg" -0xad37: "goegs" -0xad38: "goen" -0xad39: "goenj" -0xad3a: "goenh" -0xad3b: "goed" -0xad3c: "goel" -0xad3d: "goelg" -0xad3e: "goelm" -0xad3f: "goelb" -0xad40: "goels" -0xad41: "goelt" -0xad42: "goelp" -0xad43: "goelh" -0xad44: "goem" -0xad45: "goeb" -0xad46: "goebs" -0xad47: "goes" -0xad48: "goess" -0xad49: "goeng" -0xad4a: "goej" -0xad4b: "goec" -0xad4c: "goek" -0xad4d: "goet" -0xad4e: "goep" -0xad4f: "goeh" -0xad50: "gyo" -0xad51: "gyog" -0xad52: "gyogg" -0xad53: "gyogs" -0xad54: "gyon" -0xad55: "gyonj" -0xad56: "gyonh" -0xad57: "gyod" -0xad58: "gyol" -0xad59: "gyolg" -0xad5a: "gyolm" -0xad5b: "gyolb" -0xad5c: "gyols" -0xad5d: "gyolt" -0xad5e: "gyolp" -0xad5f: "gyolh" -0xad60: "gyom" -0xad61: "gyob" -0xad62: "gyobs" -0xad63: "gyos" -0xad64: "gyoss" -0xad65: "gyong" -0xad66: "gyoj" -0xad67: "gyoc" -0xad68: "gyok" -0xad69: "gyot" -0xad6a: "gyop" -0xad6b: "gyoh" -0xad6c: "gu" -0xad6d: "gug" -0xad6e: "gugg" -0xad6f: "gugs" -0xad70: "gun" -0xad71: "gunj" -0xad72: "gunh" -0xad73: "gud" -0xad74: "gul" -0xad75: "gulg" -0xad76: "gulm" -0xad77: "gulb" -0xad78: "guls" -0xad79: "gult" -0xad7a: "gulp" -0xad7b: "gulh" -0xad7c: "gum" -0xad7d: "gub" -0xad7e: "gubs" -0xad7f: "gus" -0xad80: "guss" -0xad81: "gung" -0xad82: "guj" -0xad83: "guc" -0xad84: "guk" -0xad85: "gut" -0xad86: "gup" -0xad87: "guh" -0xad88: "gweo" -0xad89: "gweog" -0xad8a: "gweogg" -0xad8b: "gweogs" -0xad8c: "gweon" -0xad8d: "gweonj" -0xad8e: "gweonh" -0xad8f: "gweod" -0xad90: "gweol" -0xad91: "gweolg" -0xad92: "gweolm" -0xad93: "gweolb" -0xad94: "gweols" -0xad95: "gweolt" -0xad96: "gweolp" -0xad97: "gweolh" -0xad98: "gweom" -0xad99: "gweob" -0xad9a: "gweobs" -0xad9b: "gweos" -0xad9c: "gweoss" -0xad9d: "gweong" -0xad9e: "gweoj" -0xad9f: "gweoc" -0xada0: "gweok" -0xada1: "gweot" -0xada2: "gweop" -0xada3: "gweoh" -0xada4: "gwe" -0xada5: "gweg" -0xada6: "gwegg" -0xada7: "gwegs" -0xada8: "gwen" -0xada9: "gwenj" -0xadaa: "gwenh" -0xadab: "gwed" -0xadac: "gwel" -0xadad: "gwelg" -0xadae: "gwelm" -0xadaf: "gwelb" -0xadb0: "gwels" -0xadb1: "gwelt" -0xadb2: "gwelp" -0xadb3: "gwelh" -0xadb4: "gwem" -0xadb5: "gweb" -0xadb6: "gwebs" -0xadb7: "gwes" -0xadb8: "gwess" -0xadb9: "gweng" -0xadba: "gwej" -0xadbb: "gwec" -0xadbc: "gwek" -0xadbd: "gwet" -0xadbe: "gwep" -0xadbf: "gweh" -0xadc0: "gwi" -0xadc1: "gwig" -0xadc2: "gwigg" -0xadc3: "gwigs" -0xadc4: "gwin" -0xadc5: "gwinj" -0xadc6: "gwinh" -0xadc7: "gwid" -0xadc8: "gwil" -0xadc9: "gwilg" -0xadca: "gwilm" -0xadcb: "gwilb" -0xadcc: "gwils" -0xadcd: "gwilt" -0xadce: "gwilp" -0xadcf: "gwilh" -0xadd0: "gwim" -0xadd1: "gwib" -0xadd2: "gwibs" -0xadd3: "gwis" -0xadd4: "gwiss" -0xadd5: "gwing" -0xadd6: "gwij" -0xadd7: "gwic" -0xadd8: "gwik" -0xadd9: "gwit" -0xadda: "gwip" -0xaddb: "gwih" -0xaddc: "gyu" -0xaddd: "gyug" -0xadde: "gyugg" -0xaddf: "gyugs" -0xade0: "gyun" -0xade1: "gyunj" -0xade2: "gyunh" -0xade3: "gyud" -0xade4: "gyul" -0xade5: "gyulg" -0xade6: "gyulm" -0xade7: "gyulb" -0xade8: "gyuls" -0xade9: "gyult" -0xadea: "gyulp" -0xadeb: "gyulh" -0xadec: "gyum" -0xaded: "gyub" -0xadee: "gyubs" -0xadef: "gyus" -0xadf0: "gyuss" -0xadf1: "gyung" -0xadf2: "gyuj" -0xadf3: "gyuc" -0xadf4: "gyuk" -0xadf5: "gyut" -0xadf6: "gyup" -0xadf7: "gyuh" -0xadf8: "geu" -0xadf9: "geug" -0xadfa: "geugg" -0xadfb: "geugs" -0xadfc: "geun" -0xadfd: "geunj" -0xadfe: "geunh" -0xadff: "geud" -/* x0ae */ -0xae00: "geul" -0xae01: "geulg" -0xae02: "geulm" -0xae03: "geulb" -0xae04: "geuls" -0xae05: "geult" -0xae06: "geulp" -0xae07: "geulh" -0xae08: "geum" -0xae09: "geub" -0xae0a: "geubs" -0xae0b: "geus" -0xae0c: "geuss" -0xae0d: "geung" -0xae0e: "geuj" -0xae0f: "geuc" -0xae10: "geuk" -0xae11: "geut" -0xae12: "geup" -0xae13: "geuh" -0xae14: "gyi" -0xae15: "gyig" -0xae16: "gyigg" -0xae17: "gyigs" -0xae18: "gyin" -0xae19: "gyinj" -0xae1a: "gyinh" -0xae1b: "gyid" -0xae1c: "gyil" -0xae1d: "gyilg" -0xae1e: "gyilm" -0xae1f: "gyilb" -0xae20: "gyils" -0xae21: "gyilt" -0xae22: "gyilp" -0xae23: "gyilh" -0xae24: "gyim" -0xae25: "gyib" -0xae26: "gyibs" -0xae27: "gyis" -0xae28: "gyiss" -0xae29: "gying" -0xae2a: "gyij" -0xae2b: "gyic" -0xae2c: "gyik" -0xae2d: "gyit" -0xae2e: "gyip" -0xae2f: "gyih" -0xae30: "gi" -0xae31: "gig" -0xae32: "gigg" -0xae33: "gigs" -0xae34: "gin" -0xae35: "ginj" -0xae36: "ginh" -0xae37: "gid" -0xae38: "gil" -0xae39: "gilg" -0xae3a: "gilm" -0xae3b: "gilb" -0xae3c: "gils" -0xae3d: "gilt" -0xae3e: "gilp" -0xae3f: "gilh" -0xae40: "gim" -0xae41: "gib" -0xae42: "gibs" -0xae43: "gis" -0xae44: "giss" -0xae45: "ging" -0xae46: "gij" -0xae47: "gic" -0xae48: "gik" -0xae49: "git" -0xae4a: "gip" -0xae4b: "gih" -0xae4c: "gga" -0xae4d: "ggag" -0xae4e: "ggagg" -0xae4f: "ggags" -0xae50: "ggan" -0xae51: "gganj" -0xae52: "gganh" -0xae53: "ggad" -0xae54: "ggal" -0xae55: "ggalg" -0xae56: "ggalm" -0xae57: "ggalb" -0xae58: "ggals" -0xae59: "ggalt" -0xae5a: "ggalp" -0xae5b: "ggalh" -0xae5c: "ggam" -0xae5d: "ggab" -0xae5e: "ggabs" -0xae5f: "ggas" -0xae60: "ggass" -0xae61: "ggang" -0xae62: "ggaj" -0xae63: "ggac" -0xae64: "ggak" -0xae65: "ggat" -0xae66: "ggap" -0xae67: "ggah" -0xae68: "ggae" -0xae69: "ggaeg" -0xae6a: "ggaegg" -0xae6b: "ggaegs" -0xae6c: "ggaen" -0xae6d: "ggaenj" -0xae6e: "ggaenh" -0xae6f: "ggaed" -0xae70: "ggael" -0xae71: "ggaelg" -0xae72: "ggaelm" -0xae73: "ggaelb" -0xae74: "ggaels" -0xae75: "ggaelt" -0xae76: "ggaelp" -0xae77: "ggaelh" -0xae78: "ggaem" -0xae79: "ggaeb" -0xae7a: "ggaebs" -0xae7b: "ggaes" -0xae7c: "ggaess" -0xae7d: "ggaeng" -0xae7e: "ggaej" -0xae7f: "ggaec" -0xae80: "ggaek" -0xae81: "ggaet" -0xae82: "ggaep" -0xae83: "ggaeh" -0xae84: "ggya" -0xae85: "ggyag" -0xae86: "ggyagg" -0xae87: "ggyags" -0xae88: "ggyan" -0xae89: "ggyanj" -0xae8a: "ggyanh" -0xae8b: "ggyad" -0xae8c: "ggyal" -0xae8d: "ggyalg" -0xae8e: "ggyalm" -0xae8f: "ggyalb" -0xae90: "ggyals" -0xae91: "ggyalt" -0xae92: "ggyalp" -0xae93: "ggyalh" -0xae94: "ggyam" -0xae95: "ggyab" -0xae96: "ggyabs" -0xae97: "ggyas" -0xae98: "ggyass" -0xae99: "ggyang" -0xae9a: "ggyaj" -0xae9b: "ggyac" -0xae9c: "ggyak" -0xae9d: "ggyat" -0xae9e: "ggyap" -0xae9f: "ggyah" -0xaea0: "ggyae" -0xaea1: "ggyaeg" -0xaea2: "ggyaegg" -0xaea3: "ggyaegs" -0xaea4: "ggyaen" -0xaea5: "ggyaenj" -0xaea6: "ggyaenh" -0xaea7: "ggyaed" -0xaea8: "ggyael" -0xaea9: "ggyaelg" -0xaeaa: "ggyaelm" -0xaeab: "ggyaelb" -0xaeac: "ggyaels" -0xaead: "ggyaelt" -0xaeae: "ggyaelp" -0xaeaf: "ggyaelh" -0xaeb0: "ggyaem" -0xaeb1: "ggyaeb" -0xaeb2: "ggyaebs" -0xaeb3: "ggyaes" -0xaeb4: "ggyaess" -0xaeb5: "ggyaeng" -0xaeb6: "ggyaej" -0xaeb7: "ggyaec" -0xaeb8: "ggyaek" -0xaeb9: "ggyaet" -0xaeba: "ggyaep" -0xaebb: "ggyaeh" -0xaebc: "ggeo" -0xaebd: "ggeog" -0xaebe: "ggeogg" -0xaebf: "ggeogs" -0xaec0: "ggeon" -0xaec1: "ggeonj" -0xaec2: "ggeonh" -0xaec3: "ggeod" -0xaec4: "ggeol" -0xaec5: "ggeolg" -0xaec6: "ggeolm" -0xaec7: "ggeolb" -0xaec8: "ggeols" -0xaec9: "ggeolt" -0xaeca: "ggeolp" -0xaecb: "ggeolh" -0xaecc: "ggeom" -0xaecd: "ggeob" -0xaece: "ggeobs" -0xaecf: "ggeos" -0xaed0: "ggeoss" -0xaed1: "ggeong" -0xaed2: "ggeoj" -0xaed3: "ggeoc" -0xaed4: "ggeok" -0xaed5: "ggeot" -0xaed6: "ggeop" -0xaed7: "ggeoh" -0xaed8: "gge" -0xaed9: "ggeg" -0xaeda: "ggegg" -0xaedb: "ggegs" -0xaedc: "ggen" -0xaedd: "ggenj" -0xaede: "ggenh" -0xaedf: "gged" -0xaee0: "ggel" -0xaee1: "ggelg" -0xaee2: "ggelm" -0xaee3: "ggelb" -0xaee4: "ggels" -0xaee5: "ggelt" -0xaee6: "ggelp" -0xaee7: "ggelh" -0xaee8: "ggem" -0xaee9: "ggeb" -0xaeea: "ggebs" -0xaeeb: "gges" -0xaeec: "ggess" -0xaeed: "ggeng" -0xaeee: "ggej" -0xaeef: "ggec" -0xaef0: "ggek" -0xaef1: "gget" -0xaef2: "ggep" -0xaef3: "ggeh" -0xaef4: "ggyeo" -0xaef5: "ggyeog" -0xaef6: "ggyeogg" -0xaef7: "ggyeogs" -0xaef8: "ggyeon" -0xaef9: "ggyeonj" -0xaefa: "ggyeonh" -0xaefb: "ggyeod" -0xaefc: "ggyeol" -0xaefd: "ggyeolg" -0xaefe: "ggyeolm" -0xaeff: "ggyeolb" -/* x0af */ -0xaf00: "ggyeols" -0xaf01: "ggyeolt" -0xaf02: "ggyeolp" -0xaf03: "ggyeolh" -0xaf04: "ggyeom" -0xaf05: "ggyeob" -0xaf06: "ggyeobs" -0xaf07: "ggyeos" -0xaf08: "ggyeoss" -0xaf09: "ggyeong" -0xaf0a: "ggyeoj" -0xaf0b: "ggyeoc" -0xaf0c: "ggyeok" -0xaf0d: "ggyeot" -0xaf0e: "ggyeop" -0xaf0f: "ggyeoh" -0xaf10: "ggye" -0xaf11: "ggyeg" -0xaf12: "ggyegg" -0xaf13: "ggyegs" -0xaf14: "ggyen" -0xaf15: "ggyenj" -0xaf16: "ggyenh" -0xaf17: "ggyed" -0xaf18: "ggyel" -0xaf19: "ggyelg" -0xaf1a: "ggyelm" -0xaf1b: "ggyelb" -0xaf1c: "ggyels" -0xaf1d: "ggyelt" -0xaf1e: "ggyelp" -0xaf1f: "ggyelh" -0xaf20: "ggyem" -0xaf21: "ggyeb" -0xaf22: "ggyebs" -0xaf23: "ggyes" -0xaf24: "ggyess" -0xaf25: "ggyeng" -0xaf26: "ggyej" -0xaf27: "ggyec" -0xaf28: "ggyek" -0xaf29: "ggyet" -0xaf2a: "ggyep" -0xaf2b: "ggyeh" -0xaf2c: "ggo" -0xaf2d: "ggog" -0xaf2e: "ggogg" -0xaf2f: "ggogs" -0xaf30: "ggon" -0xaf31: "ggonj" -0xaf32: "ggonh" -0xaf33: "ggod" -0xaf34: "ggol" -0xaf35: "ggolg" -0xaf36: "ggolm" -0xaf37: "ggolb" -0xaf38: "ggols" -0xaf39: "ggolt" -0xaf3a: "ggolp" -0xaf3b: "ggolh" -0xaf3c: "ggom" -0xaf3d: "ggob" -0xaf3e: "ggobs" -0xaf3f: "ggos" -0xaf40: "ggoss" -0xaf41: "ggong" -0xaf42: "ggoj" -0xaf43: "ggoc" -0xaf44: "ggok" -0xaf45: "ggot" -0xaf46: "ggop" -0xaf47: "ggoh" -0xaf48: "ggwa" -0xaf49: "ggwag" -0xaf4a: "ggwagg" -0xaf4b: "ggwags" -0xaf4c: "ggwan" -0xaf4d: "ggwanj" -0xaf4e: "ggwanh" -0xaf4f: "ggwad" -0xaf50: "ggwal" -0xaf51: "ggwalg" -0xaf52: "ggwalm" -0xaf53: "ggwalb" -0xaf54: "ggwals" -0xaf55: "ggwalt" -0xaf56: "ggwalp" -0xaf57: "ggwalh" -0xaf58: "ggwam" -0xaf59: "ggwab" -0xaf5a: "ggwabs" -0xaf5b: "ggwas" -0xaf5c: "ggwass" -0xaf5d: "ggwang" -0xaf5e: "ggwaj" -0xaf5f: "ggwac" -0xaf60: "ggwak" -0xaf61: "ggwat" -0xaf62: "ggwap" -0xaf63: "ggwah" -0xaf64: "ggwae" -0xaf65: "ggwaeg" -0xaf66: "ggwaegg" -0xaf67: "ggwaegs" -0xaf68: "ggwaen" -0xaf69: "ggwaenj" -0xaf6a: "ggwaenh" -0xaf6b: "ggwaed" -0xaf6c: "ggwael" -0xaf6d: "ggwaelg" -0xaf6e: "ggwaelm" -0xaf6f: "ggwaelb" -0xaf70: "ggwaels" -0xaf71: "ggwaelt" -0xaf72: "ggwaelp" -0xaf73: "ggwaelh" -0xaf74: "ggwaem" -0xaf75: "ggwaeb" -0xaf76: "ggwaebs" -0xaf77: "ggwaes" -0xaf78: "ggwaess" -0xaf79: "ggwaeng" -0xaf7a: "ggwaej" -0xaf7b: "ggwaec" -0xaf7c: "ggwaek" -0xaf7d: "ggwaet" -0xaf7e: "ggwaep" -0xaf7f: "ggwaeh" -0xaf80: "ggoe" -0xaf81: "ggoeg" -0xaf82: "ggoegg" -0xaf83: "ggoegs" -0xaf84: "ggoen" -0xaf85: "ggoenj" -0xaf86: "ggoenh" -0xaf87: "ggoed" -0xaf88: "ggoel" -0xaf89: "ggoelg" -0xaf8a: "ggoelm" -0xaf8b: "ggoelb" -0xaf8c: "ggoels" -0xaf8d: "ggoelt" -0xaf8e: "ggoelp" -0xaf8f: "ggoelh" -0xaf90: "ggoem" -0xaf91: "ggoeb" -0xaf92: "ggoebs" -0xaf93: "ggoes" -0xaf94: "ggoess" -0xaf95: "ggoeng" -0xaf96: "ggoej" -0xaf97: "ggoec" -0xaf98: "ggoek" -0xaf99: "ggoet" -0xaf9a: "ggoep" -0xaf9b: "ggoeh" -0xaf9c: "ggyo" -0xaf9d: "ggyog" -0xaf9e: "ggyogg" -0xaf9f: "ggyogs" -0xafa0: "ggyon" -0xafa1: "ggyonj" -0xafa2: "ggyonh" -0xafa3: "ggyod" -0xafa4: "ggyol" -0xafa5: "ggyolg" -0xafa6: "ggyolm" -0xafa7: "ggyolb" -0xafa8: "ggyols" -0xafa9: "ggyolt" -0xafaa: "ggyolp" -0xafab: "ggyolh" -0xafac: "ggyom" -0xafad: "ggyob" -0xafae: "ggyobs" -0xafaf: "ggyos" -0xafb0: "ggyoss" -0xafb1: "ggyong" -0xafb2: "ggyoj" -0xafb3: "ggyoc" -0xafb4: "ggyok" -0xafb5: "ggyot" -0xafb6: "ggyop" -0xafb7: "ggyoh" -0xafb8: "ggu" -0xafb9: "ggug" -0xafba: "ggugg" -0xafbb: "ggugs" -0xafbc: "ggun" -0xafbd: "ggunj" -0xafbe: "ggunh" -0xafbf: "ggud" -0xafc0: "ggul" -0xafc1: "ggulg" -0xafc2: "ggulm" -0xafc3: "ggulb" -0xafc4: "gguls" -0xafc5: "ggult" -0xafc6: "ggulp" -0xafc7: "ggulh" -0xafc8: "ggum" -0xafc9: "ggub" -0xafca: "ggubs" -0xafcb: "ggus" -0xafcc: "gguss" -0xafcd: "ggung" -0xafce: "gguj" -0xafcf: "gguc" -0xafd0: "gguk" -0xafd1: "ggut" -0xafd2: "ggup" -0xafd3: "gguh" -0xafd4: "ggweo" -0xafd5: "ggweog" -0xafd6: "ggweogg" -0xafd7: "ggweogs" -0xafd8: "ggweon" -0xafd9: "ggweonj" -0xafda: "ggweonh" -0xafdb: "ggweod" -0xafdc: "ggweol" -0xafdd: "ggweolg" -0xafde: "ggweolm" -0xafdf: "ggweolb" -0xafe0: "ggweols" -0xafe1: "ggweolt" -0xafe2: "ggweolp" -0xafe3: "ggweolh" -0xafe4: "ggweom" -0xafe5: "ggweob" -0xafe6: "ggweobs" -0xafe7: "ggweos" -0xafe8: "ggweoss" -0xafe9: "ggweong" -0xafea: "ggweoj" -0xafeb: "ggweoc" -0xafec: "ggweok" -0xafed: "ggweot" -0xafee: "ggweop" -0xafef: "ggweoh" -0xaff0: "ggwe" -0xaff1: "ggweg" -0xaff2: "ggwegg" -0xaff3: "ggwegs" -0xaff4: "ggwen" -0xaff5: "ggwenj" -0xaff6: "ggwenh" -0xaff7: "ggwed" -0xaff8: "ggwel" -0xaff9: "ggwelg" -0xaffa: "ggwelm" -0xaffb: "ggwelb" -0xaffc: "ggwels" -0xaffd: "ggwelt" -0xaffe: "ggwelp" -0xafff: "ggwelh" -/* x0b0 */ -0xb000: "ggwem" -0xb001: "ggweb" -0xb002: "ggwebs" -0xb003: "ggwes" -0xb004: "ggwess" -0xb005: "ggweng" -0xb006: "ggwej" -0xb007: "ggwec" -0xb008: "ggwek" -0xb009: "ggwet" -0xb00a: "ggwep" -0xb00b: "ggweh" -0xb00c: "ggwi" -0xb00d: "ggwig" -0xb00e: "ggwigg" -0xb00f: "ggwigs" -0xb010: "ggwin" -0xb011: "ggwinj" -0xb012: "ggwinh" -0xb013: "ggwid" -0xb014: "ggwil" -0xb015: "ggwilg" -0xb016: "ggwilm" -0xb017: "ggwilb" -0xb018: "ggwils" -0xb019: "ggwilt" -0xb01a: "ggwilp" -0xb01b: "ggwilh" -0xb01c: "ggwim" -0xb01d: "ggwib" -0xb01e: "ggwibs" -0xb01f: "ggwis" -0xb020: "ggwiss" -0xb021: "ggwing" -0xb022: "ggwij" -0xb023: "ggwic" -0xb024: "ggwik" -0xb025: "ggwit" -0xb026: "ggwip" -0xb027: "ggwih" -0xb028: "ggyu" -0xb029: "ggyug" -0xb02a: "ggyugg" -0xb02b: "ggyugs" -0xb02c: "ggyun" -0xb02d: "ggyunj" -0xb02e: "ggyunh" -0xb02f: "ggyud" -0xb030: "ggyul" -0xb031: "ggyulg" -0xb032: "ggyulm" -0xb033: "ggyulb" -0xb034: "ggyuls" -0xb035: "ggyult" -0xb036: "ggyulp" -0xb037: "ggyulh" -0xb038: "ggyum" -0xb039: "ggyub" -0xb03a: "ggyubs" -0xb03b: "ggyus" -0xb03c: "ggyuss" -0xb03d: "ggyung" -0xb03e: "ggyuj" -0xb03f: "ggyuc" -0xb040: "ggyuk" -0xb041: "ggyut" -0xb042: "ggyup" -0xb043: "ggyuh" -0xb044: "ggeu" -0xb045: "ggeug" -0xb046: "ggeugg" -0xb047: "ggeugs" -0xb048: "ggeun" -0xb049: "ggeunj" -0xb04a: "ggeunh" -0xb04b: "ggeud" -0xb04c: "ggeul" -0xb04d: "ggeulg" -0xb04e: "ggeulm" -0xb04f: "ggeulb" -0xb050: "ggeuls" -0xb051: "ggeult" -0xb052: "ggeulp" -0xb053: "ggeulh" -0xb054: "ggeum" -0xb055: "ggeub" -0xb056: "ggeubs" -0xb057: "ggeus" -0xb058: "ggeuss" -0xb059: "ggeung" -0xb05a: "ggeuj" -0xb05b: "ggeuc" -0xb05c: "ggeuk" -0xb05d: "ggeut" -0xb05e: "ggeup" -0xb05f: "ggeuh" -0xb060: "ggyi" -0xb061: "ggyig" -0xb062: "ggyigg" -0xb063: "ggyigs" -0xb064: "ggyin" -0xb065: "ggyinj" -0xb066: "ggyinh" -0xb067: "ggyid" -0xb068: "ggyil" -0xb069: "ggyilg" -0xb06a: "ggyilm" -0xb06b: "ggyilb" -0xb06c: "ggyils" -0xb06d: "ggyilt" -0xb06e: "ggyilp" -0xb06f: "ggyilh" -0xb070: "ggyim" -0xb071: "ggyib" -0xb072: "ggyibs" -0xb073: "ggyis" -0xb074: "ggyiss" -0xb075: "ggying" -0xb076: "ggyij" -0xb077: "ggyic" -0xb078: "ggyik" -0xb079: "ggyit" -0xb07a: "ggyip" -0xb07b: "ggyih" -0xb07c: "ggi" -0xb07d: "ggig" -0xb07e: "ggigg" -0xb07f: "ggigs" -0xb080: "ggin" -0xb081: "gginj" -0xb082: "gginh" -0xb083: "ggid" -0xb084: "ggil" -0xb085: "ggilg" -0xb086: "ggilm" -0xb087: "ggilb" -0xb088: "ggils" -0xb089: "ggilt" -0xb08a: "ggilp" -0xb08b: "ggilh" -0xb08c: "ggim" -0xb08d: "ggib" -0xb08e: "ggibs" -0xb08f: "ggis" -0xb090: "ggiss" -0xb091: "gging" -0xb092: "ggij" -0xb093: "ggic" -0xb094: "ggik" -0xb095: "ggit" -0xb096: "ggip" -0xb097: "ggih" -0xb098: "na" -0xb099: "nag" -0xb09a: "nagg" -0xb09b: "nags" -0xb09c: "nan" -0xb09d: "nanj" -0xb09e: "nanh" -0xb09f: "nad" -0xb0a0: "nal" -0xb0a1: "nalg" -0xb0a2: "nalm" -0xb0a3: "nalb" -0xb0a4: "nals" -0xb0a5: "nalt" -0xb0a6: "nalp" -0xb0a7: "nalh" -0xb0a8: "nam" -0xb0a9: "nab" -0xb0aa: "nabs" -0xb0ab: "nas" -0xb0ac: "nass" -0xb0ad: "nang" -0xb0ae: "naj" -0xb0af: "nac" -0xb0b0: "nak" -0xb0b1: "nat" -0xb0b2: "nap" -0xb0b3: "nah" -0xb0b4: "nae" -0xb0b5: "naeg" -0xb0b6: "naegg" -0xb0b7: "naegs" -0xb0b8: "naen" -0xb0b9: "naenj" -0xb0ba: "naenh" -0xb0bb: "naed" -0xb0bc: "nael" -0xb0bd: "naelg" -0xb0be: "naelm" -0xb0bf: "naelb" -0xb0c0: "naels" -0xb0c1: "naelt" -0xb0c2: "naelp" -0xb0c3: "naelh" -0xb0c4: "naem" -0xb0c5: "naeb" -0xb0c6: "naebs" -0xb0c7: "naes" -0xb0c8: "naess" -0xb0c9: "naeng" -0xb0ca: "naej" -0xb0cb: "naec" -0xb0cc: "naek" -0xb0cd: "naet" -0xb0ce: "naep" -0xb0cf: "naeh" -0xb0d0: "nya" -0xb0d1: "nyag" -0xb0d2: "nyagg" -0xb0d3: "nyags" -0xb0d4: "nyan" -0xb0d5: "nyanj" -0xb0d6: "nyanh" -0xb0d7: "nyad" -0xb0d8: "nyal" -0xb0d9: "nyalg" -0xb0da: "nyalm" -0xb0db: "nyalb" -0xb0dc: "nyals" -0xb0dd: "nyalt" -0xb0de: "nyalp" -0xb0df: "nyalh" -0xb0e0: "nyam" -0xb0e1: "nyab" -0xb0e2: "nyabs" -0xb0e3: "nyas" -0xb0e4: "nyass" -0xb0e5: "nyang" -0xb0e6: "nyaj" -0xb0e7: "nyac" -0xb0e8: "nyak" -0xb0e9: "nyat" -0xb0ea: "nyap" -0xb0eb: "nyah" -0xb0ec: "nyae" -0xb0ed: "nyaeg" -0xb0ee: "nyaegg" -0xb0ef: "nyaegs" -0xb0f0: "nyaen" -0xb0f1: "nyaenj" -0xb0f2: "nyaenh" -0xb0f3: "nyaed" -0xb0f4: "nyael" -0xb0f5: "nyaelg" -0xb0f6: "nyaelm" -0xb0f7: "nyaelb" -0xb0f8: "nyaels" -0xb0f9: "nyaelt" -0xb0fa: "nyaelp" -0xb0fb: "nyaelh" -0xb0fc: "nyaem" -0xb0fd: "nyaeb" -0xb0fe: "nyaebs" -0xb0ff: "nyaes" -/* x0b1 */ -0xb100: "nyaess" -0xb101: "nyaeng" -0xb102: "nyaej" -0xb103: "nyaec" -0xb104: "nyaek" -0xb105: "nyaet" -0xb106: "nyaep" -0xb107: "nyaeh" -0xb108: "neo" -0xb109: "neog" -0xb10a: "neogg" -0xb10b: "neogs" -0xb10c: "neon" -0xb10d: "neonj" -0xb10e: "neonh" -0xb10f: "neod" -0xb110: "neol" -0xb111: "neolg" -0xb112: "neolm" -0xb113: "neolb" -0xb114: "neols" -0xb115: "neolt" -0xb116: "neolp" -0xb117: "neolh" -0xb118: "neom" -0xb119: "neob" -0xb11a: "neobs" -0xb11b: "neos" -0xb11c: "neoss" -0xb11d: "neong" -0xb11e: "neoj" -0xb11f: "neoc" -0xb120: "neok" -0xb121: "neot" -0xb122: "neop" -0xb123: "neoh" -0xb124: "ne" -0xb125: "neg" -0xb126: "negg" -0xb127: "negs" -0xb128: "nen" -0xb129: "nenj" -0xb12a: "nenh" -0xb12b: "ned" -0xb12c: "nel" -0xb12d: "nelg" -0xb12e: "nelm" -0xb12f: "nelb" -0xb130: "nels" -0xb131: "nelt" -0xb132: "nelp" -0xb133: "nelh" -0xb134: "nem" -0xb135: "neb" -0xb136: "nebs" -0xb137: "nes" -0xb138: "ness" -0xb139: "neng" -0xb13a: "nej" -0xb13b: "nec" -0xb13c: "nek" -0xb13d: "net" -0xb13e: "nep" -0xb13f: "neh" -0xb140: "nyeo" -0xb141: "nyeog" -0xb142: "nyeogg" -0xb143: "nyeogs" -0xb144: "nyeon" -0xb145: "nyeonj" -0xb146: "nyeonh" -0xb147: "nyeod" -0xb148: "nyeol" -0xb149: "nyeolg" -0xb14a: "nyeolm" -0xb14b: "nyeolb" -0xb14c: "nyeols" -0xb14d: "nyeolt" -0xb14e: "nyeolp" -0xb14f: "nyeolh" -0xb150: "nyeom" -0xb151: "nyeob" -0xb152: "nyeobs" -0xb153: "nyeos" -0xb154: "nyeoss" -0xb155: "nyeong" -0xb156: "nyeoj" -0xb157: "nyeoc" -0xb158: "nyeok" -0xb159: "nyeot" -0xb15a: "nyeop" -0xb15b: "nyeoh" -0xb15c: "nye" -0xb15d: "nyeg" -0xb15e: "nyegg" -0xb15f: "nyegs" -0xb160: "nyen" -0xb161: "nyenj" -0xb162: "nyenh" -0xb163: "nyed" -0xb164: "nyel" -0xb165: "nyelg" -0xb166: "nyelm" -0xb167: "nyelb" -0xb168: "nyels" -0xb169: "nyelt" -0xb16a: "nyelp" -0xb16b: "nyelh" -0xb16c: "nyem" -0xb16d: "nyeb" -0xb16e: "nyebs" -0xb16f: "nyes" -0xb170: "nyess" -0xb171: "nyeng" -0xb172: "nyej" -0xb173: "nyec" -0xb174: "nyek" -0xb175: "nyet" -0xb176: "nyep" -0xb177: "nyeh" -0xb178: "no" -0xb179: "nog" -0xb17a: "nogg" -0xb17b: "nogs" -0xb17c: "non" -0xb17d: "nonj" -0xb17e: "nonh" -0xb17f: "nod" -0xb180: "nol" -0xb181: "nolg" -0xb182: "nolm" -0xb183: "nolb" -0xb184: "nols" -0xb185: "nolt" -0xb186: "nolp" -0xb187: "nolh" -0xb188: "nom" -0xb189: "nob" -0xb18a: "nobs" -0xb18b: "nos" -0xb18c: "noss" -0xb18d: "nong" -0xb18e: "noj" -0xb18f: "noc" -0xb190: "nok" -0xb191: "not" -0xb192: "nop" -0xb193: "noh" -0xb194: "nwa" -0xb195: "nwag" -0xb196: "nwagg" -0xb197: "nwags" -0xb198: "nwan" -0xb199: "nwanj" -0xb19a: "nwanh" -0xb19b: "nwad" -0xb19c: "nwal" -0xb19d: "nwalg" -0xb19e: "nwalm" -0xb19f: "nwalb" -0xb1a0: "nwals" -0xb1a1: "nwalt" -0xb1a2: "nwalp" -0xb1a3: "nwalh" -0xb1a4: "nwam" -0xb1a5: "nwab" -0xb1a6: "nwabs" -0xb1a7: "nwas" -0xb1a8: "nwass" -0xb1a9: "nwang" -0xb1aa: "nwaj" -0xb1ab: "nwac" -0xb1ac: "nwak" -0xb1ad: "nwat" -0xb1ae: "nwap" -0xb1af: "nwah" -0xb1b0: "nwae" -0xb1b1: "nwaeg" -0xb1b2: "nwaegg" -0xb1b3: "nwaegs" -0xb1b4: "nwaen" -0xb1b5: "nwaenj" -0xb1b6: "nwaenh" -0xb1b7: "nwaed" -0xb1b8: "nwael" -0xb1b9: "nwaelg" -0xb1ba: "nwaelm" -0xb1bb: "nwaelb" -0xb1bc: "nwaels" -0xb1bd: "nwaelt" -0xb1be: "nwaelp" -0xb1bf: "nwaelh" -0xb1c0: "nwaem" -0xb1c1: "nwaeb" -0xb1c2: "nwaebs" -0xb1c3: "nwaes" -0xb1c4: "nwaess" -0xb1c5: "nwaeng" -0xb1c6: "nwaej" -0xb1c7: "nwaec" -0xb1c8: "nwaek" -0xb1c9: "nwaet" -0xb1ca: "nwaep" -0xb1cb: "nwaeh" -0xb1cc: "noe" -0xb1cd: "noeg" -0xb1ce: "noegg" -0xb1cf: "noegs" -0xb1d0: "noen" -0xb1d1: "noenj" -0xb1d2: "noenh" -0xb1d3: "noed" -0xb1d4: "noel" -0xb1d5: "noelg" -0xb1d6: "noelm" -0xb1d7: "noelb" -0xb1d8: "noels" -0xb1d9: "noelt" -0xb1da: "noelp" -0xb1db: "noelh" -0xb1dc: "noem" -0xb1dd: "noeb" -0xb1de: "noebs" -0xb1df: "noes" -0xb1e0: "noess" -0xb1e1: "noeng" -0xb1e2: "noej" -0xb1e3: "noec" -0xb1e4: "noek" -0xb1e5: "noet" -0xb1e6: "noep" -0xb1e7: "noeh" -0xb1e8: "nyo" -0xb1e9: "nyog" -0xb1ea: "nyogg" -0xb1eb: "nyogs" -0xb1ec: "nyon" -0xb1ed: "nyonj" -0xb1ee: "nyonh" -0xb1ef: "nyod" -0xb1f0: "nyol" -0xb1f1: "nyolg" -0xb1f2: "nyolm" -0xb1f3: "nyolb" -0xb1f4: "nyols" -0xb1f5: "nyolt" -0xb1f6: "nyolp" -0xb1f7: "nyolh" -0xb1f8: "nyom" -0xb1f9: "nyob" -0xb1fa: "nyobs" -0xb1fb: "nyos" -0xb1fc: "nyoss" -0xb1fd: "nyong" -0xb1fe: "nyoj" -0xb1ff: "nyoc" -/* x0b2 */ -0xb200: "nyok" -0xb201: "nyot" -0xb202: "nyop" -0xb203: "nyoh" -0xb204: "nu" -0xb205: "nug" -0xb206: "nugg" -0xb207: "nugs" -0xb208: "nun" -0xb209: "nunj" -0xb20a: "nunh" -0xb20b: "nud" -0xb20c: "nul" -0xb20d: "nulg" -0xb20e: "nulm" -0xb20f: "nulb" -0xb210: "nuls" -0xb211: "nult" -0xb212: "nulp" -0xb213: "nulh" -0xb214: "num" -0xb215: "nub" -0xb216: "nubs" -0xb217: "nus" -0xb218: "nuss" -0xb219: "nung" -0xb21a: "nuj" -0xb21b: "nuc" -0xb21c: "nuk" -0xb21d: "nut" -0xb21e: "nup" -0xb21f: "nuh" -0xb220: "nweo" -0xb221: "nweog" -0xb222: "nweogg" -0xb223: "nweogs" -0xb224: "nweon" -0xb225: "nweonj" -0xb226: "nweonh" -0xb227: "nweod" -0xb228: "nweol" -0xb229: "nweolg" -0xb22a: "nweolm" -0xb22b: "nweolb" -0xb22c: "nweols" -0xb22d: "nweolt" -0xb22e: "nweolp" -0xb22f: "nweolh" -0xb230: "nweom" -0xb231: "nweob" -0xb232: "nweobs" -0xb233: "nweos" -0xb234: "nweoss" -0xb235: "nweong" -0xb236: "nweoj" -0xb237: "nweoc" -0xb238: "nweok" -0xb239: "nweot" -0xb23a: "nweop" -0xb23b: "nweoh" -0xb23c: "nwe" -0xb23d: "nweg" -0xb23e: "nwegg" -0xb23f: "nwegs" -0xb240: "nwen" -0xb241: "nwenj" -0xb242: "nwenh" -0xb243: "nwed" -0xb244: "nwel" -0xb245: "nwelg" -0xb246: "nwelm" -0xb247: "nwelb" -0xb248: "nwels" -0xb249: "nwelt" -0xb24a: "nwelp" -0xb24b: "nwelh" -0xb24c: "nwem" -0xb24d: "nweb" -0xb24e: "nwebs" -0xb24f: "nwes" -0xb250: "nwess" -0xb251: "nweng" -0xb252: "nwej" -0xb253: "nwec" -0xb254: "nwek" -0xb255: "nwet" -0xb256: "nwep" -0xb257: "nweh" -0xb258: "nwi" -0xb259: "nwig" -0xb25a: "nwigg" -0xb25b: "nwigs" -0xb25c: "nwin" -0xb25d: "nwinj" -0xb25e: "nwinh" -0xb25f: "nwid" -0xb260: "nwil" -0xb261: "nwilg" -0xb262: "nwilm" -0xb263: "nwilb" -0xb264: "nwils" -0xb265: "nwilt" -0xb266: "nwilp" -0xb267: "nwilh" -0xb268: "nwim" -0xb269: "nwib" -0xb26a: "nwibs" -0xb26b: "nwis" -0xb26c: "nwiss" -0xb26d: "nwing" -0xb26e: "nwij" -0xb26f: "nwic" -0xb270: "nwik" -0xb271: "nwit" -0xb272: "nwip" -0xb273: "nwih" -0xb274: "nyu" -0xb275: "nyug" -0xb276: "nyugg" -0xb277: "nyugs" -0xb278: "nyun" -0xb279: "nyunj" -0xb27a: "nyunh" -0xb27b: "nyud" -0xb27c: "nyul" -0xb27d: "nyulg" -0xb27e: "nyulm" -0xb27f: "nyulb" -0xb280: "nyuls" -0xb281: "nyult" -0xb282: "nyulp" -0xb283: "nyulh" -0xb284: "nyum" -0xb285: "nyub" -0xb286: "nyubs" -0xb287: "nyus" -0xb288: "nyuss" -0xb289: "nyung" -0xb28a: "nyuj" -0xb28b: "nyuc" -0xb28c: "nyuk" -0xb28d: "nyut" -0xb28e: "nyup" -0xb28f: "nyuh" -0xb290: "neu" -0xb291: "neug" -0xb292: "neugg" -0xb293: "neugs" -0xb294: "neun" -0xb295: "neunj" -0xb296: "neunh" -0xb297: "neud" -0xb298: "neul" -0xb299: "neulg" -0xb29a: "neulm" -0xb29b: "neulb" -0xb29c: "neuls" -0xb29d: "neult" -0xb29e: "neulp" -0xb29f: "neulh" -0xb2a0: "neum" -0xb2a1: "neub" -0xb2a2: "neubs" -0xb2a3: "neus" -0xb2a4: "neuss" -0xb2a5: "neung" -0xb2a6: "neuj" -0xb2a7: "neuc" -0xb2a8: "neuk" -0xb2a9: "neut" -0xb2aa: "neup" -0xb2ab: "neuh" -0xb2ac: "nyi" -0xb2ad: "nyig" -0xb2ae: "nyigg" -0xb2af: "nyigs" -0xb2b0: "nyin" -0xb2b1: "nyinj" -0xb2b2: "nyinh" -0xb2b3: "nyid" -0xb2b4: "nyil" -0xb2b5: "nyilg" -0xb2b6: "nyilm" -0xb2b7: "nyilb" -0xb2b8: "nyils" -0xb2b9: "nyilt" -0xb2ba: "nyilp" -0xb2bb: "nyilh" -0xb2bc: "nyim" -0xb2bd: "nyib" -0xb2be: "nyibs" -0xb2bf: "nyis" -0xb2c0: "nyiss" -0xb2c1: "nying" -0xb2c2: "nyij" -0xb2c3: "nyic" -0xb2c4: "nyik" -0xb2c5: "nyit" -0xb2c6: "nyip" -0xb2c7: "nyih" -0xb2c8: "ni" -0xb2c9: "nig" -0xb2ca: "nigg" -0xb2cb: "nigs" -0xb2cc: "nin" -0xb2cd: "ninj" -0xb2ce: "ninh" -0xb2cf: "nid" -0xb2d0: "nil" -0xb2d1: "nilg" -0xb2d2: "nilm" -0xb2d3: "nilb" -0xb2d4: "nils" -0xb2d5: "nilt" -0xb2d6: "nilp" -0xb2d7: "nilh" -0xb2d8: "nim" -0xb2d9: "nib" -0xb2da: "nibs" -0xb2db: "nis" -0xb2dc: "niss" -0xb2dd: "ning" -0xb2de: "nij" -0xb2df: "nic" -0xb2e0: "nik" -0xb2e1: "nit" -0xb2e2: "nip" -0xb2e3: "nih" -0xb2e4: "da" -0xb2e5: "dag" -0xb2e6: "dagg" -0xb2e7: "dags" -0xb2e8: "dan" -0xb2e9: "danj" -0xb2ea: "danh" -0xb2eb: "dad" -0xb2ec: "dal" -0xb2ed: "dalg" -0xb2ee: "dalm" -0xb2ef: "dalb" -0xb2f0: "dals" -0xb2f1: "dalt" -0xb2f2: "dalp" -0xb2f3: "dalh" -0xb2f4: "dam" -0xb2f5: "dab" -0xb2f6: "dabs" -0xb2f7: "das" -0xb2f8: "dass" -0xb2f9: "dang" -0xb2fa: "daj" -0xb2fb: "dac" -0xb2fc: "dak" -0xb2fd: "dat" -0xb2fe: "dap" -0xb2ff: "dah" -/* x0b3 */ -0xb300: "dae" -0xb301: "daeg" -0xb302: "daegg" -0xb303: "daegs" -0xb304: "daen" -0xb305: "daenj" -0xb306: "daenh" -0xb307: "daed" -0xb308: "dael" -0xb309: "daelg" -0xb30a: "daelm" -0xb30b: "daelb" -0xb30c: "daels" -0xb30d: "daelt" -0xb30e: "daelp" -0xb30f: "daelh" -0xb310: "daem" -0xb311: "daeb" -0xb312: "daebs" -0xb313: "daes" -0xb314: "daess" -0xb315: "daeng" -0xb316: "daej" -0xb317: "daec" -0xb318: "daek" -0xb319: "daet" -0xb31a: "daep" -0xb31b: "daeh" -0xb31c: "dya" -0xb31d: "dyag" -0xb31e: "dyagg" -0xb31f: "dyags" -0xb320: "dyan" -0xb321: "dyanj" -0xb322: "dyanh" -0xb323: "dyad" -0xb324: "dyal" -0xb325: "dyalg" -0xb326: "dyalm" -0xb327: "dyalb" -0xb328: "dyals" -0xb329: "dyalt" -0xb32a: "dyalp" -0xb32b: "dyalh" -0xb32c: "dyam" -0xb32d: "dyab" -0xb32e: "dyabs" -0xb32f: "dyas" -0xb330: "dyass" -0xb331: "dyang" -0xb332: "dyaj" -0xb333: "dyac" -0xb334: "dyak" -0xb335: "dyat" -0xb336: "dyap" -0xb337: "dyah" -0xb338: "dyae" -0xb339: "dyaeg" -0xb33a: "dyaegg" -0xb33b: "dyaegs" -0xb33c: "dyaen" -0xb33d: "dyaenj" -0xb33e: "dyaenh" -0xb33f: "dyaed" -0xb340: "dyael" -0xb341: "dyaelg" -0xb342: "dyaelm" -0xb343: "dyaelb" -0xb344: "dyaels" -0xb345: "dyaelt" -0xb346: "dyaelp" -0xb347: "dyaelh" -0xb348: "dyaem" -0xb349: "dyaeb" -0xb34a: "dyaebs" -0xb34b: "dyaes" -0xb34c: "dyaess" -0xb34d: "dyaeng" -0xb34e: "dyaej" -0xb34f: "dyaec" -0xb350: "dyaek" -0xb351: "dyaet" -0xb352: "dyaep" -0xb353: "dyaeh" -0xb354: "deo" -0xb355: "deog" -0xb356: "deogg" -0xb357: "deogs" -0xb358: "deon" -0xb359: "deonj" -0xb35a: "deonh" -0xb35b: "deod" -0xb35c: "deol" -0xb35d: "deolg" -0xb35e: "deolm" -0xb35f: "deolb" -0xb360: "deols" -0xb361: "deolt" -0xb362: "deolp" -0xb363: "deolh" -0xb364: "deom" -0xb365: "deob" -0xb366: "deobs" -0xb367: "deos" -0xb368: "deoss" -0xb369: "deong" -0xb36a: "deoj" -0xb36b: "deoc" -0xb36c: "deok" -0xb36d: "deot" -0xb36e: "deop" -0xb36f: "deoh" -0xb370: "de" -0xb371: "deg" -0xb372: "degg" -0xb373: "degs" -0xb374: "den" -0xb375: "denj" -0xb376: "denh" -0xb377: "ded" -0xb378: "del" -0xb379: "delg" -0xb37a: "delm" -0xb37b: "delb" -0xb37c: "dels" -0xb37d: "delt" -0xb37e: "delp" -0xb37f: "delh" -0xb380: "dem" -0xb381: "deb" -0xb382: "debs" -0xb383: "des" -0xb384: "dess" -0xb385: "deng" -0xb386: "dej" -0xb387: "dec" -0xb388: "dek" -0xb389: "det" -0xb38a: "dep" -0xb38b: "deh" -0xb38c: "dyeo" -0xb38d: "dyeog" -0xb38e: "dyeogg" -0xb38f: "dyeogs" -0xb390: "dyeon" -0xb391: "dyeonj" -0xb392: "dyeonh" -0xb393: "dyeod" -0xb394: "dyeol" -0xb395: "dyeolg" -0xb396: "dyeolm" -0xb397: "dyeolb" -0xb398: "dyeols" -0xb399: "dyeolt" -0xb39a: "dyeolp" -0xb39b: "dyeolh" -0xb39c: "dyeom" -0xb39d: "dyeob" -0xb39e: "dyeobs" -0xb39f: "dyeos" -0xb3a0: "dyeoss" -0xb3a1: "dyeong" -0xb3a2: "dyeoj" -0xb3a3: "dyeoc" -0xb3a4: "dyeok" -0xb3a5: "dyeot" -0xb3a6: "dyeop" -0xb3a7: "dyeoh" -0xb3a8: "dye" -0xb3a9: "dyeg" -0xb3aa: "dyegg" -0xb3ab: "dyegs" -0xb3ac: "dyen" -0xb3ad: "dyenj" -0xb3ae: "dyenh" -0xb3af: "dyed" -0xb3b0: "dyel" -0xb3b1: "dyelg" -0xb3b2: "dyelm" -0xb3b3: "dyelb" -0xb3b4: "dyels" -0xb3b5: "dyelt" -0xb3b6: "dyelp" -0xb3b7: "dyelh" -0xb3b8: "dyem" -0xb3b9: "dyeb" -0xb3ba: "dyebs" -0xb3bb: "dyes" -0xb3bc: "dyess" -0xb3bd: "dyeng" -0xb3be: "dyej" -0xb3bf: "dyec" -0xb3c0: "dyek" -0xb3c1: "dyet" -0xb3c2: "dyep" -0xb3c3: "dyeh" -0xb3c4: "do" -0xb3c5: "dog" -0xb3c6: "dogg" -0xb3c7: "dogs" -0xb3c8: "don" -0xb3c9: "donj" -0xb3ca: "donh" -0xb3cb: "dod" -0xb3cc: "dol" -0xb3cd: "dolg" -0xb3ce: "dolm" -0xb3cf: "dolb" -0xb3d0: "dols" -0xb3d1: "dolt" -0xb3d2: "dolp" -0xb3d3: "dolh" -0xb3d4: "dom" -0xb3d5: "dob" -0xb3d6: "dobs" -0xb3d7: "dos" -0xb3d8: "doss" -0xb3d9: "dong" -0xb3da: "doj" -0xb3db: "doc" -0xb3dc: "dok" -0xb3dd: "dot" -0xb3de: "dop" -0xb3df: "doh" -0xb3e0: "dwa" -0xb3e1: "dwag" -0xb3e2: "dwagg" -0xb3e3: "dwags" -0xb3e4: "dwan" -0xb3e5: "dwanj" -0xb3e6: "dwanh" -0xb3e7: "dwad" -0xb3e8: "dwal" -0xb3e9: "dwalg" -0xb3ea: "dwalm" -0xb3eb: "dwalb" -0xb3ec: "dwals" -0xb3ed: "dwalt" -0xb3ee: "dwalp" -0xb3ef: "dwalh" -0xb3f0: "dwam" -0xb3f1: "dwab" -0xb3f2: "dwabs" -0xb3f3: "dwas" -0xb3f4: "dwass" -0xb3f5: "dwang" -0xb3f6: "dwaj" -0xb3f7: "dwac" -0xb3f8: "dwak" -0xb3f9: "dwat" -0xb3fa: "dwap" -0xb3fb: "dwah" -0xb3fc: "dwae" -0xb3fd: "dwaeg" -0xb3fe: "dwaegg" -0xb3ff: "dwaegs" -/* x0b4 */ -0xb400: "dwaen" -0xb401: "dwaenj" -0xb402: "dwaenh" -0xb403: "dwaed" -0xb404: "dwael" -0xb405: "dwaelg" -0xb406: "dwaelm" -0xb407: "dwaelb" -0xb408: "dwaels" -0xb409: "dwaelt" -0xb40a: "dwaelp" -0xb40b: "dwaelh" -0xb40c: "dwaem" -0xb40d: "dwaeb" -0xb40e: "dwaebs" -0xb40f: "dwaes" -0xb410: "dwaess" -0xb411: "dwaeng" -0xb412: "dwaej" -0xb413: "dwaec" -0xb414: "dwaek" -0xb415: "dwaet" -0xb416: "dwaep" -0xb417: "dwaeh" -0xb418: "doe" -0xb419: "doeg" -0xb41a: "doegg" -0xb41b: "doegs" -0xb41c: "doen" -0xb41d: "doenj" -0xb41e: "doenh" -0xb41f: "doed" -0xb420: "doel" -0xb421: "doelg" -0xb422: "doelm" -0xb423: "doelb" -0xb424: "doels" -0xb425: "doelt" -0xb426: "doelp" -0xb427: "doelh" -0xb428: "doem" -0xb429: "doeb" -0xb42a: "doebs" -0xb42b: "does" -0xb42c: "doess" -0xb42d: "doeng" -0xb42e: "doej" -0xb42f: "doec" -0xb430: "doek" -0xb431: "doet" -0xb432: "doep" -0xb433: "doeh" -0xb434: "dyo" -0xb435: "dyog" -0xb436: "dyogg" -0xb437: "dyogs" -0xb438: "dyon" -0xb439: "dyonj" -0xb43a: "dyonh" -0xb43b: "dyod" -0xb43c: "dyol" -0xb43d: "dyolg" -0xb43e: "dyolm" -0xb43f: "dyolb" -0xb440: "dyols" -0xb441: "dyolt" -0xb442: "dyolp" -0xb443: "dyolh" -0xb444: "dyom" -0xb445: "dyob" -0xb446: "dyobs" -0xb447: "dyos" -0xb448: "dyoss" -0xb449: "dyong" -0xb44a: "dyoj" -0xb44b: "dyoc" -0xb44c: "dyok" -0xb44d: "dyot" -0xb44e: "dyop" -0xb44f: "dyoh" -0xb450: "du" -0xb451: "dug" -0xb452: "dugg" -0xb453: "dugs" -0xb454: "dun" -0xb455: "dunj" -0xb456: "dunh" -0xb457: "dud" -0xb458: "dul" -0xb459: "dulg" -0xb45a: "dulm" -0xb45b: "dulb" -0xb45c: "duls" -0xb45d: "dult" -0xb45e: "dulp" -0xb45f: "dulh" -0xb460: "dum" -0xb461: "dub" -0xb462: "dubs" -0xb463: "dus" -0xb464: "duss" -0xb465: "dung" -0xb466: "duj" -0xb467: "duc" -0xb468: "duk" -0xb469: "dut" -0xb46a: "dup" -0xb46b: "duh" -0xb46c: "dweo" -0xb46d: "dweog" -0xb46e: "dweogg" -0xb46f: "dweogs" -0xb470: "dweon" -0xb471: "dweonj" -0xb472: "dweonh" -0xb473: "dweod" -0xb474: "dweol" -0xb475: "dweolg" -0xb476: "dweolm" -0xb477: "dweolb" -0xb478: "dweols" -0xb479: "dweolt" -0xb47a: "dweolp" -0xb47b: "dweolh" -0xb47c: "dweom" -0xb47d: "dweob" -0xb47e: "dweobs" -0xb47f: "dweos" -0xb480: "dweoss" -0xb481: "dweong" -0xb482: "dweoj" -0xb483: "dweoc" -0xb484: "dweok" -0xb485: "dweot" -0xb486: "dweop" -0xb487: "dweoh" -0xb488: "dwe" -0xb489: "dweg" -0xb48a: "dwegg" -0xb48b: "dwegs" -0xb48c: "dwen" -0xb48d: "dwenj" -0xb48e: "dwenh" -0xb48f: "dwed" -0xb490: "dwel" -0xb491: "dwelg" -0xb492: "dwelm" -0xb493: "dwelb" -0xb494: "dwels" -0xb495: "dwelt" -0xb496: "dwelp" -0xb497: "dwelh" -0xb498: "dwem" -0xb499: "dweb" -0xb49a: "dwebs" -0xb49b: "dwes" -0xb49c: "dwess" -0xb49d: "dweng" -0xb49e: "dwej" -0xb49f: "dwec" -0xb4a0: "dwek" -0xb4a1: "dwet" -0xb4a2: "dwep" -0xb4a3: "dweh" -0xb4a4: "dwi" -0xb4a5: "dwig" -0xb4a6: "dwigg" -0xb4a7: "dwigs" -0xb4a8: "dwin" -0xb4a9: "dwinj" -0xb4aa: "dwinh" -0xb4ab: "dwid" -0xb4ac: "dwil" -0xb4ad: "dwilg" -0xb4ae: "dwilm" -0xb4af: "dwilb" -0xb4b0: "dwils" -0xb4b1: "dwilt" -0xb4b2: "dwilp" -0xb4b3: "dwilh" -0xb4b4: "dwim" -0xb4b5: "dwib" -0xb4b6: "dwibs" -0xb4b7: "dwis" -0xb4b8: "dwiss" -0xb4b9: "dwing" -0xb4ba: "dwij" -0xb4bb: "dwic" -0xb4bc: "dwik" -0xb4bd: "dwit" -0xb4be: "dwip" -0xb4bf: "dwih" -0xb4c0: "dyu" -0xb4c1: "dyug" -0xb4c2: "dyugg" -0xb4c3: "dyugs" -0xb4c4: "dyun" -0xb4c5: "dyunj" -0xb4c6: "dyunh" -0xb4c7: "dyud" -0xb4c8: "dyul" -0xb4c9: "dyulg" -0xb4ca: "dyulm" -0xb4cb: "dyulb" -0xb4cc: "dyuls" -0xb4cd: "dyult" -0xb4ce: "dyulp" -0xb4cf: "dyulh" -0xb4d0: "dyum" -0xb4d1: "dyub" -0xb4d2: "dyubs" -0xb4d3: "dyus" -0xb4d4: "dyuss" -0xb4d5: "dyung" -0xb4d6: "dyuj" -0xb4d7: "dyuc" -0xb4d8: "dyuk" -0xb4d9: "dyut" -0xb4da: "dyup" -0xb4db: "dyuh" -0xb4dc: "deu" -0xb4dd: "deug" -0xb4de: "deugg" -0xb4df: "deugs" -0xb4e0: "deun" -0xb4e1: "deunj" -0xb4e2: "deunh" -0xb4e3: "deud" -0xb4e4: "deul" -0xb4e5: "deulg" -0xb4e6: "deulm" -0xb4e7: "deulb" -0xb4e8: "deuls" -0xb4e9: "deult" -0xb4ea: "deulp" -0xb4eb: "deulh" -0xb4ec: "deum" -0xb4ed: "deub" -0xb4ee: "deubs" -0xb4ef: "deus" -0xb4f0: "deuss" -0xb4f1: "deung" -0xb4f2: "deuj" -0xb4f3: "deuc" -0xb4f4: "deuk" -0xb4f5: "deut" -0xb4f6: "deup" -0xb4f7: "deuh" -0xb4f8: "dyi" -0xb4f9: "dyig" -0xb4fa: "dyigg" -0xb4fb: "dyigs" -0xb4fc: "dyin" -0xb4fd: "dyinj" -0xb4fe: "dyinh" -0xb4ff: "dyid" -/* x0b5 */ -0xb500: "dyil" -0xb501: "dyilg" -0xb502: "dyilm" -0xb503: "dyilb" -0xb504: "dyils" -0xb505: "dyilt" -0xb506: "dyilp" -0xb507: "dyilh" -0xb508: "dyim" -0xb509: "dyib" -0xb50a: "dyibs" -0xb50b: "dyis" -0xb50c: "dyiss" -0xb50d: "dying" -0xb50e: "dyij" -0xb50f: "dyic" -0xb510: "dyik" -0xb511: "dyit" -0xb512: "dyip" -0xb513: "dyih" -0xb514: "di" -0xb515: "dig" -0xb516: "digg" -0xb517: "digs" -0xb518: "din" -0xb519: "dinj" -0xb51a: "dinh" -0xb51b: "did" -0xb51c: "dil" -0xb51d: "dilg" -0xb51e: "dilm" -0xb51f: "dilb" -0xb520: "dils" -0xb521: "dilt" -0xb522: "dilp" -0xb523: "dilh" -0xb524: "dim" -0xb525: "dib" -0xb526: "dibs" -0xb527: "dis" -0xb528: "diss" -0xb529: "ding" -0xb52a: "dij" -0xb52b: "dic" -0xb52c: "dik" -0xb52d: "dit" -0xb52e: "dip" -0xb52f: "dih" -0xb530: "dda" -0xb531: "ddag" -0xb532: "ddagg" -0xb533: "ddags" -0xb534: "ddan" -0xb535: "ddanj" -0xb536: "ddanh" -0xb537: "ddad" -0xb538: "ddal" -0xb539: "ddalg" -0xb53a: "ddalm" -0xb53b: "ddalb" -0xb53c: "ddals" -0xb53d: "ddalt" -0xb53e: "ddalp" -0xb53f: "ddalh" -0xb540: "ddam" -0xb541: "ddab" -0xb542: "ddabs" -0xb543: "ddas" -0xb544: "ddass" -0xb545: "ddang" -0xb546: "ddaj" -0xb547: "ddac" -0xb548: "ddak" -0xb549: "ddat" -0xb54a: "ddap" -0xb54b: "ddah" -0xb54c: "ddae" -0xb54d: "ddaeg" -0xb54e: "ddaegg" -0xb54f: "ddaegs" -0xb550: "ddaen" -0xb551: "ddaenj" -0xb552: "ddaenh" -0xb553: "ddaed" -0xb554: "ddael" -0xb555: "ddaelg" -0xb556: "ddaelm" -0xb557: "ddaelb" -0xb558: "ddaels" -0xb559: "ddaelt" -0xb55a: "ddaelp" -0xb55b: "ddaelh" -0xb55c: "ddaem" -0xb55d: "ddaeb" -0xb55e: "ddaebs" -0xb55f: "ddaes" -0xb560: "ddaess" -0xb561: "ddaeng" -0xb562: "ddaej" -0xb563: "ddaec" -0xb564: "ddaek" -0xb565: "ddaet" -0xb566: "ddaep" -0xb567: "ddaeh" -0xb568: "ddya" -0xb569: "ddyag" -0xb56a: "ddyagg" -0xb56b: "ddyags" -0xb56c: "ddyan" -0xb56d: "ddyanj" -0xb56e: "ddyanh" -0xb56f: "ddyad" -0xb570: "ddyal" -0xb571: "ddyalg" -0xb572: "ddyalm" -0xb573: "ddyalb" -0xb574: "ddyals" -0xb575: "ddyalt" -0xb576: "ddyalp" -0xb577: "ddyalh" -0xb578: "ddyam" -0xb579: "ddyab" -0xb57a: "ddyabs" -0xb57b: "ddyas" -0xb57c: "ddyass" -0xb57d: "ddyang" -0xb57e: "ddyaj" -0xb57f: "ddyac" -0xb580: "ddyak" -0xb581: "ddyat" -0xb582: "ddyap" -0xb583: "ddyah" -0xb584: "ddyae" -0xb585: "ddyaeg" -0xb586: "ddyaegg" -0xb587: "ddyaegs" -0xb588: "ddyaen" -0xb589: "ddyaenj" -0xb58a: "ddyaenh" -0xb58b: "ddyaed" -0xb58c: "ddyael" -0xb58d: "ddyaelg" -0xb58e: "ddyaelm" -0xb58f: "ddyaelb" -0xb590: "ddyaels" -0xb591: "ddyaelt" -0xb592: "ddyaelp" -0xb593: "ddyaelh" -0xb594: "ddyaem" -0xb595: "ddyaeb" -0xb596: "ddyaebs" -0xb597: "ddyaes" -0xb598: "ddyaess" -0xb599: "ddyaeng" -0xb59a: "ddyaej" -0xb59b: "ddyaec" -0xb59c: "ddyaek" -0xb59d: "ddyaet" -0xb59e: "ddyaep" -0xb59f: "ddyaeh" -0xb5a0: "ddeo" -0xb5a1: "ddeog" -0xb5a2: "ddeogg" -0xb5a3: "ddeogs" -0xb5a4: "ddeon" -0xb5a5: "ddeonj" -0xb5a6: "ddeonh" -0xb5a7: "ddeod" -0xb5a8: "ddeol" -0xb5a9: "ddeolg" -0xb5aa: "ddeolm" -0xb5ab: "ddeolb" -0xb5ac: "ddeols" -0xb5ad: "ddeolt" -0xb5ae: "ddeolp" -0xb5af: "ddeolh" -0xb5b0: "ddeom" -0xb5b1: "ddeob" -0xb5b2: "ddeobs" -0xb5b3: "ddeos" -0xb5b4: "ddeoss" -0xb5b5: "ddeong" -0xb5b6: "ddeoj" -0xb5b7: "ddeoc" -0xb5b8: "ddeok" -0xb5b9: "ddeot" -0xb5ba: "ddeop" -0xb5bb: "ddeoh" -0xb5bc: "dde" -0xb5bd: "ddeg" -0xb5be: "ddegg" -0xb5bf: "ddegs" -0xb5c0: "dden" -0xb5c1: "ddenj" -0xb5c2: "ddenh" -0xb5c3: "dded" -0xb5c4: "ddel" -0xb5c5: "ddelg" -0xb5c6: "ddelm" -0xb5c7: "ddelb" -0xb5c8: "ddels" -0xb5c9: "ddelt" -0xb5ca: "ddelp" -0xb5cb: "ddelh" -0xb5cc: "ddem" -0xb5cd: "ddeb" -0xb5ce: "ddebs" -0xb5cf: "ddes" -0xb5d0: "ddess" -0xb5d1: "ddeng" -0xb5d2: "ddej" -0xb5d3: "ddec" -0xb5d4: "ddek" -0xb5d5: "ddet" -0xb5d6: "ddep" -0xb5d7: "ddeh" -0xb5d8: "ddyeo" -0xb5d9: "ddyeog" -0xb5da: "ddyeogg" -0xb5db: "ddyeogs" -0xb5dc: "ddyeon" -0xb5dd: "ddyeonj" -0xb5de: "ddyeonh" -0xb5df: "ddyeod" -0xb5e0: "ddyeol" -0xb5e1: "ddyeolg" -0xb5e2: "ddyeolm" -0xb5e3: "ddyeolb" -0xb5e4: "ddyeols" -0xb5e5: "ddyeolt" -0xb5e6: "ddyeolp" -0xb5e7: "ddyeolh" -0xb5e8: "ddyeom" -0xb5e9: "ddyeob" -0xb5ea: "ddyeobs" -0xb5eb: "ddyeos" -0xb5ec: "ddyeoss" -0xb5ed: "ddyeong" -0xb5ee: "ddyeoj" -0xb5ef: "ddyeoc" -0xb5f0: "ddyeok" -0xb5f1: "ddyeot" -0xb5f2: "ddyeop" -0xb5f3: "ddyeoh" -0xb5f4: "ddye" -0xb5f5: "ddyeg" -0xb5f6: "ddyegg" -0xb5f7: "ddyegs" -0xb5f8: "ddyen" -0xb5f9: "ddyenj" -0xb5fa: "ddyenh" -0xb5fb: "ddyed" -0xb5fc: "ddyel" -0xb5fd: "ddyelg" -0xb5fe: "ddyelm" -0xb5ff: "ddyelb" -/* x0b6 */ -0xb600: "ddyels" -0xb601: "ddyelt" -0xb602: "ddyelp" -0xb603: "ddyelh" -0xb604: "ddyem" -0xb605: "ddyeb" -0xb606: "ddyebs" -0xb607: "ddyes" -0xb608: "ddyess" -0xb609: "ddyeng" -0xb60a: "ddyej" -0xb60b: "ddyec" -0xb60c: "ddyek" -0xb60d: "ddyet" -0xb60e: "ddyep" -0xb60f: "ddyeh" -0xb610: "ddo" -0xb611: "ddog" -0xb612: "ddogg" -0xb613: "ddogs" -0xb614: "ddon" -0xb615: "ddonj" -0xb616: "ddonh" -0xb617: "ddod" -0xb618: "ddol" -0xb619: "ddolg" -0xb61a: "ddolm" -0xb61b: "ddolb" -0xb61c: "ddols" -0xb61d: "ddolt" -0xb61e: "ddolp" -0xb61f: "ddolh" -0xb620: "ddom" -0xb621: "ddob" -0xb622: "ddobs" -0xb623: "ddos" -0xb624: "ddoss" -0xb625: "ddong" -0xb626: "ddoj" -0xb627: "ddoc" -0xb628: "ddok" -0xb629: "ddot" -0xb62a: "ddop" -0xb62b: "ddoh" -0xb62c: "ddwa" -0xb62d: "ddwag" -0xb62e: "ddwagg" -0xb62f: "ddwags" -0xb630: "ddwan" -0xb631: "ddwanj" -0xb632: "ddwanh" -0xb633: "ddwad" -0xb634: "ddwal" -0xb635: "ddwalg" -0xb636: "ddwalm" -0xb637: "ddwalb" -0xb638: "ddwals" -0xb639: "ddwalt" -0xb63a: "ddwalp" -0xb63b: "ddwalh" -0xb63c: "ddwam" -0xb63d: "ddwab" -0xb63e: "ddwabs" -0xb63f: "ddwas" -0xb640: "ddwass" -0xb641: "ddwang" -0xb642: "ddwaj" -0xb643: "ddwac" -0xb644: "ddwak" -0xb645: "ddwat" -0xb646: "ddwap" -0xb647: "ddwah" -0xb648: "ddwae" -0xb649: "ddwaeg" -0xb64a: "ddwaegg" -0xb64b: "ddwaegs" -0xb64c: "ddwaen" -0xb64d: "ddwaenj" -0xb64e: "ddwaenh" -0xb64f: "ddwaed" -0xb650: "ddwael" -0xb651: "ddwaelg" -0xb652: "ddwaelm" -0xb653: "ddwaelb" -0xb654: "ddwaels" -0xb655: "ddwaelt" -0xb656: "ddwaelp" -0xb657: "ddwaelh" -0xb658: "ddwaem" -0xb659: "ddwaeb" -0xb65a: "ddwaebs" -0xb65b: "ddwaes" -0xb65c: "ddwaess" -0xb65d: "ddwaeng" -0xb65e: "ddwaej" -0xb65f: "ddwaec" -0xb660: "ddwaek" -0xb661: "ddwaet" -0xb662: "ddwaep" -0xb663: "ddwaeh" -0xb664: "ddoe" -0xb665: "ddoeg" -0xb666: "ddoegg" -0xb667: "ddoegs" -0xb668: "ddoen" -0xb669: "ddoenj" -0xb66a: "ddoenh" -0xb66b: "ddoed" -0xb66c: "ddoel" -0xb66d: "ddoelg" -0xb66e: "ddoelm" -0xb66f: "ddoelb" -0xb670: "ddoels" -0xb671: "ddoelt" -0xb672: "ddoelp" -0xb673: "ddoelh" -0xb674: "ddoem" -0xb675: "ddoeb" -0xb676: "ddoebs" -0xb677: "ddoes" -0xb678: "ddoess" -0xb679: "ddoeng" -0xb67a: "ddoej" -0xb67b: "ddoec" -0xb67c: "ddoek" -0xb67d: "ddoet" -0xb67e: "ddoep" -0xb67f: "ddoeh" -0xb680: "ddyo" -0xb681: "ddyog" -0xb682: "ddyogg" -0xb683: "ddyogs" -0xb684: "ddyon" -0xb685: "ddyonj" -0xb686: "ddyonh" -0xb687: "ddyod" -0xb688: "ddyol" -0xb689: "ddyolg" -0xb68a: "ddyolm" -0xb68b: "ddyolb" -0xb68c: "ddyols" -0xb68d: "ddyolt" -0xb68e: "ddyolp" -0xb68f: "ddyolh" -0xb690: "ddyom" -0xb691: "ddyob" -0xb692: "ddyobs" -0xb693: "ddyos" -0xb694: "ddyoss" -0xb695: "ddyong" -0xb696: "ddyoj" -0xb697: "ddyoc" -0xb698: "ddyok" -0xb699: "ddyot" -0xb69a: "ddyop" -0xb69b: "ddyoh" -0xb69c: "ddu" -0xb69d: "ddug" -0xb69e: "ddugg" -0xb69f: "ddugs" -0xb6a0: "ddun" -0xb6a1: "ddunj" -0xb6a2: "ddunh" -0xb6a3: "ddud" -0xb6a4: "ddul" -0xb6a5: "ddulg" -0xb6a6: "ddulm" -0xb6a7: "ddulb" -0xb6a8: "dduls" -0xb6a9: "ddult" -0xb6aa: "ddulp" -0xb6ab: "ddulh" -0xb6ac: "ddum" -0xb6ad: "ddub" -0xb6ae: "ddubs" -0xb6af: "ddus" -0xb6b0: "dduss" -0xb6b1: "ddung" -0xb6b2: "dduj" -0xb6b3: "dduc" -0xb6b4: "dduk" -0xb6b5: "ddut" -0xb6b6: "ddup" -0xb6b7: "dduh" -0xb6b8: "ddweo" -0xb6b9: "ddweog" -0xb6ba: "ddweogg" -0xb6bb: "ddweogs" -0xb6bc: "ddweon" -0xb6bd: "ddweonj" -0xb6be: "ddweonh" -0xb6bf: "ddweod" -0xb6c0: "ddweol" -0xb6c1: "ddweolg" -0xb6c2: "ddweolm" -0xb6c3: "ddweolb" -0xb6c4: "ddweols" -0xb6c5: "ddweolt" -0xb6c6: "ddweolp" -0xb6c7: "ddweolh" -0xb6c8: "ddweom" -0xb6c9: "ddweob" -0xb6ca: "ddweobs" -0xb6cb: "ddweos" -0xb6cc: "ddweoss" -0xb6cd: "ddweong" -0xb6ce: "ddweoj" -0xb6cf: "ddweoc" -0xb6d0: "ddweok" -0xb6d1: "ddweot" -0xb6d2: "ddweop" -0xb6d3: "ddweoh" -0xb6d4: "ddwe" -0xb6d5: "ddweg" -0xb6d6: "ddwegg" -0xb6d7: "ddwegs" -0xb6d8: "ddwen" -0xb6d9: "ddwenj" -0xb6da: "ddwenh" -0xb6db: "ddwed" -0xb6dc: "ddwel" -0xb6dd: "ddwelg" -0xb6de: "ddwelm" -0xb6df: "ddwelb" -0xb6e0: "ddwels" -0xb6e1: "ddwelt" -0xb6e2: "ddwelp" -0xb6e3: "ddwelh" -0xb6e4: "ddwem" -0xb6e5: "ddweb" -0xb6e6: "ddwebs" -0xb6e7: "ddwes" -0xb6e8: "ddwess" -0xb6e9: "ddweng" -0xb6ea: "ddwej" -0xb6eb: "ddwec" -0xb6ec: "ddwek" -0xb6ed: "ddwet" -0xb6ee: "ddwep" -0xb6ef: "ddweh" -0xb6f0: "ddwi" -0xb6f1: "ddwig" -0xb6f2: "ddwigg" -0xb6f3: "ddwigs" -0xb6f4: "ddwin" -0xb6f5: "ddwinj" -0xb6f6: "ddwinh" -0xb6f7: "ddwid" -0xb6f8: "ddwil" -0xb6f9: "ddwilg" -0xb6fa: "ddwilm" -0xb6fb: "ddwilb" -0xb6fc: "ddwils" -0xb6fd: "ddwilt" -0xb6fe: "ddwilp" -0xb6ff: "ddwilh" -/* x0b7 */ -0xb700: "ddwim" -0xb701: "ddwib" -0xb702: "ddwibs" -0xb703: "ddwis" -0xb704: "ddwiss" -0xb705: "ddwing" -0xb706: "ddwij" -0xb707: "ddwic" -0xb708: "ddwik" -0xb709: "ddwit" -0xb70a: "ddwip" -0xb70b: "ddwih" -0xb70c: "ddyu" -0xb70d: "ddyug" -0xb70e: "ddyugg" -0xb70f: "ddyugs" -0xb710: "ddyun" -0xb711: "ddyunj" -0xb712: "ddyunh" -0xb713: "ddyud" -0xb714: "ddyul" -0xb715: "ddyulg" -0xb716: "ddyulm" -0xb717: "ddyulb" -0xb718: "ddyuls" -0xb719: "ddyult" -0xb71a: "ddyulp" -0xb71b: "ddyulh" -0xb71c: "ddyum" -0xb71d: "ddyub" -0xb71e: "ddyubs" -0xb71f: "ddyus" -0xb720: "ddyuss" -0xb721: "ddyung" -0xb722: "ddyuj" -0xb723: "ddyuc" -0xb724: "ddyuk" -0xb725: "ddyut" -0xb726: "ddyup" -0xb727: "ddyuh" -0xb728: "ddeu" -0xb729: "ddeug" -0xb72a: "ddeugg" -0xb72b: "ddeugs" -0xb72c: "ddeun" -0xb72d: "ddeunj" -0xb72e: "ddeunh" -0xb72f: "ddeud" -0xb730: "ddeul" -0xb731: "ddeulg" -0xb732: "ddeulm" -0xb733: "ddeulb" -0xb734: "ddeuls" -0xb735: "ddeult" -0xb736: "ddeulp" -0xb737: "ddeulh" -0xb738: "ddeum" -0xb739: "ddeub" -0xb73a: "ddeubs" -0xb73b: "ddeus" -0xb73c: "ddeuss" -0xb73d: "ddeung" -0xb73e: "ddeuj" -0xb73f: "ddeuc" -0xb740: "ddeuk" -0xb741: "ddeut" -0xb742: "ddeup" -0xb743: "ddeuh" -0xb744: "ddyi" -0xb745: "ddyig" -0xb746: "ddyigg" -0xb747: "ddyigs" -0xb748: "ddyin" -0xb749: "ddyinj" -0xb74a: "ddyinh" -0xb74b: "ddyid" -0xb74c: "ddyil" -0xb74d: "ddyilg" -0xb74e: "ddyilm" -0xb74f: "ddyilb" -0xb750: "ddyils" -0xb751: "ddyilt" -0xb752: "ddyilp" -0xb753: "ddyilh" -0xb754: "ddyim" -0xb755: "ddyib" -0xb756: "ddyibs" -0xb757: "ddyis" -0xb758: "ddyiss" -0xb759: "ddying" -0xb75a: "ddyij" -0xb75b: "ddyic" -0xb75c: "ddyik" -0xb75d: "ddyit" -0xb75e: "ddyip" -0xb75f: "ddyih" -0xb760: "ddi" -0xb761: "ddig" -0xb762: "ddigg" -0xb763: "ddigs" -0xb764: "ddin" -0xb765: "ddinj" -0xb766: "ddinh" -0xb767: "ddid" -0xb768: "ddil" -0xb769: "ddilg" -0xb76a: "ddilm" -0xb76b: "ddilb" -0xb76c: "ddils" -0xb76d: "ddilt" -0xb76e: "ddilp" -0xb76f: "ddilh" -0xb770: "ddim" -0xb771: "ddib" -0xb772: "ddibs" -0xb773: "ddis" -0xb774: "ddiss" -0xb775: "dding" -0xb776: "ddij" -0xb777: "ddic" -0xb778: "ddik" -0xb779: "ddit" -0xb77a: "ddip" -0xb77b: "ddih" -0xb77c: "ra" -0xb77d: "rag" -0xb77e: "ragg" -0xb77f: "rags" -0xb780: "ran" -0xb781: "ranj" -0xb782: "ranh" -0xb783: "rad" -0xb784: "ral" -0xb785: "ralg" -0xb786: "ralm" -0xb787: "ralb" -0xb788: "rals" -0xb789: "ralt" -0xb78a: "ralp" -0xb78b: "ralh" -0xb78c: "ram" -0xb78d: "rab" -0xb78e: "rabs" -0xb78f: "ras" -0xb790: "rass" -0xb791: "rang" -0xb792: "raj" -0xb793: "rac" -0xb794: "rak" -0xb795: "rat" -0xb796: "rap" -0xb797: "rah" -0xb798: "rae" -0xb799: "raeg" -0xb79a: "raegg" -0xb79b: "raegs" -0xb79c: "raen" -0xb79d: "raenj" -0xb79e: "raenh" -0xb79f: "raed" -0xb7a0: "rael" -0xb7a1: "raelg" -0xb7a2: "raelm" -0xb7a3: "raelb" -0xb7a4: "raels" -0xb7a5: "raelt" -0xb7a6: "raelp" -0xb7a7: "raelh" -0xb7a8: "raem" -0xb7a9: "raeb" -0xb7aa: "raebs" -0xb7ab: "raes" -0xb7ac: "raess" -0xb7ad: "raeng" -0xb7ae: "raej" -0xb7af: "raec" -0xb7b0: "raek" -0xb7b1: "raet" -0xb7b2: "raep" -0xb7b3: "raeh" -0xb7b4: "rya" -0xb7b5: "ryag" -0xb7b6: "ryagg" -0xb7b7: "ryags" -0xb7b8: "ryan" -0xb7b9: "ryanj" -0xb7ba: "ryanh" -0xb7bb: "ryad" -0xb7bc: "ryal" -0xb7bd: "ryalg" -0xb7be: "ryalm" -0xb7bf: "ryalb" -0xb7c0: "ryals" -0xb7c1: "ryalt" -0xb7c2: "ryalp" -0xb7c3: "ryalh" -0xb7c4: "ryam" -0xb7c5: "ryab" -0xb7c6: "ryabs" -0xb7c7: "ryas" -0xb7c8: "ryass" -0xb7c9: "ryang" -0xb7ca: "ryaj" -0xb7cb: "ryac" -0xb7cc: "ryak" -0xb7cd: "ryat" -0xb7ce: "ryap" -0xb7cf: "ryah" -0xb7d0: "ryae" -0xb7d1: "ryaeg" -0xb7d2: "ryaegg" -0xb7d3: "ryaegs" -0xb7d4: "ryaen" -0xb7d5: "ryaenj" -0xb7d6: "ryaenh" -0xb7d7: "ryaed" -0xb7d8: "ryael" -0xb7d9: "ryaelg" -0xb7da: "ryaelm" -0xb7db: "ryaelb" -0xb7dc: "ryaels" -0xb7dd: "ryaelt" -0xb7de: "ryaelp" -0xb7df: "ryaelh" -0xb7e0: "ryaem" -0xb7e1: "ryaeb" -0xb7e2: "ryaebs" -0xb7e3: "ryaes" -0xb7e4: "ryaess" -0xb7e5: "ryaeng" -0xb7e6: "ryaej" -0xb7e7: "ryaec" -0xb7e8: "ryaek" -0xb7e9: "ryaet" -0xb7ea: "ryaep" -0xb7eb: "ryaeh" -0xb7ec: "reo" -0xb7ed: "reog" -0xb7ee: "reogg" -0xb7ef: "reogs" -0xb7f0: "reon" -0xb7f1: "reonj" -0xb7f2: "reonh" -0xb7f3: "reod" -0xb7f4: "reol" -0xb7f5: "reolg" -0xb7f6: "reolm" -0xb7f7: "reolb" -0xb7f8: "reols" -0xb7f9: "reolt" -0xb7fa: "reolp" -0xb7fb: "reolh" -0xb7fc: "reom" -0xb7fd: "reob" -0xb7fe: "reobs" -0xb7ff: "reos" -/* x0b8 */ -0xb800: "reoss" -0xb801: "reong" -0xb802: "reoj" -0xb803: "reoc" -0xb804: "reok" -0xb805: "reot" -0xb806: "reop" -0xb807: "reoh" -0xb808: "re" -0xb809: "reg" -0xb80a: "regg" -0xb80b: "regs" -0xb80c: "ren" -0xb80d: "renj" -0xb80e: "renh" -0xb80f: "red" -0xb810: "rel" -0xb811: "relg" -0xb812: "relm" -0xb813: "relb" -0xb814: "rels" -0xb815: "relt" -0xb816: "relp" -0xb817: "relh" -0xb818: "rem" -0xb819: "reb" -0xb81a: "rebs" -0xb81b: "res" -0xb81c: "ress" -0xb81d: "reng" -0xb81e: "rej" -0xb81f: "rec" -0xb820: "rek" -0xb821: "ret" -0xb822: "rep" -0xb823: "reh" -0xb824: "ryeo" -0xb825: "ryeog" -0xb826: "ryeogg" -0xb827: "ryeogs" -0xb828: "ryeon" -0xb829: "ryeonj" -0xb82a: "ryeonh" -0xb82b: "ryeod" -0xb82c: "ryeol" -0xb82d: "ryeolg" -0xb82e: "ryeolm" -0xb82f: "ryeolb" -0xb830: "ryeols" -0xb831: "ryeolt" -0xb832: "ryeolp" -0xb833: "ryeolh" -0xb834: "ryeom" -0xb835: "ryeob" -0xb836: "ryeobs" -0xb837: "ryeos" -0xb838: "ryeoss" -0xb839: "ryeong" -0xb83a: "ryeoj" -0xb83b: "ryeoc" -0xb83c: "ryeok" -0xb83d: "ryeot" -0xb83e: "ryeop" -0xb83f: "ryeoh" -0xb840: "rye" -0xb841: "ryeg" -0xb842: "ryegg" -0xb843: "ryegs" -0xb844: "ryen" -0xb845: "ryenj" -0xb846: "ryenh" -0xb847: "ryed" -0xb848: "ryel" -0xb849: "ryelg" -0xb84a: "ryelm" -0xb84b: "ryelb" -0xb84c: "ryels" -0xb84d: "ryelt" -0xb84e: "ryelp" -0xb84f: "ryelh" -0xb850: "ryem" -0xb851: "ryeb" -0xb852: "ryebs" -0xb853: "ryes" -0xb854: "ryess" -0xb855: "ryeng" -0xb856: "ryej" -0xb857: "ryec" -0xb858: "ryek" -0xb859: "ryet" -0xb85a: "ryep" -0xb85b: "ryeh" -0xb85c: "ro" -0xb85d: "rog" -0xb85e: "rogg" -0xb85f: "rogs" -0xb860: "ron" -0xb861: "ronj" -0xb862: "ronh" -0xb863: "rod" -0xb864: "rol" -0xb865: "rolg" -0xb866: "rolm" -0xb867: "rolb" -0xb868: "rols" -0xb869: "rolt" -0xb86a: "rolp" -0xb86b: "rolh" -0xb86c: "rom" -0xb86d: "rob" -0xb86e: "robs" -0xb86f: "ros" -0xb870: "ross" -0xb871: "rong" -0xb872: "roj" -0xb873: "roc" -0xb874: "rok" -0xb875: "rot" -0xb876: "rop" -0xb877: "roh" -0xb878: "rwa" -0xb879: "rwag" -0xb87a: "rwagg" -0xb87b: "rwags" -0xb87c: "rwan" -0xb87d: "rwanj" -0xb87e: "rwanh" -0xb87f: "rwad" -0xb880: "rwal" -0xb881: "rwalg" -0xb882: "rwalm" -0xb883: "rwalb" -0xb884: "rwals" -0xb885: "rwalt" -0xb886: "rwalp" -0xb887: "rwalh" -0xb888: "rwam" -0xb889: "rwab" -0xb88a: "rwabs" -0xb88b: "rwas" -0xb88c: "rwass" -0xb88d: "rwang" -0xb88e: "rwaj" -0xb88f: "rwac" -0xb890: "rwak" -0xb891: "rwat" -0xb892: "rwap" -0xb893: "rwah" -0xb894: "rwae" -0xb895: "rwaeg" -0xb896: "rwaegg" -0xb897: "rwaegs" -0xb898: "rwaen" -0xb899: "rwaenj" -0xb89a: "rwaenh" -0xb89b: "rwaed" -0xb89c: "rwael" -0xb89d: "rwaelg" -0xb89e: "rwaelm" -0xb89f: "rwaelb" -0xb8a0: "rwaels" -0xb8a1: "rwaelt" -0xb8a2: "rwaelp" -0xb8a3: "rwaelh" -0xb8a4: "rwaem" -0xb8a5: "rwaeb" -0xb8a6: "rwaebs" -0xb8a7: "rwaes" -0xb8a8: "rwaess" -0xb8a9: "rwaeng" -0xb8aa: "rwaej" -0xb8ab: "rwaec" -0xb8ac: "rwaek" -0xb8ad: "rwaet" -0xb8ae: "rwaep" -0xb8af: "rwaeh" -0xb8b0: "roe" -0xb8b1: "roeg" -0xb8b2: "roegg" -0xb8b3: "roegs" -0xb8b4: "roen" -0xb8b5: "roenj" -0xb8b6: "roenh" -0xb8b7: "roed" -0xb8b8: "roel" -0xb8b9: "roelg" -0xb8ba: "roelm" -0xb8bb: "roelb" -0xb8bc: "roels" -0xb8bd: "roelt" -0xb8be: "roelp" -0xb8bf: "roelh" -0xb8c0: "roem" -0xb8c1: "roeb" -0xb8c2: "roebs" -0xb8c3: "roes" -0xb8c4: "roess" -0xb8c5: "roeng" -0xb8c6: "roej" -0xb8c7: "roec" -0xb8c8: "roek" -0xb8c9: "roet" -0xb8ca: "roep" -0xb8cb: "roeh" -0xb8cc: "ryo" -0xb8cd: "ryog" -0xb8ce: "ryogg" -0xb8cf: "ryogs" -0xb8d0: "ryon" -0xb8d1: "ryonj" -0xb8d2: "ryonh" -0xb8d3: "ryod" -0xb8d4: "ryol" -0xb8d5: "ryolg" -0xb8d6: "ryolm" -0xb8d7: "ryolb" -0xb8d8: "ryols" -0xb8d9: "ryolt" -0xb8da: "ryolp" -0xb8db: "ryolh" -0xb8dc: "ryom" -0xb8dd: "ryob" -0xb8de: "ryobs" -0xb8df: "ryos" -0xb8e0: "ryoss" -0xb8e1: "ryong" -0xb8e2: "ryoj" -0xb8e3: "ryoc" -0xb8e4: "ryok" -0xb8e5: "ryot" -0xb8e6: "ryop" -0xb8e7: "ryoh" -0xb8e8: "ru" -0xb8e9: "rug" -0xb8ea: "rugg" -0xb8eb: "rugs" -0xb8ec: "run" -0xb8ed: "runj" -0xb8ee: "runh" -0xb8ef: "rud" -0xb8f0: "rul" -0xb8f1: "rulg" -0xb8f2: "rulm" -0xb8f3: "rulb" -0xb8f4: "ruls" -0xb8f5: "rult" -0xb8f6: "rulp" -0xb8f7: "rulh" -0xb8f8: "rum" -0xb8f9: "rub" -0xb8fa: "rubs" -0xb8fb: "rus" -0xb8fc: "russ" -0xb8fd: "rung" -0xb8fe: "ruj" -0xb8ff: "ruc" -/* x0b9 */ -0xb900: "ruk" -0xb901: "rut" -0xb902: "rup" -0xb903: "ruh" -0xb904: "rweo" -0xb905: "rweog" -0xb906: "rweogg" -0xb907: "rweogs" -0xb908: "rweon" -0xb909: "rweonj" -0xb90a: "rweonh" -0xb90b: "rweod" -0xb90c: "rweol" -0xb90d: "rweolg" -0xb90e: "rweolm" -0xb90f: "rweolb" -0xb910: "rweols" -0xb911: "rweolt" -0xb912: "rweolp" -0xb913: "rweolh" -0xb914: "rweom" -0xb915: "rweob" -0xb916: "rweobs" -0xb917: "rweos" -0xb918: "rweoss" -0xb919: "rweong" -0xb91a: "rweoj" -0xb91b: "rweoc" -0xb91c: "rweok" -0xb91d: "rweot" -0xb91e: "rweop" -0xb91f: "rweoh" -0xb920: "rwe" -0xb921: "rweg" -0xb922: "rwegg" -0xb923: "rwegs" -0xb924: "rwen" -0xb925: "rwenj" -0xb926: "rwenh" -0xb927: "rwed" -0xb928: "rwel" -0xb929: "rwelg" -0xb92a: "rwelm" -0xb92b: "rwelb" -0xb92c: "rwels" -0xb92d: "rwelt" -0xb92e: "rwelp" -0xb92f: "rwelh" -0xb930: "rwem" -0xb931: "rweb" -0xb932: "rwebs" -0xb933: "rwes" -0xb934: "rwess" -0xb935: "rweng" -0xb936: "rwej" -0xb937: "rwec" -0xb938: "rwek" -0xb939: "rwet" -0xb93a: "rwep" -0xb93b: "rweh" -0xb93c: "rwi" -0xb93d: "rwig" -0xb93e: "rwigg" -0xb93f: "rwigs" -0xb940: "rwin" -0xb941: "rwinj" -0xb942: "rwinh" -0xb943: "rwid" -0xb944: "rwil" -0xb945: "rwilg" -0xb946: "rwilm" -0xb947: "rwilb" -0xb948: "rwils" -0xb949: "rwilt" -0xb94a: "rwilp" -0xb94b: "rwilh" -0xb94c: "rwim" -0xb94d: "rwib" -0xb94e: "rwibs" -0xb94f: "rwis" -0xb950: "rwiss" -0xb951: "rwing" -0xb952: "rwij" -0xb953: "rwic" -0xb954: "rwik" -0xb955: "rwit" -0xb956: "rwip" -0xb957: "rwih" -0xb958: "ryu" -0xb959: "ryug" -0xb95a: "ryugg" -0xb95b: "ryugs" -0xb95c: "ryun" -0xb95d: "ryunj" -0xb95e: "ryunh" -0xb95f: "ryud" -0xb960: "ryul" -0xb961: "ryulg" -0xb962: "ryulm" -0xb963: "ryulb" -0xb964: "ryuls" -0xb965: "ryult" -0xb966: "ryulp" -0xb967: "ryulh" -0xb968: "ryum" -0xb969: "ryub" -0xb96a: "ryubs" -0xb96b: "ryus" -0xb96c: "ryuss" -0xb96d: "ryung" -0xb96e: "ryuj" -0xb96f: "ryuc" -0xb970: "ryuk" -0xb971: "ryut" -0xb972: "ryup" -0xb973: "ryuh" -0xb974: "reu" -0xb975: "reug" -0xb976: "reugg" -0xb977: "reugs" -0xb978: "reun" -0xb979: "reunj" -0xb97a: "reunh" -0xb97b: "reud" -0xb97c: "reul" -0xb97d: "reulg" -0xb97e: "reulm" -0xb97f: "reulb" -0xb980: "reuls" -0xb981: "reult" -0xb982: "reulp" -0xb983: "reulh" -0xb984: "reum" -0xb985: "reub" -0xb986: "reubs" -0xb987: "reus" -0xb988: "reuss" -0xb989: "reung" -0xb98a: "reuj" -0xb98b: "reuc" -0xb98c: "reuk" -0xb98d: "reut" -0xb98e: "reup" -0xb98f: "reuh" -0xb990: "ryi" -0xb991: "ryig" -0xb992: "ryigg" -0xb993: "ryigs" -0xb994: "ryin" -0xb995: "ryinj" -0xb996: "ryinh" -0xb997: "ryid" -0xb998: "ryil" -0xb999: "ryilg" -0xb99a: "ryilm" -0xb99b: "ryilb" -0xb99c: "ryils" -0xb99d: "ryilt" -0xb99e: "ryilp" -0xb99f: "ryilh" -0xb9a0: "ryim" -0xb9a1: "ryib" -0xb9a2: "ryibs" -0xb9a3: "ryis" -0xb9a4: "ryiss" -0xb9a5: "rying" -0xb9a6: "ryij" -0xb9a7: "ryic" -0xb9a8: "ryik" -0xb9a9: "ryit" -0xb9aa: "ryip" -0xb9ab: "ryih" -0xb9ac: "ri" -0xb9ad: "rig" -0xb9ae: "rigg" -0xb9af: "rigs" -0xb9b0: "rin" -0xb9b1: "rinj" -0xb9b2: "rinh" -0xb9b3: "rid" -0xb9b4: "ril" -0xb9b5: "rilg" -0xb9b6: "rilm" -0xb9b7: "rilb" -0xb9b8: "rils" -0xb9b9: "rilt" -0xb9ba: "rilp" -0xb9bb: "rilh" -0xb9bc: "rim" -0xb9bd: "rib" -0xb9be: "ribs" -0xb9bf: "ris" -0xb9c0: "riss" -0xb9c1: "ring" -0xb9c2: "rij" -0xb9c3: "ric" -0xb9c4: "rik" -0xb9c5: "rit" -0xb9c6: "rip" -0xb9c7: "rih" -0xb9c8: "ma" -0xb9c9: "mag" -0xb9ca: "magg" -0xb9cb: "mags" -0xb9cc: "man" -0xb9cd: "manj" -0xb9ce: "manh" -0xb9cf: "mad" -0xb9d0: "mal" -0xb9d1: "malg" -0xb9d2: "malm" -0xb9d3: "malb" -0xb9d4: "mals" -0xb9d5: "malt" -0xb9d6: "malp" -0xb9d7: "malh" -0xb9d8: "mam" -0xb9d9: "mab" -0xb9da: "mabs" -0xb9db: "mas" -0xb9dc: "mass" -0xb9dd: "mang" -0xb9de: "maj" -0xb9df: "mac" -0xb9e0: "mak" -0xb9e1: "mat" -0xb9e2: "map" -0xb9e3: "mah" -0xb9e4: "mae" -0xb9e5: "maeg" -0xb9e6: "maegg" -0xb9e7: "maegs" -0xb9e8: "maen" -0xb9e9: "maenj" -0xb9ea: "maenh" -0xb9eb: "maed" -0xb9ec: "mael" -0xb9ed: "maelg" -0xb9ee: "maelm" -0xb9ef: "maelb" -0xb9f0: "maels" -0xb9f1: "maelt" -0xb9f2: "maelp" -0xb9f3: "maelh" -0xb9f4: "maem" -0xb9f5: "maeb" -0xb9f6: "maebs" -0xb9f7: "maes" -0xb9f8: "maess" -0xb9f9: "maeng" -0xb9fa: "maej" -0xb9fb: "maec" -0xb9fc: "maek" -0xb9fd: "maet" -0xb9fe: "maep" -0xb9ff: "maeh" -/* x0ba */ -0xba00: "mya" -0xba01: "myag" -0xba02: "myagg" -0xba03: "myags" -0xba04: "myan" -0xba05: "myanj" -0xba06: "myanh" -0xba07: "myad" -0xba08: "myal" -0xba09: "myalg" -0xba0a: "myalm" -0xba0b: "myalb" -0xba0c: "myals" -0xba0d: "myalt" -0xba0e: "myalp" -0xba0f: "myalh" -0xba10: "myam" -0xba11: "myab" -0xba12: "myabs" -0xba13: "myas" -0xba14: "myass" -0xba15: "myang" -0xba16: "myaj" -0xba17: "myac" -0xba18: "myak" -0xba19: "myat" -0xba1a: "myap" -0xba1b: "myah" -0xba1c: "myae" -0xba1d: "myaeg" -0xba1e: "myaegg" -0xba1f: "myaegs" -0xba20: "myaen" -0xba21: "myaenj" -0xba22: "myaenh" -0xba23: "myaed" -0xba24: "myael" -0xba25: "myaelg" -0xba26: "myaelm" -0xba27: "myaelb" -0xba28: "myaels" -0xba29: "myaelt" -0xba2a: "myaelp" -0xba2b: "myaelh" -0xba2c: "myaem" -0xba2d: "myaeb" -0xba2e: "myaebs" -0xba2f: "myaes" -0xba30: "myaess" -0xba31: "myaeng" -0xba32: "myaej" -0xba33: "myaec" -0xba34: "myaek" -0xba35: "myaet" -0xba36: "myaep" -0xba37: "myaeh" -0xba38: "meo" -0xba39: "meog" -0xba3a: "meogg" -0xba3b: "meogs" -0xba3c: "meon" -0xba3d: "meonj" -0xba3e: "meonh" -0xba3f: "meod" -0xba40: "meol" -0xba41: "meolg" -0xba42: "meolm" -0xba43: "meolb" -0xba44: "meols" -0xba45: "meolt" -0xba46: "meolp" -0xba47: "meolh" -0xba48: "meom" -0xba49: "meob" -0xba4a: "meobs" -0xba4b: "meos" -0xba4c: "meoss" -0xba4d: "meong" -0xba4e: "meoj" -0xba4f: "meoc" -0xba50: "meok" -0xba51: "meot" -0xba52: "meop" -0xba53: "meoh" -0xba54: "me" -0xba55: "meg" -0xba56: "megg" -0xba57: "megs" -0xba58: "men" -0xba59: "menj" -0xba5a: "menh" -0xba5b: "med" -0xba5c: "mel" -0xba5d: "melg" -0xba5e: "melm" -0xba5f: "melb" -0xba60: "mels" -0xba61: "melt" -0xba62: "melp" -0xba63: "melh" -0xba64: "mem" -0xba65: "meb" -0xba66: "mebs" -0xba67: "mes" -0xba68: "mess" -0xba69: "meng" -0xba6a: "mej" -0xba6b: "mec" -0xba6c: "mek" -0xba6d: "met" -0xba6e: "mep" -0xba6f: "meh" -0xba70: "myeo" -0xba71: "myeog" -0xba72: "myeogg" -0xba73: "myeogs" -0xba74: "myeon" -0xba75: "myeonj" -0xba76: "myeonh" -0xba77: "myeod" -0xba78: "myeol" -0xba79: "myeolg" -0xba7a: "myeolm" -0xba7b: "myeolb" -0xba7c: "myeols" -0xba7d: "myeolt" -0xba7e: "myeolp" -0xba7f: "myeolh" -0xba80: "myeom" -0xba81: "myeob" -0xba82: "myeobs" -0xba83: "myeos" -0xba84: "myeoss" -0xba85: "myeong" -0xba86: "myeoj" -0xba87: "myeoc" -0xba88: "myeok" -0xba89: "myeot" -0xba8a: "myeop" -0xba8b: "myeoh" -0xba8c: "mye" -0xba8d: "myeg" -0xba8e: "myegg" -0xba8f: "myegs" -0xba90: "myen" -0xba91: "myenj" -0xba92: "myenh" -0xba93: "myed" -0xba94: "myel" -0xba95: "myelg" -0xba96: "myelm" -0xba97: "myelb" -0xba98: "myels" -0xba99: "myelt" -0xba9a: "myelp" -0xba9b: "myelh" -0xba9c: "myem" -0xba9d: "myeb" -0xba9e: "myebs" -0xba9f: "myes" -0xbaa0: "myess" -0xbaa1: "myeng" -0xbaa2: "myej" -0xbaa3: "myec" -0xbaa4: "myek" -0xbaa5: "myet" -0xbaa6: "myep" -0xbaa7: "myeh" -0xbaa8: "mo" -0xbaa9: "mog" -0xbaaa: "mogg" -0xbaab: "mogs" -0xbaac: "mon" -0xbaad: "monj" -0xbaae: "monh" -0xbaaf: "mod" -0xbab0: "mol" -0xbab1: "molg" -0xbab2: "molm" -0xbab3: "molb" -0xbab4: "mols" -0xbab5: "molt" -0xbab6: "molp" -0xbab7: "molh" -0xbab8: "mom" -0xbab9: "mob" -0xbaba: "mobs" -0xbabb: "mos" -0xbabc: "moss" -0xbabd: "mong" -0xbabe: "moj" -0xbabf: "moc" -0xbac0: "mok" -0xbac1: "mot" -0xbac2: "mop" -0xbac3: "moh" -0xbac4: "mwa" -0xbac5: "mwag" -0xbac6: "mwagg" -0xbac7: "mwags" -0xbac8: "mwan" -0xbac9: "mwanj" -0xbaca: "mwanh" -0xbacb: "mwad" -0xbacc: "mwal" -0xbacd: "mwalg" -0xbace: "mwalm" -0xbacf: "mwalb" -0xbad0: "mwals" -0xbad1: "mwalt" -0xbad2: "mwalp" -0xbad3: "mwalh" -0xbad4: "mwam" -0xbad5: "mwab" -0xbad6: "mwabs" -0xbad7: "mwas" -0xbad8: "mwass" -0xbad9: "mwang" -0xbada: "mwaj" -0xbadb: "mwac" -0xbadc: "mwak" -0xbadd: "mwat" -0xbade: "mwap" -0xbadf: "mwah" -0xbae0: "mwae" -0xbae1: "mwaeg" -0xbae2: "mwaegg" -0xbae3: "mwaegs" -0xbae4: "mwaen" -0xbae5: "mwaenj" -0xbae6: "mwaenh" -0xbae7: "mwaed" -0xbae8: "mwael" -0xbae9: "mwaelg" -0xbaea: "mwaelm" -0xbaeb: "mwaelb" -0xbaec: "mwaels" -0xbaed: "mwaelt" -0xbaee: "mwaelp" -0xbaef: "mwaelh" -0xbaf0: "mwaem" -0xbaf1: "mwaeb" -0xbaf2: "mwaebs" -0xbaf3: "mwaes" -0xbaf4: "mwaess" -0xbaf5: "mwaeng" -0xbaf6: "mwaej" -0xbaf7: "mwaec" -0xbaf8: "mwaek" -0xbaf9: "mwaet" -0xbafa: "mwaep" -0xbafb: "mwaeh" -0xbafc: "moe" -0xbafd: "moeg" -0xbafe: "moegg" -0xbaff: "moegs" -/* x0bb */ -0xbb00: "moen" -0xbb01: "moenj" -0xbb02: "moenh" -0xbb03: "moed" -0xbb04: "moel" -0xbb05: "moelg" -0xbb06: "moelm" -0xbb07: "moelb" -0xbb08: "moels" -0xbb09: "moelt" -0xbb0a: "moelp" -0xbb0b: "moelh" -0xbb0c: "moem" -0xbb0d: "moeb" -0xbb0e: "moebs" -0xbb0f: "moes" -0xbb10: "moess" -0xbb11: "moeng" -0xbb12: "moej" -0xbb13: "moec" -0xbb14: "moek" -0xbb15: "moet" -0xbb16: "moep" -0xbb17: "moeh" -0xbb18: "myo" -0xbb19: "myog" -0xbb1a: "myogg" -0xbb1b: "myogs" -0xbb1c: "myon" -0xbb1d: "myonj" -0xbb1e: "myonh" -0xbb1f: "myod" -0xbb20: "myol" -0xbb21: "myolg" -0xbb22: "myolm" -0xbb23: "myolb" -0xbb24: "myols" -0xbb25: "myolt" -0xbb26: "myolp" -0xbb27: "myolh" -0xbb28: "myom" -0xbb29: "myob" -0xbb2a: "myobs" -0xbb2b: "myos" -0xbb2c: "myoss" -0xbb2d: "myong" -0xbb2e: "myoj" -0xbb2f: "myoc" -0xbb30: "myok" -0xbb31: "myot" -0xbb32: "myop" -0xbb33: "myoh" -0xbb34: "mu" -0xbb35: "mug" -0xbb36: "mugg" -0xbb37: "mugs" -0xbb38: "mun" -0xbb39: "munj" -0xbb3a: "munh" -0xbb3b: "mud" -0xbb3c: "mul" -0xbb3d: "mulg" -0xbb3e: "mulm" -0xbb3f: "mulb" -0xbb40: "muls" -0xbb41: "mult" -0xbb42: "mulp" -0xbb43: "mulh" -0xbb44: "mum" -0xbb45: "mub" -0xbb46: "mubs" -0xbb47: "mus" -0xbb48: "muss" -0xbb49: "mung" -0xbb4a: "muj" -0xbb4b: "muc" -0xbb4c: "muk" -0xbb4d: "mut" -0xbb4e: "mup" -0xbb4f: "muh" -0xbb50: "mweo" -0xbb51: "mweog" -0xbb52: "mweogg" -0xbb53: "mweogs" -0xbb54: "mweon" -0xbb55: "mweonj" -0xbb56: "mweonh" -0xbb57: "mweod" -0xbb58: "mweol" -0xbb59: "mweolg" -0xbb5a: "mweolm" -0xbb5b: "mweolb" -0xbb5c: "mweols" -0xbb5d: "mweolt" -0xbb5e: "mweolp" -0xbb5f: "mweolh" -0xbb60: "mweom" -0xbb61: "mweob" -0xbb62: "mweobs" -0xbb63: "mweos" -0xbb64: "mweoss" -0xbb65: "mweong" -0xbb66: "mweoj" -0xbb67: "mweoc" -0xbb68: "mweok" -0xbb69: "mweot" -0xbb6a: "mweop" -0xbb6b: "mweoh" -0xbb6c: "mwe" -0xbb6d: "mweg" -0xbb6e: "mwegg" -0xbb6f: "mwegs" -0xbb70: "mwen" -0xbb71: "mwenj" -0xbb72: "mwenh" -0xbb73: "mwed" -0xbb74: "mwel" -0xbb75: "mwelg" -0xbb76: "mwelm" -0xbb77: "mwelb" -0xbb78: "mwels" -0xbb79: "mwelt" -0xbb7a: "mwelp" -0xbb7b: "mwelh" -0xbb7c: "mwem" -0xbb7d: "mweb" -0xbb7e: "mwebs" -0xbb7f: "mwes" -0xbb80: "mwess" -0xbb81: "mweng" -0xbb82: "mwej" -0xbb83: "mwec" -0xbb84: "mwek" -0xbb85: "mwet" -0xbb86: "mwep" -0xbb87: "mweh" -0xbb88: "mwi" -0xbb89: "mwig" -0xbb8a: "mwigg" -0xbb8b: "mwigs" -0xbb8c: "mwin" -0xbb8d: "mwinj" -0xbb8e: "mwinh" -0xbb8f: "mwid" -0xbb90: "mwil" -0xbb91: "mwilg" -0xbb92: "mwilm" -0xbb93: "mwilb" -0xbb94: "mwils" -0xbb95: "mwilt" -0xbb96: "mwilp" -0xbb97: "mwilh" -0xbb98: "mwim" -0xbb99: "mwib" -0xbb9a: "mwibs" -0xbb9b: "mwis" -0xbb9c: "mwiss" -0xbb9d: "mwing" -0xbb9e: "mwij" -0xbb9f: "mwic" -0xbba0: "mwik" -0xbba1: "mwit" -0xbba2: "mwip" -0xbba3: "mwih" -0xbba4: "myu" -0xbba5: "myug" -0xbba6: "myugg" -0xbba7: "myugs" -0xbba8: "myun" -0xbba9: "myunj" -0xbbaa: "myunh" -0xbbab: "myud" -0xbbac: "myul" -0xbbad: "myulg" -0xbbae: "myulm" -0xbbaf: "myulb" -0xbbb0: "myuls" -0xbbb1: "myult" -0xbbb2: "myulp" -0xbbb3: "myulh" -0xbbb4: "myum" -0xbbb5: "myub" -0xbbb6: "myubs" -0xbbb7: "myus" -0xbbb8: "myuss" -0xbbb9: "myung" -0xbbba: "myuj" -0xbbbb: "myuc" -0xbbbc: "myuk" -0xbbbd: "myut" -0xbbbe: "myup" -0xbbbf: "myuh" -0xbbc0: "meu" -0xbbc1: "meug" -0xbbc2: "meugg" -0xbbc3: "meugs" -0xbbc4: "meun" -0xbbc5: "meunj" -0xbbc6: "meunh" -0xbbc7: "meud" -0xbbc8: "meul" -0xbbc9: "meulg" -0xbbca: "meulm" -0xbbcb: "meulb" -0xbbcc: "meuls" -0xbbcd: "meult" -0xbbce: "meulp" -0xbbcf: "meulh" -0xbbd0: "meum" -0xbbd1: "meub" -0xbbd2: "meubs" -0xbbd3: "meus" -0xbbd4: "meuss" -0xbbd5: "meung" -0xbbd6: "meuj" -0xbbd7: "meuc" -0xbbd8: "meuk" -0xbbd9: "meut" -0xbbda: "meup" -0xbbdb: "meuh" -0xbbdc: "myi" -0xbbdd: "myig" -0xbbde: "myigg" -0xbbdf: "myigs" -0xbbe0: "myin" -0xbbe1: "myinj" -0xbbe2: "myinh" -0xbbe3: "myid" -0xbbe4: "myil" -0xbbe5: "myilg" -0xbbe6: "myilm" -0xbbe7: "myilb" -0xbbe8: "myils" -0xbbe9: "myilt" -0xbbea: "myilp" -0xbbeb: "myilh" -0xbbec: "myim" -0xbbed: "myib" -0xbbee: "myibs" -0xbbef: "myis" -0xbbf0: "myiss" -0xbbf1: "mying" -0xbbf2: "myij" -0xbbf3: "myic" -0xbbf4: "myik" -0xbbf5: "myit" -0xbbf6: "myip" -0xbbf7: "myih" -0xbbf8: "mi" -0xbbf9: "mig" -0xbbfa: "migg" -0xbbfb: "migs" -0xbbfc: "min" -0xbbfd: "minj" -0xbbfe: "minh" -0xbbff: "mid" -/* x0bc */ -0xbc00: "mil" -0xbc01: "milg" -0xbc02: "milm" -0xbc03: "milb" -0xbc04: "mils" -0xbc05: "milt" -0xbc06: "milp" -0xbc07: "milh" -0xbc08: "mim" -0xbc09: "mib" -0xbc0a: "mibs" -0xbc0b: "mis" -0xbc0c: "miss" -0xbc0d: "ming" -0xbc0e: "mij" -0xbc0f: "mic" -0xbc10: "mik" -0xbc11: "mit" -0xbc12: "mip" -0xbc13: "mih" -0xbc14: "ba" -0xbc15: "bag" -0xbc16: "bagg" -0xbc17: "bags" -0xbc18: "ban" -0xbc19: "banj" -0xbc1a: "banh" -0xbc1b: "bad" -0xbc1c: "bal" -0xbc1d: "balg" -0xbc1e: "balm" -0xbc1f: "balb" -0xbc20: "bals" -0xbc21: "balt" -0xbc22: "balp" -0xbc23: "balh" -0xbc24: "bam" -0xbc25: "bab" -0xbc26: "babs" -0xbc27: "bas" -0xbc28: "bass" -0xbc29: "bang" -0xbc2a: "baj" -0xbc2b: "bac" -0xbc2c: "bak" -0xbc2d: "bat" -0xbc2e: "bap" -0xbc2f: "bah" -0xbc30: "bae" -0xbc31: "baeg" -0xbc32: "baegg" -0xbc33: "baegs" -0xbc34: "baen" -0xbc35: "baenj" -0xbc36: "baenh" -0xbc37: "baed" -0xbc38: "bael" -0xbc39: "baelg" -0xbc3a: "baelm" -0xbc3b: "baelb" -0xbc3c: "baels" -0xbc3d: "baelt" -0xbc3e: "baelp" -0xbc3f: "baelh" -0xbc40: "baem" -0xbc41: "baeb" -0xbc42: "baebs" -0xbc43: "baes" -0xbc44: "baess" -0xbc45: "baeng" -0xbc46: "baej" -0xbc47: "baec" -0xbc48: "baek" -0xbc49: "baet" -0xbc4a: "baep" -0xbc4b: "baeh" -0xbc4c: "bya" -0xbc4d: "byag" -0xbc4e: "byagg" -0xbc4f: "byags" -0xbc50: "byan" -0xbc51: "byanj" -0xbc52: "byanh" -0xbc53: "byad" -0xbc54: "byal" -0xbc55: "byalg" -0xbc56: "byalm" -0xbc57: "byalb" -0xbc58: "byals" -0xbc59: "byalt" -0xbc5a: "byalp" -0xbc5b: "byalh" -0xbc5c: "byam" -0xbc5d: "byab" -0xbc5e: "byabs" -0xbc5f: "byas" -0xbc60: "byass" -0xbc61: "byang" -0xbc62: "byaj" -0xbc63: "byac" -0xbc64: "byak" -0xbc65: "byat" -0xbc66: "byap" -0xbc67: "byah" -0xbc68: "byae" -0xbc69: "byaeg" -0xbc6a: "byaegg" -0xbc6b: "byaegs" -0xbc6c: "byaen" -0xbc6d: "byaenj" -0xbc6e: "byaenh" -0xbc6f: "byaed" -0xbc70: "byael" -0xbc71: "byaelg" -0xbc72: "byaelm" -0xbc73: "byaelb" -0xbc74: "byaels" -0xbc75: "byaelt" -0xbc76: "byaelp" -0xbc77: "byaelh" -0xbc78: "byaem" -0xbc79: "byaeb" -0xbc7a: "byaebs" -0xbc7b: "byaes" -0xbc7c: "byaess" -0xbc7d: "byaeng" -0xbc7e: "byaej" -0xbc7f: "byaec" -0xbc80: "byaek" -0xbc81: "byaet" -0xbc82: "byaep" -0xbc83: "byaeh" -0xbc84: "beo" -0xbc85: "beog" -0xbc86: "beogg" -0xbc87: "beogs" -0xbc88: "beon" -0xbc89: "beonj" -0xbc8a: "beonh" -0xbc8b: "beod" -0xbc8c: "beol" -0xbc8d: "beolg" -0xbc8e: "beolm" -0xbc8f: "beolb" -0xbc90: "beols" -0xbc91: "beolt" -0xbc92: "beolp" -0xbc93: "beolh" -0xbc94: "beom" -0xbc95: "beob" -0xbc96: "beobs" -0xbc97: "beos" -0xbc98: "beoss" -0xbc99: "beong" -0xbc9a: "beoj" -0xbc9b: "beoc" -0xbc9c: "beok" -0xbc9d: "beot" -0xbc9e: "beop" -0xbc9f: "beoh" -0xbca0: "be" -0xbca1: "beg" -0xbca2: "begg" -0xbca3: "begs" -0xbca4: "ben" -0xbca5: "benj" -0xbca6: "benh" -0xbca7: "bed" -0xbca8: "bel" -0xbca9: "belg" -0xbcaa: "belm" -0xbcab: "belb" -0xbcac: "bels" -0xbcad: "belt" -0xbcae: "belp" -0xbcaf: "belh" -0xbcb0: "bem" -0xbcb1: "beb" -0xbcb2: "bebs" -0xbcb3: "bes" -0xbcb4: "bess" -0xbcb5: "beng" -0xbcb6: "bej" -0xbcb7: "bec" -0xbcb8: "bek" -0xbcb9: "bet" -0xbcba: "bep" -0xbcbb: "beh" -0xbcbc: "byeo" -0xbcbd: "byeog" -0xbcbe: "byeogg" -0xbcbf: "byeogs" -0xbcc0: "byeon" -0xbcc1: "byeonj" -0xbcc2: "byeonh" -0xbcc3: "byeod" -0xbcc4: "byeol" -0xbcc5: "byeolg" -0xbcc6: "byeolm" -0xbcc7: "byeolb" -0xbcc8: "byeols" -0xbcc9: "byeolt" -0xbcca: "byeolp" -0xbccb: "byeolh" -0xbccc: "byeom" -0xbccd: "byeob" -0xbcce: "byeobs" -0xbccf: "byeos" -0xbcd0: "byeoss" -0xbcd1: "byeong" -0xbcd2: "byeoj" -0xbcd3: "byeoc" -0xbcd4: "byeok" -0xbcd5: "byeot" -0xbcd6: "byeop" -0xbcd7: "byeoh" -0xbcd8: "bye" -0xbcd9: "byeg" -0xbcda: "byegg" -0xbcdb: "byegs" -0xbcdc: "byen" -0xbcdd: "byenj" -0xbcde: "byenh" -0xbcdf: "byed" -0xbce0: "byel" -0xbce1: "byelg" -0xbce2: "byelm" -0xbce3: "byelb" -0xbce4: "byels" -0xbce5: "byelt" -0xbce6: "byelp" -0xbce7: "byelh" -0xbce8: "byem" -0xbce9: "byeb" -0xbcea: "byebs" -0xbceb: "byes" -0xbcec: "byess" -0xbced: "byeng" -0xbcee: "byej" -0xbcef: "byec" -0xbcf0: "byek" -0xbcf1: "byet" -0xbcf2: "byep" -0xbcf3: "byeh" -0xbcf4: "bo" -0xbcf5: "bog" -0xbcf6: "bogg" -0xbcf7: "bogs" -0xbcf8: "bon" -0xbcf9: "bonj" -0xbcfa: "bonh" -0xbcfb: "bod" -0xbcfc: "bol" -0xbcfd: "bolg" -0xbcfe: "bolm" -0xbcff: "bolb" -/* x0bd */ -0xbd00: "bols" -0xbd01: "bolt" -0xbd02: "bolp" -0xbd03: "bolh" -0xbd04: "bom" -0xbd05: "bob" -0xbd06: "bobs" -0xbd07: "bos" -0xbd08: "boss" -0xbd09: "bong" -0xbd0a: "boj" -0xbd0b: "boc" -0xbd0c: "bok" -0xbd0d: "bot" -0xbd0e: "bop" -0xbd0f: "boh" -0xbd10: "bwa" -0xbd11: "bwag" -0xbd12: "bwagg" -0xbd13: "bwags" -0xbd14: "bwan" -0xbd15: "bwanj" -0xbd16: "bwanh" -0xbd17: "bwad" -0xbd18: "bwal" -0xbd19: "bwalg" -0xbd1a: "bwalm" -0xbd1b: "bwalb" -0xbd1c: "bwals" -0xbd1d: "bwalt" -0xbd1e: "bwalp" -0xbd1f: "bwalh" -0xbd20: "bwam" -0xbd21: "bwab" -0xbd22: "bwabs" -0xbd23: "bwas" -0xbd24: "bwass" -0xbd25: "bwang" -0xbd26: "bwaj" -0xbd27: "bwac" -0xbd28: "bwak" -0xbd29: "bwat" -0xbd2a: "bwap" -0xbd2b: "bwah" -0xbd2c: "bwae" -0xbd2d: "bwaeg" -0xbd2e: "bwaegg" -0xbd2f: "bwaegs" -0xbd30: "bwaen" -0xbd31: "bwaenj" -0xbd32: "bwaenh" -0xbd33: "bwaed" -0xbd34: "bwael" -0xbd35: "bwaelg" -0xbd36: "bwaelm" -0xbd37: "bwaelb" -0xbd38: "bwaels" -0xbd39: "bwaelt" -0xbd3a: "bwaelp" -0xbd3b: "bwaelh" -0xbd3c: "bwaem" -0xbd3d: "bwaeb" -0xbd3e: "bwaebs" -0xbd3f: "bwaes" -0xbd40: "bwaess" -0xbd41: "bwaeng" -0xbd42: "bwaej" -0xbd43: "bwaec" -0xbd44: "bwaek" -0xbd45: "bwaet" -0xbd46: "bwaep" -0xbd47: "bwaeh" -0xbd48: "boe" -0xbd49: "boeg" -0xbd4a: "boegg" -0xbd4b: "boegs" -0xbd4c: "boen" -0xbd4d: "boenj" -0xbd4e: "boenh" -0xbd4f: "boed" -0xbd50: "boel" -0xbd51: "boelg" -0xbd52: "boelm" -0xbd53: "boelb" -0xbd54: "boels" -0xbd55: "boelt" -0xbd56: "boelp" -0xbd57: "boelh" -0xbd58: "boem" -0xbd59: "boeb" -0xbd5a: "boebs" -0xbd5b: "boes" -0xbd5c: "boess" -0xbd5d: "boeng" -0xbd5e: "boej" -0xbd5f: "boec" -0xbd60: "boek" -0xbd61: "boet" -0xbd62: "boep" -0xbd63: "boeh" -0xbd64: "byo" -0xbd65: "byog" -0xbd66: "byogg" -0xbd67: "byogs" -0xbd68: "byon" -0xbd69: "byonj" -0xbd6a: "byonh" -0xbd6b: "byod" -0xbd6c: "byol" -0xbd6d: "byolg" -0xbd6e: "byolm" -0xbd6f: "byolb" -0xbd70: "byols" -0xbd71: "byolt" -0xbd72: "byolp" -0xbd73: "byolh" -0xbd74: "byom" -0xbd75: "byob" -0xbd76: "byobs" -0xbd77: "byos" -0xbd78: "byoss" -0xbd79: "byong" -0xbd7a: "byoj" -0xbd7b: "byoc" -0xbd7c: "byok" -0xbd7d: "byot" -0xbd7e: "byop" -0xbd7f: "byoh" -0xbd80: "bu" -0xbd81: "bug" -0xbd82: "bugg" -0xbd83: "bugs" -0xbd84: "bun" -0xbd85: "bunj" -0xbd86: "bunh" -0xbd87: "bud" -0xbd88: "bul" -0xbd89: "bulg" -0xbd8a: "bulm" -0xbd8b: "bulb" -0xbd8c: "buls" -0xbd8d: "bult" -0xbd8e: "bulp" -0xbd8f: "bulh" -0xbd90: "bum" -0xbd91: "bub" -0xbd92: "bubs" -0xbd93: "bus" -0xbd94: "buss" -0xbd95: "bung" -0xbd96: "buj" -0xbd97: "buc" -0xbd98: "buk" -0xbd99: "but" -0xbd9a: "bup" -0xbd9b: "buh" -0xbd9c: "bweo" -0xbd9d: "bweog" -0xbd9e: "bweogg" -0xbd9f: "bweogs" -0xbda0: "bweon" -0xbda1: "bweonj" -0xbda2: "bweonh" -0xbda3: "bweod" -0xbda4: "bweol" -0xbda5: "bweolg" -0xbda6: "bweolm" -0xbda7: "bweolb" -0xbda8: "bweols" -0xbda9: "bweolt" -0xbdaa: "bweolp" -0xbdab: "bweolh" -0xbdac: "bweom" -0xbdad: "bweob" -0xbdae: "bweobs" -0xbdaf: "bweos" -0xbdb0: "bweoss" -0xbdb1: "bweong" -0xbdb2: "bweoj" -0xbdb3: "bweoc" -0xbdb4: "bweok" -0xbdb5: "bweot" -0xbdb6: "bweop" -0xbdb7: "bweoh" -0xbdb8: "bwe" -0xbdb9: "bweg" -0xbdba: "bwegg" -0xbdbb: "bwegs" -0xbdbc: "bwen" -0xbdbd: "bwenj" -0xbdbe: "bwenh" -0xbdbf: "bwed" -0xbdc0: "bwel" -0xbdc1: "bwelg" -0xbdc2: "bwelm" -0xbdc3: "bwelb" -0xbdc4: "bwels" -0xbdc5: "bwelt" -0xbdc6: "bwelp" -0xbdc7: "bwelh" -0xbdc8: "bwem" -0xbdc9: "bweb" -0xbdca: "bwebs" -0xbdcb: "bwes" -0xbdcc: "bwess" -0xbdcd: "bweng" -0xbdce: "bwej" -0xbdcf: "bwec" -0xbdd0: "bwek" -0xbdd1: "bwet" -0xbdd2: "bwep" -0xbdd3: "bweh" -0xbdd4: "bwi" -0xbdd5: "bwig" -0xbdd6: "bwigg" -0xbdd7: "bwigs" -0xbdd8: "bwin" -0xbdd9: "bwinj" -0xbdda: "bwinh" -0xbddb: "bwid" -0xbddc: "bwil" -0xbddd: "bwilg" -0xbdde: "bwilm" -0xbddf: "bwilb" -0xbde0: "bwils" -0xbde1: "bwilt" -0xbde2: "bwilp" -0xbde3: "bwilh" -0xbde4: "bwim" -0xbde5: "bwib" -0xbde6: "bwibs" -0xbde7: "bwis" -0xbde8: "bwiss" -0xbde9: "bwing" -0xbdea: "bwij" -0xbdeb: "bwic" -0xbdec: "bwik" -0xbded: "bwit" -0xbdee: "bwip" -0xbdef: "bwih" -0xbdf0: "byu" -0xbdf1: "byug" -0xbdf2: "byugg" -0xbdf3: "byugs" -0xbdf4: "byun" -0xbdf5: "byunj" -0xbdf6: "byunh" -0xbdf7: "byud" -0xbdf8: "byul" -0xbdf9: "byulg" -0xbdfa: "byulm" -0xbdfb: "byulb" -0xbdfc: "byuls" -0xbdfd: "byult" -0xbdfe: "byulp" -0xbdff: "byulh" -/* x0be */ -0xbe00: "byum" -0xbe01: "byub" -0xbe02: "byubs" -0xbe03: "byus" -0xbe04: "byuss" -0xbe05: "byung" -0xbe06: "byuj" -0xbe07: "byuc" -0xbe08: "byuk" -0xbe09: "byut" -0xbe0a: "byup" -0xbe0b: "byuh" -0xbe0c: "beu" -0xbe0d: "beug" -0xbe0e: "beugg" -0xbe0f: "beugs" -0xbe10: "beun" -0xbe11: "beunj" -0xbe12: "beunh" -0xbe13: "beud" -0xbe14: "beul" -0xbe15: "beulg" -0xbe16: "beulm" -0xbe17: "beulb" -0xbe18: "beuls" -0xbe19: "beult" -0xbe1a: "beulp" -0xbe1b: "beulh" -0xbe1c: "beum" -0xbe1d: "beub" -0xbe1e: "beubs" -0xbe1f: "beus" -0xbe20: "beuss" -0xbe21: "beung" -0xbe22: "beuj" -0xbe23: "beuc" -0xbe24: "beuk" -0xbe25: "beut" -0xbe26: "beup" -0xbe27: "beuh" -0xbe28: "byi" -0xbe29: "byig" -0xbe2a: "byigg" -0xbe2b: "byigs" -0xbe2c: "byin" -0xbe2d: "byinj" -0xbe2e: "byinh" -0xbe2f: "byid" -0xbe30: "byil" -0xbe31: "byilg" -0xbe32: "byilm" -0xbe33: "byilb" -0xbe34: "byils" -0xbe35: "byilt" -0xbe36: "byilp" -0xbe37: "byilh" -0xbe38: "byim" -0xbe39: "byib" -0xbe3a: "byibs" -0xbe3b: "byis" -0xbe3c: "byiss" -0xbe3d: "bying" -0xbe3e: "byij" -0xbe3f: "byic" -0xbe40: "byik" -0xbe41: "byit" -0xbe42: "byip" -0xbe43: "byih" -0xbe44: "bi" -0xbe45: "big" -0xbe46: "bigg" -0xbe47: "bigs" -0xbe48: "bin" -0xbe49: "binj" -0xbe4a: "binh" -0xbe4b: "bid" -0xbe4c: "bil" -0xbe4d: "bilg" -0xbe4e: "bilm" -0xbe4f: "bilb" -0xbe50: "bils" -0xbe51: "bilt" -0xbe52: "bilp" -0xbe53: "bilh" -0xbe54: "bim" -0xbe55: "bib" -0xbe56: "bibs" -0xbe57: "bis" -0xbe58: "biss" -0xbe59: "bing" -0xbe5a: "bij" -0xbe5b: "bic" -0xbe5c: "bik" -0xbe5d: "bit" -0xbe5e: "bip" -0xbe5f: "bih" -0xbe60: "bba" -0xbe61: "bbag" -0xbe62: "bbagg" -0xbe63: "bbags" -0xbe64: "bban" -0xbe65: "bbanj" -0xbe66: "bbanh" -0xbe67: "bbad" -0xbe68: "bbal" -0xbe69: "bbalg" -0xbe6a: "bbalm" -0xbe6b: "bbalb" -0xbe6c: "bbals" -0xbe6d: "bbalt" -0xbe6e: "bbalp" -0xbe6f: "bbalh" -0xbe70: "bbam" -0xbe71: "bbab" -0xbe72: "bbabs" -0xbe73: "bbas" -0xbe74: "bbass" -0xbe75: "bbang" -0xbe76: "bbaj" -0xbe77: "bbac" -0xbe78: "bbak" -0xbe79: "bbat" -0xbe7a: "bbap" -0xbe7b: "bbah" -0xbe7c: "bbae" -0xbe7d: "bbaeg" -0xbe7e: "bbaegg" -0xbe7f: "bbaegs" -0xbe80: "bbaen" -0xbe81: "bbaenj" -0xbe82: "bbaenh" -0xbe83: "bbaed" -0xbe84: "bbael" -0xbe85: "bbaelg" -0xbe86: "bbaelm" -0xbe87: "bbaelb" -0xbe88: "bbaels" -0xbe89: "bbaelt" -0xbe8a: "bbaelp" -0xbe8b: "bbaelh" -0xbe8c: "bbaem" -0xbe8d: "bbaeb" -0xbe8e: "bbaebs" -0xbe8f: "bbaes" -0xbe90: "bbaess" -0xbe91: "bbaeng" -0xbe92: "bbaej" -0xbe93: "bbaec" -0xbe94: "bbaek" -0xbe95: "bbaet" -0xbe96: "bbaep" -0xbe97: "bbaeh" -0xbe98: "bbya" -0xbe99: "bbyag" -0xbe9a: "bbyagg" -0xbe9b: "bbyags" -0xbe9c: "bbyan" -0xbe9d: "bbyanj" -0xbe9e: "bbyanh" -0xbe9f: "bbyad" -0xbea0: "bbyal" -0xbea1: "bbyalg" -0xbea2: "bbyalm" -0xbea3: "bbyalb" -0xbea4: "bbyals" -0xbea5: "bbyalt" -0xbea6: "bbyalp" -0xbea7: "bbyalh" -0xbea8: "bbyam" -0xbea9: "bbyab" -0xbeaa: "bbyabs" -0xbeab: "bbyas" -0xbeac: "bbyass" -0xbead: "bbyang" -0xbeae: "bbyaj" -0xbeaf: "bbyac" -0xbeb0: "bbyak" -0xbeb1: "bbyat" -0xbeb2: "bbyap" -0xbeb3: "bbyah" -0xbeb4: "bbyae" -0xbeb5: "bbyaeg" -0xbeb6: "bbyaegg" -0xbeb7: "bbyaegs" -0xbeb8: "bbyaen" -0xbeb9: "bbyaenj" -0xbeba: "bbyaenh" -0xbebb: "bbyaed" -0xbebc: "bbyael" -0xbebd: "bbyaelg" -0xbebe: "bbyaelm" -0xbebf: "bbyaelb" -0xbec0: "bbyaels" -0xbec1: "bbyaelt" -0xbec2: "bbyaelp" -0xbec3: "bbyaelh" -0xbec4: "bbyaem" -0xbec5: "bbyaeb" -0xbec6: "bbyaebs" -0xbec7: "bbyaes" -0xbec8: "bbyaess" -0xbec9: "bbyaeng" -0xbeca: "bbyaej" -0xbecb: "bbyaec" -0xbecc: "bbyaek" -0xbecd: "bbyaet" -0xbece: "bbyaep" -0xbecf: "bbyaeh" -0xbed0: "bbeo" -0xbed1: "bbeog" -0xbed2: "bbeogg" -0xbed3: "bbeogs" -0xbed4: "bbeon" -0xbed5: "bbeonj" -0xbed6: "bbeonh" -0xbed7: "bbeod" -0xbed8: "bbeol" -0xbed9: "bbeolg" -0xbeda: "bbeolm" -0xbedb: "bbeolb" -0xbedc: "bbeols" -0xbedd: "bbeolt" -0xbede: "bbeolp" -0xbedf: "bbeolh" -0xbee0: "bbeom" -0xbee1: "bbeob" -0xbee2: "bbeobs" -0xbee3: "bbeos" -0xbee4: "bbeoss" -0xbee5: "bbeong" -0xbee6: "bbeoj" -0xbee7: "bbeoc" -0xbee8: "bbeok" -0xbee9: "bbeot" -0xbeea: "bbeop" -0xbeeb: "bbeoh" -0xbeec: "bbe" -0xbeed: "bbeg" -0xbeee: "bbegg" -0xbeef: "bbegs" -0xbef0: "bben" -0xbef1: "bbenj" -0xbef2: "bbenh" -0xbef3: "bbed" -0xbef4: "bbel" -0xbef5: "bbelg" -0xbef6: "bbelm" -0xbef7: "bbelb" -0xbef8: "bbels" -0xbef9: "bbelt" -0xbefa: "bbelp" -0xbefb: "bbelh" -0xbefc: "bbem" -0xbefd: "bbeb" -0xbefe: "bbebs" -0xbeff: "bbes" -/* x0bf */ -0xbf00: "bbess" -0xbf01: "bbeng" -0xbf02: "bbej" -0xbf03: "bbec" -0xbf04: "bbek" -0xbf05: "bbet" -0xbf06: "bbep" -0xbf07: "bbeh" -0xbf08: "bbyeo" -0xbf09: "bbyeog" -0xbf0a: "bbyeogg" -0xbf0b: "bbyeogs" -0xbf0c: "bbyeon" -0xbf0d: "bbyeonj" -0xbf0e: "bbyeonh" -0xbf0f: "bbyeod" -0xbf10: "bbyeol" -0xbf11: "bbyeolg" -0xbf12: "bbyeolm" -0xbf13: "bbyeolb" -0xbf14: "bbyeols" -0xbf15: "bbyeolt" -0xbf16: "bbyeolp" -0xbf17: "bbyeolh" -0xbf18: "bbyeom" -0xbf19: "bbyeob" -0xbf1a: "bbyeobs" -0xbf1b: "bbyeos" -0xbf1c: "bbyeoss" -0xbf1d: "bbyeong" -0xbf1e: "bbyeoj" -0xbf1f: "bbyeoc" -0xbf20: "bbyeok" -0xbf21: "bbyeot" -0xbf22: "bbyeop" -0xbf23: "bbyeoh" -0xbf24: "bbye" -0xbf25: "bbyeg" -0xbf26: "bbyegg" -0xbf27: "bbyegs" -0xbf28: "bbyen" -0xbf29: "bbyenj" -0xbf2a: "bbyenh" -0xbf2b: "bbyed" -0xbf2c: "bbyel" -0xbf2d: "bbyelg" -0xbf2e: "bbyelm" -0xbf2f: "bbyelb" -0xbf30: "bbyels" -0xbf31: "bbyelt" -0xbf32: "bbyelp" -0xbf33: "bbyelh" -0xbf34: "bbyem" -0xbf35: "bbyeb" -0xbf36: "bbyebs" -0xbf37: "bbyes" -0xbf38: "bbyess" -0xbf39: "bbyeng" -0xbf3a: "bbyej" -0xbf3b: "bbyec" -0xbf3c: "bbyek" -0xbf3d: "bbyet" -0xbf3e: "bbyep" -0xbf3f: "bbyeh" -0xbf40: "bbo" -0xbf41: "bbog" -0xbf42: "bbogg" -0xbf43: "bbogs" -0xbf44: "bbon" -0xbf45: "bbonj" -0xbf46: "bbonh" -0xbf47: "bbod" -0xbf48: "bbol" -0xbf49: "bbolg" -0xbf4a: "bbolm" -0xbf4b: "bbolb" -0xbf4c: "bbols" -0xbf4d: "bbolt" -0xbf4e: "bbolp" -0xbf4f: "bbolh" -0xbf50: "bbom" -0xbf51: "bbob" -0xbf52: "bbobs" -0xbf53: "bbos" -0xbf54: "bboss" -0xbf55: "bbong" -0xbf56: "bboj" -0xbf57: "bboc" -0xbf58: "bbok" -0xbf59: "bbot" -0xbf5a: "bbop" -0xbf5b: "bboh" -0xbf5c: "bbwa" -0xbf5d: "bbwag" -0xbf5e: "bbwagg" -0xbf5f: "bbwags" -0xbf60: "bbwan" -0xbf61: "bbwanj" -0xbf62: "bbwanh" -0xbf63: "bbwad" -0xbf64: "bbwal" -0xbf65: "bbwalg" -0xbf66: "bbwalm" -0xbf67: "bbwalb" -0xbf68: "bbwals" -0xbf69: "bbwalt" -0xbf6a: "bbwalp" -0xbf6b: "bbwalh" -0xbf6c: "bbwam" -0xbf6d: "bbwab" -0xbf6e: "bbwabs" -0xbf6f: "bbwas" -0xbf70: "bbwass" -0xbf71: "bbwang" -0xbf72: "bbwaj" -0xbf73: "bbwac" -0xbf74: "bbwak" -0xbf75: "bbwat" -0xbf76: "bbwap" -0xbf77: "bbwah" -0xbf78: "bbwae" -0xbf79: "bbwaeg" -0xbf7a: "bbwaegg" -0xbf7b: "bbwaegs" -0xbf7c: "bbwaen" -0xbf7d: "bbwaenj" -0xbf7e: "bbwaenh" -0xbf7f: "bbwaed" -0xbf80: "bbwael" -0xbf81: "bbwaelg" -0xbf82: "bbwaelm" -0xbf83: "bbwaelb" -0xbf84: "bbwaels" -0xbf85: "bbwaelt" -0xbf86: "bbwaelp" -0xbf87: "bbwaelh" -0xbf88: "bbwaem" -0xbf89: "bbwaeb" -0xbf8a: "bbwaebs" -0xbf8b: "bbwaes" -0xbf8c: "bbwaess" -0xbf8d: "bbwaeng" -0xbf8e: "bbwaej" -0xbf8f: "bbwaec" -0xbf90: "bbwaek" -0xbf91: "bbwaet" -0xbf92: "bbwaep" -0xbf93: "bbwaeh" -0xbf94: "bboe" -0xbf95: "bboeg" -0xbf96: "bboegg" -0xbf97: "bboegs" -0xbf98: "bboen" -0xbf99: "bboenj" -0xbf9a: "bboenh" -0xbf9b: "bboed" -0xbf9c: "bboel" -0xbf9d: "bboelg" -0xbf9e: "bboelm" -0xbf9f: "bboelb" -0xbfa0: "bboels" -0xbfa1: "bboelt" -0xbfa2: "bboelp" -0xbfa3: "bboelh" -0xbfa4: "bboem" -0xbfa5: "bboeb" -0xbfa6: "bboebs" -0xbfa7: "bboes" -0xbfa8: "bboess" -0xbfa9: "bboeng" -0xbfaa: "bboej" -0xbfab: "bboec" -0xbfac: "bboek" -0xbfad: "bboet" -0xbfae: "bboep" -0xbfaf: "bboeh" -0xbfb0: "bbyo" -0xbfb1: "bbyog" -0xbfb2: "bbyogg" -0xbfb3: "bbyogs" -0xbfb4: "bbyon" -0xbfb5: "bbyonj" -0xbfb6: "bbyonh" -0xbfb7: "bbyod" -0xbfb8: "bbyol" -0xbfb9: "bbyolg" -0xbfba: "bbyolm" -0xbfbb: "bbyolb" -0xbfbc: "bbyols" -0xbfbd: "bbyolt" -0xbfbe: "bbyolp" -0xbfbf: "bbyolh" -0xbfc0: "bbyom" -0xbfc1: "bbyob" -0xbfc2: "bbyobs" -0xbfc3: "bbyos" -0xbfc4: "bbyoss" -0xbfc5: "bbyong" -0xbfc6: "bbyoj" -0xbfc7: "bbyoc" -0xbfc8: "bbyok" -0xbfc9: "bbyot" -0xbfca: "bbyop" -0xbfcb: "bbyoh" -0xbfcc: "bbu" -0xbfcd: "bbug" -0xbfce: "bbugg" -0xbfcf: "bbugs" -0xbfd0: "bbun" -0xbfd1: "bbunj" -0xbfd2: "bbunh" -0xbfd3: "bbud" -0xbfd4: "bbul" -0xbfd5: "bbulg" -0xbfd6: "bbulm" -0xbfd7: "bbulb" -0xbfd8: "bbuls" -0xbfd9: "bbult" -0xbfda: "bbulp" -0xbfdb: "bbulh" -0xbfdc: "bbum" -0xbfdd: "bbub" -0xbfde: "bbubs" -0xbfdf: "bbus" -0xbfe0: "bbuss" -0xbfe1: "bbung" -0xbfe2: "bbuj" -0xbfe3: "bbuc" -0xbfe4: "bbuk" -0xbfe5: "bbut" -0xbfe6: "bbup" -0xbfe7: "bbuh" -0xbfe8: "bbweo" -0xbfe9: "bbweog" -0xbfea: "bbweogg" -0xbfeb: "bbweogs" -0xbfec: "bbweon" -0xbfed: "bbweonj" -0xbfee: "bbweonh" -0xbfef: "bbweod" -0xbff0: "bbweol" -0xbff1: "bbweolg" -0xbff2: "bbweolm" -0xbff3: "bbweolb" -0xbff4: "bbweols" -0xbff5: "bbweolt" -0xbff6: "bbweolp" -0xbff7: "bbweolh" -0xbff8: "bbweom" -0xbff9: "bbweob" -0xbffa: "bbweobs" -0xbffb: "bbweos" -0xbffc: "bbweoss" -0xbffd: "bbweong" -0xbffe: "bbweoj" -0xbfff: "bbweoc" -/* x0c0 */ -0xc000: "bbweok" -0xc001: "bbweot" -0xc002: "bbweop" -0xc003: "bbweoh" -0xc004: "bbwe" -0xc005: "bbweg" -0xc006: "bbwegg" -0xc007: "bbwegs" -0xc008: "bbwen" -0xc009: "bbwenj" -0xc00a: "bbwenh" -0xc00b: "bbwed" -0xc00c: "bbwel" -0xc00d: "bbwelg" -0xc00e: "bbwelm" -0xc00f: "bbwelb" -0xc010: "bbwels" -0xc011: "bbwelt" -0xc012: "bbwelp" -0xc013: "bbwelh" -0xc014: "bbwem" -0xc015: "bbweb" -0xc016: "bbwebs" -0xc017: "bbwes" -0xc018: "bbwess" -0xc019: "bbweng" -0xc01a: "bbwej" -0xc01b: "bbwec" -0xc01c: "bbwek" -0xc01d: "bbwet" -0xc01e: "bbwep" -0xc01f: "bbweh" -0xc020: "bbwi" -0xc021: "bbwig" -0xc022: "bbwigg" -0xc023: "bbwigs" -0xc024: "bbwin" -0xc025: "bbwinj" -0xc026: "bbwinh" -0xc027: "bbwid" -0xc028: "bbwil" -0xc029: "bbwilg" -0xc02a: "bbwilm" -0xc02b: "bbwilb" -0xc02c: "bbwils" -0xc02d: "bbwilt" -0xc02e: "bbwilp" -0xc02f: "bbwilh" -0xc030: "bbwim" -0xc031: "bbwib" -0xc032: "bbwibs" -0xc033: "bbwis" -0xc034: "bbwiss" -0xc035: "bbwing" -0xc036: "bbwij" -0xc037: "bbwic" -0xc038: "bbwik" -0xc039: "bbwit" -0xc03a: "bbwip" -0xc03b: "bbwih" -0xc03c: "bbyu" -0xc03d: "bbyug" -0xc03e: "bbyugg" -0xc03f: "bbyugs" -0xc040: "bbyun" -0xc041: "bbyunj" -0xc042: "bbyunh" -0xc043: "bbyud" -0xc044: "bbyul" -0xc045: "bbyulg" -0xc046: "bbyulm" -0xc047: "bbyulb" -0xc048: "bbyuls" -0xc049: "bbyult" -0xc04a: "bbyulp" -0xc04b: "bbyulh" -0xc04c: "bbyum" -0xc04d: "bbyub" -0xc04e: "bbyubs" -0xc04f: "bbyus" -0xc050: "bbyuss" -0xc051: "bbyung" -0xc052: "bbyuj" -0xc053: "bbyuc" -0xc054: "bbyuk" -0xc055: "bbyut" -0xc056: "bbyup" -0xc057: "bbyuh" -0xc058: "bbeu" -0xc059: "bbeug" -0xc05a: "bbeugg" -0xc05b: "bbeugs" -0xc05c: "bbeun" -0xc05d: "bbeunj" -0xc05e: "bbeunh" -0xc05f: "bbeud" -0xc060: "bbeul" -0xc061: "bbeulg" -0xc062: "bbeulm" -0xc063: "bbeulb" -0xc064: "bbeuls" -0xc065: "bbeult" -0xc066: "bbeulp" -0xc067: "bbeulh" -0xc068: "bbeum" -0xc069: "bbeub" -0xc06a: "bbeubs" -0xc06b: "bbeus" -0xc06c: "bbeuss" -0xc06d: "bbeung" -0xc06e: "bbeuj" -0xc06f: "bbeuc" -0xc070: "bbeuk" -0xc071: "bbeut" -0xc072: "bbeup" -0xc073: "bbeuh" -0xc074: "bbyi" -0xc075: "bbyig" -0xc076: "bbyigg" -0xc077: "bbyigs" -0xc078: "bbyin" -0xc079: "bbyinj" -0xc07a: "bbyinh" -0xc07b: "bbyid" -0xc07c: "bbyil" -0xc07d: "bbyilg" -0xc07e: "bbyilm" -0xc07f: "bbyilb" -0xc080: "bbyils" -0xc081: "bbyilt" -0xc082: "bbyilp" -0xc083: "bbyilh" -0xc084: "bbyim" -0xc085: "bbyib" -0xc086: "bbyibs" -0xc087: "bbyis" -0xc088: "bbyiss" -0xc089: "bbying" -0xc08a: "bbyij" -0xc08b: "bbyic" -0xc08c: "bbyik" -0xc08d: "bbyit" -0xc08e: "bbyip" -0xc08f: "bbyih" -0xc090: "bbi" -0xc091: "bbig" -0xc092: "bbigg" -0xc093: "bbigs" -0xc094: "bbin" -0xc095: "bbinj" -0xc096: "bbinh" -0xc097: "bbid" -0xc098: "bbil" -0xc099: "bbilg" -0xc09a: "bbilm" -0xc09b: "bbilb" -0xc09c: "bbils" -0xc09d: "bbilt" -0xc09e: "bbilp" -0xc09f: "bbilh" -0xc0a0: "bbim" -0xc0a1: "bbib" -0xc0a2: "bbibs" -0xc0a3: "bbis" -0xc0a4: "bbiss" -0xc0a5: "bbing" -0xc0a6: "bbij" -0xc0a7: "bbic" -0xc0a8: "bbik" -0xc0a9: "bbit" -0xc0aa: "bbip" -0xc0ab: "bbih" -0xc0ac: "sa" -0xc0ad: "sag" -0xc0ae: "sagg" -0xc0af: "sags" -0xc0b0: "san" -0xc0b1: "sanj" -0xc0b2: "sanh" -0xc0b3: "sad" -0xc0b4: "sal" -0xc0b5: "salg" -0xc0b6: "salm" -0xc0b7: "salb" -0xc0b8: "sals" -0xc0b9: "salt" -0xc0ba: "salp" -0xc0bb: "salh" -0xc0bc: "sam" -0xc0bd: "sab" -0xc0be: "sabs" -0xc0bf: "sas" -0xc0c0: "sass" -0xc0c1: "sang" -0xc0c2: "saj" -0xc0c3: "sac" -0xc0c4: "sak" -0xc0c5: "sat" -0xc0c6: "sap" -0xc0c7: "sah" -0xc0c8: "sae" -0xc0c9: "saeg" -0xc0ca: "saegg" -0xc0cb: "saegs" -0xc0cc: "saen" -0xc0cd: "saenj" -0xc0ce: "saenh" -0xc0cf: "saed" -0xc0d0: "sael" -0xc0d1: "saelg" -0xc0d2: "saelm" -0xc0d3: "saelb" -0xc0d4: "saels" -0xc0d5: "saelt" -0xc0d6: "saelp" -0xc0d7: "saelh" -0xc0d8: "saem" -0xc0d9: "saeb" -0xc0da: "saebs" -0xc0db: "saes" -0xc0dc: "saess" -0xc0dd: "saeng" -0xc0de: "saej" -0xc0df: "saec" -0xc0e0: "saek" -0xc0e1: "saet" -0xc0e2: "saep" -0xc0e3: "saeh" -0xc0e4: "sya" -0xc0e5: "syag" -0xc0e6: "syagg" -0xc0e7: "syags" -0xc0e8: "syan" -0xc0e9: "syanj" -0xc0ea: "syanh" -0xc0eb: "syad" -0xc0ec: "syal" -0xc0ed: "syalg" -0xc0ee: "syalm" -0xc0ef: "syalb" -0xc0f0: "syals" -0xc0f1: "syalt" -0xc0f2: "syalp" -0xc0f3: "syalh" -0xc0f4: "syam" -0xc0f5: "syab" -0xc0f6: "syabs" -0xc0f7: "syas" -0xc0f8: "syass" -0xc0f9: "syang" -0xc0fa: "syaj" -0xc0fb: "syac" -0xc0fc: "syak" -0xc0fd: "syat" -0xc0fe: "syap" -0xc0ff: "syah" -/* x0c1 */ -0xc100: "syae" -0xc101: "syaeg" -0xc102: "syaegg" -0xc103: "syaegs" -0xc104: "syaen" -0xc105: "syaenj" -0xc106: "syaenh" -0xc107: "syaed" -0xc108: "syael" -0xc109: "syaelg" -0xc10a: "syaelm" -0xc10b: "syaelb" -0xc10c: "syaels" -0xc10d: "syaelt" -0xc10e: "syaelp" -0xc10f: "syaelh" -0xc110: "syaem" -0xc111: "syaeb" -0xc112: "syaebs" -0xc113: "syaes" -0xc114: "syaess" -0xc115: "syaeng" -0xc116: "syaej" -0xc117: "syaec" -0xc118: "syaek" -0xc119: "syaet" -0xc11a: "syaep" -0xc11b: "syaeh" -0xc11c: "seo" -0xc11d: "seog" -0xc11e: "seogg" -0xc11f: "seogs" -0xc120: "seon" -0xc121: "seonj" -0xc122: "seonh" -0xc123: "seod" -0xc124: "seol" -0xc125: "seolg" -0xc126: "seolm" -0xc127: "seolb" -0xc128: "seols" -0xc129: "seolt" -0xc12a: "seolp" -0xc12b: "seolh" -0xc12c: "seom" -0xc12d: "seob" -0xc12e: "seobs" -0xc12f: "seos" -0xc130: "seoss" -0xc131: "seong" -0xc132: "seoj" -0xc133: "seoc" -0xc134: "seok" -0xc135: "seot" -0xc136: "seop" -0xc137: "seoh" -0xc138: "se" -0xc139: "seg" -0xc13a: "segg" -0xc13b: "segs" -0xc13c: "sen" -0xc13d: "senj" -0xc13e: "senh" -0xc13f: "sed" -0xc140: "sel" -0xc141: "selg" -0xc142: "selm" -0xc143: "selb" -0xc144: "sels" -0xc145: "selt" -0xc146: "selp" -0xc147: "selh" -0xc148: "sem" -0xc149: "seb" -0xc14a: "sebs" -0xc14b: "ses" -0xc14c: "sess" -0xc14d: "seng" -0xc14e: "sej" -0xc14f: "sec" -0xc150: "sek" -0xc151: "set" -0xc152: "sep" -0xc153: "seh" -0xc154: "syeo" -0xc155: "syeog" -0xc156: "syeogg" -0xc157: "syeogs" -0xc158: "syeon" -0xc159: "syeonj" -0xc15a: "syeonh" -0xc15b: "syeod" -0xc15c: "syeol" -0xc15d: "syeolg" -0xc15e: "syeolm" -0xc15f: "syeolb" -0xc160: "syeols" -0xc161: "syeolt" -0xc162: "syeolp" -0xc163: "syeolh" -0xc164: "syeom" -0xc165: "syeob" -0xc166: "syeobs" -0xc167: "syeos" -0xc168: "syeoss" -0xc169: "syeong" -0xc16a: "syeoj" -0xc16b: "syeoc" -0xc16c: "syeok" -0xc16d: "syeot" -0xc16e: "syeop" -0xc16f: "syeoh" -0xc170: "sye" -0xc171: "syeg" -0xc172: "syegg" -0xc173: "syegs" -0xc174: "syen" -0xc175: "syenj" -0xc176: "syenh" -0xc177: "syed" -0xc178: "syel" -0xc179: "syelg" -0xc17a: "syelm" -0xc17b: "syelb" -0xc17c: "syels" -0xc17d: "syelt" -0xc17e: "syelp" -0xc17f: "syelh" -0xc180: "syem" -0xc181: "syeb" -0xc182: "syebs" -0xc183: "syes" -0xc184: "syess" -0xc185: "syeng" -0xc186: "syej" -0xc187: "syec" -0xc188: "syek" -0xc189: "syet" -0xc18a: "syep" -0xc18b: "syeh" -0xc18c: "so" -0xc18d: "sog" -0xc18e: "sogg" -0xc18f: "sogs" -0xc190: "son" -0xc191: "sonj" -0xc192: "sonh" -0xc193: "sod" -0xc194: "sol" -0xc195: "solg" -0xc196: "solm" -0xc197: "solb" -0xc198: "sols" -0xc199: "solt" -0xc19a: "solp" -0xc19b: "solh" -0xc19c: "som" -0xc19d: "sob" -0xc19e: "sobs" -0xc19f: "sos" -0xc1a0: "soss" -0xc1a1: "song" -0xc1a2: "soj" -0xc1a3: "soc" -0xc1a4: "sok" -0xc1a5: "sot" -0xc1a6: "sop" -0xc1a7: "soh" -0xc1a8: "swa" -0xc1a9: "swag" -0xc1aa: "swagg" -0xc1ab: "swags" -0xc1ac: "swan" -0xc1ad: "swanj" -0xc1ae: "swanh" -0xc1af: "swad" -0xc1b0: "swal" -0xc1b1: "swalg" -0xc1b2: "swalm" -0xc1b3: "swalb" -0xc1b4: "swals" -0xc1b5: "swalt" -0xc1b6: "swalp" -0xc1b7: "swalh" -0xc1b8: "swam" -0xc1b9: "swab" -0xc1ba: "swabs" -0xc1bb: "swas" -0xc1bc: "swass" -0xc1bd: "swang" -0xc1be: "swaj" -0xc1bf: "swac" -0xc1c0: "swak" -0xc1c1: "swat" -0xc1c2: "swap" -0xc1c3: "swah" -0xc1c4: "swae" -0xc1c5: "swaeg" -0xc1c6: "swaegg" -0xc1c7: "swaegs" -0xc1c8: "swaen" -0xc1c9: "swaenj" -0xc1ca: "swaenh" -0xc1cb: "swaed" -0xc1cc: "swael" -0xc1cd: "swaelg" -0xc1ce: "swaelm" -0xc1cf: "swaelb" -0xc1d0: "swaels" -0xc1d1: "swaelt" -0xc1d2: "swaelp" -0xc1d3: "swaelh" -0xc1d4: "swaem" -0xc1d5: "swaeb" -0xc1d6: "swaebs" -0xc1d7: "swaes" -0xc1d8: "swaess" -0xc1d9: "swaeng" -0xc1da: "swaej" -0xc1db: "swaec" -0xc1dc: "swaek" -0xc1dd: "swaet" -0xc1de: "swaep" -0xc1df: "swaeh" -0xc1e0: "soe" -0xc1e1: "soeg" -0xc1e2: "soegg" -0xc1e3: "soegs" -0xc1e4: "soen" -0xc1e5: "soenj" -0xc1e6: "soenh" -0xc1e7: "soed" -0xc1e8: "soel" -0xc1e9: "soelg" -0xc1ea: "soelm" -0xc1eb: "soelb" -0xc1ec: "soels" -0xc1ed: "soelt" -0xc1ee: "soelp" -0xc1ef: "soelh" -0xc1f0: "soem" -0xc1f1: "soeb" -0xc1f2: "soebs" -0xc1f3: "soes" -0xc1f4: "soess" -0xc1f5: "soeng" -0xc1f6: "soej" -0xc1f7: "soec" -0xc1f8: "soek" -0xc1f9: "soet" -0xc1fa: "soep" -0xc1fb: "soeh" -0xc1fc: "syo" -0xc1fd: "syog" -0xc1fe: "syogg" -0xc1ff: "syogs" -/* x0c2 */ -0xc200: "syon" -0xc201: "syonj" -0xc202: "syonh" -0xc203: "syod" -0xc204: "syol" -0xc205: "syolg" -0xc206: "syolm" -0xc207: "syolb" -0xc208: "syols" -0xc209: "syolt" -0xc20a: "syolp" -0xc20b: "syolh" -0xc20c: "syom" -0xc20d: "syob" -0xc20e: "syobs" -0xc20f: "syos" -0xc210: "syoss" -0xc211: "syong" -0xc212: "syoj" -0xc213: "syoc" -0xc214: "syok" -0xc215: "syot" -0xc216: "syop" -0xc217: "syoh" -0xc218: "su" -0xc219: "sug" -0xc21a: "sugg" -0xc21b: "sugs" -0xc21c: "sun" -0xc21d: "sunj" -0xc21e: "sunh" -0xc21f: "sud" -0xc220: "sul" -0xc221: "sulg" -0xc222: "sulm" -0xc223: "sulb" -0xc224: "suls" -0xc225: "sult" -0xc226: "sulp" -0xc227: "sulh" -0xc228: "sum" -0xc229: "sub" -0xc22a: "subs" -0xc22b: "sus" -0xc22c: "suss" -0xc22d: "sung" -0xc22e: "suj" -0xc22f: "suc" -0xc230: "suk" -0xc231: "sut" -0xc232: "sup" -0xc233: "suh" -0xc234: "sweo" -0xc235: "sweog" -0xc236: "sweogg" -0xc237: "sweogs" -0xc238: "sweon" -0xc239: "sweonj" -0xc23a: "sweonh" -0xc23b: "sweod" -0xc23c: "sweol" -0xc23d: "sweolg" -0xc23e: "sweolm" -0xc23f: "sweolb" -0xc240: "sweols" -0xc241: "sweolt" -0xc242: "sweolp" -0xc243: "sweolh" -0xc244: "sweom" -0xc245: "sweob" -0xc246: "sweobs" -0xc247: "sweos" -0xc248: "sweoss" -0xc249: "sweong" -0xc24a: "sweoj" -0xc24b: "sweoc" -0xc24c: "sweok" -0xc24d: "sweot" -0xc24e: "sweop" -0xc24f: "sweoh" -0xc250: "swe" -0xc251: "sweg" -0xc252: "swegg" -0xc253: "swegs" -0xc254: "swen" -0xc255: "swenj" -0xc256: "swenh" -0xc257: "swed" -0xc258: "swel" -0xc259: "swelg" -0xc25a: "swelm" -0xc25b: "swelb" -0xc25c: "swels" -0xc25d: "swelt" -0xc25e: "swelp" -0xc25f: "swelh" -0xc260: "swem" -0xc261: "sweb" -0xc262: "swebs" -0xc263: "swes" -0xc264: "swess" -0xc265: "sweng" -0xc266: "swej" -0xc267: "swec" -0xc268: "swek" -0xc269: "swet" -0xc26a: "swep" -0xc26b: "sweh" -0xc26c: "swi" -0xc26d: "swig" -0xc26e: "swigg" -0xc26f: "swigs" -0xc270: "swin" -0xc271: "swinj" -0xc272: "swinh" -0xc273: "swid" -0xc274: "swil" -0xc275: "swilg" -0xc276: "swilm" -0xc277: "swilb" -0xc278: "swils" -0xc279: "swilt" -0xc27a: "swilp" -0xc27b: "swilh" -0xc27c: "swim" -0xc27d: "swib" -0xc27e: "swibs" -0xc27f: "swis" -0xc280: "swiss" -0xc281: "swing" -0xc282: "swij" -0xc283: "swic" -0xc284: "swik" -0xc285: "swit" -0xc286: "swip" -0xc287: "swih" -0xc288: "syu" -0xc289: "syug" -0xc28a: "syugg" -0xc28b: "syugs" -0xc28c: "syun" -0xc28d: "syunj" -0xc28e: "syunh" -0xc28f: "syud" -0xc290: "syul" -0xc291: "syulg" -0xc292: "syulm" -0xc293: "syulb" -0xc294: "syuls" -0xc295: "syult" -0xc296: "syulp" -0xc297: "syulh" -0xc298: "syum" -0xc299: "syub" -0xc29a: "syubs" -0xc29b: "syus" -0xc29c: "syuss" -0xc29d: "syung" -0xc29e: "syuj" -0xc29f: "syuc" -0xc2a0: "syuk" -0xc2a1: "syut" -0xc2a2: "syup" -0xc2a3: "syuh" -0xc2a4: "seu" -0xc2a5: "seug" -0xc2a6: "seugg" -0xc2a7: "seugs" -0xc2a8: "seun" -0xc2a9: "seunj" -0xc2aa: "seunh" -0xc2ab: "seud" -0xc2ac: "seul" -0xc2ad: "seulg" -0xc2ae: "seulm" -0xc2af: "seulb" -0xc2b0: "seuls" -0xc2b1: "seult" -0xc2b2: "seulp" -0xc2b3: "seulh" -0xc2b4: "seum" -0xc2b5: "seub" -0xc2b6: "seubs" -0xc2b7: "seus" -0xc2b8: "seuss" -0xc2b9: "seung" -0xc2ba: "seuj" -0xc2bb: "seuc" -0xc2bc: "seuk" -0xc2bd: "seut" -0xc2be: "seup" -0xc2bf: "seuh" -0xc2c0: "syi" -0xc2c1: "syig" -0xc2c2: "syigg" -0xc2c3: "syigs" -0xc2c4: "syin" -0xc2c5: "syinj" -0xc2c6: "syinh" -0xc2c7: "syid" -0xc2c8: "syil" -0xc2c9: "syilg" -0xc2ca: "syilm" -0xc2cb: "syilb" -0xc2cc: "syils" -0xc2cd: "syilt" -0xc2ce: "syilp" -0xc2cf: "syilh" -0xc2d0: "syim" -0xc2d1: "syib" -0xc2d2: "syibs" -0xc2d3: "syis" -0xc2d4: "syiss" -0xc2d5: "sying" -0xc2d6: "syij" -0xc2d7: "syic" -0xc2d8: "syik" -0xc2d9: "syit" -0xc2da: "syip" -0xc2db: "syih" -0xc2dc: "si" -0xc2dd: "sig" -0xc2de: "sigg" -0xc2df: "sigs" -0xc2e0: "sin" -0xc2e1: "sinj" -0xc2e2: "sinh" -0xc2e3: "sid" -0xc2e4: "sil" -0xc2e5: "silg" -0xc2e6: "silm" -0xc2e7: "silb" -0xc2e8: "sils" -0xc2e9: "silt" -0xc2ea: "silp" -0xc2eb: "silh" -0xc2ec: "sim" -0xc2ed: "sib" -0xc2ee: "sibs" -0xc2ef: "sis" -0xc2f0: "siss" -0xc2f1: "sing" -0xc2f2: "sij" -0xc2f3: "sic" -0xc2f4: "sik" -0xc2f5: "sit" -0xc2f6: "sip" -0xc2f7: "sih" -0xc2f8: "ssa" -0xc2f9: "ssag" -0xc2fa: "ssagg" -0xc2fb: "ssags" -0xc2fc: "ssan" -0xc2fd: "ssanj" -0xc2fe: "ssanh" -0xc2ff: "ssad" -/* x0c3 */ -0xc300: "ssal" -0xc301: "ssalg" -0xc302: "ssalm" -0xc303: "ssalb" -0xc304: "ssals" -0xc305: "ssalt" -0xc306: "ssalp" -0xc307: "ssalh" -0xc308: "ssam" -0xc309: "ssab" -0xc30a: "ssabs" -0xc30b: "ssas" -0xc30c: "ssass" -0xc30d: "ssang" -0xc30e: "ssaj" -0xc30f: "ssac" -0xc310: "ssak" -0xc311: "ssat" -0xc312: "ssap" -0xc313: "ssah" -0xc314: "ssae" -0xc315: "ssaeg" -0xc316: "ssaegg" -0xc317: "ssaegs" -0xc318: "ssaen" -0xc319: "ssaenj" -0xc31a: "ssaenh" -0xc31b: "ssaed" -0xc31c: "ssael" -0xc31d: "ssaelg" -0xc31e: "ssaelm" -0xc31f: "ssaelb" -0xc320: "ssaels" -0xc321: "ssaelt" -0xc322: "ssaelp" -0xc323: "ssaelh" -0xc324: "ssaem" -0xc325: "ssaeb" -0xc326: "ssaebs" -0xc327: "ssaes" -0xc328: "ssaess" -0xc329: "ssaeng" -0xc32a: "ssaej" -0xc32b: "ssaec" -0xc32c: "ssaek" -0xc32d: "ssaet" -0xc32e: "ssaep" -0xc32f: "ssaeh" -0xc330: "ssya" -0xc331: "ssyag" -0xc332: "ssyagg" -0xc333: "ssyags" -0xc334: "ssyan" -0xc335: "ssyanj" -0xc336: "ssyanh" -0xc337: "ssyad" -0xc338: "ssyal" -0xc339: "ssyalg" -0xc33a: "ssyalm" -0xc33b: "ssyalb" -0xc33c: "ssyals" -0xc33d: "ssyalt" -0xc33e: "ssyalp" -0xc33f: "ssyalh" -0xc340: "ssyam" -0xc341: "ssyab" -0xc342: "ssyabs" -0xc343: "ssyas" -0xc344: "ssyass" -0xc345: "ssyang" -0xc346: "ssyaj" -0xc347: "ssyac" -0xc348: "ssyak" -0xc349: "ssyat" -0xc34a: "ssyap" -0xc34b: "ssyah" -0xc34c: "ssyae" -0xc34d: "ssyaeg" -0xc34e: "ssyaegg" -0xc34f: "ssyaegs" -0xc350: "ssyaen" -0xc351: "ssyaenj" -0xc352: "ssyaenh" -0xc353: "ssyaed" -0xc354: "ssyael" -0xc355: "ssyaelg" -0xc356: "ssyaelm" -0xc357: "ssyaelb" -0xc358: "ssyaels" -0xc359: "ssyaelt" -0xc35a: "ssyaelp" -0xc35b: "ssyaelh" -0xc35c: "ssyaem" -0xc35d: "ssyaeb" -0xc35e: "ssyaebs" -0xc35f: "ssyaes" -0xc360: "ssyaess" -0xc361: "ssyaeng" -0xc362: "ssyaej" -0xc363: "ssyaec" -0xc364: "ssyaek" -0xc365: "ssyaet" -0xc366: "ssyaep" -0xc367: "ssyaeh" -0xc368: "sseo" -0xc369: "sseog" -0xc36a: "sseogg" -0xc36b: "sseogs" -0xc36c: "sseon" -0xc36d: "sseonj" -0xc36e: "sseonh" -0xc36f: "sseod" -0xc370: "sseol" -0xc371: "sseolg" -0xc372: "sseolm" -0xc373: "sseolb" -0xc374: "sseols" -0xc375: "sseolt" -0xc376: "sseolp" -0xc377: "sseolh" -0xc378: "sseom" -0xc379: "sseob" -0xc37a: "sseobs" -0xc37b: "sseos" -0xc37c: "sseoss" -0xc37d: "sseong" -0xc37e: "sseoj" -0xc37f: "sseoc" -0xc380: "sseok" -0xc381: "sseot" -0xc382: "sseop" -0xc383: "sseoh" -0xc384: "sse" -0xc385: "sseg" -0xc386: "ssegg" -0xc387: "ssegs" -0xc388: "ssen" -0xc389: "ssenj" -0xc38a: "ssenh" -0xc38b: "ssed" -0xc38c: "ssel" -0xc38d: "sselg" -0xc38e: "sselm" -0xc38f: "sselb" -0xc390: "ssels" -0xc391: "sselt" -0xc392: "sselp" -0xc393: "sselh" -0xc394: "ssem" -0xc395: "sseb" -0xc396: "ssebs" -0xc397: "sses" -0xc398: "ssess" -0xc399: "sseng" -0xc39a: "ssej" -0xc39b: "ssec" -0xc39c: "ssek" -0xc39d: "sset" -0xc39e: "ssep" -0xc39f: "sseh" -0xc3a0: "ssyeo" -0xc3a1: "ssyeog" -0xc3a2: "ssyeogg" -0xc3a3: "ssyeogs" -0xc3a4: "ssyeon" -0xc3a5: "ssyeonj" -0xc3a6: "ssyeonh" -0xc3a7: "ssyeod" -0xc3a8: "ssyeol" -0xc3a9: "ssyeolg" -0xc3aa: "ssyeolm" -0xc3ab: "ssyeolb" -0xc3ac: "ssyeols" -0xc3ad: "ssyeolt" -0xc3ae: "ssyeolp" -0xc3af: "ssyeolh" -0xc3b0: "ssyeom" -0xc3b1: "ssyeob" -0xc3b2: "ssyeobs" -0xc3b3: "ssyeos" -0xc3b4: "ssyeoss" -0xc3b5: "ssyeong" -0xc3b6: "ssyeoj" -0xc3b7: "ssyeoc" -0xc3b8: "ssyeok" -0xc3b9: "ssyeot" -0xc3ba: "ssyeop" -0xc3bb: "ssyeoh" -0xc3bc: "ssye" -0xc3bd: "ssyeg" -0xc3be: "ssyegg" -0xc3bf: "ssyegs" -0xc3c0: "ssyen" -0xc3c1: "ssyenj" -0xc3c2: "ssyenh" -0xc3c3: "ssyed" -0xc3c4: "ssyel" -0xc3c5: "ssyelg" -0xc3c6: "ssyelm" -0xc3c7: "ssyelb" -0xc3c8: "ssyels" -0xc3c9: "ssyelt" -0xc3ca: "ssyelp" -0xc3cb: "ssyelh" -0xc3cc: "ssyem" -0xc3cd: "ssyeb" -0xc3ce: "ssyebs" -0xc3cf: "ssyes" -0xc3d0: "ssyess" -0xc3d1: "ssyeng" -0xc3d2: "ssyej" -0xc3d3: "ssyec" -0xc3d4: "ssyek" -0xc3d5: "ssyet" -0xc3d6: "ssyep" -0xc3d7: "ssyeh" -0xc3d8: "sso" -0xc3d9: "ssog" -0xc3da: "ssogg" -0xc3db: "ssogs" -0xc3dc: "sson" -0xc3dd: "ssonj" -0xc3de: "ssonh" -0xc3df: "ssod" -0xc3e0: "ssol" -0xc3e1: "ssolg" -0xc3e2: "ssolm" -0xc3e3: "ssolb" -0xc3e4: "ssols" -0xc3e5: "ssolt" -0xc3e6: "ssolp" -0xc3e7: "ssolh" -0xc3e8: "ssom" -0xc3e9: "ssob" -0xc3ea: "ssobs" -0xc3eb: "ssos" -0xc3ec: "ssoss" -0xc3ed: "ssong" -0xc3ee: "ssoj" -0xc3ef: "ssoc" -0xc3f0: "ssok" -0xc3f1: "ssot" -0xc3f2: "ssop" -0xc3f3: "ssoh" -0xc3f4: "sswa" -0xc3f5: "sswag" -0xc3f6: "sswagg" -0xc3f7: "sswags" -0xc3f8: "sswan" -0xc3f9: "sswanj" -0xc3fa: "sswanh" -0xc3fb: "sswad" -0xc3fc: "sswal" -0xc3fd: "sswalg" -0xc3fe: "sswalm" -0xc3ff: "sswalb" -/* x0c4 */ -0xc400: "sswals" -0xc401: "sswalt" -0xc402: "sswalp" -0xc403: "sswalh" -0xc404: "sswam" -0xc405: "sswab" -0xc406: "sswabs" -0xc407: "sswas" -0xc408: "sswass" -0xc409: "sswang" -0xc40a: "sswaj" -0xc40b: "sswac" -0xc40c: "sswak" -0xc40d: "sswat" -0xc40e: "sswap" -0xc40f: "sswah" -0xc410: "sswae" -0xc411: "sswaeg" -0xc412: "sswaegg" -0xc413: "sswaegs" -0xc414: "sswaen" -0xc415: "sswaenj" -0xc416: "sswaenh" -0xc417: "sswaed" -0xc418: "sswael" -0xc419: "sswaelg" -0xc41a: "sswaelm" -0xc41b: "sswaelb" -0xc41c: "sswaels" -0xc41d: "sswaelt" -0xc41e: "sswaelp" -0xc41f: "sswaelh" -0xc420: "sswaem" -0xc421: "sswaeb" -0xc422: "sswaebs" -0xc423: "sswaes" -0xc424: "sswaess" -0xc425: "sswaeng" -0xc426: "sswaej" -0xc427: "sswaec" -0xc428: "sswaek" -0xc429: "sswaet" -0xc42a: "sswaep" -0xc42b: "sswaeh" -0xc42c: "ssoe" -0xc42d: "ssoeg" -0xc42e: "ssoegg" -0xc42f: "ssoegs" -0xc430: "ssoen" -0xc431: "ssoenj" -0xc432: "ssoenh" -0xc433: "ssoed" -0xc434: "ssoel" -0xc435: "ssoelg" -0xc436: "ssoelm" -0xc437: "ssoelb" -0xc438: "ssoels" -0xc439: "ssoelt" -0xc43a: "ssoelp" -0xc43b: "ssoelh" -0xc43c: "ssoem" -0xc43d: "ssoeb" -0xc43e: "ssoebs" -0xc43f: "ssoes" -0xc440: "ssoess" -0xc441: "ssoeng" -0xc442: "ssoej" -0xc443: "ssoec" -0xc444: "ssoek" -0xc445: "ssoet" -0xc446: "ssoep" -0xc447: "ssoeh" -0xc448: "ssyo" -0xc449: "ssyog" -0xc44a: "ssyogg" -0xc44b: "ssyogs" -0xc44c: "ssyon" -0xc44d: "ssyonj" -0xc44e: "ssyonh" -0xc44f: "ssyod" -0xc450: "ssyol" -0xc451: "ssyolg" -0xc452: "ssyolm" -0xc453: "ssyolb" -0xc454: "ssyols" -0xc455: "ssyolt" -0xc456: "ssyolp" -0xc457: "ssyolh" -0xc458: "ssyom" -0xc459: "ssyob" -0xc45a: "ssyobs" -0xc45b: "ssyos" -0xc45c: "ssyoss" -0xc45d: "ssyong" -0xc45e: "ssyoj" -0xc45f: "ssyoc" -0xc460: "ssyok" -0xc461: "ssyot" -0xc462: "ssyop" -0xc463: "ssyoh" -0xc464: "ssu" -0xc465: "ssug" -0xc466: "ssugg" -0xc467: "ssugs" -0xc468: "ssun" -0xc469: "ssunj" -0xc46a: "ssunh" -0xc46b: "ssud" -0xc46c: "ssul" -0xc46d: "ssulg" -0xc46e: "ssulm" -0xc46f: "ssulb" -0xc470: "ssuls" -0xc471: "ssult" -0xc472: "ssulp" -0xc473: "ssulh" -0xc474: "ssum" -0xc475: "ssub" -0xc476: "ssubs" -0xc477: "ssus" -0xc478: "ssuss" -0xc479: "ssung" -0xc47a: "ssuj" -0xc47b: "ssuc" -0xc47c: "ssuk" -0xc47d: "ssut" -0xc47e: "ssup" -0xc47f: "ssuh" -0xc480: "ssweo" -0xc481: "ssweog" -0xc482: "ssweogg" -0xc483: "ssweogs" -0xc484: "ssweon" -0xc485: "ssweonj" -0xc486: "ssweonh" -0xc487: "ssweod" -0xc488: "ssweol" -0xc489: "ssweolg" -0xc48a: "ssweolm" -0xc48b: "ssweolb" -0xc48c: "ssweols" -0xc48d: "ssweolt" -0xc48e: "ssweolp" -0xc48f: "ssweolh" -0xc490: "ssweom" -0xc491: "ssweob" -0xc492: "ssweobs" -0xc493: "ssweos" -0xc494: "ssweoss" -0xc495: "ssweong" -0xc496: "ssweoj" -0xc497: "ssweoc" -0xc498: "ssweok" -0xc499: "ssweot" -0xc49a: "ssweop" -0xc49b: "ssweoh" -0xc49c: "sswe" -0xc49d: "ssweg" -0xc49e: "sswegg" -0xc49f: "sswegs" -0xc4a0: "sswen" -0xc4a1: "sswenj" -0xc4a2: "sswenh" -0xc4a3: "sswed" -0xc4a4: "sswel" -0xc4a5: "sswelg" -0xc4a6: "sswelm" -0xc4a7: "sswelb" -0xc4a8: "sswels" -0xc4a9: "sswelt" -0xc4aa: "sswelp" -0xc4ab: "sswelh" -0xc4ac: "sswem" -0xc4ad: "ssweb" -0xc4ae: "sswebs" -0xc4af: "sswes" -0xc4b0: "sswess" -0xc4b1: "ssweng" -0xc4b2: "sswej" -0xc4b3: "sswec" -0xc4b4: "sswek" -0xc4b5: "sswet" -0xc4b6: "sswep" -0xc4b7: "ssweh" -0xc4b8: "sswi" -0xc4b9: "sswig" -0xc4ba: "sswigg" -0xc4bb: "sswigs" -0xc4bc: "sswin" -0xc4bd: "sswinj" -0xc4be: "sswinh" -0xc4bf: "sswid" -0xc4c0: "sswil" -0xc4c1: "sswilg" -0xc4c2: "sswilm" -0xc4c3: "sswilb" -0xc4c4: "sswils" -0xc4c5: "sswilt" -0xc4c6: "sswilp" -0xc4c7: "sswilh" -0xc4c8: "sswim" -0xc4c9: "sswib" -0xc4ca: "sswibs" -0xc4cb: "sswis" -0xc4cc: "sswiss" -0xc4cd: "sswing" -0xc4ce: "sswij" -0xc4cf: "sswic" -0xc4d0: "sswik" -0xc4d1: "sswit" -0xc4d2: "sswip" -0xc4d3: "sswih" -0xc4d4: "ssyu" -0xc4d5: "ssyug" -0xc4d6: "ssyugg" -0xc4d7: "ssyugs" -0xc4d8: "ssyun" -0xc4d9: "ssyunj" -0xc4da: "ssyunh" -0xc4db: "ssyud" -0xc4dc: "ssyul" -0xc4dd: "ssyulg" -0xc4de: "ssyulm" -0xc4df: "ssyulb" -0xc4e0: "ssyuls" -0xc4e1: "ssyult" -0xc4e2: "ssyulp" -0xc4e3: "ssyulh" -0xc4e4: "ssyum" -0xc4e5: "ssyub" -0xc4e6: "ssyubs" -0xc4e7: "ssyus" -0xc4e8: "ssyuss" -0xc4e9: "ssyung" -0xc4ea: "ssyuj" -0xc4eb: "ssyuc" -0xc4ec: "ssyuk" -0xc4ed: "ssyut" -0xc4ee: "ssyup" -0xc4ef: "ssyuh" -0xc4f0: "sseu" -0xc4f1: "sseug" -0xc4f2: "sseugg" -0xc4f3: "sseugs" -0xc4f4: "sseun" -0xc4f5: "sseunj" -0xc4f6: "sseunh" -0xc4f7: "sseud" -0xc4f8: "sseul" -0xc4f9: "sseulg" -0xc4fa: "sseulm" -0xc4fb: "sseulb" -0xc4fc: "sseuls" -0xc4fd: "sseult" -0xc4fe: "sseulp" -0xc4ff: "sseulh" -/* x0c5 */ -0xc500: "sseum" -0xc501: "sseub" -0xc502: "sseubs" -0xc503: "sseus" -0xc504: "sseuss" -0xc505: "sseung" -0xc506: "sseuj" -0xc507: "sseuc" -0xc508: "sseuk" -0xc509: "sseut" -0xc50a: "sseup" -0xc50b: "sseuh" -0xc50c: "ssyi" -0xc50d: "ssyig" -0xc50e: "ssyigg" -0xc50f: "ssyigs" -0xc510: "ssyin" -0xc511: "ssyinj" -0xc512: "ssyinh" -0xc513: "ssyid" -0xc514: "ssyil" -0xc515: "ssyilg" -0xc516: "ssyilm" -0xc517: "ssyilb" -0xc518: "ssyils" -0xc519: "ssyilt" -0xc51a: "ssyilp" -0xc51b: "ssyilh" -0xc51c: "ssyim" -0xc51d: "ssyib" -0xc51e: "ssyibs" -0xc51f: "ssyis" -0xc520: "ssyiss" -0xc521: "ssying" -0xc522: "ssyij" -0xc523: "ssyic" -0xc524: "ssyik" -0xc525: "ssyit" -0xc526: "ssyip" -0xc527: "ssyih" -0xc528: "ssi" -0xc529: "ssig" -0xc52a: "ssigg" -0xc52b: "ssigs" -0xc52c: "ssin" -0xc52d: "ssinj" -0xc52e: "ssinh" -0xc52f: "ssid" -0xc530: "ssil" -0xc531: "ssilg" -0xc532: "ssilm" -0xc533: "ssilb" -0xc534: "ssils" -0xc535: "ssilt" -0xc536: "ssilp" -0xc537: "ssilh" -0xc538: "ssim" -0xc539: "ssib" -0xc53a: "ssibs" -0xc53b: "ssis" -0xc53c: "ssiss" -0xc53d: "ssing" -0xc53e: "ssij" -0xc53f: "ssic" -0xc540: "ssik" -0xc541: "ssit" -0xc542: "ssip" -0xc543: "ssih" -0xc544: "a" -0xc545: "ag" -0xc546: "agg" -0xc547: "ags" -0xc548: "an" -0xc549: "anj" -0xc54a: "anh" -0xc54b: "ad" -0xc54c: "al" -0xc54d: "alg" -0xc54e: "alm" -0xc54f: "alb" -0xc550: "als" -0xc551: "alt" -0xc552: "alp" -0xc553: "alh" -0xc554: "am" -0xc555: "ab" -0xc556: "abs" -0xc557: "as" -0xc558: "ass" -0xc559: "ang" -0xc55a: "aj" -0xc55b: "ac" -0xc55c: "ak" -0xc55d: "at" -0xc55e: "ap" -0xc55f: "ah" -0xc560: "ae" -0xc561: "aeg" -0xc562: "aegg" -0xc563: "aegs" -0xc564: "aen" -0xc565: "aenj" -0xc566: "aenh" -0xc567: "aed" -0xc568: "ael" -0xc569: "aelg" -0xc56a: "aelm" -0xc56b: "aelb" -0xc56c: "aels" -0xc56d: "aelt" -0xc56e: "aelp" -0xc56f: "aelh" -0xc570: "aem" -0xc571: "aeb" -0xc572: "aebs" -0xc573: "aes" -0xc574: "aess" -0xc575: "aeng" -0xc576: "aej" -0xc577: "aec" -0xc578: "aek" -0xc579: "aet" -0xc57a: "aep" -0xc57b: "aeh" -0xc57c: "ya" -0xc57d: "yag" -0xc57e: "yagg" -0xc57f: "yags" -0xc580: "yan" -0xc581: "yanj" -0xc582: "yanh" -0xc583: "yad" -0xc584: "yal" -0xc585: "yalg" -0xc586: "yalm" -0xc587: "yalb" -0xc588: "yals" -0xc589: "yalt" -0xc58a: "yalp" -0xc58b: "yalh" -0xc58c: "yam" -0xc58d: "yab" -0xc58e: "yabs" -0xc58f: "yas" -0xc590: "yass" -0xc591: "yang" -0xc592: "yaj" -0xc593: "yac" -0xc594: "yak" -0xc595: "yat" -0xc596: "yap" -0xc597: "yah" -0xc598: "yae" -0xc599: "yaeg" -0xc59a: "yaegg" -0xc59b: "yaegs" -0xc59c: "yaen" -0xc59d: "yaenj" -0xc59e: "yaenh" -0xc59f: "yaed" -0xc5a0: "yael" -0xc5a1: "yaelg" -0xc5a2: "yaelm" -0xc5a3: "yaelb" -0xc5a4: "yaels" -0xc5a5: "yaelt" -0xc5a6: "yaelp" -0xc5a7: "yaelh" -0xc5a8: "yaem" -0xc5a9: "yaeb" -0xc5aa: "yaebs" -0xc5ab: "yaes" -0xc5ac: "yaess" -0xc5ad: "yaeng" -0xc5ae: "yaej" -0xc5af: "yaec" -0xc5b0: "yaek" -0xc5b1: "yaet" -0xc5b2: "yaep" -0xc5b3: "yaeh" -0xc5b4: "eo" -0xc5b5: "eog" -0xc5b6: "eogg" -0xc5b7: "eogs" -0xc5b8: "eon" -0xc5b9: "eonj" -0xc5ba: "eonh" -0xc5bb: "eod" -0xc5bc: "eol" -0xc5bd: "eolg" -0xc5be: "eolm" -0xc5bf: "eolb" -0xc5c0: "eols" -0xc5c1: "eolt" -0xc5c2: "eolp" -0xc5c3: "eolh" -0xc5c4: "eom" -0xc5c5: "eob" -0xc5c6: "eobs" -0xc5c7: "eos" -0xc5c8: "eoss" -0xc5c9: "eong" -0xc5ca: "eoj" -0xc5cb: "eoc" -0xc5cc: "eok" -0xc5cd: "eot" -0xc5ce: "eop" -0xc5cf: "eoh" -0xc5d0: "e" -0xc5d1: "eg" -0xc5d2: "egg" -0xc5d3: "egs" -0xc5d4: "en" -0xc5d5: "enj" -0xc5d6: "enh" -0xc5d7: "ed" -0xc5d8: "el" -0xc5d9: "elg" -0xc5da: "elm" -0xc5db: "elb" -0xc5dc: "els" -0xc5dd: "elt" -0xc5de: "elp" -0xc5df: "elh" -0xc5e0: "em" -0xc5e1: "eb" -0xc5e2: "ebs" -0xc5e3: "es" -0xc5e4: "ess" -0xc5e5: "eng" -0xc5e6: "ej" -0xc5e7: "ec" -0xc5e8: "ek" -0xc5e9: "et" -0xc5ea: "ep" -0xc5eb: "eh" -0xc5ec: "yeo" -0xc5ed: "yeog" -0xc5ee: "yeogg" -0xc5ef: "yeogs" -0xc5f0: "yeon" -0xc5f1: "yeonj" -0xc5f2: "yeonh" -0xc5f3: "yeod" -0xc5f4: "yeol" -0xc5f5: "yeolg" -0xc5f6: "yeolm" -0xc5f7: "yeolb" -0xc5f8: "yeols" -0xc5f9: "yeolt" -0xc5fa: "yeolp" -0xc5fb: "yeolh" -0xc5fc: "yeom" -0xc5fd: "yeob" -0xc5fe: "yeobs" -0xc5ff: "yeos" -/* x0c6 */ -0xc600: "yeoss" -0xc601: "yeong" -0xc602: "yeoj" -0xc603: "yeoc" -0xc604: "yeok" -0xc605: "yeot" -0xc606: "yeop" -0xc607: "yeoh" -0xc608: "ye" -0xc609: "yeg" -0xc60a: "yegg" -0xc60b: "yegs" -0xc60c: "yen" -0xc60d: "yenj" -0xc60e: "yenh" -0xc60f: "yed" -0xc610: "yel" -0xc611: "yelg" -0xc612: "yelm" -0xc613: "yelb" -0xc614: "yels" -0xc615: "yelt" -0xc616: "yelp" -0xc617: "yelh" -0xc618: "yem" -0xc619: "yeb" -0xc61a: "yebs" -0xc61b: "yes" -0xc61c: "yess" -0xc61d: "yeng" -0xc61e: "yej" -0xc61f: "yec" -0xc620: "yek" -0xc621: "yet" -0xc622: "yep" -0xc623: "yeh" -0xc624: "o" -0xc625: "og" -0xc626: "ogg" -0xc627: "ogs" -0xc628: "on" -0xc629: "onj" -0xc62a: "onh" -0xc62b: "od" -0xc62c: "ol" -0xc62d: "olg" -0xc62e: "olm" -0xc62f: "olb" -0xc630: "ols" -0xc631: "olt" -0xc632: "olp" -0xc633: "olh" -0xc634: "om" -0xc635: "ob" -0xc636: "obs" -0xc637: "os" -0xc638: "oss" -0xc639: "ong" -0xc63a: "oj" -0xc63b: "oc" -0xc63c: "ok" -0xc63d: "ot" -0xc63e: "op" -0xc63f: "oh" -0xc640: "wa" -0xc641: "wag" -0xc642: "wagg" -0xc643: "wags" -0xc644: "wan" -0xc645: "wanj" -0xc646: "wanh" -0xc647: "wad" -0xc648: "wal" -0xc649: "walg" -0xc64a: "walm" -0xc64b: "walb" -0xc64c: "wals" -0xc64d: "walt" -0xc64e: "walp" -0xc64f: "walh" -0xc650: "wam" -0xc651: "wab" -0xc652: "wabs" -0xc653: "was" -0xc654: "wass" -0xc655: "wang" -0xc656: "waj" -0xc657: "wac" -0xc658: "wak" -0xc659: "wat" -0xc65a: "wap" -0xc65b: "wah" -0xc65c: "wae" -0xc65d: "waeg" -0xc65e: "waegg" -0xc65f: "waegs" -0xc660: "waen" -0xc661: "waenj" -0xc662: "waenh" -0xc663: "waed" -0xc664: "wael" -0xc665: "waelg" -0xc666: "waelm" -0xc667: "waelb" -0xc668: "waels" -0xc669: "waelt" -0xc66a: "waelp" -0xc66b: "waelh" -0xc66c: "waem" -0xc66d: "waeb" -0xc66e: "waebs" -0xc66f: "waes" -0xc670: "waess" -0xc671: "waeng" -0xc672: "waej" -0xc673: "waec" -0xc674: "waek" -0xc675: "waet" -0xc676: "waep" -0xc677: "waeh" -0xc678: "oe" -0xc679: "oeg" -0xc67a: "oegg" -0xc67b: "oegs" -0xc67c: "oen" -0xc67d: "oenj" -0xc67e: "oenh" -0xc67f: "oed" -0xc680: "oel" -0xc681: "oelg" -0xc682: "oelm" -0xc683: "oelb" -0xc684: "oels" -0xc685: "oelt" -0xc686: "oelp" -0xc687: "oelh" -0xc688: "oem" -0xc689: "oeb" -0xc68a: "oebs" -0xc68b: "oes" -0xc68c: "oess" -0xc68d: "oeng" -0xc68e: "oej" -0xc68f: "oec" -0xc690: "oek" -0xc691: "oet" -0xc692: "oep" -0xc693: "oeh" -0xc694: "yo" -0xc695: "yog" -0xc696: "yogg" -0xc697: "yogs" -0xc698: "yon" -0xc699: "yonj" -0xc69a: "yonh" -0xc69b: "yod" -0xc69c: "yol" -0xc69d: "yolg" -0xc69e: "yolm" -0xc69f: "yolb" -0xc6a0: "yols" -0xc6a1: "yolt" -0xc6a2: "yolp" -0xc6a3: "yolh" -0xc6a4: "yom" -0xc6a5: "yob" -0xc6a6: "yobs" -0xc6a7: "yos" -0xc6a8: "yoss" -0xc6a9: "yong" -0xc6aa: "yoj" -0xc6ab: "yoc" -0xc6ac: "yok" -0xc6ad: "yot" -0xc6ae: "yop" -0xc6af: "yoh" -0xc6b0: "u" -0xc6b1: "ug" -0xc6b2: "ugg" -0xc6b3: "ugs" -0xc6b4: "un" -0xc6b5: "unj" -0xc6b6: "unh" -0xc6b7: "ud" -0xc6b8: "ul" -0xc6b9: "ulg" -0xc6ba: "ulm" -0xc6bb: "ulb" -0xc6bc: "uls" -0xc6bd: "ult" -0xc6be: "ulp" -0xc6bf: "ulh" -0xc6c0: "um" -0xc6c1: "ub" -0xc6c2: "ubs" -0xc6c3: "us" -0xc6c4: "uss" -0xc6c5: "ung" -0xc6c6: "uj" -0xc6c7: "uc" -0xc6c8: "uk" -0xc6c9: "ut" -0xc6ca: "up" -0xc6cb: "uh" -0xc6cc: "weo" -0xc6cd: "weog" -0xc6ce: "weogg" -0xc6cf: "weogs" -0xc6d0: "weon" -0xc6d1: "weonj" -0xc6d2: "weonh" -0xc6d3: "weod" -0xc6d4: "weol" -0xc6d5: "weolg" -0xc6d6: "weolm" -0xc6d7: "weolb" -0xc6d8: "weols" -0xc6d9: "weolt" -0xc6da: "weolp" -0xc6db: "weolh" -0xc6dc: "weom" -0xc6dd: "weob" -0xc6de: "weobs" -0xc6df: "weos" -0xc6e0: "weoss" -0xc6e1: "weong" -0xc6e2: "weoj" -0xc6e3: "weoc" -0xc6e4: "weok" -0xc6e5: "weot" -0xc6e6: "weop" -0xc6e7: "weoh" -0xc6e8: "we" -0xc6e9: "weg" -0xc6ea: "wegg" -0xc6eb: "wegs" -0xc6ec: "wen" -0xc6ed: "wenj" -0xc6ee: "wenh" -0xc6ef: "wed" -0xc6f0: "wel" -0xc6f1: "welg" -0xc6f2: "welm" -0xc6f3: "welb" -0xc6f4: "wels" -0xc6f5: "welt" -0xc6f6: "welp" -0xc6f7: "welh" -0xc6f8: "wem" -0xc6f9: "web" -0xc6fa: "webs" -0xc6fb: "wes" -0xc6fc: "wess" -0xc6fd: "weng" -0xc6fe: "wej" -0xc6ff: "wec" -/* x0c7 */ -0xc700: "wek" -0xc701: "wet" -0xc702: "wep" -0xc703: "weh" -0xc704: "wi" -0xc705: "wig" -0xc706: "wigg" -0xc707: "wigs" -0xc708: "win" -0xc709: "winj" -0xc70a: "winh" -0xc70b: "wid" -0xc70c: "wil" -0xc70d: "wilg" -0xc70e: "wilm" -0xc70f: "wilb" -0xc710: "wils" -0xc711: "wilt" -0xc712: "wilp" -0xc713: "wilh" -0xc714: "wim" -0xc715: "wib" -0xc716: "wibs" -0xc717: "wis" -0xc718: "wiss" -0xc719: "wing" -0xc71a: "wij" -0xc71b: "wic" -0xc71c: "wik" -0xc71d: "wit" -0xc71e: "wip" -0xc71f: "wih" -0xc720: "yu" -0xc721: "yug" -0xc722: "yugg" -0xc723: "yugs" -0xc724: "yun" -0xc725: "yunj" -0xc726: "yunh" -0xc727: "yud" -0xc728: "yul" -0xc729: "yulg" -0xc72a: "yulm" -0xc72b: "yulb" -0xc72c: "yuls" -0xc72d: "yult" -0xc72e: "yulp" -0xc72f: "yulh" -0xc730: "yum" -0xc731: "yub" -0xc732: "yubs" -0xc733: "yus" -0xc734: "yuss" -0xc735: "yung" -0xc736: "yuj" -0xc737: "yuc" -0xc738: "yuk" -0xc739: "yut" -0xc73a: "yup" -0xc73b: "yuh" -0xc73c: "eu" -0xc73d: "eug" -0xc73e: "eugg" -0xc73f: "eugs" -0xc740: "eun" -0xc741: "eunj" -0xc742: "eunh" -0xc743: "eud" -0xc744: "eul" -0xc745: "eulg" -0xc746: "eulm" -0xc747: "eulb" -0xc748: "euls" -0xc749: "eult" -0xc74a: "eulp" -0xc74b: "eulh" -0xc74c: "eum" -0xc74d: "eub" -0xc74e: "eubs" -0xc74f: "eus" -0xc750: "euss" -0xc751: "eung" -0xc752: "euj" -0xc753: "euc" -0xc754: "euk" -0xc755: "eut" -0xc756: "eup" -0xc757: "euh" -0xc758: "yi" -0xc759: "yig" -0xc75a: "yigg" -0xc75b: "yigs" -0xc75c: "yin" -0xc75d: "yinj" -0xc75e: "yinh" -0xc75f: "yid" -0xc760: "yil" -0xc761: "yilg" -0xc762: "yilm" -0xc763: "yilb" -0xc764: "yils" -0xc765: "yilt" -0xc766: "yilp" -0xc767: "yilh" -0xc768: "yim" -0xc769: "yib" -0xc76a: "yibs" -0xc76b: "yis" -0xc76c: "yiss" -0xc76d: "ying" -0xc76e: "yij" -0xc76f: "yic" -0xc770: "yik" -0xc771: "yit" -0xc772: "yip" -0xc773: "yih" -0xc774: "i" -0xc775: "ig" -0xc776: "igg" -0xc777: "igs" -0xc778: "in" -0xc779: "inj" -0xc77a: "inh" -0xc77b: "id" -0xc77c: "il" -0xc77d: "ilg" -0xc77e: "ilm" -0xc77f: "ilb" -0xc780: "ils" -0xc781: "ilt" -0xc782: "ilp" -0xc783: "ilh" -0xc784: "im" -0xc785: "ib" -0xc786: "ibs" -0xc787: "is" -0xc788: "iss" -0xc789: "ing" -0xc78a: "ij" -0xc78b: "ic" -0xc78c: "ik" -0xc78d: "it" -0xc78e: "ip" -0xc78f: "ih" -0xc790: "ja" -0xc791: "jag" -0xc792: "jagg" -0xc793: "jags" -0xc794: "jan" -0xc795: "janj" -0xc796: "janh" -0xc797: "jad" -0xc798: "jal" -0xc799: "jalg" -0xc79a: "jalm" -0xc79b: "jalb" -0xc79c: "jals" -0xc79d: "jalt" -0xc79e: "jalp" -0xc79f: "jalh" -0xc7a0: "jam" -0xc7a1: "jab" -0xc7a2: "jabs" -0xc7a3: "jas" -0xc7a4: "jass" -0xc7a5: "jang" -0xc7a6: "jaj" -0xc7a7: "jac" -0xc7a8: "jak" -0xc7a9: "jat" -0xc7aa: "jap" -0xc7ab: "jah" -0xc7ac: "jae" -0xc7ad: "jaeg" -0xc7ae: "jaegg" -0xc7af: "jaegs" -0xc7b0: "jaen" -0xc7b1: "jaenj" -0xc7b2: "jaenh" -0xc7b3: "jaed" -0xc7b4: "jael" -0xc7b5: "jaelg" -0xc7b6: "jaelm" -0xc7b7: "jaelb" -0xc7b8: "jaels" -0xc7b9: "jaelt" -0xc7ba: "jaelp" -0xc7bb: "jaelh" -0xc7bc: "jaem" -0xc7bd: "jaeb" -0xc7be: "jaebs" -0xc7bf: "jaes" -0xc7c0: "jaess" -0xc7c1: "jaeng" -0xc7c2: "jaej" -0xc7c3: "jaec" -0xc7c4: "jaek" -0xc7c5: "jaet" -0xc7c6: "jaep" -0xc7c7: "jaeh" -0xc7c8: "jya" -0xc7c9: "jyag" -0xc7ca: "jyagg" -0xc7cb: "jyags" -0xc7cc: "jyan" -0xc7cd: "jyanj" -0xc7ce: "jyanh" -0xc7cf: "jyad" -0xc7d0: "jyal" -0xc7d1: "jyalg" -0xc7d2: "jyalm" -0xc7d3: "jyalb" -0xc7d4: "jyals" -0xc7d5: "jyalt" -0xc7d6: "jyalp" -0xc7d7: "jyalh" -0xc7d8: "jyam" -0xc7d9: "jyab" -0xc7da: "jyabs" -0xc7db: "jyas" -0xc7dc: "jyass" -0xc7dd: "jyang" -0xc7de: "jyaj" -0xc7df: "jyac" -0xc7e0: "jyak" -0xc7e1: "jyat" -0xc7e2: "jyap" -0xc7e3: "jyah" -0xc7e4: "jyae" -0xc7e5: "jyaeg" -0xc7e6: "jyaegg" -0xc7e7: "jyaegs" -0xc7e8: "jyaen" -0xc7e9: "jyaenj" -0xc7ea: "jyaenh" -0xc7eb: "jyaed" -0xc7ec: "jyael" -0xc7ed: "jyaelg" -0xc7ee: "jyaelm" -0xc7ef: "jyaelb" -0xc7f0: "jyaels" -0xc7f1: "jyaelt" -0xc7f2: "jyaelp" -0xc7f3: "jyaelh" -0xc7f4: "jyaem" -0xc7f5: "jyaeb" -0xc7f6: "jyaebs" -0xc7f7: "jyaes" -0xc7f8: "jyaess" -0xc7f9: "jyaeng" -0xc7fa: "jyaej" -0xc7fb: "jyaec" -0xc7fc: "jyaek" -0xc7fd: "jyaet" -0xc7fe: "jyaep" -0xc7ff: "jyaeh" -/* x0c8 */ -0xc800: "jeo" -0xc801: "jeog" -0xc802: "jeogg" -0xc803: "jeogs" -0xc804: "jeon" -0xc805: "jeonj" -0xc806: "jeonh" -0xc807: "jeod" -0xc808: "jeol" -0xc809: "jeolg" -0xc80a: "jeolm" -0xc80b: "jeolb" -0xc80c: "jeols" -0xc80d: "jeolt" -0xc80e: "jeolp" -0xc80f: "jeolh" -0xc810: "jeom" -0xc811: "jeob" -0xc812: "jeobs" -0xc813: "jeos" -0xc814: "jeoss" -0xc815: "jeong" -0xc816: "jeoj" -0xc817: "jeoc" -0xc818: "jeok" -0xc819: "jeot" -0xc81a: "jeop" -0xc81b: "jeoh" -0xc81c: "je" -0xc81d: "jeg" -0xc81e: "jegg" -0xc81f: "jegs" -0xc820: "jen" -0xc821: "jenj" -0xc822: "jenh" -0xc823: "jed" -0xc824: "jel" -0xc825: "jelg" -0xc826: "jelm" -0xc827: "jelb" -0xc828: "jels" -0xc829: "jelt" -0xc82a: "jelp" -0xc82b: "jelh" -0xc82c: "jem" -0xc82d: "jeb" -0xc82e: "jebs" -0xc82f: "jes" -0xc830: "jess" -0xc831: "jeng" -0xc832: "jej" -0xc833: "jec" -0xc834: "jek" -0xc835: "jet" -0xc836: "jep" -0xc837: "jeh" -0xc838: "jyeo" -0xc839: "jyeog" -0xc83a: "jyeogg" -0xc83b: "jyeogs" -0xc83c: "jyeon" -0xc83d: "jyeonj" -0xc83e: "jyeonh" -0xc83f: "jyeod" -0xc840: "jyeol" -0xc841: "jyeolg" -0xc842: "jyeolm" -0xc843: "jyeolb" -0xc844: "jyeols" -0xc845: "jyeolt" -0xc846: "jyeolp" -0xc847: "jyeolh" -0xc848: "jyeom" -0xc849: "jyeob" -0xc84a: "jyeobs" -0xc84b: "jyeos" -0xc84c: "jyeoss" -0xc84d: "jyeong" -0xc84e: "jyeoj" -0xc84f: "jyeoc" -0xc850: "jyeok" -0xc851: "jyeot" -0xc852: "jyeop" -0xc853: "jyeoh" -0xc854: "jye" -0xc855: "jyeg" -0xc856: "jyegg" -0xc857: "jyegs" -0xc858: "jyen" -0xc859: "jyenj" -0xc85a: "jyenh" -0xc85b: "jyed" -0xc85c: "jyel" -0xc85d: "jyelg" -0xc85e: "jyelm" -0xc85f: "jyelb" -0xc860: "jyels" -0xc861: "jyelt" -0xc862: "jyelp" -0xc863: "jyelh" -0xc864: "jyem" -0xc865: "jyeb" -0xc866: "jyebs" -0xc867: "jyes" -0xc868: "jyess" -0xc869: "jyeng" -0xc86a: "jyej" -0xc86b: "jyec" -0xc86c: "jyek" -0xc86d: "jyet" -0xc86e: "jyep" -0xc86f: "jyeh" -0xc870: "jo" -0xc871: "jog" -0xc872: "jogg" -0xc873: "jogs" -0xc874: "jon" -0xc875: "jonj" -0xc876: "jonh" -0xc877: "jod" -0xc878: "jol" -0xc879: "jolg" -0xc87a: "jolm" -0xc87b: "jolb" -0xc87c: "jols" -0xc87d: "jolt" -0xc87e: "jolp" -0xc87f: "jolh" -0xc880: "jom" -0xc881: "job" -0xc882: "jobs" -0xc883: "jos" -0xc884: "joss" -0xc885: "jong" -0xc886: "joj" -0xc887: "joc" -0xc888: "jok" -0xc889: "jot" -0xc88a: "jop" -0xc88b: "joh" -0xc88c: "jwa" -0xc88d: "jwag" -0xc88e: "jwagg" -0xc88f: "jwags" -0xc890: "jwan" -0xc891: "jwanj" -0xc892: "jwanh" -0xc893: "jwad" -0xc894: "jwal" -0xc895: "jwalg" -0xc896: "jwalm" -0xc897: "jwalb" -0xc898: "jwals" -0xc899: "jwalt" -0xc89a: "jwalp" -0xc89b: "jwalh" -0xc89c: "jwam" -0xc89d: "jwab" -0xc89e: "jwabs" -0xc89f: "jwas" -0xc8a0: "jwass" -0xc8a1: "jwang" -0xc8a2: "jwaj" -0xc8a3: "jwac" -0xc8a4: "jwak" -0xc8a5: "jwat" -0xc8a6: "jwap" -0xc8a7: "jwah" -0xc8a8: "jwae" -0xc8a9: "jwaeg" -0xc8aa: "jwaegg" -0xc8ab: "jwaegs" -0xc8ac: "jwaen" -0xc8ad: "jwaenj" -0xc8ae: "jwaenh" -0xc8af: "jwaed" -0xc8b0: "jwael" -0xc8b1: "jwaelg" -0xc8b2: "jwaelm" -0xc8b3: "jwaelb" -0xc8b4: "jwaels" -0xc8b5: "jwaelt" -0xc8b6: "jwaelp" -0xc8b7: "jwaelh" -0xc8b8: "jwaem" -0xc8b9: "jwaeb" -0xc8ba: "jwaebs" -0xc8bb: "jwaes" -0xc8bc: "jwaess" -0xc8bd: "jwaeng" -0xc8be: "jwaej" -0xc8bf: "jwaec" -0xc8c0: "jwaek" -0xc8c1: "jwaet" -0xc8c2: "jwaep" -0xc8c3: "jwaeh" -0xc8c4: "joe" -0xc8c5: "joeg" -0xc8c6: "joegg" -0xc8c7: "joegs" -0xc8c8: "joen" -0xc8c9: "joenj" -0xc8ca: "joenh" -0xc8cb: "joed" -0xc8cc: "joel" -0xc8cd: "joelg" -0xc8ce: "joelm" -0xc8cf: "joelb" -0xc8d0: "joels" -0xc8d1: "joelt" -0xc8d2: "joelp" -0xc8d3: "joelh" -0xc8d4: "joem" -0xc8d5: "joeb" -0xc8d6: "joebs" -0xc8d7: "joes" -0xc8d8: "joess" -0xc8d9: "joeng" -0xc8da: "joej" -0xc8db: "joec" -0xc8dc: "joek" -0xc8dd: "joet" -0xc8de: "joep" -0xc8df: "joeh" -0xc8e0: "jyo" -0xc8e1: "jyog" -0xc8e2: "jyogg" -0xc8e3: "jyogs" -0xc8e4: "jyon" -0xc8e5: "jyonj" -0xc8e6: "jyonh" -0xc8e7: "jyod" -0xc8e8: "jyol" -0xc8e9: "jyolg" -0xc8ea: "jyolm" -0xc8eb: "jyolb" -0xc8ec: "jyols" -0xc8ed: "jyolt" -0xc8ee: "jyolp" -0xc8ef: "jyolh" -0xc8f0: "jyom" -0xc8f1: "jyob" -0xc8f2: "jyobs" -0xc8f3: "jyos" -0xc8f4: "jyoss" -0xc8f5: "jyong" -0xc8f6: "jyoj" -0xc8f7: "jyoc" -0xc8f8: "jyok" -0xc8f9: "jyot" -0xc8fa: "jyop" -0xc8fb: "jyoh" -0xc8fc: "ju" -0xc8fd: "jug" -0xc8fe: "jugg" -0xc8ff: "jugs" -/* x0c9 */ -0xc900: "jun" -0xc901: "junj" -0xc902: "junh" -0xc903: "jud" -0xc904: "jul" -0xc905: "julg" -0xc906: "julm" -0xc907: "julb" -0xc908: "juls" -0xc909: "jult" -0xc90a: "julp" -0xc90b: "julh" -0xc90c: "jum" -0xc90d: "jub" -0xc90e: "jubs" -0xc90f: "jus" -0xc910: "juss" -0xc911: "jung" -0xc912: "juj" -0xc913: "juc" -0xc914: "juk" -0xc915: "jut" -0xc916: "jup" -0xc917: "juh" -0xc918: "jweo" -0xc919: "jweog" -0xc91a: "jweogg" -0xc91b: "jweogs" -0xc91c: "jweon" -0xc91d: "jweonj" -0xc91e: "jweonh" -0xc91f: "jweod" -0xc920: "jweol" -0xc921: "jweolg" -0xc922: "jweolm" -0xc923: "jweolb" -0xc924: "jweols" -0xc925: "jweolt" -0xc926: "jweolp" -0xc927: "jweolh" -0xc928: "jweom" -0xc929: "jweob" -0xc92a: "jweobs" -0xc92b: "jweos" -0xc92c: "jweoss" -0xc92d: "jweong" -0xc92e: "jweoj" -0xc92f: "jweoc" -0xc930: "jweok" -0xc931: "jweot" -0xc932: "jweop" -0xc933: "jweoh" -0xc934: "jwe" -0xc935: "jweg" -0xc936: "jwegg" -0xc937: "jwegs" -0xc938: "jwen" -0xc939: "jwenj" -0xc93a: "jwenh" -0xc93b: "jwed" -0xc93c: "jwel" -0xc93d: "jwelg" -0xc93e: "jwelm" -0xc93f: "jwelb" -0xc940: "jwels" -0xc941: "jwelt" -0xc942: "jwelp" -0xc943: "jwelh" -0xc944: "jwem" -0xc945: "jweb" -0xc946: "jwebs" -0xc947: "jwes" -0xc948: "jwess" -0xc949: "jweng" -0xc94a: "jwej" -0xc94b: "jwec" -0xc94c: "jwek" -0xc94d: "jwet" -0xc94e: "jwep" -0xc94f: "jweh" -0xc950: "jwi" -0xc951: "jwig" -0xc952: "jwigg" -0xc953: "jwigs" -0xc954: "jwin" -0xc955: "jwinj" -0xc956: "jwinh" -0xc957: "jwid" -0xc958: "jwil" -0xc959: "jwilg" -0xc95a: "jwilm" -0xc95b: "jwilb" -0xc95c: "jwils" -0xc95d: "jwilt" -0xc95e: "jwilp" -0xc95f: "jwilh" -0xc960: "jwim" -0xc961: "jwib" -0xc962: "jwibs" -0xc963: "jwis" -0xc964: "jwiss" -0xc965: "jwing" -0xc966: "jwij" -0xc967: "jwic" -0xc968: "jwik" -0xc969: "jwit" -0xc96a: "jwip" -0xc96b: "jwih" -0xc96c: "jyu" -0xc96d: "jyug" -0xc96e: "jyugg" -0xc96f: "jyugs" -0xc970: "jyun" -0xc971: "jyunj" -0xc972: "jyunh" -0xc973: "jyud" -0xc974: "jyul" -0xc975: "jyulg" -0xc976: "jyulm" -0xc977: "jyulb" -0xc978: "jyuls" -0xc979: "jyult" -0xc97a: "jyulp" -0xc97b: "jyulh" -0xc97c: "jyum" -0xc97d: "jyub" -0xc97e: "jyubs" -0xc97f: "jyus" -0xc980: "jyuss" -0xc981: "jyung" -0xc982: "jyuj" -0xc983: "jyuc" -0xc984: "jyuk" -0xc985: "jyut" -0xc986: "jyup" -0xc987: "jyuh" -0xc988: "jeu" -0xc989: "jeug" -0xc98a: "jeugg" -0xc98b: "jeugs" -0xc98c: "jeun" -0xc98d: "jeunj" -0xc98e: "jeunh" -0xc98f: "jeud" -0xc990: "jeul" -0xc991: "jeulg" -0xc992: "jeulm" -0xc993: "jeulb" -0xc994: "jeuls" -0xc995: "jeult" -0xc996: "jeulp" -0xc997: "jeulh" -0xc998: "jeum" -0xc999: "jeub" -0xc99a: "jeubs" -0xc99b: "jeus" -0xc99c: "jeuss" -0xc99d: "jeung" -0xc99e: "jeuj" -0xc99f: "jeuc" -0xc9a0: "jeuk" -0xc9a1: "jeut" -0xc9a2: "jeup" -0xc9a3: "jeuh" -0xc9a4: "jyi" -0xc9a5: "jyig" -0xc9a6: "jyigg" -0xc9a7: "jyigs" -0xc9a8: "jyin" -0xc9a9: "jyinj" -0xc9aa: "jyinh" -0xc9ab: "jyid" -0xc9ac: "jyil" -0xc9ad: "jyilg" -0xc9ae: "jyilm" -0xc9af: "jyilb" -0xc9b0: "jyils" -0xc9b1: "jyilt" -0xc9b2: "jyilp" -0xc9b3: "jyilh" -0xc9b4: "jyim" -0xc9b5: "jyib" -0xc9b6: "jyibs" -0xc9b7: "jyis" -0xc9b8: "jyiss" -0xc9b9: "jying" -0xc9ba: "jyij" -0xc9bb: "jyic" -0xc9bc: "jyik" -0xc9bd: "jyit" -0xc9be: "jyip" -0xc9bf: "jyih" -0xc9c0: "ji" -0xc9c1: "jig" -0xc9c2: "jigg" -0xc9c3: "jigs" -0xc9c4: "jin" -0xc9c5: "jinj" -0xc9c6: "jinh" -0xc9c7: "jid" -0xc9c8: "jil" -0xc9c9: "jilg" -0xc9ca: "jilm" -0xc9cb: "jilb" -0xc9cc: "jils" -0xc9cd: "jilt" -0xc9ce: "jilp" -0xc9cf: "jilh" -0xc9d0: "jim" -0xc9d1: "jib" -0xc9d2: "jibs" -0xc9d3: "jis" -0xc9d4: "jiss" -0xc9d5: "jing" -0xc9d6: "jij" -0xc9d7: "jic" -0xc9d8: "jik" -0xc9d9: "jit" -0xc9da: "jip" -0xc9db: "jih" -0xc9dc: "jja" -0xc9dd: "jjag" -0xc9de: "jjagg" -0xc9df: "jjags" -0xc9e0: "jjan" -0xc9e1: "jjanj" -0xc9e2: "jjanh" -0xc9e3: "jjad" -0xc9e4: "jjal" -0xc9e5: "jjalg" -0xc9e6: "jjalm" -0xc9e7: "jjalb" -0xc9e8: "jjals" -0xc9e9: "jjalt" -0xc9ea: "jjalp" -0xc9eb: "jjalh" -0xc9ec: "jjam" -0xc9ed: "jjab" -0xc9ee: "jjabs" -0xc9ef: "jjas" -0xc9f0: "jjass" -0xc9f1: "jjang" -0xc9f2: "jjaj" -0xc9f3: "jjac" -0xc9f4: "jjak" -0xc9f5: "jjat" -0xc9f6: "jjap" -0xc9f7: "jjah" -0xc9f8: "jjae" -0xc9f9: "jjaeg" -0xc9fa: "jjaegg" -0xc9fb: "jjaegs" -0xc9fc: "jjaen" -0xc9fd: "jjaenj" -0xc9fe: "jjaenh" -0xc9ff: "jjaed" -/* x0ca */ -0xca00: "jjael" -0xca01: "jjaelg" -0xca02: "jjaelm" -0xca03: "jjaelb" -0xca04: "jjaels" -0xca05: "jjaelt" -0xca06: "jjaelp" -0xca07: "jjaelh" -0xca08: "jjaem" -0xca09: "jjaeb" -0xca0a: "jjaebs" -0xca0b: "jjaes" -0xca0c: "jjaess" -0xca0d: "jjaeng" -0xca0e: "jjaej" -0xca0f: "jjaec" -0xca10: "jjaek" -0xca11: "jjaet" -0xca12: "jjaep" -0xca13: "jjaeh" -0xca14: "jjya" -0xca15: "jjyag" -0xca16: "jjyagg" -0xca17: "jjyags" -0xca18: "jjyan" -0xca19: "jjyanj" -0xca1a: "jjyanh" -0xca1b: "jjyad" -0xca1c: "jjyal" -0xca1d: "jjyalg" -0xca1e: "jjyalm" -0xca1f: "jjyalb" -0xca20: "jjyals" -0xca21: "jjyalt" -0xca22: "jjyalp" -0xca23: "jjyalh" -0xca24: "jjyam" -0xca25: "jjyab" -0xca26: "jjyabs" -0xca27: "jjyas" -0xca28: "jjyass" -0xca29: "jjyang" -0xca2a: "jjyaj" -0xca2b: "jjyac" -0xca2c: "jjyak" -0xca2d: "jjyat" -0xca2e: "jjyap" -0xca2f: "jjyah" -0xca30: "jjyae" -0xca31: "jjyaeg" -0xca32: "jjyaegg" -0xca33: "jjyaegs" -0xca34: "jjyaen" -0xca35: "jjyaenj" -0xca36: "jjyaenh" -0xca37: "jjyaed" -0xca38: "jjyael" -0xca39: "jjyaelg" -0xca3a: "jjyaelm" -0xca3b: "jjyaelb" -0xca3c: "jjyaels" -0xca3d: "jjyaelt" -0xca3e: "jjyaelp" -0xca3f: "jjyaelh" -0xca40: "jjyaem" -0xca41: "jjyaeb" -0xca42: "jjyaebs" -0xca43: "jjyaes" -0xca44: "jjyaess" -0xca45: "jjyaeng" -0xca46: "jjyaej" -0xca47: "jjyaec" -0xca48: "jjyaek" -0xca49: "jjyaet" -0xca4a: "jjyaep" -0xca4b: "jjyaeh" -0xca4c: "jjeo" -0xca4d: "jjeog" -0xca4e: "jjeogg" -0xca4f: "jjeogs" -0xca50: "jjeon" -0xca51: "jjeonj" -0xca52: "jjeonh" -0xca53: "jjeod" -0xca54: "jjeol" -0xca55: "jjeolg" -0xca56: "jjeolm" -0xca57: "jjeolb" -0xca58: "jjeols" -0xca59: "jjeolt" -0xca5a: "jjeolp" -0xca5b: "jjeolh" -0xca5c: "jjeom" -0xca5d: "jjeob" -0xca5e: "jjeobs" -0xca5f: "jjeos" -0xca60: "jjeoss" -0xca61: "jjeong" -0xca62: "jjeoj" -0xca63: "jjeoc" -0xca64: "jjeok" -0xca65: "jjeot" -0xca66: "jjeop" -0xca67: "jjeoh" -0xca68: "jje" -0xca69: "jjeg" -0xca6a: "jjegg" -0xca6b: "jjegs" -0xca6c: "jjen" -0xca6d: "jjenj" -0xca6e: "jjenh" -0xca6f: "jjed" -0xca70: "jjel" -0xca71: "jjelg" -0xca72: "jjelm" -0xca73: "jjelb" -0xca74: "jjels" -0xca75: "jjelt" -0xca76: "jjelp" -0xca77: "jjelh" -0xca78: "jjem" -0xca79: "jjeb" -0xca7a: "jjebs" -0xca7b: "jjes" -0xca7c: "jjess" -0xca7d: "jjeng" -0xca7e: "jjej" -0xca7f: "jjec" -0xca80: "jjek" -0xca81: "jjet" -0xca82: "jjep" -0xca83: "jjeh" -0xca84: "jjyeo" -0xca85: "jjyeog" -0xca86: "jjyeogg" -0xca87: "jjyeogs" -0xca88: "jjyeon" -0xca89: "jjyeonj" -0xca8a: "jjyeonh" -0xca8b: "jjyeod" -0xca8c: "jjyeol" -0xca8d: "jjyeolg" -0xca8e: "jjyeolm" -0xca8f: "jjyeolb" -0xca90: "jjyeols" -0xca91: "jjyeolt" -0xca92: "jjyeolp" -0xca93: "jjyeolh" -0xca94: "jjyeom" -0xca95: "jjyeob" -0xca96: "jjyeobs" -0xca97: "jjyeos" -0xca98: "jjyeoss" -0xca99: "jjyeong" -0xca9a: "jjyeoj" -0xca9b: "jjyeoc" -0xca9c: "jjyeok" -0xca9d: "jjyeot" -0xca9e: "jjyeop" -0xca9f: "jjyeoh" -0xcaa0: "jjye" -0xcaa1: "jjyeg" -0xcaa2: "jjyegg" -0xcaa3: "jjyegs" -0xcaa4: "jjyen" -0xcaa5: "jjyenj" -0xcaa6: "jjyenh" -0xcaa7: "jjyed" -0xcaa8: "jjyel" -0xcaa9: "jjyelg" -0xcaaa: "jjyelm" -0xcaab: "jjyelb" -0xcaac: "jjyels" -0xcaad: "jjyelt" -0xcaae: "jjyelp" -0xcaaf: "jjyelh" -0xcab0: "jjyem" -0xcab1: "jjyeb" -0xcab2: "jjyebs" -0xcab3: "jjyes" -0xcab4: "jjyess" -0xcab5: "jjyeng" -0xcab6: "jjyej" -0xcab7: "jjyec" -0xcab8: "jjyek" -0xcab9: "jjyet" -0xcaba: "jjyep" -0xcabb: "jjyeh" -0xcabc: "jjo" -0xcabd: "jjog" -0xcabe: "jjogg" -0xcabf: "jjogs" -0xcac0: "jjon" -0xcac1: "jjonj" -0xcac2: "jjonh" -0xcac3: "jjod" -0xcac4: "jjol" -0xcac5: "jjolg" -0xcac6: "jjolm" -0xcac7: "jjolb" -0xcac8: "jjols" -0xcac9: "jjolt" -0xcaca: "jjolp" -0xcacb: "jjolh" -0xcacc: "jjom" -0xcacd: "jjob" -0xcace: "jjobs" -0xcacf: "jjos" -0xcad0: "jjoss" -0xcad1: "jjong" -0xcad2: "jjoj" -0xcad3: "jjoc" -0xcad4: "jjok" -0xcad5: "jjot" -0xcad6: "jjop" -0xcad7: "jjoh" -0xcad8: "jjwa" -0xcad9: "jjwag" -0xcada: "jjwagg" -0xcadb: "jjwags" -0xcadc: "jjwan" -0xcadd: "jjwanj" -0xcade: "jjwanh" -0xcadf: "jjwad" -0xcae0: "jjwal" -0xcae1: "jjwalg" -0xcae2: "jjwalm" -0xcae3: "jjwalb" -0xcae4: "jjwals" -0xcae5: "jjwalt" -0xcae6: "jjwalp" -0xcae7: "jjwalh" -0xcae8: "jjwam" -0xcae9: "jjwab" -0xcaea: "jjwabs" -0xcaeb: "jjwas" -0xcaec: "jjwass" -0xcaed: "jjwang" -0xcaee: "jjwaj" -0xcaef: "jjwac" -0xcaf0: "jjwak" -0xcaf1: "jjwat" -0xcaf2: "jjwap" -0xcaf3: "jjwah" -0xcaf4: "jjwae" -0xcaf5: "jjwaeg" -0xcaf6: "jjwaegg" -0xcaf7: "jjwaegs" -0xcaf8: "jjwaen" -0xcaf9: "jjwaenj" -0xcafa: "jjwaenh" -0xcafb: "jjwaed" -0xcafc: "jjwael" -0xcafd: "jjwaelg" -0xcafe: "jjwaelm" -0xcaff: "jjwaelb" -/* x0cb */ -0xcb00: "jjwaels" -0xcb01: "jjwaelt" -0xcb02: "jjwaelp" -0xcb03: "jjwaelh" -0xcb04: "jjwaem" -0xcb05: "jjwaeb" -0xcb06: "jjwaebs" -0xcb07: "jjwaes" -0xcb08: "jjwaess" -0xcb09: "jjwaeng" -0xcb0a: "jjwaej" -0xcb0b: "jjwaec" -0xcb0c: "jjwaek" -0xcb0d: "jjwaet" -0xcb0e: "jjwaep" -0xcb0f: "jjwaeh" -0xcb10: "jjoe" -0xcb11: "jjoeg" -0xcb12: "jjoegg" -0xcb13: "jjoegs" -0xcb14: "jjoen" -0xcb15: "jjoenj" -0xcb16: "jjoenh" -0xcb17: "jjoed" -0xcb18: "jjoel" -0xcb19: "jjoelg" -0xcb1a: "jjoelm" -0xcb1b: "jjoelb" -0xcb1c: "jjoels" -0xcb1d: "jjoelt" -0xcb1e: "jjoelp" -0xcb1f: "jjoelh" -0xcb20: "jjoem" -0xcb21: "jjoeb" -0xcb22: "jjoebs" -0xcb23: "jjoes" -0xcb24: "jjoess" -0xcb25: "jjoeng" -0xcb26: "jjoej" -0xcb27: "jjoec" -0xcb28: "jjoek" -0xcb29: "jjoet" -0xcb2a: "jjoep" -0xcb2b: "jjoeh" -0xcb2c: "jjyo" -0xcb2d: "jjyog" -0xcb2e: "jjyogg" -0xcb2f: "jjyogs" -0xcb30: "jjyon" -0xcb31: "jjyonj" -0xcb32: "jjyonh" -0xcb33: "jjyod" -0xcb34: "jjyol" -0xcb35: "jjyolg" -0xcb36: "jjyolm" -0xcb37: "jjyolb" -0xcb38: "jjyols" -0xcb39: "jjyolt" -0xcb3a: "jjyolp" -0xcb3b: "jjyolh" -0xcb3c: "jjyom" -0xcb3d: "jjyob" -0xcb3e: "jjyobs" -0xcb3f: "jjyos" -0xcb40: "jjyoss" -0xcb41: "jjyong" -0xcb42: "jjyoj" -0xcb43: "jjyoc" -0xcb44: "jjyok" -0xcb45: "jjyot" -0xcb46: "jjyop" -0xcb47: "jjyoh" -0xcb48: "jju" -0xcb49: "jjug" -0xcb4a: "jjugg" -0xcb4b: "jjugs" -0xcb4c: "jjun" -0xcb4d: "jjunj" -0xcb4e: "jjunh" -0xcb4f: "jjud" -0xcb50: "jjul" -0xcb51: "jjulg" -0xcb52: "jjulm" -0xcb53: "jjulb" -0xcb54: "jjuls" -0xcb55: "jjult" -0xcb56: "jjulp" -0xcb57: "jjulh" -0xcb58: "jjum" -0xcb59: "jjub" -0xcb5a: "jjubs" -0xcb5b: "jjus" -0xcb5c: "jjuss" -0xcb5d: "jjung" -0xcb5e: "jjuj" -0xcb5f: "jjuc" -0xcb60: "jjuk" -0xcb61: "jjut" -0xcb62: "jjup" -0xcb63: "jjuh" -0xcb64: "jjweo" -0xcb65: "jjweog" -0xcb66: "jjweogg" -0xcb67: "jjweogs" -0xcb68: "jjweon" -0xcb69: "jjweonj" -0xcb6a: "jjweonh" -0xcb6b: "jjweod" -0xcb6c: "jjweol" -0xcb6d: "jjweolg" -0xcb6e: "jjweolm" -0xcb6f: "jjweolb" -0xcb70: "jjweols" -0xcb71: "jjweolt" -0xcb72: "jjweolp" -0xcb73: "jjweolh" -0xcb74: "jjweom" -0xcb75: "jjweob" -0xcb76: "jjweobs" -0xcb77: "jjweos" -0xcb78: "jjweoss" -0xcb79: "jjweong" -0xcb7a: "jjweoj" -0xcb7b: "jjweoc" -0xcb7c: "jjweok" -0xcb7d: "jjweot" -0xcb7e: "jjweop" -0xcb7f: "jjweoh" -0xcb80: "jjwe" -0xcb81: "jjweg" -0xcb82: "jjwegg" -0xcb83: "jjwegs" -0xcb84: "jjwen" -0xcb85: "jjwenj" -0xcb86: "jjwenh" -0xcb87: "jjwed" -0xcb88: "jjwel" -0xcb89: "jjwelg" -0xcb8a: "jjwelm" -0xcb8b: "jjwelb" -0xcb8c: "jjwels" -0xcb8d: "jjwelt" -0xcb8e: "jjwelp" -0xcb8f: "jjwelh" -0xcb90: "jjwem" -0xcb91: "jjweb" -0xcb92: "jjwebs" -0xcb93: "jjwes" -0xcb94: "jjwess" -0xcb95: "jjweng" -0xcb96: "jjwej" -0xcb97: "jjwec" -0xcb98: "jjwek" -0xcb99: "jjwet" -0xcb9a: "jjwep" -0xcb9b: "jjweh" -0xcb9c: "jjwi" -0xcb9d: "jjwig" -0xcb9e: "jjwigg" -0xcb9f: "jjwigs" -0xcba0: "jjwin" -0xcba1: "jjwinj" -0xcba2: "jjwinh" -0xcba3: "jjwid" -0xcba4: "jjwil" -0xcba5: "jjwilg" -0xcba6: "jjwilm" -0xcba7: "jjwilb" -0xcba8: "jjwils" -0xcba9: "jjwilt" -0xcbaa: "jjwilp" -0xcbab: "jjwilh" -0xcbac: "jjwim" -0xcbad: "jjwib" -0xcbae: "jjwibs" -0xcbaf: "jjwis" -0xcbb0: "jjwiss" -0xcbb1: "jjwing" -0xcbb2: "jjwij" -0xcbb3: "jjwic" -0xcbb4: "jjwik" -0xcbb5: "jjwit" -0xcbb6: "jjwip" -0xcbb7: "jjwih" -0xcbb8: "jjyu" -0xcbb9: "jjyug" -0xcbba: "jjyugg" -0xcbbb: "jjyugs" -0xcbbc: "jjyun" -0xcbbd: "jjyunj" -0xcbbe: "jjyunh" -0xcbbf: "jjyud" -0xcbc0: "jjyul" -0xcbc1: "jjyulg" -0xcbc2: "jjyulm" -0xcbc3: "jjyulb" -0xcbc4: "jjyuls" -0xcbc5: "jjyult" -0xcbc6: "jjyulp" -0xcbc7: "jjyulh" -0xcbc8: "jjyum" -0xcbc9: "jjyub" -0xcbca: "jjyubs" -0xcbcb: "jjyus" -0xcbcc: "jjyuss" -0xcbcd: "jjyung" -0xcbce: "jjyuj" -0xcbcf: "jjyuc" -0xcbd0: "jjyuk" -0xcbd1: "jjyut" -0xcbd2: "jjyup" -0xcbd3: "jjyuh" -0xcbd4: "jjeu" -0xcbd5: "jjeug" -0xcbd6: "jjeugg" -0xcbd7: "jjeugs" -0xcbd8: "jjeun" -0xcbd9: "jjeunj" -0xcbda: "jjeunh" -0xcbdb: "jjeud" -0xcbdc: "jjeul" -0xcbdd: "jjeulg" -0xcbde: "jjeulm" -0xcbdf: "jjeulb" -0xcbe0: "jjeuls" -0xcbe1: "jjeult" -0xcbe2: "jjeulp" -0xcbe3: "jjeulh" -0xcbe4: "jjeum" -0xcbe5: "jjeub" -0xcbe6: "jjeubs" -0xcbe7: "jjeus" -0xcbe8: "jjeuss" -0xcbe9: "jjeung" -0xcbea: "jjeuj" -0xcbeb: "jjeuc" -0xcbec: "jjeuk" -0xcbed: "jjeut" -0xcbee: "jjeup" -0xcbef: "jjeuh" -0xcbf0: "jjyi" -0xcbf1: "jjyig" -0xcbf2: "jjyigg" -0xcbf3: "jjyigs" -0xcbf4: "jjyin" -0xcbf5: "jjyinj" -0xcbf6: "jjyinh" -0xcbf7: "jjyid" -0xcbf8: "jjyil" -0xcbf9: "jjyilg" -0xcbfa: "jjyilm" -0xcbfb: "jjyilb" -0xcbfc: "jjyils" -0xcbfd: "jjyilt" -0xcbfe: "jjyilp" -0xcbff: "jjyilh" -/* x0cc */ -0xcc00: "jjyim" -0xcc01: "jjyib" -0xcc02: "jjyibs" -0xcc03: "jjyis" -0xcc04: "jjyiss" -0xcc05: "jjying" -0xcc06: "jjyij" -0xcc07: "jjyic" -0xcc08: "jjyik" -0xcc09: "jjyit" -0xcc0a: "jjyip" -0xcc0b: "jjyih" -0xcc0c: "jji" -0xcc0d: "jjig" -0xcc0e: "jjigg" -0xcc0f: "jjigs" -0xcc10: "jjin" -0xcc11: "jjinj" -0xcc12: "jjinh" -0xcc13: "jjid" -0xcc14: "jjil" -0xcc15: "jjilg" -0xcc16: "jjilm" -0xcc17: "jjilb" -0xcc18: "jjils" -0xcc19: "jjilt" -0xcc1a: "jjilp" -0xcc1b: "jjilh" -0xcc1c: "jjim" -0xcc1d: "jjib" -0xcc1e: "jjibs" -0xcc1f: "jjis" -0xcc20: "jjiss" -0xcc21: "jjing" -0xcc22: "jjij" -0xcc23: "jjic" -0xcc24: "jjik" -0xcc25: "jjit" -0xcc26: "jjip" -0xcc27: "jjih" -0xcc28: "ca" -0xcc29: "cag" -0xcc2a: "cagg" -0xcc2b: "cags" -0xcc2c: "can" -0xcc2d: "canj" -0xcc2e: "canh" -0xcc2f: "cad" -0xcc30: "cal" -0xcc31: "calg" -0xcc32: "calm" -0xcc33: "calb" -0xcc34: "cals" -0xcc35: "calt" -0xcc36: "calp" -0xcc37: "calh" -0xcc38: "cam" -0xcc39: "cab" -0xcc3a: "cabs" -0xcc3b: "cas" -0xcc3c: "cass" -0xcc3d: "cang" -0xcc3e: "caj" -0xcc3f: "cac" -0xcc40: "cak" -0xcc41: "cat" -0xcc42: "cap" -0xcc43: "cah" -0xcc44: "cae" -0xcc45: "caeg" -0xcc46: "caegg" -0xcc47: "caegs" -0xcc48: "caen" -0xcc49: "caenj" -0xcc4a: "caenh" -0xcc4b: "caed" -0xcc4c: "cael" -0xcc4d: "caelg" -0xcc4e: "caelm" -0xcc4f: "caelb" -0xcc50: "caels" -0xcc51: "caelt" -0xcc52: "caelp" -0xcc53: "caelh" -0xcc54: "caem" -0xcc55: "caeb" -0xcc56: "caebs" -0xcc57: "caes" -0xcc58: "caess" -0xcc59: "caeng" -0xcc5a: "caej" -0xcc5b: "caec" -0xcc5c: "caek" -0xcc5d: "caet" -0xcc5e: "caep" -0xcc5f: "caeh" -0xcc60: "cya" -0xcc61: "cyag" -0xcc62: "cyagg" -0xcc63: "cyags" -0xcc64: "cyan" -0xcc65: "cyanj" -0xcc66: "cyanh" -0xcc67: "cyad" -0xcc68: "cyal" -0xcc69: "cyalg" -0xcc6a: "cyalm" -0xcc6b: "cyalb" -0xcc6c: "cyals" -0xcc6d: "cyalt" -0xcc6e: "cyalp" -0xcc6f: "cyalh" -0xcc70: "cyam" -0xcc71: "cyab" -0xcc72: "cyabs" -0xcc73: "cyas" -0xcc74: "cyass" -0xcc75: "cyang" -0xcc76: "cyaj" -0xcc77: "cyac" -0xcc78: "cyak" -0xcc79: "cyat" -0xcc7a: "cyap" -0xcc7b: "cyah" -0xcc7c: "cyae" -0xcc7d: "cyaeg" -0xcc7e: "cyaegg" -0xcc7f: "cyaegs" -0xcc80: "cyaen" -0xcc81: "cyaenj" -0xcc82: "cyaenh" -0xcc83: "cyaed" -0xcc84: "cyael" -0xcc85: "cyaelg" -0xcc86: "cyaelm" -0xcc87: "cyaelb" -0xcc88: "cyaels" -0xcc89: "cyaelt" -0xcc8a: "cyaelp" -0xcc8b: "cyaelh" -0xcc8c: "cyaem" -0xcc8d: "cyaeb" -0xcc8e: "cyaebs" -0xcc8f: "cyaes" -0xcc90: "cyaess" -0xcc91: "cyaeng" -0xcc92: "cyaej" -0xcc93: "cyaec" -0xcc94: "cyaek" -0xcc95: "cyaet" -0xcc96: "cyaep" -0xcc97: "cyaeh" -0xcc98: "ceo" -0xcc99: "ceog" -0xcc9a: "ceogg" -0xcc9b: "ceogs" -0xcc9c: "ceon" -0xcc9d: "ceonj" -0xcc9e: "ceonh" -0xcc9f: "ceod" -0xcca0: "ceol" -0xcca1: "ceolg" -0xcca2: "ceolm" -0xcca3: "ceolb" -0xcca4: "ceols" -0xcca5: "ceolt" -0xcca6: "ceolp" -0xcca7: "ceolh" -0xcca8: "ceom" -0xcca9: "ceob" -0xccaa: "ceobs" -0xccab: "ceos" -0xccac: "ceoss" -0xccad: "ceong" -0xccae: "ceoj" -0xccaf: "ceoc" -0xccb0: "ceok" -0xccb1: "ceot" -0xccb2: "ceop" -0xccb3: "ceoh" -0xccb4: "ce" -0xccb5: "ceg" -0xccb6: "cegg" -0xccb7: "cegs" -0xccb8: "cen" -0xccb9: "cenj" -0xccba: "cenh" -0xccbb: "ced" -0xccbc: "cel" -0xccbd: "celg" -0xccbe: "celm" -0xccbf: "celb" -0xccc0: "cels" -0xccc1: "celt" -0xccc2: "celp" -0xccc3: "celh" -0xccc4: "cem" -0xccc5: "ceb" -0xccc6: "cebs" -0xccc7: "ces" -0xccc8: "cess" -0xccc9: "ceng" -0xccca: "cej" -0xcccb: "cec" -0xcccc: "cek" -0xcccd: "cet" -0xccce: "cep" -0xcccf: "ceh" -0xccd0: "cyeo" -0xccd1: "cyeog" -0xccd2: "cyeogg" -0xccd3: "cyeogs" -0xccd4: "cyeon" -0xccd5: "cyeonj" -0xccd6: "cyeonh" -0xccd7: "cyeod" -0xccd8: "cyeol" -0xccd9: "cyeolg" -0xccda: "cyeolm" -0xccdb: "cyeolb" -0xccdc: "cyeols" -0xccdd: "cyeolt" -0xccde: "cyeolp" -0xccdf: "cyeolh" -0xcce0: "cyeom" -0xcce1: "cyeob" -0xcce2: "cyeobs" -0xcce3: "cyeos" -0xcce4: "cyeoss" -0xcce5: "cyeong" -0xcce6: "cyeoj" -0xcce7: "cyeoc" -0xcce8: "cyeok" -0xcce9: "cyeot" -0xccea: "cyeop" -0xcceb: "cyeoh" -0xccec: "cye" -0xcced: "cyeg" -0xccee: "cyegg" -0xccef: "cyegs" -0xccf0: "cyen" -0xccf1: "cyenj" -0xccf2: "cyenh" -0xccf3: "cyed" -0xccf4: "cyel" -0xccf5: "cyelg" -0xccf6: "cyelm" -0xccf7: "cyelb" -0xccf8: "cyels" -0xccf9: "cyelt" -0xccfa: "cyelp" -0xccfb: "cyelh" -0xccfc: "cyem" -0xccfd: "cyeb" -0xccfe: "cyebs" -0xccff: "cyes" -/* x0cd */ -0xcd00: "cyess" -0xcd01: "cyeng" -0xcd02: "cyej" -0xcd03: "cyec" -0xcd04: "cyek" -0xcd05: "cyet" -0xcd06: "cyep" -0xcd07: "cyeh" -0xcd08: "co" -0xcd09: "cog" -0xcd0a: "cogg" -0xcd0b: "cogs" -0xcd0c: "con" -0xcd0d: "conj" -0xcd0e: "conh" -0xcd0f: "cod" -0xcd10: "col" -0xcd11: "colg" -0xcd12: "colm" -0xcd13: "colb" -0xcd14: "cols" -0xcd15: "colt" -0xcd16: "colp" -0xcd17: "colh" -0xcd18: "com" -0xcd19: "cob" -0xcd1a: "cobs" -0xcd1b: "cos" -0xcd1c: "coss" -0xcd1d: "cong" -0xcd1e: "coj" -0xcd1f: "coc" -0xcd20: "cok" -0xcd21: "cot" -0xcd22: "cop" -0xcd23: "coh" -0xcd24: "cwa" -0xcd25: "cwag" -0xcd26: "cwagg" -0xcd27: "cwags" -0xcd28: "cwan" -0xcd29: "cwanj" -0xcd2a: "cwanh" -0xcd2b: "cwad" -0xcd2c: "cwal" -0xcd2d: "cwalg" -0xcd2e: "cwalm" -0xcd2f: "cwalb" -0xcd30: "cwals" -0xcd31: "cwalt" -0xcd32: "cwalp" -0xcd33: "cwalh" -0xcd34: "cwam" -0xcd35: "cwab" -0xcd36: "cwabs" -0xcd37: "cwas" -0xcd38: "cwass" -0xcd39: "cwang" -0xcd3a: "cwaj" -0xcd3b: "cwac" -0xcd3c: "cwak" -0xcd3d: "cwat" -0xcd3e: "cwap" -0xcd3f: "cwah" -0xcd40: "cwae" -0xcd41: "cwaeg" -0xcd42: "cwaegg" -0xcd43: "cwaegs" -0xcd44: "cwaen" -0xcd45: "cwaenj" -0xcd46: "cwaenh" -0xcd47: "cwaed" -0xcd48: "cwael" -0xcd49: "cwaelg" -0xcd4a: "cwaelm" -0xcd4b: "cwaelb" -0xcd4c: "cwaels" -0xcd4d: "cwaelt" -0xcd4e: "cwaelp" -0xcd4f: "cwaelh" -0xcd50: "cwaem" -0xcd51: "cwaeb" -0xcd52: "cwaebs" -0xcd53: "cwaes" -0xcd54: "cwaess" -0xcd55: "cwaeng" -0xcd56: "cwaej" -0xcd57: "cwaec" -0xcd58: "cwaek" -0xcd59: "cwaet" -0xcd5a: "cwaep" -0xcd5b: "cwaeh" -0xcd5c: "coe" -0xcd5d: "coeg" -0xcd5e: "coegg" -0xcd5f: "coegs" -0xcd60: "coen" -0xcd61: "coenj" -0xcd62: "coenh" -0xcd63: "coed" -0xcd64: "coel" -0xcd65: "coelg" -0xcd66: "coelm" -0xcd67: "coelb" -0xcd68: "coels" -0xcd69: "coelt" -0xcd6a: "coelp" -0xcd6b: "coelh" -0xcd6c: "coem" -0xcd6d: "coeb" -0xcd6e: "coebs" -0xcd6f: "coes" -0xcd70: "coess" -0xcd71: "coeng" -0xcd72: "coej" -0xcd73: "coec" -0xcd74: "coek" -0xcd75: "coet" -0xcd76: "coep" -0xcd77: "coeh" -0xcd78: "cyo" -0xcd79: "cyog" -0xcd7a: "cyogg" -0xcd7b: "cyogs" -0xcd7c: "cyon" -0xcd7d: "cyonj" -0xcd7e: "cyonh" -0xcd7f: "cyod" -0xcd80: "cyol" -0xcd81: "cyolg" -0xcd82: "cyolm" -0xcd83: "cyolb" -0xcd84: "cyols" -0xcd85: "cyolt" -0xcd86: "cyolp" -0xcd87: "cyolh" -0xcd88: "cyom" -0xcd89: "cyob" -0xcd8a: "cyobs" -0xcd8b: "cyos" -0xcd8c: "cyoss" -0xcd8d: "cyong" -0xcd8e: "cyoj" -0xcd8f: "cyoc" -0xcd90: "cyok" -0xcd91: "cyot" -0xcd92: "cyop" -0xcd93: "cyoh" -0xcd94: "cu" -0xcd95: "cug" -0xcd96: "cugg" -0xcd97: "cugs" -0xcd98: "cun" -0xcd99: "cunj" -0xcd9a: "cunh" -0xcd9b: "cud" -0xcd9c: "cul" -0xcd9d: "culg" -0xcd9e: "culm" -0xcd9f: "culb" -0xcda0: "culs" -0xcda1: "cult" -0xcda2: "culp" -0xcda3: "culh" -0xcda4: "cum" -0xcda5: "cub" -0xcda6: "cubs" -0xcda7: "cus" -0xcda8: "cuss" -0xcda9: "cung" -0xcdaa: "cuj" -0xcdab: "cuc" -0xcdac: "cuk" -0xcdad: "cut" -0xcdae: "cup" -0xcdaf: "cuh" -0xcdb0: "cweo" -0xcdb1: "cweog" -0xcdb2: "cweogg" -0xcdb3: "cweogs" -0xcdb4: "cweon" -0xcdb5: "cweonj" -0xcdb6: "cweonh" -0xcdb7: "cweod" -0xcdb8: "cweol" -0xcdb9: "cweolg" -0xcdba: "cweolm" -0xcdbb: "cweolb" -0xcdbc: "cweols" -0xcdbd: "cweolt" -0xcdbe: "cweolp" -0xcdbf: "cweolh" -0xcdc0: "cweom" -0xcdc1: "cweob" -0xcdc2: "cweobs" -0xcdc3: "cweos" -0xcdc4: "cweoss" -0xcdc5: "cweong" -0xcdc6: "cweoj" -0xcdc7: "cweoc" -0xcdc8: "cweok" -0xcdc9: "cweot" -0xcdca: "cweop" -0xcdcb: "cweoh" -0xcdcc: "cwe" -0xcdcd: "cweg" -0xcdce: "cwegg" -0xcdcf: "cwegs" -0xcdd0: "cwen" -0xcdd1: "cwenj" -0xcdd2: "cwenh" -0xcdd3: "cwed" -0xcdd4: "cwel" -0xcdd5: "cwelg" -0xcdd6: "cwelm" -0xcdd7: "cwelb" -0xcdd8: "cwels" -0xcdd9: "cwelt" -0xcdda: "cwelp" -0xcddb: "cwelh" -0xcddc: "cwem" -0xcddd: "cweb" -0xcdde: "cwebs" -0xcddf: "cwes" -0xcde0: "cwess" -0xcde1: "cweng" -0xcde2: "cwej" -0xcde3: "cwec" -0xcde4: "cwek" -0xcde5: "cwet" -0xcde6: "cwep" -0xcde7: "cweh" -0xcde8: "cwi" -0xcde9: "cwig" -0xcdea: "cwigg" -0xcdeb: "cwigs" -0xcdec: "cwin" -0xcded: "cwinj" -0xcdee: "cwinh" -0xcdef: "cwid" -0xcdf0: "cwil" -0xcdf1: "cwilg" -0xcdf2: "cwilm" -0xcdf3: "cwilb" -0xcdf4: "cwils" -0xcdf5: "cwilt" -0xcdf6: "cwilp" -0xcdf7: "cwilh" -0xcdf8: "cwim" -0xcdf9: "cwib" -0xcdfa: "cwibs" -0xcdfb: "cwis" -0xcdfc: "cwiss" -0xcdfd: "cwing" -0xcdfe: "cwij" -0xcdff: "cwic" -/* x0ce */ -0xce00: "cwik" -0xce01: "cwit" -0xce02: "cwip" -0xce03: "cwih" -0xce04: "cyu" -0xce05: "cyug" -0xce06: "cyugg" -0xce07: "cyugs" -0xce08: "cyun" -0xce09: "cyunj" -0xce0a: "cyunh" -0xce0b: "cyud" -0xce0c: "cyul" -0xce0d: "cyulg" -0xce0e: "cyulm" -0xce0f: "cyulb" -0xce10: "cyuls" -0xce11: "cyult" -0xce12: "cyulp" -0xce13: "cyulh" -0xce14: "cyum" -0xce15: "cyub" -0xce16: "cyubs" -0xce17: "cyus" -0xce18: "cyuss" -0xce19: "cyung" -0xce1a: "cyuj" -0xce1b: "cyuc" -0xce1c: "cyuk" -0xce1d: "cyut" -0xce1e: "cyup" -0xce1f: "cyuh" -0xce20: "ceu" -0xce21: "ceug" -0xce22: "ceugg" -0xce23: "ceugs" -0xce24: "ceun" -0xce25: "ceunj" -0xce26: "ceunh" -0xce27: "ceud" -0xce28: "ceul" -0xce29: "ceulg" -0xce2a: "ceulm" -0xce2b: "ceulb" -0xce2c: "ceuls" -0xce2d: "ceult" -0xce2e: "ceulp" -0xce2f: "ceulh" -0xce30: "ceum" -0xce31: "ceub" -0xce32: "ceubs" -0xce33: "ceus" -0xce34: "ceuss" -0xce35: "ceung" -0xce36: "ceuj" -0xce37: "ceuc" -0xce38: "ceuk" -0xce39: "ceut" -0xce3a: "ceup" -0xce3b: "ceuh" -0xce3c: "cyi" -0xce3d: "cyig" -0xce3e: "cyigg" -0xce3f: "cyigs" -0xce40: "cyin" -0xce41: "cyinj" -0xce42: "cyinh" -0xce43: "cyid" -0xce44: "cyil" -0xce45: "cyilg" -0xce46: "cyilm" -0xce47: "cyilb" -0xce48: "cyils" -0xce49: "cyilt" -0xce4a: "cyilp" -0xce4b: "cyilh" -0xce4c: "cyim" -0xce4d: "cyib" -0xce4e: "cyibs" -0xce4f: "cyis" -0xce50: "cyiss" -0xce51: "cying" -0xce52: "cyij" -0xce53: "cyic" -0xce54: "cyik" -0xce55: "cyit" -0xce56: "cyip" -0xce57: "cyih" -0xce58: "ci" -0xce59: "cig" -0xce5a: "cigg" -0xce5b: "cigs" -0xce5c: "cin" -0xce5d: "cinj" -0xce5e: "cinh" -0xce5f: "cid" -0xce60: "cil" -0xce61: "cilg" -0xce62: "cilm" -0xce63: "cilb" -0xce64: "cils" -0xce65: "cilt" -0xce66: "cilp" -0xce67: "cilh" -0xce68: "cim" -0xce69: "cib" -0xce6a: "cibs" -0xce6b: "cis" -0xce6c: "ciss" -0xce6d: "cing" -0xce6e: "cij" -0xce6f: "cic" -0xce70: "cik" -0xce71: "cit" -0xce72: "cip" -0xce73: "cih" -0xce74: "ka" -0xce75: "kag" -0xce76: "kagg" -0xce77: "kags" -0xce78: "kan" -0xce79: "kanj" -0xce7a: "kanh" -0xce7b: "kad" -0xce7c: "kal" -0xce7d: "kalg" -0xce7e: "kalm" -0xce7f: "kalb" -0xce80: "kals" -0xce81: "kalt" -0xce82: "kalp" -0xce83: "kalh" -0xce84: "kam" -0xce85: "kab" -0xce86: "kabs" -0xce87: "kas" -0xce88: "kass" -0xce89: "kang" -0xce8a: "kaj" -0xce8b: "kac" -0xce8c: "kak" -0xce8d: "kat" -0xce8e: "kap" -0xce8f: "kah" -0xce90: "kae" -0xce91: "kaeg" -0xce92: "kaegg" -0xce93: "kaegs" -0xce94: "kaen" -0xce95: "kaenj" -0xce96: "kaenh" -0xce97: "kaed" -0xce98: "kael" -0xce99: "kaelg" -0xce9a: "kaelm" -0xce9b: "kaelb" -0xce9c: "kaels" -0xce9d: "kaelt" -0xce9e: "kaelp" -0xce9f: "kaelh" -0xcea0: "kaem" -0xcea1: "kaeb" -0xcea2: "kaebs" -0xcea3: "kaes" -0xcea4: "kaess" -0xcea5: "kaeng" -0xcea6: "kaej" -0xcea7: "kaec" -0xcea8: "kaek" -0xcea9: "kaet" -0xceaa: "kaep" -0xceab: "kaeh" -0xceac: "kya" -0xcead: "kyag" -0xceae: "kyagg" -0xceaf: "kyags" -0xceb0: "kyan" -0xceb1: "kyanj" -0xceb2: "kyanh" -0xceb3: "kyad" -0xceb4: "kyal" -0xceb5: "kyalg" -0xceb6: "kyalm" -0xceb7: "kyalb" -0xceb8: "kyals" -0xceb9: "kyalt" -0xceba: "kyalp" -0xcebb: "kyalh" -0xcebc: "kyam" -0xcebd: "kyab" -0xcebe: "kyabs" -0xcebf: "kyas" -0xcec0: "kyass" -0xcec1: "kyang" -0xcec2: "kyaj" -0xcec3: "kyac" -0xcec4: "kyak" -0xcec5: "kyat" -0xcec6: "kyap" -0xcec7: "kyah" -0xcec8: "kyae" -0xcec9: "kyaeg" -0xceca: "kyaegg" -0xcecb: "kyaegs" -0xcecc: "kyaen" -0xcecd: "kyaenj" -0xcece: "kyaenh" -0xcecf: "kyaed" -0xced0: "kyael" -0xced1: "kyaelg" -0xced2: "kyaelm" -0xced3: "kyaelb" -0xced4: "kyaels" -0xced5: "kyaelt" -0xced6: "kyaelp" -0xced7: "kyaelh" -0xced8: "kyaem" -0xced9: "kyaeb" -0xceda: "kyaebs" -0xcedb: "kyaes" -0xcedc: "kyaess" -0xcedd: "kyaeng" -0xcede: "kyaej" -0xcedf: "kyaec" -0xcee0: "kyaek" -0xcee1: "kyaet" -0xcee2: "kyaep" -0xcee3: "kyaeh" -0xcee4: "keo" -0xcee5: "keog" -0xcee6: "keogg" -0xcee7: "keogs" -0xcee8: "keon" -0xcee9: "keonj" -0xceea: "keonh" -0xceeb: "keod" -0xceec: "keol" -0xceed: "keolg" -0xceee: "keolm" -0xceef: "keolb" -0xcef0: "keols" -0xcef1: "keolt" -0xcef2: "keolp" -0xcef3: "keolh" -0xcef4: "keom" -0xcef5: "keob" -0xcef6: "keobs" -0xcef7: "keos" -0xcef8: "keoss" -0xcef9: "keong" -0xcefa: "keoj" -0xcefb: "keoc" -0xcefc: "keok" -0xcefd: "keot" -0xcefe: "keop" -0xceff: "keoh" -/* x0cf */ -0xcf00: "ke" -0xcf01: "keg" -0xcf02: "kegg" -0xcf03: "kegs" -0xcf04: "ken" -0xcf05: "kenj" -0xcf06: "kenh" -0xcf07: "ked" -0xcf08: "kel" -0xcf09: "kelg" -0xcf0a: "kelm" -0xcf0b: "kelb" -0xcf0c: "kels" -0xcf0d: "kelt" -0xcf0e: "kelp" -0xcf0f: "kelh" -0xcf10: "kem" -0xcf11: "keb" -0xcf12: "kebs" -0xcf13: "kes" -0xcf14: "kess" -0xcf15: "keng" -0xcf16: "kej" -0xcf17: "kec" -0xcf18: "kek" -0xcf19: "ket" -0xcf1a: "kep" -0xcf1b: "keh" -0xcf1c: "kyeo" -0xcf1d: "kyeog" -0xcf1e: "kyeogg" -0xcf1f: "kyeogs" -0xcf20: "kyeon" -0xcf21: "kyeonj" -0xcf22: "kyeonh" -0xcf23: "kyeod" -0xcf24: "kyeol" -0xcf25: "kyeolg" -0xcf26: "kyeolm" -0xcf27: "kyeolb" -0xcf28: "kyeols" -0xcf29: "kyeolt" -0xcf2a: "kyeolp" -0xcf2b: "kyeolh" -0xcf2c: "kyeom" -0xcf2d: "kyeob" -0xcf2e: "kyeobs" -0xcf2f: "kyeos" -0xcf30: "kyeoss" -0xcf31: "kyeong" -0xcf32: "kyeoj" -0xcf33: "kyeoc" -0xcf34: "kyeok" -0xcf35: "kyeot" -0xcf36: "kyeop" -0xcf37: "kyeoh" -0xcf38: "kye" -0xcf39: "kyeg" -0xcf3a: "kyegg" -0xcf3b: "kyegs" -0xcf3c: "kyen" -0xcf3d: "kyenj" -0xcf3e: "kyenh" -0xcf3f: "kyed" -0xcf40: "kyel" -0xcf41: "kyelg" -0xcf42: "kyelm" -0xcf43: "kyelb" -0xcf44: "kyels" -0xcf45: "kyelt" -0xcf46: "kyelp" -0xcf47: "kyelh" -0xcf48: "kyem" -0xcf49: "kyeb" -0xcf4a: "kyebs" -0xcf4b: "kyes" -0xcf4c: "kyess" -0xcf4d: "kyeng" -0xcf4e: "kyej" -0xcf4f: "kyec" -0xcf50: "kyek" -0xcf51: "kyet" -0xcf52: "kyep" -0xcf53: "kyeh" -0xcf54: "ko" -0xcf55: "kog" -0xcf56: "kogg" -0xcf57: "kogs" -0xcf58: "kon" -0xcf59: "konj" -0xcf5a: "konh" -0xcf5b: "kod" -0xcf5c: "kol" -0xcf5d: "kolg" -0xcf5e: "kolm" -0xcf5f: "kolb" -0xcf60: "kols" -0xcf61: "kolt" -0xcf62: "kolp" -0xcf63: "kolh" -0xcf64: "kom" -0xcf65: "kob" -0xcf66: "kobs" -0xcf67: "kos" -0xcf68: "koss" -0xcf69: "kong" -0xcf6a: "koj" -0xcf6b: "koc" -0xcf6c: "kok" -0xcf6d: "kot" -0xcf6e: "kop" -0xcf6f: "koh" -0xcf70: "kwa" -0xcf71: "kwag" -0xcf72: "kwagg" -0xcf73: "kwags" -0xcf74: "kwan" -0xcf75: "kwanj" -0xcf76: "kwanh" -0xcf77: "kwad" -0xcf78: "kwal" -0xcf79: "kwalg" -0xcf7a: "kwalm" -0xcf7b: "kwalb" -0xcf7c: "kwals" -0xcf7d: "kwalt" -0xcf7e: "kwalp" -0xcf7f: "kwalh" -0xcf80: "kwam" -0xcf81: "kwab" -0xcf82: "kwabs" -0xcf83: "kwas" -0xcf84: "kwass" -0xcf85: "kwang" -0xcf86: "kwaj" -0xcf87: "kwac" -0xcf88: "kwak" -0xcf89: "kwat" -0xcf8a: "kwap" -0xcf8b: "kwah" -0xcf8c: "kwae" -0xcf8d: "kwaeg" -0xcf8e: "kwaegg" -0xcf8f: "kwaegs" -0xcf90: "kwaen" -0xcf91: "kwaenj" -0xcf92: "kwaenh" -0xcf93: "kwaed" -0xcf94: "kwael" -0xcf95: "kwaelg" -0xcf96: "kwaelm" -0xcf97: "kwaelb" -0xcf98: "kwaels" -0xcf99: "kwaelt" -0xcf9a: "kwaelp" -0xcf9b: "kwaelh" -0xcf9c: "kwaem" -0xcf9d: "kwaeb" -0xcf9e: "kwaebs" -0xcf9f: "kwaes" -0xcfa0: "kwaess" -0xcfa1: "kwaeng" -0xcfa2: "kwaej" -0xcfa3: "kwaec" -0xcfa4: "kwaek" -0xcfa5: "kwaet" -0xcfa6: "kwaep" -0xcfa7: "kwaeh" -0xcfa8: "koe" -0xcfa9: "koeg" -0xcfaa: "koegg" -0xcfab: "koegs" -0xcfac: "koen" -0xcfad: "koenj" -0xcfae: "koenh" -0xcfaf: "koed" -0xcfb0: "koel" -0xcfb1: "koelg" -0xcfb2: "koelm" -0xcfb3: "koelb" -0xcfb4: "koels" -0xcfb5: "koelt" -0xcfb6: "koelp" -0xcfb7: "koelh" -0xcfb8: "koem" -0xcfb9: "koeb" -0xcfba: "koebs" -0xcfbb: "koes" -0xcfbc: "koess" -0xcfbd: "koeng" -0xcfbe: "koej" -0xcfbf: "koec" -0xcfc0: "koek" -0xcfc1: "koet" -0xcfc2: "koep" -0xcfc3: "koeh" -0xcfc4: "kyo" -0xcfc5: "kyog" -0xcfc6: "kyogg" -0xcfc7: "kyogs" -0xcfc8: "kyon" -0xcfc9: "kyonj" -0xcfca: "kyonh" -0xcfcb: "kyod" -0xcfcc: "kyol" -0xcfcd: "kyolg" -0xcfce: "kyolm" -0xcfcf: "kyolb" -0xcfd0: "kyols" -0xcfd1: "kyolt" -0xcfd2: "kyolp" -0xcfd3: "kyolh" -0xcfd4: "kyom" -0xcfd5: "kyob" -0xcfd6: "kyobs" -0xcfd7: "kyos" -0xcfd8: "kyoss" -0xcfd9: "kyong" -0xcfda: "kyoj" -0xcfdb: "kyoc" -0xcfdc: "kyok" -0xcfdd: "kyot" -0xcfde: "kyop" -0xcfdf: "kyoh" -0xcfe0: "ku" -0xcfe1: "kug" -0xcfe2: "kugg" -0xcfe3: "kugs" -0xcfe4: "kun" -0xcfe5: "kunj" -0xcfe6: "kunh" -0xcfe7: "kud" -0xcfe8: "kul" -0xcfe9: "kulg" -0xcfea: "kulm" -0xcfeb: "kulb" -0xcfec: "kuls" -0xcfed: "kult" -0xcfee: "kulp" -0xcfef: "kulh" -0xcff0: "kum" -0xcff1: "kub" -0xcff2: "kubs" -0xcff3: "kus" -0xcff4: "kuss" -0xcff5: "kung" -0xcff6: "kuj" -0xcff7: "kuc" -0xcff8: "kuk" -0xcff9: "kut" -0xcffa: "kup" -0xcffb: "kuh" -0xcffc: "kweo" -0xcffd: "kweog" -0xcffe: "kweogg" -0xcfff: "kweogs" -/* x0d0 */ -0xd000: "kweon" -0xd001: "kweonj" -0xd002: "kweonh" -0xd003: "kweod" -0xd004: "kweol" -0xd005: "kweolg" -0xd006: "kweolm" -0xd007: "kweolb" -0xd008: "kweols" -0xd009: "kweolt" -0xd00a: "kweolp" -0xd00b: "kweolh" -0xd00c: "kweom" -0xd00d: "kweob" -0xd00e: "kweobs" -0xd00f: "kweos" -0xd010: "kweoss" -0xd011: "kweong" -0xd012: "kweoj" -0xd013: "kweoc" -0xd014: "kweok" -0xd015: "kweot" -0xd016: "kweop" -0xd017: "kweoh" -0xd018: "kwe" -0xd019: "kweg" -0xd01a: "kwegg" -0xd01b: "kwegs" -0xd01c: "kwen" -0xd01d: "kwenj" -0xd01e: "kwenh" -0xd01f: "kwed" -0xd020: "kwel" -0xd021: "kwelg" -0xd022: "kwelm" -0xd023: "kwelb" -0xd024: "kwels" -0xd025: "kwelt" -0xd026: "kwelp" -0xd027: "kwelh" -0xd028: "kwem" -0xd029: "kweb" -0xd02a: "kwebs" -0xd02b: "kwes" -0xd02c: "kwess" -0xd02d: "kweng" -0xd02e: "kwej" -0xd02f: "kwec" -0xd030: "kwek" -0xd031: "kwet" -0xd032: "kwep" -0xd033: "kweh" -0xd034: "kwi" -0xd035: "kwig" -0xd036: "kwigg" -0xd037: "kwigs" -0xd038: "kwin" -0xd039: "kwinj" -0xd03a: "kwinh" -0xd03b: "kwid" -0xd03c: "kwil" -0xd03d: "kwilg" -0xd03e: "kwilm" -0xd03f: "kwilb" -0xd040: "kwils" -0xd041: "kwilt" -0xd042: "kwilp" -0xd043: "kwilh" -0xd044: "kwim" -0xd045: "kwib" -0xd046: "kwibs" -0xd047: "kwis" -0xd048: "kwiss" -0xd049: "kwing" -0xd04a: "kwij" -0xd04b: "kwic" -0xd04c: "kwik" -0xd04d: "kwit" -0xd04e: "kwip" -0xd04f: "kwih" -0xd050: "kyu" -0xd051: "kyug" -0xd052: "kyugg" -0xd053: "kyugs" -0xd054: "kyun" -0xd055: "kyunj" -0xd056: "kyunh" -0xd057: "kyud" -0xd058: "kyul" -0xd059: "kyulg" -0xd05a: "kyulm" -0xd05b: "kyulb" -0xd05c: "kyuls" -0xd05d: "kyult" -0xd05e: "kyulp" -0xd05f: "kyulh" -0xd060: "kyum" -0xd061: "kyub" -0xd062: "kyubs" -0xd063: "kyus" -0xd064: "kyuss" -0xd065: "kyung" -0xd066: "kyuj" -0xd067: "kyuc" -0xd068: "kyuk" -0xd069: "kyut" -0xd06a: "kyup" -0xd06b: "kyuh" -0xd06c: "keu" -0xd06d: "keug" -0xd06e: "keugg" -0xd06f: "keugs" -0xd070: "keun" -0xd071: "keunj" -0xd072: "keunh" -0xd073: "keud" -0xd074: "keul" -0xd075: "keulg" -0xd076: "keulm" -0xd077: "keulb" -0xd078: "keuls" -0xd079: "keult" -0xd07a: "keulp" -0xd07b: "keulh" -0xd07c: "keum" -0xd07d: "keub" -0xd07e: "keubs" -0xd07f: "keus" -0xd080: "keuss" -0xd081: "keung" -0xd082: "keuj" -0xd083: "keuc" -0xd084: "keuk" -0xd085: "keut" -0xd086: "keup" -0xd087: "keuh" -0xd088: "kyi" -0xd089: "kyig" -0xd08a: "kyigg" -0xd08b: "kyigs" -0xd08c: "kyin" -0xd08d: "kyinj" -0xd08e: "kyinh" -0xd08f: "kyid" -0xd090: "kyil" -0xd091: "kyilg" -0xd092: "kyilm" -0xd093: "kyilb" -0xd094: "kyils" -0xd095: "kyilt" -0xd096: "kyilp" -0xd097: "kyilh" -0xd098: "kyim" -0xd099: "kyib" -0xd09a: "kyibs" -0xd09b: "kyis" -0xd09c: "kyiss" -0xd09d: "kying" -0xd09e: "kyij" -0xd09f: "kyic" -0xd0a0: "kyik" -0xd0a1: "kyit" -0xd0a2: "kyip" -0xd0a3: "kyih" -0xd0a4: "ki" -0xd0a5: "kig" -0xd0a6: "kigg" -0xd0a7: "kigs" -0xd0a8: "kin" -0xd0a9: "kinj" -0xd0aa: "kinh" -0xd0ab: "kid" -0xd0ac: "kil" -0xd0ad: "kilg" -0xd0ae: "kilm" -0xd0af: "kilb" -0xd0b0: "kils" -0xd0b1: "kilt" -0xd0b2: "kilp" -0xd0b3: "kilh" -0xd0b4: "kim" -0xd0b5: "kib" -0xd0b6: "kibs" -0xd0b7: "kis" -0xd0b8: "kiss" -0xd0b9: "king" -0xd0ba: "kij" -0xd0bb: "kic" -0xd0bc: "kik" -0xd0bd: "kit" -0xd0be: "kip" -0xd0bf: "kih" -0xd0c0: "ta" -0xd0c1: "tag" -0xd0c2: "tagg" -0xd0c3: "tags" -0xd0c4: "tan" -0xd0c5: "tanj" -0xd0c6: "tanh" -0xd0c7: "tad" -0xd0c8: "tal" -0xd0c9: "talg" -0xd0ca: "talm" -0xd0cb: "talb" -0xd0cc: "tals" -0xd0cd: "talt" -0xd0ce: "talp" -0xd0cf: "talh" -0xd0d0: "tam" -0xd0d1: "tab" -0xd0d2: "tabs" -0xd0d3: "tas" -0xd0d4: "tass" -0xd0d5: "tang" -0xd0d6: "taj" -0xd0d7: "tac" -0xd0d8: "tak" -0xd0d9: "tat" -0xd0da: "tap" -0xd0db: "tah" -0xd0dc: "tae" -0xd0dd: "taeg" -0xd0de: "taegg" -0xd0df: "taegs" -0xd0e0: "taen" -0xd0e1: "taenj" -0xd0e2: "taenh" -0xd0e3: "taed" -0xd0e4: "tael" -0xd0e5: "taelg" -0xd0e6: "taelm" -0xd0e7: "taelb" -0xd0e8: "taels" -0xd0e9: "taelt" -0xd0ea: "taelp" -0xd0eb: "taelh" -0xd0ec: "taem" -0xd0ed: "taeb" -0xd0ee: "taebs" -0xd0ef: "taes" -0xd0f0: "taess" -0xd0f1: "taeng" -0xd0f2: "taej" -0xd0f3: "taec" -0xd0f4: "taek" -0xd0f5: "taet" -0xd0f6: "taep" -0xd0f7: "taeh" -0xd0f8: "tya" -0xd0f9: "tyag" -0xd0fa: "tyagg" -0xd0fb: "tyags" -0xd0fc: "tyan" -0xd0fd: "tyanj" -0xd0fe: "tyanh" -0xd0ff: "tyad" -/* x0d1 */ -0xd100: "tyal" -0xd101: "tyalg" -0xd102: "tyalm" -0xd103: "tyalb" -0xd104: "tyals" -0xd105: "tyalt" -0xd106: "tyalp" -0xd107: "tyalh" -0xd108: "tyam" -0xd109: "tyab" -0xd10a: "tyabs" -0xd10b: "tyas" -0xd10c: "tyass" -0xd10d: "tyang" -0xd10e: "tyaj" -0xd10f: "tyac" -0xd110: "tyak" -0xd111: "tyat" -0xd112: "tyap" -0xd113: "tyah" -0xd114: "tyae" -0xd115: "tyaeg" -0xd116: "tyaegg" -0xd117: "tyaegs" -0xd118: "tyaen" -0xd119: "tyaenj" -0xd11a: "tyaenh" -0xd11b: "tyaed" -0xd11c: "tyael" -0xd11d: "tyaelg" -0xd11e: "tyaelm" -0xd11f: "tyaelb" -0xd120: "tyaels" -0xd121: "tyaelt" -0xd122: "tyaelp" -0xd123: "tyaelh" -0xd124: "tyaem" -0xd125: "tyaeb" -0xd126: "tyaebs" -0xd127: "tyaes" -0xd128: "tyaess" -0xd129: "tyaeng" -0xd12a: "tyaej" -0xd12b: "tyaec" -0xd12c: "tyaek" -0xd12d: "tyaet" -0xd12e: "tyaep" -0xd12f: "tyaeh" -0xd130: "teo" -0xd131: "teog" -0xd132: "teogg" -0xd133: "teogs" -0xd134: "teon" -0xd135: "teonj" -0xd136: "teonh" -0xd137: "teod" -0xd138: "teol" -0xd139: "teolg" -0xd13a: "teolm" -0xd13b: "teolb" -0xd13c: "teols" -0xd13d: "teolt" -0xd13e: "teolp" -0xd13f: "teolh" -0xd140: "teom" -0xd141: "teob" -0xd142: "teobs" -0xd143: "teos" -0xd144: "teoss" -0xd145: "teong" -0xd146: "teoj" -0xd147: "teoc" -0xd148: "teok" -0xd149: "teot" -0xd14a: "teop" -0xd14b: "teoh" -0xd14c: "te" -0xd14d: "teg" -0xd14e: "tegg" -0xd14f: "tegs" -0xd150: "ten" -0xd151: "tenj" -0xd152: "tenh" -0xd153: "ted" -0xd154: "tel" -0xd155: "telg" -0xd156: "telm" -0xd157: "telb" -0xd158: "tels" -0xd159: "telt" -0xd15a: "telp" -0xd15b: "telh" -0xd15c: "tem" -0xd15d: "teb" -0xd15e: "tebs" -0xd15f: "tes" -0xd160: "tess" -0xd161: "teng" -0xd162: "tej" -0xd163: "tec" -0xd164: "tek" -0xd165: "tet" -0xd166: "tep" -0xd167: "teh" -0xd168: "tyeo" -0xd169: "tyeog" -0xd16a: "tyeogg" -0xd16b: "tyeogs" -0xd16c: "tyeon" -0xd16d: "tyeonj" -0xd16e: "tyeonh" -0xd16f: "tyeod" -0xd170: "tyeol" -0xd171: "tyeolg" -0xd172: "tyeolm" -0xd173: "tyeolb" -0xd174: "tyeols" -0xd175: "tyeolt" -0xd176: "tyeolp" -0xd177: "tyeolh" -0xd178: "tyeom" -0xd179: "tyeob" -0xd17a: "tyeobs" -0xd17b: "tyeos" -0xd17c: "tyeoss" -0xd17d: "tyeong" -0xd17e: "tyeoj" -0xd17f: "tyeoc" -0xd180: "tyeok" -0xd181: "tyeot" -0xd182: "tyeop" -0xd183: "tyeoh" -0xd184: "tye" -0xd185: "tyeg" -0xd186: "tyegg" -0xd187: "tyegs" -0xd188: "tyen" -0xd189: "tyenj" -0xd18a: "tyenh" -0xd18b: "tyed" -0xd18c: "tyel" -0xd18d: "tyelg" -0xd18e: "tyelm" -0xd18f: "tyelb" -0xd190: "tyels" -0xd191: "tyelt" -0xd192: "tyelp" -0xd193: "tyelh" -0xd194: "tyem" -0xd195: "tyeb" -0xd196: "tyebs" -0xd197: "tyes" -0xd198: "tyess" -0xd199: "tyeng" -0xd19a: "tyej" -0xd19b: "tyec" -0xd19c: "tyek" -0xd19d: "tyet" -0xd19e: "tyep" -0xd19f: "tyeh" -0xd1a0: "to" -0xd1a1: "tog" -0xd1a2: "togg" -0xd1a3: "togs" -0xd1a4: "ton" -0xd1a5: "tonj" -0xd1a6: "tonh" -0xd1a7: "tod" -0xd1a8: "tol" -0xd1a9: "tolg" -0xd1aa: "tolm" -0xd1ab: "tolb" -0xd1ac: "tols" -0xd1ad: "tolt" -0xd1ae: "tolp" -0xd1af: "tolh" -0xd1b0: "tom" -0xd1b1: "tob" -0xd1b2: "tobs" -0xd1b3: "tos" -0xd1b4: "toss" -0xd1b5: "tong" -0xd1b6: "toj" -0xd1b7: "toc" -0xd1b8: "tok" -0xd1b9: "tot" -0xd1ba: "top" -0xd1bb: "toh" -0xd1bc: "twa" -0xd1bd: "twag" -0xd1be: "twagg" -0xd1bf: "twags" -0xd1c0: "twan" -0xd1c1: "twanj" -0xd1c2: "twanh" -0xd1c3: "twad" -0xd1c4: "twal" -0xd1c5: "twalg" -0xd1c6: "twalm" -0xd1c7: "twalb" -0xd1c8: "twals" -0xd1c9: "twalt" -0xd1ca: "twalp" -0xd1cb: "twalh" -0xd1cc: "twam" -0xd1cd: "twab" -0xd1ce: "twabs" -0xd1cf: "twas" -0xd1d0: "twass" -0xd1d1: "twang" -0xd1d2: "twaj" -0xd1d3: "twac" -0xd1d4: "twak" -0xd1d5: "twat" -0xd1d6: "twap" -0xd1d7: "twah" -0xd1d8: "twae" -0xd1d9: "twaeg" -0xd1da: "twaegg" -0xd1db: "twaegs" -0xd1dc: "twaen" -0xd1dd: "twaenj" -0xd1de: "twaenh" -0xd1df: "twaed" -0xd1e0: "twael" -0xd1e1: "twaelg" -0xd1e2: "twaelm" -0xd1e3: "twaelb" -0xd1e4: "twaels" -0xd1e5: "twaelt" -0xd1e6: "twaelp" -0xd1e7: "twaelh" -0xd1e8: "twaem" -0xd1e9: "twaeb" -0xd1ea: "twaebs" -0xd1eb: "twaes" -0xd1ec: "twaess" -0xd1ed: "twaeng" -0xd1ee: "twaej" -0xd1ef: "twaec" -0xd1f0: "twaek" -0xd1f1: "twaet" -0xd1f2: "twaep" -0xd1f3: "twaeh" -0xd1f4: "toe" -0xd1f5: "toeg" -0xd1f6: "toegg" -0xd1f7: "toegs" -0xd1f8: "toen" -0xd1f9: "toenj" -0xd1fa: "toenh" -0xd1fb: "toed" -0xd1fc: "toel" -0xd1fd: "toelg" -0xd1fe: "toelm" -0xd1ff: "toelb" -/* x0d2 */ -0xd200: "toels" -0xd201: "toelt" -0xd202: "toelp" -0xd203: "toelh" -0xd204: "toem" -0xd205: "toeb" -0xd206: "toebs" -0xd207: "toes" -0xd208: "toess" -0xd209: "toeng" -0xd20a: "toej" -0xd20b: "toec" -0xd20c: "toek" -0xd20d: "toet" -0xd20e: "toep" -0xd20f: "toeh" -0xd210: "tyo" -0xd211: "tyog" -0xd212: "tyogg" -0xd213: "tyogs" -0xd214: "tyon" -0xd215: "tyonj" -0xd216: "tyonh" -0xd217: "tyod" -0xd218: "tyol" -0xd219: "tyolg" -0xd21a: "tyolm" -0xd21b: "tyolb" -0xd21c: "tyols" -0xd21d: "tyolt" -0xd21e: "tyolp" -0xd21f: "tyolh" -0xd220: "tyom" -0xd221: "tyob" -0xd222: "tyobs" -0xd223: "tyos" -0xd224: "tyoss" -0xd225: "tyong" -0xd226: "tyoj" -0xd227: "tyoc" -0xd228: "tyok" -0xd229: "tyot" -0xd22a: "tyop" -0xd22b: "tyoh" -0xd22c: "tu" -0xd22d: "tug" -0xd22e: "tugg" -0xd22f: "tugs" -0xd230: "tun" -0xd231: "tunj" -0xd232: "tunh" -0xd233: "tud" -0xd234: "tul" -0xd235: "tulg" -0xd236: "tulm" -0xd237: "tulb" -0xd238: "tuls" -0xd239: "tult" -0xd23a: "tulp" -0xd23b: "tulh" -0xd23c: "tum" -0xd23d: "tub" -0xd23e: "tubs" -0xd23f: "tus" -0xd240: "tuss" -0xd241: "tung" -0xd242: "tuj" -0xd243: "tuc" -0xd244: "tuk" -0xd245: "tut" -0xd246: "tup" -0xd247: "tuh" -0xd248: "tweo" -0xd249: "tweog" -0xd24a: "tweogg" -0xd24b: "tweogs" -0xd24c: "tweon" -0xd24d: "tweonj" -0xd24e: "tweonh" -0xd24f: "tweod" -0xd250: "tweol" -0xd251: "tweolg" -0xd252: "tweolm" -0xd253: "tweolb" -0xd254: "tweols" -0xd255: "tweolt" -0xd256: "tweolp" -0xd257: "tweolh" -0xd258: "tweom" -0xd259: "tweob" -0xd25a: "tweobs" -0xd25b: "tweos" -0xd25c: "tweoss" -0xd25d: "tweong" -0xd25e: "tweoj" -0xd25f: "tweoc" -0xd260: "tweok" -0xd261: "tweot" -0xd262: "tweop" -0xd263: "tweoh" -0xd264: "twe" -0xd265: "tweg" -0xd266: "twegg" -0xd267: "twegs" -0xd268: "twen" -0xd269: "twenj" -0xd26a: "twenh" -0xd26b: "twed" -0xd26c: "twel" -0xd26d: "twelg" -0xd26e: "twelm" -0xd26f: "twelb" -0xd270: "twels" -0xd271: "twelt" -0xd272: "twelp" -0xd273: "twelh" -0xd274: "twem" -0xd275: "tweb" -0xd276: "twebs" -0xd277: "twes" -0xd278: "twess" -0xd279: "tweng" -0xd27a: "twej" -0xd27b: "twec" -0xd27c: "twek" -0xd27d: "twet" -0xd27e: "twep" -0xd27f: "tweh" -0xd280: "twi" -0xd281: "twig" -0xd282: "twigg" -0xd283: "twigs" -0xd284: "twin" -0xd285: "twinj" -0xd286: "twinh" -0xd287: "twid" -0xd288: "twil" -0xd289: "twilg" -0xd28a: "twilm" -0xd28b: "twilb" -0xd28c: "twils" -0xd28d: "twilt" -0xd28e: "twilp" -0xd28f: "twilh" -0xd290: "twim" -0xd291: "twib" -0xd292: "twibs" -0xd293: "twis" -0xd294: "twiss" -0xd295: "twing" -0xd296: "twij" -0xd297: "twic" -0xd298: "twik" -0xd299: "twit" -0xd29a: "twip" -0xd29b: "twih" -0xd29c: "tyu" -0xd29d: "tyug" -0xd29e: "tyugg" -0xd29f: "tyugs" -0xd2a0: "tyun" -0xd2a1: "tyunj" -0xd2a2: "tyunh" -0xd2a3: "tyud" -0xd2a4: "tyul" -0xd2a5: "tyulg" -0xd2a6: "tyulm" -0xd2a7: "tyulb" -0xd2a8: "tyuls" -0xd2a9: "tyult" -0xd2aa: "tyulp" -0xd2ab: "tyulh" -0xd2ac: "tyum" -0xd2ad: "tyub" -0xd2ae: "tyubs" -0xd2af: "tyus" -0xd2b0: "tyuss" -0xd2b1: "tyung" -0xd2b2: "tyuj" -0xd2b3: "tyuc" -0xd2b4: "tyuk" -0xd2b5: "tyut" -0xd2b6: "tyup" -0xd2b7: "tyuh" -0xd2b8: "teu" -0xd2b9: "teug" -0xd2ba: "teugg" -0xd2bb: "teugs" -0xd2bc: "teun" -0xd2bd: "teunj" -0xd2be: "teunh" -0xd2bf: "teud" -0xd2c0: "teul" -0xd2c1: "teulg" -0xd2c2: "teulm" -0xd2c3: "teulb" -0xd2c4: "teuls" -0xd2c5: "teult" -0xd2c6: "teulp" -0xd2c7: "teulh" -0xd2c8: "teum" -0xd2c9: "teub" -0xd2ca: "teubs" -0xd2cb: "teus" -0xd2cc: "teuss" -0xd2cd: "teung" -0xd2ce: "teuj" -0xd2cf: "teuc" -0xd2d0: "teuk" -0xd2d1: "teut" -0xd2d2: "teup" -0xd2d3: "teuh" -0xd2d4: "tyi" -0xd2d5: "tyig" -0xd2d6: "tyigg" -0xd2d7: "tyigs" -0xd2d8: "tyin" -0xd2d9: "tyinj" -0xd2da: "tyinh" -0xd2db: "tyid" -0xd2dc: "tyil" -0xd2dd: "tyilg" -0xd2de: "tyilm" -0xd2df: "tyilb" -0xd2e0: "tyils" -0xd2e1: "tyilt" -0xd2e2: "tyilp" -0xd2e3: "tyilh" -0xd2e4: "tyim" -0xd2e5: "tyib" -0xd2e6: "tyibs" -0xd2e7: "tyis" -0xd2e8: "tyiss" -0xd2e9: "tying" -0xd2ea: "tyij" -0xd2eb: "tyic" -0xd2ec: "tyik" -0xd2ed: "tyit" -0xd2ee: "tyip" -0xd2ef: "tyih" -0xd2f0: "ti" -0xd2f1: "tig" -0xd2f2: "tigg" -0xd2f3: "tigs" -0xd2f4: "tin" -0xd2f5: "tinj" -0xd2f6: "tinh" -0xd2f7: "tid" -0xd2f8: "til" -0xd2f9: "tilg" -0xd2fa: "tilm" -0xd2fb: "tilb" -0xd2fc: "tils" -0xd2fd: "tilt" -0xd2fe: "tilp" -0xd2ff: "tilh" -/* x0d3 */ -0xd300: "tim" -0xd301: "tib" -0xd302: "tibs" -0xd303: "tis" -0xd304: "tiss" -0xd305: "ting" -0xd306: "tij" -0xd307: "tic" -0xd308: "tik" -0xd309: "tit" -0xd30a: "tip" -0xd30b: "tih" -0xd30c: "pa" -0xd30d: "pag" -0xd30e: "pagg" -0xd30f: "pags" -0xd310: "pan" -0xd311: "panj" -0xd312: "panh" -0xd313: "pad" -0xd314: "pal" -0xd315: "palg" -0xd316: "palm" -0xd317: "palb" -0xd318: "pals" -0xd319: "palt" -0xd31a: "palp" -0xd31b: "palh" -0xd31c: "pam" -0xd31d: "pab" -0xd31e: "pabs" -0xd31f: "pas" -0xd320: "pass" -0xd321: "pang" -0xd322: "paj" -0xd323: "pac" -0xd324: "pak" -0xd325: "pat" -0xd326: "pap" -0xd327: "pah" -0xd328: "pae" -0xd329: "paeg" -0xd32a: "paegg" -0xd32b: "paegs" -0xd32c: "paen" -0xd32d: "paenj" -0xd32e: "paenh" -0xd32f: "paed" -0xd330: "pael" -0xd331: "paelg" -0xd332: "paelm" -0xd333: "paelb" -0xd334: "paels" -0xd335: "paelt" -0xd336: "paelp" -0xd337: "paelh" -0xd338: "paem" -0xd339: "paeb" -0xd33a: "paebs" -0xd33b: "paes" -0xd33c: "paess" -0xd33d: "paeng" -0xd33e: "paej" -0xd33f: "paec" -0xd340: "paek" -0xd341: "paet" -0xd342: "paep" -0xd343: "paeh" -0xd344: "pya" -0xd345: "pyag" -0xd346: "pyagg" -0xd347: "pyags" -0xd348: "pyan" -0xd349: "pyanj" -0xd34a: "pyanh" -0xd34b: "pyad" -0xd34c: "pyal" -0xd34d: "pyalg" -0xd34e: "pyalm" -0xd34f: "pyalb" -0xd350: "pyals" -0xd351: "pyalt" -0xd352: "pyalp" -0xd353: "pyalh" -0xd354: "pyam" -0xd355: "pyab" -0xd356: "pyabs" -0xd357: "pyas" -0xd358: "pyass" -0xd359: "pyang" -0xd35a: "pyaj" -0xd35b: "pyac" -0xd35c: "pyak" -0xd35d: "pyat" -0xd35e: "pyap" -0xd35f: "pyah" -0xd360: "pyae" -0xd361: "pyaeg" -0xd362: "pyaegg" -0xd363: "pyaegs" -0xd364: "pyaen" -0xd365: "pyaenj" -0xd366: "pyaenh" -0xd367: "pyaed" -0xd368: "pyael" -0xd369: "pyaelg" -0xd36a: "pyaelm" -0xd36b: "pyaelb" -0xd36c: "pyaels" -0xd36d: "pyaelt" -0xd36e: "pyaelp" -0xd36f: "pyaelh" -0xd370: "pyaem" -0xd371: "pyaeb" -0xd372: "pyaebs" -0xd373: "pyaes" -0xd374: "pyaess" -0xd375: "pyaeng" -0xd376: "pyaej" -0xd377: "pyaec" -0xd378: "pyaek" -0xd379: "pyaet" -0xd37a: "pyaep" -0xd37b: "pyaeh" -0xd37c: "peo" -0xd37d: "peog" -0xd37e: "peogg" -0xd37f: "peogs" -0xd380: "peon" -0xd381: "peonj" -0xd382: "peonh" -0xd383: "peod" -0xd384: "peol" -0xd385: "peolg" -0xd386: "peolm" -0xd387: "peolb" -0xd388: "peols" -0xd389: "peolt" -0xd38a: "peolp" -0xd38b: "peolh" -0xd38c: "peom" -0xd38d: "peob" -0xd38e: "peobs" -0xd38f: "peos" -0xd390: "peoss" -0xd391: "peong" -0xd392: "peoj" -0xd393: "peoc" -0xd394: "peok" -0xd395: "peot" -0xd396: "peop" -0xd397: "peoh" -0xd398: "pe" -0xd399: "peg" -0xd39a: "pegg" -0xd39b: "pegs" -0xd39c: "pen" -0xd39d: "penj" -0xd39e: "penh" -0xd39f: "ped" -0xd3a0: "pel" -0xd3a1: "pelg" -0xd3a2: "pelm" -0xd3a3: "pelb" -0xd3a4: "pels" -0xd3a5: "pelt" -0xd3a6: "pelp" -0xd3a7: "pelh" -0xd3a8: "pem" -0xd3a9: "peb" -0xd3aa: "pebs" -0xd3ab: "pes" -0xd3ac: "pess" -0xd3ad: "peng" -0xd3ae: "pej" -0xd3af: "pec" -0xd3b0: "pek" -0xd3b1: "pet" -0xd3b2: "pep" -0xd3b3: "peh" -0xd3b4: "pyeo" -0xd3b5: "pyeog" -0xd3b6: "pyeogg" -0xd3b7: "pyeogs" -0xd3b8: "pyeon" -0xd3b9: "pyeonj" -0xd3ba: "pyeonh" -0xd3bb: "pyeod" -0xd3bc: "pyeol" -0xd3bd: "pyeolg" -0xd3be: "pyeolm" -0xd3bf: "pyeolb" -0xd3c0: "pyeols" -0xd3c1: "pyeolt" -0xd3c2: "pyeolp" -0xd3c3: "pyeolh" -0xd3c4: "pyeom" -0xd3c5: "pyeob" -0xd3c6: "pyeobs" -0xd3c7: "pyeos" -0xd3c8: "pyeoss" -0xd3c9: "pyeong" -0xd3ca: "pyeoj" -0xd3cb: "pyeoc" -0xd3cc: "pyeok" -0xd3cd: "pyeot" -0xd3ce: "pyeop" -0xd3cf: "pyeoh" -0xd3d0: "pye" -0xd3d1: "pyeg" -0xd3d2: "pyegg" -0xd3d3: "pyegs" -0xd3d4: "pyen" -0xd3d5: "pyenj" -0xd3d6: "pyenh" -0xd3d7: "pyed" -0xd3d8: "pyel" -0xd3d9: "pyelg" -0xd3da: "pyelm" -0xd3db: "pyelb" -0xd3dc: "pyels" -0xd3dd: "pyelt" -0xd3de: "pyelp" -0xd3df: "pyelh" -0xd3e0: "pyem" -0xd3e1: "pyeb" -0xd3e2: "pyebs" -0xd3e3: "pyes" -0xd3e4: "pyess" -0xd3e5: "pyeng" -0xd3e6: "pyej" -0xd3e7: "pyec" -0xd3e8: "pyek" -0xd3e9: "pyet" -0xd3ea: "pyep" -0xd3eb: "pyeh" -0xd3ec: "po" -0xd3ed: "pog" -0xd3ee: "pogg" -0xd3ef: "pogs" -0xd3f0: "pon" -0xd3f1: "ponj" -0xd3f2: "ponh" -0xd3f3: "pod" -0xd3f4: "pol" -0xd3f5: "polg" -0xd3f6: "polm" -0xd3f7: "polb" -0xd3f8: "pols" -0xd3f9: "polt" -0xd3fa: "polp" -0xd3fb: "polh" -0xd3fc: "pom" -0xd3fd: "pob" -0xd3fe: "pobs" -0xd3ff: "pos" -/* x0d4 */ -0xd400: "poss" -0xd401: "pong" -0xd402: "poj" -0xd403: "poc" -0xd404: "pok" -0xd405: "pot" -0xd406: "pop" -0xd407: "poh" -0xd408: "pwa" -0xd409: "pwag" -0xd40a: "pwagg" -0xd40b: "pwags" -0xd40c: "pwan" -0xd40d: "pwanj" -0xd40e: "pwanh" -0xd40f: "pwad" -0xd410: "pwal" -0xd411: "pwalg" -0xd412: "pwalm" -0xd413: "pwalb" -0xd414: "pwals" -0xd415: "pwalt" -0xd416: "pwalp" -0xd417: "pwalh" -0xd418: "pwam" -0xd419: "pwab" -0xd41a: "pwabs" -0xd41b: "pwas" -0xd41c: "pwass" -0xd41d: "pwang" -0xd41e: "pwaj" -0xd41f: "pwac" -0xd420: "pwak" -0xd421: "pwat" -0xd422: "pwap" -0xd423: "pwah" -0xd424: "pwae" -0xd425: "pwaeg" -0xd426: "pwaegg" -0xd427: "pwaegs" -0xd428: "pwaen" -0xd429: "pwaenj" -0xd42a: "pwaenh" -0xd42b: "pwaed" -0xd42c: "pwael" -0xd42d: "pwaelg" -0xd42e: "pwaelm" -0xd42f: "pwaelb" -0xd430: "pwaels" -0xd431: "pwaelt" -0xd432: "pwaelp" -0xd433: "pwaelh" -0xd434: "pwaem" -0xd435: "pwaeb" -0xd436: "pwaebs" -0xd437: "pwaes" -0xd438: "pwaess" -0xd439: "pwaeng" -0xd43a: "pwaej" -0xd43b: "pwaec" -0xd43c: "pwaek" -0xd43d: "pwaet" -0xd43e: "pwaep" -0xd43f: "pwaeh" -0xd440: "poe" -0xd441: "poeg" -0xd442: "poegg" -0xd443: "poegs" -0xd444: "poen" -0xd445: "poenj" -0xd446: "poenh" -0xd447: "poed" -0xd448: "poel" -0xd449: "poelg" -0xd44a: "poelm" -0xd44b: "poelb" -0xd44c: "poels" -0xd44d: "poelt" -0xd44e: "poelp" -0xd44f: "poelh" -0xd450: "poem" -0xd451: "poeb" -0xd452: "poebs" -0xd453: "poes" -0xd454: "poess" -0xd455: "poeng" -0xd456: "poej" -0xd457: "poec" -0xd458: "poek" -0xd459: "poet" -0xd45a: "poep" -0xd45b: "poeh" -0xd45c: "pyo" -0xd45d: "pyog" -0xd45e: "pyogg" -0xd45f: "pyogs" -0xd460: "pyon" -0xd461: "pyonj" -0xd462: "pyonh" -0xd463: "pyod" -0xd464: "pyol" -0xd465: "pyolg" -0xd466: "pyolm" -0xd467: "pyolb" -0xd468: "pyols" -0xd469: "pyolt" -0xd46a: "pyolp" -0xd46b: "pyolh" -0xd46c: "pyom" -0xd46d: "pyob" -0xd46e: "pyobs" -0xd46f: "pyos" -0xd470: "pyoss" -0xd471: "pyong" -0xd472: "pyoj" -0xd473: "pyoc" -0xd474: "pyok" -0xd475: "pyot" -0xd476: "pyop" -0xd477: "pyoh" -0xd478: "pu" -0xd479: "pug" -0xd47a: "pugg" -0xd47b: "pugs" -0xd47c: "pun" -0xd47d: "punj" -0xd47e: "punh" -0xd47f: "pud" -0xd480: "pul" -0xd481: "pulg" -0xd482: "pulm" -0xd483: "pulb" -0xd484: "puls" -0xd485: "pult" -0xd486: "pulp" -0xd487: "pulh" -0xd488: "pum" -0xd489: "pub" -0xd48a: "pubs" -0xd48b: "pus" -0xd48c: "puss" -0xd48d: "pung" -0xd48e: "puj" -0xd48f: "puc" -0xd490: "puk" -0xd491: "put" -0xd492: "pup" -0xd493: "puh" -0xd494: "pweo" -0xd495: "pweog" -0xd496: "pweogg" -0xd497: "pweogs" -0xd498: "pweon" -0xd499: "pweonj" -0xd49a: "pweonh" -0xd49b: "pweod" -0xd49c: "pweol" -0xd49d: "pweolg" -0xd49e: "pweolm" -0xd49f: "pweolb" -0xd4a0: "pweols" -0xd4a1: "pweolt" -0xd4a2: "pweolp" -0xd4a3: "pweolh" -0xd4a4: "pweom" -0xd4a5: "pweob" -0xd4a6: "pweobs" -0xd4a7: "pweos" -0xd4a8: "pweoss" -0xd4a9: "pweong" -0xd4aa: "pweoj" -0xd4ab: "pweoc" -0xd4ac: "pweok" -0xd4ad: "pweot" -0xd4ae: "pweop" -0xd4af: "pweoh" -0xd4b0: "pwe" -0xd4b1: "pweg" -0xd4b2: "pwegg" -0xd4b3: "pwegs" -0xd4b4: "pwen" -0xd4b5: "pwenj" -0xd4b6: "pwenh" -0xd4b7: "pwed" -0xd4b8: "pwel" -0xd4b9: "pwelg" -0xd4ba: "pwelm" -0xd4bb: "pwelb" -0xd4bc: "pwels" -0xd4bd: "pwelt" -0xd4be: "pwelp" -0xd4bf: "pwelh" -0xd4c0: "pwem" -0xd4c1: "pweb" -0xd4c2: "pwebs" -0xd4c3: "pwes" -0xd4c4: "pwess" -0xd4c5: "pweng" -0xd4c6: "pwej" -0xd4c7: "pwec" -0xd4c8: "pwek" -0xd4c9: "pwet" -0xd4ca: "pwep" -0xd4cb: "pweh" -0xd4cc: "pwi" -0xd4cd: "pwig" -0xd4ce: "pwigg" -0xd4cf: "pwigs" -0xd4d0: "pwin" -0xd4d1: "pwinj" -0xd4d2: "pwinh" -0xd4d3: "pwid" -0xd4d4: "pwil" -0xd4d5: "pwilg" -0xd4d6: "pwilm" -0xd4d7: "pwilb" -0xd4d8: "pwils" -0xd4d9: "pwilt" -0xd4da: "pwilp" -0xd4db: "pwilh" -0xd4dc: "pwim" -0xd4dd: "pwib" -0xd4de: "pwibs" -0xd4df: "pwis" -0xd4e0: "pwiss" -0xd4e1: "pwing" -0xd4e2: "pwij" -0xd4e3: "pwic" -0xd4e4: "pwik" -0xd4e5: "pwit" -0xd4e6: "pwip" -0xd4e7: "pwih" -0xd4e8: "pyu" -0xd4e9: "pyug" -0xd4ea: "pyugg" -0xd4eb: "pyugs" -0xd4ec: "pyun" -0xd4ed: "pyunj" -0xd4ee: "pyunh" -0xd4ef: "pyud" -0xd4f0: "pyul" -0xd4f1: "pyulg" -0xd4f2: "pyulm" -0xd4f3: "pyulb" -0xd4f4: "pyuls" -0xd4f5: "pyult" -0xd4f6: "pyulp" -0xd4f7: "pyulh" -0xd4f8: "pyum" -0xd4f9: "pyub" -0xd4fa: "pyubs" -0xd4fb: "pyus" -0xd4fc: "pyuss" -0xd4fd: "pyung" -0xd4fe: "pyuj" -0xd4ff: "pyuc" -/* x0d5 */ -0xd500: "pyuk" -0xd501: "pyut" -0xd502: "pyup" -0xd503: "pyuh" -0xd504: "peu" -0xd505: "peug" -0xd506: "peugg" -0xd507: "peugs" -0xd508: "peun" -0xd509: "peunj" -0xd50a: "peunh" -0xd50b: "peud" -0xd50c: "peul" -0xd50d: "peulg" -0xd50e: "peulm" -0xd50f: "peulb" -0xd510: "peuls" -0xd511: "peult" -0xd512: "peulp" -0xd513: "peulh" -0xd514: "peum" -0xd515: "peub" -0xd516: "peubs" -0xd517: "peus" -0xd518: "peuss" -0xd519: "peung" -0xd51a: "peuj" -0xd51b: "peuc" -0xd51c: "peuk" -0xd51d: "peut" -0xd51e: "peup" -0xd51f: "peuh" -0xd520: "pyi" -0xd521: "pyig" -0xd522: "pyigg" -0xd523: "pyigs" -0xd524: "pyin" -0xd525: "pyinj" -0xd526: "pyinh" -0xd527: "pyid" -0xd528: "pyil" -0xd529: "pyilg" -0xd52a: "pyilm" -0xd52b: "pyilb" -0xd52c: "pyils" -0xd52d: "pyilt" -0xd52e: "pyilp" -0xd52f: "pyilh" -0xd530: "pyim" -0xd531: "pyib" -0xd532: "pyibs" -0xd533: "pyis" -0xd534: "pyiss" -0xd535: "pying" -0xd536: "pyij" -0xd537: "pyic" -0xd538: "pyik" -0xd539: "pyit" -0xd53a: "pyip" -0xd53b: "pyih" -0xd53c: "pi" -0xd53d: "pig" -0xd53e: "pigg" -0xd53f: "pigs" -0xd540: "pin" -0xd541: "pinj" -0xd542: "pinh" -0xd543: "pid" -0xd544: "pil" -0xd545: "pilg" -0xd546: "pilm" -0xd547: "pilb" -0xd548: "pils" -0xd549: "pilt" -0xd54a: "pilp" -0xd54b: "pilh" -0xd54c: "pim" -0xd54d: "pib" -0xd54e: "pibs" -0xd54f: "pis" -0xd550: "piss" -0xd551: "ping" -0xd552: "pij" -0xd553: "pic" -0xd554: "pik" -0xd555: "pit" -0xd556: "pip" -0xd557: "pih" -0xd558: "ha" -0xd559: "hag" -0xd55a: "hagg" -0xd55b: "hags" -0xd55c: "han" -0xd55d: "hanj" -0xd55e: "hanh" -0xd55f: "had" -0xd560: "hal" -0xd561: "halg" -0xd562: "halm" -0xd563: "halb" -0xd564: "hals" -0xd565: "halt" -0xd566: "halp" -0xd567: "halh" -0xd568: "ham" -0xd569: "hab" -0xd56a: "habs" -0xd56b: "has" -0xd56c: "hass" -0xd56d: "hang" -0xd56e: "haj" -0xd56f: "hac" -0xd570: "hak" -0xd571: "hat" -0xd572: "hap" -0xd573: "hah" -0xd574: "hae" -0xd575: "haeg" -0xd576: "haegg" -0xd577: "haegs" -0xd578: "haen" -0xd579: "haenj" -0xd57a: "haenh" -0xd57b: "haed" -0xd57c: "hael" -0xd57d: "haelg" -0xd57e: "haelm" -0xd57f: "haelb" -0xd580: "haels" -0xd581: "haelt" -0xd582: "haelp" -0xd583: "haelh" -0xd584: "haem" -0xd585: "haeb" -0xd586: "haebs" -0xd587: "haes" -0xd588: "haess" -0xd589: "haeng" -0xd58a: "haej" -0xd58b: "haec" -0xd58c: "haek" -0xd58d: "haet" -0xd58e: "haep" -0xd58f: "haeh" -0xd590: "hya" -0xd591: "hyag" -0xd592: "hyagg" -0xd593: "hyags" -0xd594: "hyan" -0xd595: "hyanj" -0xd596: "hyanh" -0xd597: "hyad" -0xd598: "hyal" -0xd599: "hyalg" -0xd59a: "hyalm" -0xd59b: "hyalb" -0xd59c: "hyals" -0xd59d: "hyalt" -0xd59e: "hyalp" -0xd59f: "hyalh" -0xd5a0: "hyam" -0xd5a1: "hyab" -0xd5a2: "hyabs" -0xd5a3: "hyas" -0xd5a4: "hyass" -0xd5a5: "hyang" -0xd5a6: "hyaj" -0xd5a7: "hyac" -0xd5a8: "hyak" -0xd5a9: "hyat" -0xd5aa: "hyap" -0xd5ab: "hyah" -0xd5ac: "hyae" -0xd5ad: "hyaeg" -0xd5ae: "hyaegg" -0xd5af: "hyaegs" -0xd5b0: "hyaen" -0xd5b1: "hyaenj" -0xd5b2: "hyaenh" -0xd5b3: "hyaed" -0xd5b4: "hyael" -0xd5b5: "hyaelg" -0xd5b6: "hyaelm" -0xd5b7: "hyaelb" -0xd5b8: "hyaels" -0xd5b9: "hyaelt" -0xd5ba: "hyaelp" -0xd5bb: "hyaelh" -0xd5bc: "hyaem" -0xd5bd: "hyaeb" -0xd5be: "hyaebs" -0xd5bf: "hyaes" -0xd5c0: "hyaess" -0xd5c1: "hyaeng" -0xd5c2: "hyaej" -0xd5c3: "hyaec" -0xd5c4: "hyaek" -0xd5c5: "hyaet" -0xd5c6: "hyaep" -0xd5c7: "hyaeh" -0xd5c8: "heo" -0xd5c9: "heog" -0xd5ca: "heogg" -0xd5cb: "heogs" -0xd5cc: "heon" -0xd5cd: "heonj" -0xd5ce: "heonh" -0xd5cf: "heod" -0xd5d0: "heol" -0xd5d1: "heolg" -0xd5d2: "heolm" -0xd5d3: "heolb" -0xd5d4: "heols" -0xd5d5: "heolt" -0xd5d6: "heolp" -0xd5d7: "heolh" -0xd5d8: "heom" -0xd5d9: "heob" -0xd5da: "heobs" -0xd5db: "heos" -0xd5dc: "heoss" -0xd5dd: "heong" -0xd5de: "heoj" -0xd5df: "heoc" -0xd5e0: "heok" -0xd5e1: "heot" -0xd5e2: "heop" -0xd5e3: "heoh" -0xd5e4: "he" -0xd5e5: "heg" -0xd5e6: "hegg" -0xd5e7: "hegs" -0xd5e8: "hen" -0xd5e9: "henj" -0xd5ea: "henh" -0xd5eb: "hed" -0xd5ec: "hel" -0xd5ed: "helg" -0xd5ee: "helm" -0xd5ef: "helb" -0xd5f0: "hels" -0xd5f1: "helt" -0xd5f2: "help" -0xd5f3: "helh" -0xd5f4: "hem" -0xd5f5: "heb" -0xd5f6: "hebs" -0xd5f7: "hes" -0xd5f8: "hess" -0xd5f9: "heng" -0xd5fa: "hej" -0xd5fb: "hec" -0xd5fc: "hek" -0xd5fd: "het" -0xd5fe: "hep" -0xd5ff: "heh" -/* x0d6 */ -0xd600: "hyeo" -0xd601: "hyeog" -0xd602: "hyeogg" -0xd603: "hyeogs" -0xd604: "hyeon" -0xd605: "hyeonj" -0xd606: "hyeonh" -0xd607: "hyeod" -0xd608: "hyeol" -0xd609: "hyeolg" -0xd60a: "hyeolm" -0xd60b: "hyeolb" -0xd60c: "hyeols" -0xd60d: "hyeolt" -0xd60e: "hyeolp" -0xd60f: "hyeolh" -0xd610: "hyeom" -0xd611: "hyeob" -0xd612: "hyeobs" -0xd613: "hyeos" -0xd614: "hyeoss" -0xd615: "hyeong" -0xd616: "hyeoj" -0xd617: "hyeoc" -0xd618: "hyeok" -0xd619: "hyeot" -0xd61a: "hyeop" -0xd61b: "hyeoh" -0xd61c: "hye" -0xd61d: "hyeg" -0xd61e: "hyegg" -0xd61f: "hyegs" -0xd620: "hyen" -0xd621: "hyenj" -0xd622: "hyenh" -0xd623: "hyed" -0xd624: "hyel" -0xd625: "hyelg" -0xd626: "hyelm" -0xd627: "hyelb" -0xd628: "hyels" -0xd629: "hyelt" -0xd62a: "hyelp" -0xd62b: "hyelh" -0xd62c: "hyem" -0xd62d: "hyeb" -0xd62e: "hyebs" -0xd62f: "hyes" -0xd630: "hyess" -0xd631: "hyeng" -0xd632: "hyej" -0xd633: "hyec" -0xd634: "hyek" -0xd635: "hyet" -0xd636: "hyep" -0xd637: "hyeh" -0xd638: "ho" -0xd639: "hog" -0xd63a: "hogg" -0xd63b: "hogs" -0xd63c: "hon" -0xd63d: "honj" -0xd63e: "honh" -0xd63f: "hod" -0xd640: "hol" -0xd641: "holg" -0xd642: "holm" -0xd643: "holb" -0xd644: "hols" -0xd645: "holt" -0xd646: "holp" -0xd647: "holh" -0xd648: "hom" -0xd649: "hob" -0xd64a: "hobs" -0xd64b: "hos" -0xd64c: "hoss" -0xd64d: "hong" -0xd64e: "hoj" -0xd64f: "hoc" -0xd650: "hok" -0xd651: "hot" -0xd652: "hop" -0xd653: "hoh" -0xd654: "hwa" -0xd655: "hwag" -0xd656: "hwagg" -0xd657: "hwags" -0xd658: "hwan" -0xd659: "hwanj" -0xd65a: "hwanh" -0xd65b: "hwad" -0xd65c: "hwal" -0xd65d: "hwalg" -0xd65e: "hwalm" -0xd65f: "hwalb" -0xd660: "hwals" -0xd661: "hwalt" -0xd662: "hwalp" -0xd663: "hwalh" -0xd664: "hwam" -0xd665: "hwab" -0xd666: "hwabs" -0xd667: "hwas" -0xd668: "hwass" -0xd669: "hwang" -0xd66a: "hwaj" -0xd66b: "hwac" -0xd66c: "hwak" -0xd66d: "hwat" -0xd66e: "hwap" -0xd66f: "hwah" -0xd670: "hwae" -0xd671: "hwaeg" -0xd672: "hwaegg" -0xd673: "hwaegs" -0xd674: "hwaen" -0xd675: "hwaenj" -0xd676: "hwaenh" -0xd677: "hwaed" -0xd678: "hwael" -0xd679: "hwaelg" -0xd67a: "hwaelm" -0xd67b: "hwaelb" -0xd67c: "hwaels" -0xd67d: "hwaelt" -0xd67e: "hwaelp" -0xd67f: "hwaelh" -0xd680: "hwaem" -0xd681: "hwaeb" -0xd682: "hwaebs" -0xd683: "hwaes" -0xd684: "hwaess" -0xd685: "hwaeng" -0xd686: "hwaej" -0xd687: "hwaec" -0xd688: "hwaek" -0xd689: "hwaet" -0xd68a: "hwaep" -0xd68b: "hwaeh" -0xd68c: "hoe" -0xd68d: "hoeg" -0xd68e: "hoegg" -0xd68f: "hoegs" -0xd690: "hoen" -0xd691: "hoenj" -0xd692: "hoenh" -0xd693: "hoed" -0xd694: "hoel" -0xd695: "hoelg" -0xd696: "hoelm" -0xd697: "hoelb" -0xd698: "hoels" -0xd699: "hoelt" -0xd69a: "hoelp" -0xd69b: "hoelh" -0xd69c: "hoem" -0xd69d: "hoeb" -0xd69e: "hoebs" -0xd69f: "hoes" -0xd6a0: "hoess" -0xd6a1: "hoeng" -0xd6a2: "hoej" -0xd6a3: "hoec" -0xd6a4: "hoek" -0xd6a5: "hoet" -0xd6a6: "hoep" -0xd6a7: "hoeh" -0xd6a8: "hyo" -0xd6a9: "hyog" -0xd6aa: "hyogg" -0xd6ab: "hyogs" -0xd6ac: "hyon" -0xd6ad: "hyonj" -0xd6ae: "hyonh" -0xd6af: "hyod" -0xd6b0: "hyol" -0xd6b1: "hyolg" -0xd6b2: "hyolm" -0xd6b3: "hyolb" -0xd6b4: "hyols" -0xd6b5: "hyolt" -0xd6b6: "hyolp" -0xd6b7: "hyolh" -0xd6b8: "hyom" -0xd6b9: "hyob" -0xd6ba: "hyobs" -0xd6bb: "hyos" -0xd6bc: "hyoss" -0xd6bd: "hyong" -0xd6be: "hyoj" -0xd6bf: "hyoc" -0xd6c0: "hyok" -0xd6c1: "hyot" -0xd6c2: "hyop" -0xd6c3: "hyoh" -0xd6c4: "hu" -0xd6c5: "hug" -0xd6c6: "hugg" -0xd6c7: "hugs" -0xd6c8: "hun" -0xd6c9: "hunj" -0xd6ca: "hunh" -0xd6cb: "hud" -0xd6cc: "hul" -0xd6cd: "hulg" -0xd6ce: "hulm" -0xd6cf: "hulb" -0xd6d0: "huls" -0xd6d1: "hult" -0xd6d2: "hulp" -0xd6d3: "hulh" -0xd6d4: "hum" -0xd6d5: "hub" -0xd6d6: "hubs" -0xd6d7: "hus" -0xd6d8: "huss" -0xd6d9: "hung" -0xd6da: "huj" -0xd6db: "huc" -0xd6dc: "huk" -0xd6dd: "hut" -0xd6de: "hup" -0xd6df: "huh" -0xd6e0: "hweo" -0xd6e1: "hweog" -0xd6e2: "hweogg" -0xd6e3: "hweogs" -0xd6e4: "hweon" -0xd6e5: "hweonj" -0xd6e6: "hweonh" -0xd6e7: "hweod" -0xd6e8: "hweol" -0xd6e9: "hweolg" -0xd6ea: "hweolm" -0xd6eb: "hweolb" -0xd6ec: "hweols" -0xd6ed: "hweolt" -0xd6ee: "hweolp" -0xd6ef: "hweolh" -0xd6f0: "hweom" -0xd6f1: "hweob" -0xd6f2: "hweobs" -0xd6f3: "hweos" -0xd6f4: "hweoss" -0xd6f5: "hweong" -0xd6f6: "hweoj" -0xd6f7: "hweoc" -0xd6f8: "hweok" -0xd6f9: "hweot" -0xd6fa: "hweop" -0xd6fb: "hweoh" -0xd6fc: "hwe" -0xd6fd: "hweg" -0xd6fe: "hwegg" -0xd6ff: "hwegs" -/* x0d7 */ -0xd700: "hwen" -0xd701: "hwenj" -0xd702: "hwenh" -0xd703: "hwed" -0xd704: "hwel" -0xd705: "hwelg" -0xd706: "hwelm" -0xd707: "hwelb" -0xd708: "hwels" -0xd709: "hwelt" -0xd70a: "hwelp" -0xd70b: "hwelh" -0xd70c: "hwem" -0xd70d: "hweb" -0xd70e: "hwebs" -0xd70f: "hwes" -0xd710: "hwess" -0xd711: "hweng" -0xd712: "hwej" -0xd713: "hwec" -0xd714: "hwek" -0xd715: "hwet" -0xd716: "hwep" -0xd717: "hweh" -0xd718: "hwi" -0xd719: "hwig" -0xd71a: "hwigg" -0xd71b: "hwigs" -0xd71c: "hwin" -0xd71d: "hwinj" -0xd71e: "hwinh" -0xd71f: "hwid" -0xd720: "hwil" -0xd721: "hwilg" -0xd722: "hwilm" -0xd723: "hwilb" -0xd724: "hwils" -0xd725: "hwilt" -0xd726: "hwilp" -0xd727: "hwilh" -0xd728: "hwim" -0xd729: "hwib" -0xd72a: "hwibs" -0xd72b: "hwis" -0xd72c: "hwiss" -0xd72d: "hwing" -0xd72e: "hwij" -0xd72f: "hwic" -0xd730: "hwik" -0xd731: "hwit" -0xd732: "hwip" -0xd733: "hwih" -0xd734: "hyu" -0xd735: "hyug" -0xd736: "hyugg" -0xd737: "hyugs" -0xd738: "hyun" -0xd739: "hyunj" -0xd73a: "hyunh" -0xd73b: "hyud" -0xd73c: "hyul" -0xd73d: "hyulg" -0xd73e: "hyulm" -0xd73f: "hyulb" -0xd740: "hyuls" -0xd741: "hyult" -0xd742: "hyulp" -0xd743: "hyulh" -0xd744: "hyum" -0xd745: "hyub" -0xd746: "hyubs" -0xd747: "hyus" -0xd748: "hyuss" -0xd749: "hyung" -0xd74a: "hyuj" -0xd74b: "hyuc" -0xd74c: "hyuk" -0xd74d: "hyut" -0xd74e: "hyup" -0xd74f: "hyuh" -0xd750: "heu" -0xd751: "heug" -0xd752: "heugg" -0xd753: "heugs" -0xd754: "heun" -0xd755: "heunj" -0xd756: "heunh" -0xd757: "heud" -0xd758: "heul" -0xd759: "heulg" -0xd75a: "heulm" -0xd75b: "heulb" -0xd75c: "heuls" -0xd75d: "heult" -0xd75e: "heulp" -0xd75f: "heulh" -0xd760: "heum" -0xd761: "heub" -0xd762: "heubs" -0xd763: "heus" -0xd764: "heuss" -0xd765: "heung" -0xd766: "heuj" -0xd767: "heuc" -0xd768: "heuk" -0xd769: "heut" -0xd76a: "heup" -0xd76b: "heuh" -0xd76c: "hyi" -0xd76d: "hyig" -0xd76e: "hyigg" -0xd76f: "hyigs" -0xd770: "hyin" -0xd771: "hyinj" -0xd772: "hyinh" -0xd773: "hyid" -0xd774: "hyil" -0xd775: "hyilg" -0xd776: "hyilm" -0xd777: "hyilb" -0xd778: "hyils" -0xd779: "hyilt" -0xd77a: "hyilp" -0xd77b: "hyilh" -0xd77c: "hyim" -0xd77d: "hyib" -0xd77e: "hyibs" -0xd77f: "hyis" -0xd780: "hyiss" -0xd781: "hying" -0xd782: "hyij" -0xd783: "hyic" -0xd784: "hyik" -0xd785: "hyit" -0xd786: "hyip" -0xd787: "hyih" -0xd788: "hi" -0xd789: "hig" -0xd78a: "higg" -0xd78b: "higs" -0xd78c: "hin" -0xd78d: "hinj" -0xd78e: "hinh" -0xd78f: "hid" -0xd790: "hil" -0xd791: "hilg" -0xd792: "hilm" -0xd793: "hilb" -0xd794: "hils" -0xd795: "hilt" -0xd796: "hilp" -0xd797: "hilh" -0xd798: "him" -0xd799: "hib" -0xd79a: "hibs" -0xd79b: "his" -0xd79c: "hiss" -0xd79d: "hing" -0xd79e: "hij" -0xd79f: "hic" -0xd7a0: "hik" -0xd7a1: "hit" -0xd7a2: "hip" -0xd7a3: "hih" -0xd7a4: "[?]" -0xd7a5: "[?]" -0xd7a6: "[?]" -0xd7a7: "[?]" -0xd7a8: "[?]" -0xd7a9: "[?]" -0xd7aa: "[?]" -0xd7ab: "[?]" -0xd7ac: "[?]" -0xd7ad: "[?]" -0xd7ae: "[?]" -0xd7af: "[?]" -0xd7b0: "[?]" -0xd7b1: "[?]" -0xd7b2: "[?]" -0xd7b3: "[?]" -0xd7b4: "[?]" -0xd7b5: "[?]" -0xd7b6: "[?]" -0xd7b7: "[?]" -0xd7b8: "[?]" -0xd7b9: "[?]" -0xd7ba: "[?]" -0xd7bb: "[?]" -0xd7bc: "[?]" -0xd7bd: "[?]" -0xd7be: "[?]" -0xd7bf: "[?]" -0xd7c0: "[?]" -0xd7c1: "[?]" -0xd7c2: "[?]" -0xd7c3: "[?]" -0xd7c4: "[?]" -0xd7c5: "[?]" -0xd7c6: "[?]" -0xd7c7: "[?]" -0xd7c8: "[?]" -0xd7c9: "[?]" -0xd7ca: "[?]" -0xd7cb: "[?]" -0xd7cc: "[?]" -0xd7cd: "[?]" -0xd7ce: "[?]" -0xd7cf: "[?]" -0xd7d0: "[?]" -0xd7d1: "[?]" -0xd7d2: "[?]" -0xd7d3: "[?]" -0xd7d4: "[?]" -0xd7d5: "[?]" -0xd7d6: "[?]" -0xd7d7: "[?]" -0xd7d8: "[?]" -0xd7d9: "[?]" -0xd7da: "[?]" -0xd7db: "[?]" -0xd7dc: "[?]" -0xd7dd: "[?]" -0xd7de: "[?]" -0xd7df: "[?]" -0xd7e0: "[?]" -0xd7e1: "[?]" -0xd7e2: "[?]" -0xd7e3: "[?]" -0xd7e4: "[?]" -0xd7e5: "[?]" -0xd7e6: "[?]" -0xd7e7: "[?]" -0xd7e8: "[?]" -0xd7e9: "[?]" -0xd7ea: "[?]" -0xd7eb: "[?]" -0xd7ec: "[?]" -0xd7ed: "[?]" -0xd7ee: "[?]" -0xd7ef: "[?]" -0xd7f0: "[?]" -0xd7f1: "[?]" -0xd7f2: "[?]" -0xd7f3: "[?]" -0xd7f4: "[?]" -0xd7f5: "[?]" -0xd7f6: "[?]" -0xd7f7: "[?]" -0xd7f8: "[?]" -0xd7f9: "[?]" -0xd7fa: "[?]" -0xd7fb: "[?]" -0xd7fc: "[?]" -0xd7fd: "[?]" -0xd7fe: "[?]" -/* x0f9 */ -0xf900: "Kay " -0xf901: "Kayng " -0xf902: "Ke " -0xf903: "Ko " -0xf904: "Kol " -0xf905: "Koc " -0xf906: "Kwi " -0xf907: "Kwi " -0xf908: "Kyun " -0xf909: "Kul " -0xf90a: "Kum " -0xf90b: "Na " -0xf90c: "Na " -0xf90d: "Na " -0xf90e: "La " -0xf90f: "Na " -0xf910: "Na " -0xf911: "Na " -0xf912: "Na " -0xf913: "Na " -0xf914: "Nak " -0xf915: "Nak " -0xf916: "Nak " -0xf917: "Nak " -0xf918: "Nak " -0xf919: "Nak " -0xf91a: "Nak " -0xf91b: "Nan " -0xf91c: "Nan " -0xf91d: "Nan " -0xf91e: "Nan " -0xf91f: "Nan " -0xf920: "Nan " -0xf921: "Nam " -0xf922: "Nam " -0xf923: "Nam " -0xf924: "Nam " -0xf925: "Nap " -0xf926: "Nap " -0xf927: "Nap " -0xf928: "Nang " -0xf929: "Nang " -0xf92a: "Nang " -0xf92b: "Nang " -0xf92c: "Nang " -0xf92d: "Nay " -0xf92e: "Nayng " -0xf92f: "No " -0xf930: "No " -0xf931: "No " -0xf932: "No " -0xf933: "No " -0xf934: "No " -0xf935: "No " -0xf936: "No " -0xf937: "No " -0xf938: "No " -0xf939: "No " -0xf93a: "No " -0xf93b: "Nok " -0xf93c: "Nok " -0xf93d: "Nok " -0xf93e: "Nok " -0xf93f: "Nok " -0xf940: "Nok " -0xf941: "Non " -0xf942: "Nong " -0xf943: "Nong " -0xf944: "Nong " -0xf945: "Nong " -0xf946: "Noy " -0xf947: "Noy " -0xf948: "Noy " -0xf949: "Noy " -0xf94a: "Nwu " -0xf94b: "Nwu " -0xf94c: "Nwu " -0xf94d: "Nwu " -0xf94e: "Nwu " -0xf94f: "Nwu " -0xf950: "Nwu " -0xf951: "Nwu " -0xf952: "Nuk " -0xf953: "Nuk " -0xf954: "Num " -0xf955: "Nung " -0xf956: "Nung " -0xf957: "Nung " -0xf958: "Nung " -0xf959: "Nung " -0xf95a: "Twu " -0xf95b: "La " -0xf95c: "Lak " -0xf95d: "Lak " -0xf95e: "Lan " -0xf95f: "Lyeng " -0xf960: "Lo " -0xf961: "Lyul " -0xf962: "Li " -0xf963: "Pey " -0xf964: "Pen " -0xf965: "Pyen " -0xf966: "Pwu " -0xf967: "Pwul " -0xf968: "Pi " -0xf969: "Sak " -0xf96a: "Sak " -0xf96b: "Sam " -0xf96c: "Sayk " -0xf96d: "Sayng " -0xf96e: "Sep " -0xf96f: "Sey " -0xf970: "Sway " -0xf971: "Sin " -0xf972: "Sim " -0xf973: "Sip " -0xf974: "Ya " -0xf975: "Yak " -0xf976: "Yak " -0xf977: "Yang " -0xf978: "Yang " -0xf979: "Yang " -0xf97a: "Yang " -0xf97b: "Yang " -0xf97c: "Yang " -0xf97d: "Yang " -0xf97e: "Yang " -0xf97f: "Ye " -0xf980: "Ye " -0xf981: "Ye " -0xf982: "Ye " -0xf983: "Ye " -0xf984: "Ye " -0xf985: "Ye " -0xf986: "Ye " -0xf987: "Ye " -0xf988: "Ye " -0xf989: "Ye " -0xf98a: "Yek " -0xf98b: "Yek " -0xf98c: "Yek " -0xf98d: "Yek " -0xf98e: "Yen " -0xf98f: "Yen " -0xf990: "Yen " -0xf991: "Yen " -0xf992: "Yen " -0xf993: "Yen " -0xf994: "Yen " -0xf995: "Yen " -0xf996: "Yen " -0xf997: "Yen " -0xf998: "Yen " -0xf999: "Yen " -0xf99a: "Yen " -0xf99b: "Yen " -0xf99c: "Yel " -0xf99d: "Yel " -0xf99e: "Yel " -0xf99f: "Yel " -0xf9a0: "Yel " -0xf9a1: "Yel " -0xf9a2: "Yem " -0xf9a3: "Yem " -0xf9a4: "Yem " -0xf9a5: "Yem " -0xf9a6: "Yem " -0xf9a7: "Yep " -0xf9a8: "Yeng " -0xf9a9: "Yeng " -0xf9aa: "Yeng " -0xf9ab: "Yeng " -0xf9ac: "Yeng " -0xf9ad: "Yeng " -0xf9ae: "Yeng " -0xf9af: "Yeng " -0xf9b0: "Yeng " -0xf9b1: "Yeng " -0xf9b2: "Yeng " -0xf9b3: "Yeng " -0xf9b4: "Yeng " -0xf9b5: "Yey " -0xf9b6: "Yey " -0xf9b7: "Yey " -0xf9b8: "Yey " -0xf9b9: "O " -0xf9ba: "Yo " -0xf9bb: "Yo " -0xf9bc: "Yo " -0xf9bd: "Yo " -0xf9be: "Yo " -0xf9bf: "Yo " -0xf9c0: "Yo " -0xf9c1: "Yo " -0xf9c2: "Yo " -0xf9c3: "Yo " -0xf9c4: "Yong " -0xf9c5: "Wun " -0xf9c6: "Wen " -0xf9c7: "Yu " -0xf9c8: "Yu " -0xf9c9: "Yu " -0xf9ca: "Yu " -0xf9cb: "Yu " -0xf9cc: "Yu " -0xf9cd: "Yu " -0xf9ce: "Yu " -0xf9cf: "Yu " -0xf9d0: "Yu " -0xf9d1: "Yuk " -0xf9d2: "Yuk " -0xf9d3: "Yuk " -0xf9d4: "Yun " -0xf9d5: "Yun " -0xf9d6: "Yun " -0xf9d7: "Yun " -0xf9d8: "Yul " -0xf9d9: "Yul " -0xf9da: "Yul " -0xf9db: "Yul " -0xf9dc: "Yung " -0xf9dd: "I " -0xf9de: "I " -0xf9df: "I " -0xf9e0: "I " -0xf9e1: "I " -0xf9e2: "I " -0xf9e3: "I " -0xf9e4: "I " -0xf9e5: "I " -0xf9e6: "I " -0xf9e7: "I " -0xf9e8: "I " -0xf9e9: "I " -0xf9ea: "I " -0xf9eb: "Ik " -0xf9ec: "Ik " -0xf9ed: "In " -0xf9ee: "In " -0xf9ef: "In " -0xf9f0: "In " -0xf9f1: "In " -0xf9f2: "In " -0xf9f3: "In " -0xf9f4: "Im " -0xf9f5: "Im " -0xf9f6: "Im " -0xf9f7: "Ip " -0xf9f8: "Ip " -0xf9f9: "Ip " -0xf9fa: "Cang " -0xf9fb: "Cek " -0xf9fc: "Ci " -0xf9fd: "Cip " -0xf9fe: "Cha " -0xf9ff: "Chek " -/* x0fa */ -0xfa00: "Chey " -0xfa01: "Thak " -0xfa02: "Thak " -0xfa03: "Thang " -0xfa04: "Thayk " -0xfa05: "Thong " -0xfa06: "Pho " -0xfa07: "Phok " -0xfa08: "Hang " -0xfa09: "Hang " -0xfa0a: "Hyen " -0xfa0b: "Hwak " -0xfa0c: "Wu " -0xfa0d: "Huo " -0xfa0e: "[?] " -0xfa0f: "[?] " -0xfa10: "Zhong " -0xfa11: "[?] " -0xfa12: "Qing " -0xfa13: "[?] " -0xfa14: "[?] " -0xfa15: "Xi " -0xfa16: "Zhu " -0xfa17: "Yi " -0xfa18: "Li " -0xfa19: "Shen " -0xfa1a: "Xiang " -0xfa1b: "Fu " -0xfa1c: "Jing " -0xfa1d: "Jing " -0xfa1e: "Yu " -0xfa1f: "[?] " -0xfa20: "Hagi " -0xfa21: "[?] " -0xfa22: "Zhu " -0xfa23: "[?] " -0xfa24: "[?] " -0xfa25: "Yi " -0xfa26: "Du " -0xfa27: "[?] " -0xfa28: "[?] " -0xfa29: "[?] " -0xfa2a: "Fan " -0xfa2b: "Si " -0xfa2c: "Guan " -0xfa2d: "[?]" -0xfa2e: "[?]" -0xfa2f: "[?]" -0xfa30: "[?]" -0xfa31: "[?]" -0xfa32: "[?]" -0xfa33: "[?]" -0xfa34: "[?]" -0xfa35: "[?]" -0xfa36: "[?]" -0xfa37: "[?]" -0xfa38: "[?]" -0xfa39: "[?]" -0xfa3a: "[?]" -0xfa3b: "[?]" -0xfa3c: "[?]" -0xfa3d: "[?]" -0xfa3e: "[?]" -0xfa3f: "[?]" -0xfa40: "[?]" -0xfa41: "[?]" -0xfa42: "[?]" -0xfa43: "[?]" -0xfa44: "[?]" -0xfa45: "[?]" -0xfa46: "[?]" -0xfa47: "[?]" -0xfa48: "[?]" -0xfa49: "[?]" -0xfa4a: "[?]" -0xfa4b: "[?]" -0xfa4c: "[?]" -0xfa4d: "[?]" -0xfa4e: "[?]" -0xfa4f: "[?]" -0xfa50: "[?]" -0xfa51: "[?]" -0xfa52: "[?]" -0xfa53: "[?]" -0xfa54: "[?]" -0xfa55: "[?]" -0xfa56: "[?]" -0xfa57: "[?]" -0xfa58: "[?]" -0xfa59: "[?]" -0xfa5a: "[?]" -0xfa5b: "[?]" -0xfa5c: "[?]" -0xfa5d: "[?]" -0xfa5e: "[?]" -0xfa5f: "[?]" -0xfa60: "[?]" -0xfa61: "[?]" -0xfa62: "[?]" -0xfa63: "[?]" -0xfa64: "[?]" -0xfa65: "[?]" -0xfa66: "[?]" -0xfa67: "[?]" -0xfa68: "[?]" -0xfa69: "[?]" -0xfa6a: "[?]" -0xfa6b: "[?]" -0xfa6c: "[?]" -0xfa6d: "[?]" -0xfa6e: "[?]" -0xfa6f: "[?]" -0xfa70: "[?]" -0xfa71: "[?]" -0xfa72: "[?]" -0xfa73: "[?]" -0xfa74: "[?]" -0xfa75: "[?]" -0xfa76: "[?]" -0xfa77: "[?]" -0xfa78: "[?]" -0xfa79: "[?]" -0xfa7a: "[?]" -0xfa7b: "[?]" -0xfa7c: "[?]" -0xfa7d: "[?]" -0xfa7e: "[?]" -0xfa7f: "[?]" -0xfa80: "[?]" -0xfa81: "[?]" -0xfa82: "[?]" -0xfa83: "[?]" -0xfa84: "[?]" -0xfa85: "[?]" -0xfa86: "[?]" -0xfa87: "[?]" -0xfa88: "[?]" -0xfa89: "[?]" -0xfa8a: "[?]" -0xfa8b: "[?]" -0xfa8c: "[?]" -0xfa8d: "[?]" -0xfa8e: "[?]" -0xfa8f: "[?]" -0xfa90: "[?]" -0xfa91: "[?]" -0xfa92: "[?]" -0xfa93: "[?]" -0xfa94: "[?]" -0xfa95: "[?]" -0xfa96: "[?]" -0xfa97: "[?]" -0xfa98: "[?]" -0xfa99: "[?]" -0xfa9a: "[?]" -0xfa9b: "[?]" -0xfa9c: "[?]" -0xfa9d: "[?]" -0xfa9e: "[?]" -0xfa9f: "[?]" -0xfaa0: "[?]" -0xfaa1: "[?]" -0xfaa2: "[?]" -0xfaa3: "[?]" -0xfaa4: "[?]" -0xfaa5: "[?]" -0xfaa6: "[?]" -0xfaa7: "[?]" -0xfaa8: "[?]" -0xfaa9: "[?]" -0xfaaa: "[?]" -0xfaab: "[?]" -0xfaac: "[?]" -0xfaad: "[?]" -0xfaae: "[?]" -0xfaaf: "[?]" -0xfab0: "[?]" -0xfab1: "[?]" -0xfab2: "[?]" -0xfab3: "[?]" -0xfab4: "[?]" -0xfab5: "[?]" -0xfab6: "[?]" -0xfab7: "[?]" -0xfab8: "[?]" -0xfab9: "[?]" -0xfaba: "[?]" -0xfabb: "[?]" -0xfabc: "[?]" -0xfabd: "[?]" -0xfabe: "[?]" -0xfabf: "[?]" -0xfac0: "[?]" -0xfac1: "[?]" -0xfac2: "[?]" -0xfac3: "[?]" -0xfac4: "[?]" -0xfac5: "[?]" -0xfac6: "[?]" -0xfac7: "[?]" -0xfac8: "[?]" -0xfac9: "[?]" -0xfaca: "[?]" -0xfacb: "[?]" -0xfacc: "[?]" -0xfacd: "[?]" -0xface: "[?]" -0xfacf: "[?]" -0xfad0: "[?]" -0xfad1: "[?]" -0xfad2: "[?]" -0xfad3: "[?]" -0xfad4: "[?]" -0xfad5: "[?]" -0xfad6: "[?]" -0xfad7: "[?]" -0xfad8: "[?]" -0xfad9: "[?]" -0xfada: "[?]" -0xfadb: "[?]" -0xfadc: "[?]" -0xfadd: "[?]" -0xfade: "[?]" -0xfadf: "[?]" -0xfae0: "[?]" -0xfae1: "[?]" -0xfae2: "[?]" -0xfae3: "[?]" -0xfae4: "[?]" -0xfae5: "[?]" -0xfae6: "[?]" -0xfae7: "[?]" -0xfae8: "[?]" -0xfae9: "[?]" -0xfaea: "[?]" -0xfaeb: "[?]" -0xfaec: "[?]" -0xfaed: "[?]" -0xfaee: "[?]" -0xfaef: "[?]" -0xfaf0: "[?]" -0xfaf1: "[?]" -0xfaf2: "[?]" -0xfaf3: "[?]" -0xfaf4: "[?]" -0xfaf5: "[?]" -0xfaf6: "[?]" -0xfaf7: "[?]" -0xfaf8: "[?]" -0xfaf9: "[?]" -0xfafa: "[?]" -0xfafb: "[?]" -0xfafc: "[?]" -0xfafd: "[?]" -0xfafe: "[?]" -/* x0fb */ -0xfb00: "ff" -0xfb01: "fi" -0xfb02: "fl" -0xfb03: "ffi" -0xfb04: "ffl" -0xfb05: "st" -0xfb06: "st" -0xfb07: "[?]" -0xfb08: "[?]" -0xfb09: "[?]" -0xfb0a: "[?]" -0xfb0b: "[?]" -0xfb0c: "[?]" -0xfb0d: "[?]" -0xfb0e: "[?]" -0xfb0f: "[?]" -0xfb10: "[?]" -0xfb11: "[?]" -0xfb12: "[?]" -0xfb13: "mn" -0xfb14: "me" -0xfb15: "mi" -0xfb16: "vn" -0xfb17: "mkh" -0xfb18: "[?]" -0xfb19: "[?]" -0xfb1a: "[?]" -0xfb1b: "[?]" -0xfb1c: "[?]" -0xfb1d: "yi" -0xfb1e: "" -0xfb1f: "ay" -0xfb20: "`" -0xfb21: "" -0xfb22: "d" -0xfb23: "h" -0xfb24: "k" -0xfb25: "l" -0xfb26: "m" -0xfb27: "m" -0xfb28: "t" -0xfb29: "+" -0xfb2a: "sh" -0xfb2b: "s" -0xfb2c: "sh" -0xfb2d: "s" -0xfb2e: "a" -0xfb2f: "a" -0xfb30: "" -0xfb31: "b" -0xfb32: "g" -0xfb33: "d" -0xfb34: "h" -0xfb35: "v" -0xfb36: "z" -0xfb37: "[?]" -0xfb38: "t" -0xfb39: "y" -0xfb3a: "k" -0xfb3b: "k" -0xfb3c: "l" -0xfb3d: "[?]" -0xfb3e: "l" -0xfb3f: "[?]" -0xfb40: "n" -0xfb41: "n" -0xfb42: "[?]" -0xfb43: "p" -0xfb44: "p" -0xfb45: "[?]" -0xfb46: "ts" -0xfb47: "ts" -0xfb48: "r" -0xfb49: "sh" -0xfb4a: "t" -0xfb4b: "vo" -0xfb4c: "b" -0xfb4d: "k" -0xfb4e: "p" -0xfb4f: "l" -0xfb50: "" -0xfb51: "" -0xfb52: "" -0xfb53: "" -0xfb54: "" -0xfb55: "" -0xfb56: "" -0xfb57: "" -0xfb58: "" -0xfb59: "" -0xfb5a: "" -0xfb5b: "" -0xfb5c: "" -0xfb5d: "" -0xfb5e: "" -0xfb5f: "" -0xfb60: "" -0xfb61: "" -0xfb62: "" -0xfb63: "" -0xfb64: "" -0xfb65: "" -0xfb66: "" -0xfb67: "" -0xfb68: "" -0xfb69: "" -0xfb6a: "" -0xfb6b: "" -0xfb6c: "" -0xfb6d: "" -0xfb6e: "" -0xfb6f: "" -0xfb70: "" -0xfb71: "" -0xfb72: "" -0xfb73: "" -0xfb74: "" -0xfb75: "" -0xfb76: "" -0xfb77: "" -0xfb78: "" -0xfb79: "" -0xfb7a: "" -0xfb7b: "" -0xfb7c: "" -0xfb7d: "" -0xfb7e: "" -0xfb7f: "" -0xfb80: "" -0xfb81: "" -0xfb82: "" -0xfb83: "" -0xfb84: "" -0xfb85: "" -0xfb86: "" -0xfb87: "" -0xfb88: "" -0xfb89: "" -0xfb8a: "" -0xfb8b: "" -0xfb8c: "" -0xfb8d: "" -0xfb8e: "" -0xfb8f: "" -0xfb90: "" -0xfb91: "" -0xfb92: "" -0xfb93: "" -0xfb94: "" -0xfb95: "" -0xfb96: "" -0xfb97: "" -0xfb98: "" -0xfb99: "" -0xfb9a: "" -0xfb9b: "" -0xfb9c: "" -0xfb9d: "" -0xfb9e: "" -0xfb9f: "" -0xfba0: "" -0xfba1: "" -0xfba2: "" -0xfba3: "" -0xfba4: "" -0xfba5: "" -0xfba6: "" -0xfba7: "" -0xfba8: "" -0xfba9: "" -0xfbaa: "" -0xfbab: "" -0xfbac: "" -0xfbad: "" -0xfbae: "" -0xfbaf: "" -0xfbb0: "" -0xfbb1: "" -0xfbb2: "[?]" -0xfbb3: "[?]" -0xfbb4: "[?]" -0xfbb5: "[?]" -0xfbb6: "[?]" -0xfbb7: "[?]" -0xfbb8: "[?]" -0xfbb9: "[?]" -0xfbba: "[?]" -0xfbbb: "[?]" -0xfbbc: "[?]" -0xfbbd: "[?]" -0xfbbe: "[?]" -0xfbbf: "[?]" -0xfbc0: "[?]" -0xfbc1: "[?]" -0xfbc2: "[?]" -0xfbc3: "[?]" -0xfbc4: "[?]" -0xfbc5: "[?]" -0xfbc6: "[?]" -0xfbc7: "[?]" -0xfbc8: "[?]" -0xfbc9: "[?]" -0xfbca: "[?]" -0xfbcb: "[?]" -0xfbcc: "[?]" -0xfbcd: "[?]" -0xfbce: "[?]" -0xfbcf: "[?]" -0xfbd0: "[?]" -0xfbd1: "[?]" -0xfbd2: "[?]" -0xfbd3: "" -0xfbd4: "" -0xfbd5: "" -0xfbd6: "" -0xfbd7: "" -0xfbd8: "" -0xfbd9: "" -0xfbda: "" -0xfbdb: "" -0xfbdc: "" -0xfbdd: "" -0xfbde: "" -0xfbdf: "" -0xfbe0: "" -0xfbe1: "" -0xfbe2: "" -0xfbe3: "" -0xfbe4: "" -0xfbe5: "" -0xfbe6: "" -0xfbe7: "" -0xfbe8: "" -0xfbe9: "" -0xfbea: "" -0xfbeb: "" -0xfbec: "" -0xfbed: "" -0xfbee: "" -0xfbef: "" -0xfbf0: "" -0xfbf1: "" -0xfbf2: "" -0xfbf3: "" -0xfbf4: "" -0xfbf5: "" -0xfbf6: "" -0xfbf7: "" -0xfbf8: "" -0xfbf9: "" -0xfbfa: "" -0xfbfb: "" -0xfbfc: "" -0xfbfd: "" -0xfbfe: "" -0xfbff: "" -/* x0fc */ -0xfc00: "" -0xfc01: "" -0xfc02: "" -0xfc03: "" -0xfc04: "" -0xfc05: "" -0xfc06: "" -0xfc07: "" -0xfc08: "" -0xfc09: "" -0xfc0a: "" -0xfc0b: "" -0xfc0c: "" -0xfc0d: "" -0xfc0e: "" -0xfc0f: "" -0xfc10: "" -0xfc11: "" -0xfc12: "" -0xfc13: "" -0xfc14: "" -0xfc15: "" -0xfc16: "" -0xfc17: "" -0xfc18: "" -0xfc19: "" -0xfc1a: "" -0xfc1b: "" -0xfc1c: "" -0xfc1d: "" -0xfc1e: "" -0xfc1f: "" -0xfc20: "" -0xfc21: "" -0xfc22: "" -0xfc23: "" -0xfc24: "" -0xfc25: "" -0xfc26: "" -0xfc27: "" -0xfc28: "" -0xfc29: "" -0xfc2a: "" -0xfc2b: "" -0xfc2c: "" -0xfc2d: "" -0xfc2e: "" -0xfc2f: "" -0xfc30: "" -0xfc31: "" -0xfc32: "" -0xfc33: "" -0xfc34: "" -0xfc35: "" -0xfc36: "" -0xfc37: "" -0xfc38: "" -0xfc39: "" -0xfc3a: "" -0xfc3b: "" -0xfc3c: "" -0xfc3d: "" -0xfc3e: "" -0xfc3f: "" -0xfc40: "" -0xfc41: "" -0xfc42: "" -0xfc43: "" -0xfc44: "" -0xfc45: "" -0xfc46: "" -0xfc47: "" -0xfc48: "" -0xfc49: "" -0xfc4a: "" -0xfc4b: "" -0xfc4c: "" -0xfc4d: "" -0xfc4e: "" -0xfc4f: "" -0xfc50: "" -0xfc51: "" -0xfc52: "" -0xfc53: "" -0xfc54: "" -0xfc55: "" -0xfc56: "" -0xfc57: "" -0xfc58: "" -0xfc59: "" -0xfc5a: "" -0xfc5b: "" -0xfc5c: "" -0xfc5d: "" -0xfc5e: "" -0xfc5f: "" -0xfc60: "" -0xfc61: "" -0xfc62: "" -0xfc63: "" -0xfc64: "" -0xfc65: "" -0xfc66: "" -0xfc67: "" -0xfc68: "" -0xfc69: "" -0xfc6a: "" -0xfc6b: "" -0xfc6c: "" -0xfc6d: "" -0xfc6e: "" -0xfc6f: "" -0xfc70: "" -0xfc71: "" -0xfc72: "" -0xfc73: "" -0xfc74: "" -0xfc75: "" -0xfc76: "" -0xfc77: "" -0xfc78: "" -0xfc79: "" -0xfc7a: "" -0xfc7b: "" -0xfc7c: "" -0xfc7d: "" -0xfc7e: "" -0xfc7f: "" -0xfc80: "" -0xfc81: "" -0xfc82: "" -0xfc83: "" -0xfc84: "" -0xfc85: "" -0xfc86: "" -0xfc87: "" -0xfc88: "" -0xfc89: "" -0xfc8a: "" -0xfc8b: "" -0xfc8c: "" -0xfc8d: "" -0xfc8e: "" -0xfc8f: "" -0xfc90: "" -0xfc91: "" -0xfc92: "" -0xfc93: "" -0xfc94: "" -0xfc95: "" -0xfc96: "" -0xfc97: "" -0xfc98: "" -0xfc99: "" -0xfc9a: "" -0xfc9b: "" -0xfc9c: "" -0xfc9d: "" -0xfc9e: "" -0xfc9f: "" -0xfca0: "" -0xfca1: "" -0xfca2: "" -0xfca3: "" -0xfca4: "" -0xfca5: "" -0xfca6: "" -0xfca7: "" -0xfca8: "" -0xfca9: "" -0xfcaa: "" -0xfcab: "" -0xfcac: "" -0xfcad: "" -0xfcae: "" -0xfcaf: "" -0xfcb0: "" -0xfcb1: "" -0xfcb2: "" -0xfcb3: "" -0xfcb4: "" -0xfcb5: "" -0xfcb6: "" -0xfcb7: "" -0xfcb8: "" -0xfcb9: "" -0xfcba: "" -0xfcbb: "" -0xfcbc: "" -0xfcbd: "" -0xfcbe: "" -0xfcbf: "" -0xfcc0: "" -0xfcc1: "" -0xfcc2: "" -0xfcc3: "" -0xfcc4: "" -0xfcc5: "" -0xfcc6: "" -0xfcc7: "" -0xfcc8: "" -0xfcc9: "" -0xfcca: "" -0xfccb: "" -0xfccc: "" -0xfccd: "" -0xfcce: "" -0xfccf: "" -0xfcd0: "" -0xfcd1: "" -0xfcd2: "" -0xfcd3: "" -0xfcd4: "" -0xfcd5: "" -0xfcd6: "" -0xfcd7: "" -0xfcd8: "" -0xfcd9: "" -0xfcda: "" -0xfcdb: "" -0xfcdc: "" -0xfcdd: "" -0xfcde: "" -0xfcdf: "" -0xfce0: "" -0xfce1: "" -0xfce2: "" -0xfce3: "" -0xfce4: "" -0xfce5: "" -0xfce6: "" -0xfce7: "" -0xfce8: "" -0xfce9: "" -0xfcea: "" -0xfceb: "" -0xfcec: "" -0xfced: "" -0xfcee: "" -0xfcef: "" -0xfcf0: "" -0xfcf1: "" -0xfcf2: "" -0xfcf3: "" -0xfcf4: "" -0xfcf5: "" -0xfcf6: "" -0xfcf7: "" -0xfcf8: "" -0xfcf9: "" -0xfcfa: "" -0xfcfb: "" -0xfcfc: "" -0xfcfd: "" -0xfcfe: "" -0xfcff: "" -/* x0fd */ -0xfd00: "" -0xfd01: "" -0xfd02: "" -0xfd03: "" -0xfd04: "" -0xfd05: "" -0xfd06: "" -0xfd07: "" -0xfd08: "" -0xfd09: "" -0xfd0a: "" -0xfd0b: "" -0xfd0c: "" -0xfd0d: "" -0xfd0e: "" -0xfd0f: "" -0xfd10: "" -0xfd11: "" -0xfd12: "" -0xfd13: "" -0xfd14: "" -0xfd15: "" -0xfd16: "" -0xfd17: "" -0xfd18: "" -0xfd19: "" -0xfd1a: "" -0xfd1b: "" -0xfd1c: "" -0xfd1d: "" -0xfd1e: "" -0xfd1f: "" -0xfd20: "" -0xfd21: "" -0xfd22: "" -0xfd23: "" -0xfd24: "" -0xfd25: "" -0xfd26: "" -0xfd27: "" -0xfd28: "" -0xfd29: "" -0xfd2a: "" -0xfd2b: "" -0xfd2c: "" -0xfd2d: "" -0xfd2e: "" -0xfd2f: "" -0xfd30: "" -0xfd31: "" -0xfd32: "" -0xfd33: "" -0xfd34: "" -0xfd35: "" -0xfd36: "" -0xfd37: "" -0xfd38: "" -0xfd39: "" -0xfd3a: "" -0xfd3b: "" -0xfd3c: "" -0xfd3d: "" -0xfd3e: "" -0xfd3f: "" -0xfd40: "[?]" -0xfd41: "[?]" -0xfd42: "[?]" -0xfd43: "[?]" -0xfd44: "[?]" -0xfd45: "[?]" -0xfd46: "[?]" -0xfd47: "[?]" -0xfd48: "[?]" -0xfd49: "[?]" -0xfd4a: "[?]" -0xfd4b: "[?]" -0xfd4c: "[?]" -0xfd4d: "[?]" -0xfd4e: "[?]" -0xfd4f: "[?]" -0xfd50: "" -0xfd51: "" -0xfd52: "" -0xfd53: "" -0xfd54: "" -0xfd55: "" -0xfd56: "" -0xfd57: "" -0xfd58: "" -0xfd59: "" -0xfd5a: "" -0xfd5b: "" -0xfd5c: "" -0xfd5d: "" -0xfd5e: "" -0xfd5f: "" -0xfd60: "" -0xfd61: "" -0xfd62: "" -0xfd63: "" -0xfd64: "" -0xfd65: "" -0xfd66: "" -0xfd67: "" -0xfd68: "" -0xfd69: "" -0xfd6a: "" -0xfd6b: "" -0xfd6c: "" -0xfd6d: "" -0xfd6e: "" -0xfd6f: "" -0xfd70: "" -0xfd71: "" -0xfd72: "" -0xfd73: "" -0xfd74: "" -0xfd75: "" -0xfd76: "" -0xfd77: "" -0xfd78: "" -0xfd79: "" -0xfd7a: "" -0xfd7b: "" -0xfd7c: "" -0xfd7d: "" -0xfd7e: "" -0xfd7f: "" -0xfd80: "" -0xfd81: "" -0xfd82: "" -0xfd83: "" -0xfd84: "" -0xfd85: "" -0xfd86: "" -0xfd87: "" -0xfd88: "" -0xfd89: "" -0xfd8a: "" -0xfd8b: "" -0xfd8c: "" -0xfd8d: "" -0xfd8e: "" -0xfd8f: "" -0xfd90: "[?]" -0xfd91: "[?]" -0xfd92: "" -0xfd93: "" -0xfd94: "" -0xfd95: "" -0xfd96: "" -0xfd97: "" -0xfd98: "" -0xfd99: "" -0xfd9a: "" -0xfd9b: "" -0xfd9c: "" -0xfd9d: "" -0xfd9e: "" -0xfd9f: "" -0xfda0: "" -0xfda1: "" -0xfda2: "" -0xfda3: "" -0xfda4: "" -0xfda5: "" -0xfda6: "" -0xfda7: "" -0xfda8: "" -0xfda9: "" -0xfdaa: "" -0xfdab: "" -0xfdac: "" -0xfdad: "" -0xfdae: "" -0xfdaf: "" -0xfdb0: "" -0xfdb1: "" -0xfdb2: "" -0xfdb3: "" -0xfdb4: "" -0xfdb5: "" -0xfdb6: "" -0xfdb7: "" -0xfdb8: "" -0xfdb9: "" -0xfdba: "" -0xfdbb: "" -0xfdbc: "" -0xfdbd: "" -0xfdbe: "" -0xfdbf: "" -0xfdc0: "" -0xfdc1: "" -0xfdc2: "" -0xfdc3: "" -0xfdc4: "" -0xfdc5: "" -0xfdc6: "" -0xfdc7: "" -0xfdc8: "[?]" -0xfdc9: "[?]" -0xfdca: "[?]" -0xfdcb: "[?]" -0xfdcc: "[?]" -0xfdcd: "[?]" -0xfdce: "[?]" -0xfdcf: "[?]" -0xfdd0: "[?]" -0xfdd1: "[?]" -0xfdd2: "[?]" -0xfdd3: "[?]" -0xfdd4: "[?]" -0xfdd5: "[?]" -0xfdd6: "[?]" -0xfdd7: "[?]" -0xfdd8: "[?]" -0xfdd9: "[?]" -0xfdda: "[?]" -0xfddb: "[?]" -0xfddc: "[?]" -0xfddd: "[?]" -0xfdde: "[?]" -0xfddf: "[?]" -0xfde0: "[?]" -0xfde1: "[?]" -0xfde2: "[?]" -0xfde3: "[?]" -0xfde4: "[?]" -0xfde5: "[?]" -0xfde6: "[?]" -0xfde7: "[?]" -0xfde8: "[?]" -0xfde9: "[?]" -0xfdea: "[?]" -0xfdeb: "[?]" -0xfdec: "[?]" -0xfded: "[?]" -0xfdee: "[?]" -0xfdef: "[?]" -0xfdf0: "" -0xfdf1: "" -0xfdf2: "" -0xfdf3: "" -0xfdf4: "" -0xfdf5: "" -0xfdf6: "" -0xfdf7: "" -0xfdf8: "" -0xfdf9: "" -0xfdfa: "" -0xfdfb: "" -0xfdfc: "[?]" -0xfdfd: "[?]" -0xfdfe: "[?]" -/* x0fe */ -0xfe00: "[?]" -0xfe01: "[?]" -0xfe02: "[?]" -0xfe03: "[?]" -0xfe04: "[?]" -0xfe05: "[?]" -0xfe06: "[?]" -0xfe07: "[?]" -0xfe08: "[?]" -0xfe09: "[?]" -0xfe0a: "[?]" -0xfe0b: "[?]" -0xfe0c: "[?]" -0xfe0d: "[?]" -0xfe0e: "[?]" -0xfe0f: "[?]" -0xfe10: "[?]" -0xfe11: "[?]" -0xfe12: "[?]" -0xfe13: "[?]" -0xfe14: "[?]" -0xfe15: "[?]" -0xfe16: "[?]" -0xfe17: "[?]" -0xfe18: "[?]" -0xfe19: "[?]" -0xfe1a: "[?]" -0xfe1b: "[?]" -0xfe1c: "[?]" -0xfe1d: "[?]" -0xfe1e: "[?]" -0xfe1f: "[?]" -0xfe20: "" -0xfe21: "" -0xfe22: "" -0xfe23: "~" -0xfe24: "[?]" -0xfe25: "[?]" -0xfe26: "[?]" -0xfe27: "[?]" -0xfe28: "[?]" -0xfe29: "[?]" -0xfe2a: "[?]" -0xfe2b: "[?]" -0xfe2c: "[?]" -0xfe2d: "[?]" -0xfe2e: "[?]" -0xfe2f: "[?]" -0xfe30: ".." -0xfe31: "--" -0xfe32: "-" -0xfe33: "_" -0xfe34: "_" -0xfe35: "(" -0xfe36: ") " -0xfe37: "{" -0xfe38: "} " -0xfe39: "[" -0xfe3a: "] " -0xfe3b: "[(" -0xfe3c: ")] " -0xfe3d: "<<" -0xfe3e: ">> " -0xfe3f: "<" -0xfe40: "> " -0xfe41: "[" -0xfe42: "] " -0xfe43: "{" -0xfe44: "}" -0xfe45: "[?]" -0xfe46: "[?]" -0xfe47: "[?]" -0xfe48: "[?]" -0xfe49: "" -0xfe4a: "" -0xfe4b: "" -0xfe4c: "" -0xfe4d: "" -0xfe4e: "" -0xfe4f: "" -0xfe50: "," -0xfe51: "," -0xfe52: "." -0xfe53: "" -0xfe54: ";" -0xfe55: ":" -0xfe56: "?" -0xfe57: "!" -0xfe58: "-" -0xfe59: "(" -0xfe5a: ")" -0xfe5b: "{" -0xfe5c: "}" -0xfe5d: "{" -0xfe5e: "}" -0xfe5f: "#" -0xfe60: "&" -0xfe61: "*" -0xfe62: "+" -0xfe63: "-" -0xfe64: "<" -0xfe65: ">" -0xfe66: "=" -0xfe67: "" -0xfe68: "\\" -0xfe69: "$" -0xfe6a: "%" -0xfe6b: "@" -0xfe6c: "[?]" -0xfe6d: "[?]" -0xfe6e: "[?]" -0xfe6f: "[?]" -0xfe70: "" -0xfe71: "" -0xfe72: "" -0xfe73: "[?]" -0xfe74: "" -0xfe75: "[?]" -0xfe76: "" -0xfe77: "" -0xfe78: "" -0xfe79: "" -0xfe7a: "" -0xfe7b: "" -0xfe7c: "" -0xfe7d: "" -0xfe7e: "" -0xfe7f: "" -0xfe80: "" -0xfe81: "" -0xfe82: "" -0xfe83: "" -0xfe84: "" -0xfe85: "" -0xfe86: "" -0xfe87: "" -0xfe88: "" -0xfe89: "" -0xfe8a: "" -0xfe8b: "" -0xfe8c: "" -0xfe8d: "" -0xfe8e: "" -0xfe8f: "" -0xfe90: "" -0xfe91: "" -0xfe92: "" -0xfe93: "" -0xfe94: "" -0xfe95: "" -0xfe96: "" -0xfe97: "" -0xfe98: "" -0xfe99: "" -0xfe9a: "" -0xfe9b: "" -0xfe9c: "" -0xfe9d: "" -0xfe9e: "" -0xfe9f: "" -0xfea0: "" -0xfea1: "" -0xfea2: "" -0xfea3: "" -0xfea4: "" -0xfea5: "" -0xfea6: "" -0xfea7: "" -0xfea8: "" -0xfea9: "" -0xfeaa: "" -0xfeab: "" -0xfeac: "" -0xfead: "" -0xfeae: "" -0xfeaf: "" -0xfeb0: "" -0xfeb1: "" -0xfeb2: "" -0xfeb3: "" -0xfeb4: "" -0xfeb5: "" -0xfeb6: "" -0xfeb7: "" -0xfeb8: "" -0xfeb9: "" -0xfeba: "" -0xfebb: "" -0xfebc: "" -0xfebd: "" -0xfebe: "" -0xfebf: "" -0xfec0: "" -0xfec1: "" -0xfec2: "" -0xfec3: "" -0xfec4: "" -0xfec5: "" -0xfec6: "" -0xfec7: "" -0xfec8: "" -0xfec9: "" -0xfeca: "" -0xfecb: "" -0xfecc: "" -0xfecd: "" -0xfece: "" -0xfecf: "" -0xfed0: "" -0xfed1: "" -0xfed2: "" -0xfed3: "" -0xfed4: "" -0xfed5: "" -0xfed6: "" -0xfed7: "" -0xfed8: "" -0xfed9: "" -0xfeda: "" -0xfedb: "" -0xfedc: "" -0xfedd: "" -0xfede: "" -0xfedf: "" -0xfee0: "" -0xfee1: "" -0xfee2: "" -0xfee3: "" -0xfee4: "" -0xfee5: "" -0xfee6: "" -0xfee7: "" -0xfee8: "" -0xfee9: "" -0xfeea: "" -0xfeeb: "" -0xfeec: "" -0xfeed: "" -0xfeee: "" -0xfeef: "" -0xfef0: "" -0xfef1: "" -0xfef2: "" -0xfef3: "" -0xfef4: "" -0xfef5: "" -0xfef6: "" -0xfef7: "" -0xfef8: "" -0xfef9: "" -0xfefa: "" -0xfefb: "" -0xfefc: "" -0xfefd: "[?]" -0xfefe: "[?]" -0xfeff: "" -/* x0ff */ -0xff00: "[?]" -0xff01: "!" -0xff02: "\"" -0xff03: "#" -0xff04: "$" -0xff05: "%" -0xff06: "&" -0xff07: "'" -0xff08: "(" -0xff09: ")" -0xff0a: "*" -0xff0b: "+" -0xff0c: "," -0xff0d: "-" -0xff0e: "." -0xff0f: "/" -0xff10: "0" -0xff11: "1" -0xff12: "2" -0xff13: "3" -0xff14: "4" -0xff15: "5" -0xff16: "6" -0xff17: "7" -0xff18: "8" -0xff19: "9" -0xff1a: ":" -0xff1b: ";" -0xff1c: "<" -0xff1d: "=" -0xff1e: ">" -0xff1f: "?" -0xff20: "@" -0xff21: "A" -0xff22: "B" -0xff23: "C" -0xff24: "D" -0xff25: "E" -0xff26: "F" -0xff27: "G" -0xff28: "H" -0xff29: "I" -0xff2a: "J" -0xff2b: "K" -0xff2c: "L" -0xff2d: "M" -0xff2e: "N" -0xff2f: "O" -0xff30: "P" -0xff31: "Q" -0xff32: "R" -0xff33: "S" -0xff34: "T" -0xff35: "U" -0xff36: "V" -0xff37: "W" -0xff38: "X" -0xff39: "Y" -0xff3a: "Z" -0xff3b: "[" -0xff3c: "\\" -0xff3d: "]" -0xff3e: "^" -0xff3f: "_" -0xff40: "`" -0xff41: "a" -0xff42: "b" -0xff43: "c" -0xff44: "d" -0xff45: "e" -0xff46: "f" -0xff47: "g" -0xff48: "h" -0xff49: "i" -0xff4a: "j" -0xff4b: "k" -0xff4c: "l" -0xff4d: "m" -0xff4e: "n" -0xff4f: "o" -0xff50: "p" -0xff51: "q" -0xff52: "r" -0xff53: "s" -0xff54: "t" -0xff55: "u" -0xff56: "v" -0xff57: "w" -0xff58: "x" -0xff59: "y" -0xff5a: "z" -0xff5b: "{" -0xff5c: "|" -0xff5d: "}" -0xff5e: "~" -0xff5f: "[?]" -0xff60: "[?]" -0xff61: "." -0xff62: "[" -0xff63: "]" -0xff64: "," -0xff65: "*" -0xff66: "wo" -0xff67: "a" -0xff68: "i" -0xff69: "u" -0xff6a: "e" -0xff6b: "o" -0xff6c: "ya" -0xff6d: "yu" -0xff6e: "yo" -0xff6f: "tu" -0xff70: "+" -0xff71: "a" -0xff72: "i" -0xff73: "u" -0xff74: "e" -0xff75: "o" -0xff76: "ka" -0xff77: "ki" -0xff78: "ku" -0xff79: "ke" -0xff7a: "ko" -0xff7b: "sa" -0xff7c: "si" -0xff7d: "su" -0xff7e: "se" -0xff7f: "so" -0xff80: "ta" -0xff81: "ti" -0xff82: "tu" -0xff83: "te" -0xff84: "to" -0xff85: "na" -0xff86: "ni" -0xff87: "nu" -0xff88: "ne" -0xff89: "no" -0xff8a: "ha" -0xff8b: "hi" -0xff8c: "hu" -0xff8d: "he" -0xff8e: "ho" -0xff8f: "ma" -0xff90: "mi" -0xff91: "mu" -0xff92: "me" -0xff93: "mo" -0xff94: "ya" -0xff95: "yu" -0xff96: "yo" -0xff97: "ra" -0xff98: "ri" -0xff99: "ru" -0xff9a: "re" -0xff9b: "ro" -0xff9c: "wa" -0xff9d: "n" -0xff9e: ":" -0xff9f: ";" -0xffa0: "" -0xffa1: "g" -0xffa2: "gg" -0xffa3: "gs" -0xffa4: "n" -0xffa5: "nj" -0xffa6: "nh" -0xffa7: "d" -0xffa8: "dd" -0xffa9: "r" -0xffaa: "lg" -0xffab: "lm" -0xffac: "lb" -0xffad: "ls" -0xffae: "lt" -0xffaf: "lp" -0xffb0: "rh" -0xffb1: "m" -0xffb2: "b" -0xffb3: "bb" -0xffb4: "bs" -0xffb5: "s" -0xffb6: "ss" -0xffb7: "" -0xffb8: "j" -0xffb9: "jj" -0xffba: "c" -0xffbb: "k" -0xffbc: "t" -0xffbd: "p" -0xffbe: "h" -0xffbf: "[?]" -0xffc0: "[?]" -0xffc1: "[?]" -0xffc2: "a" -0xffc3: "ae" -0xffc4: "ya" -0xffc5: "yae" -0xffc6: "eo" -0xffc7: "e" -0xffc8: "[?]" -0xffc9: "[?]" -0xffca: "yeo" -0xffcb: "ye" -0xffcc: "o" -0xffcd: "wa" -0xffce: "wae" -0xffcf: "oe" -0xffd0: "[?]" -0xffd1: "[?]" -0xffd2: "yo" -0xffd3: "u" -0xffd4: "weo" -0xffd5: "we" -0xffd6: "wi" -0xffd7: "yu" -0xffd8: "[?]" -0xffd9: "[?]" -0xffda: "eu" -0xffdb: "yi" -0xffdc: "i" -0xffdd: "[?]" -0xffde: "[?]" -0xffdf: "[?]" -0xffe0: "/C" -0xffe1: "PS" -0xffe2: "!" -0xffe3: "-" -0xffe4: "|" -0xffe5: "Y=" -0xffe6: "W=" -0xffe7: "[?]" -0xffe8: "|" -0xffe9: "-" -0xffea: "|" -0xffeb: "-" -0xffec: "|" -0xffed: "#" -0xffee: "O" -0xffef: "[?]" -0xfff0: "[?]" -0xfff1: "[?]" -0xfff2: "[?]" -0xfff3: "[?]" -0xfff4: "[?]" -0xfff5: "[?]" -0xfff6: "[?]" -0xfff7: "[?]" -0xfff8: "[?]" -0xfff9: "{" -0xfffa: "|" -0xfffb: "}" -0xfffc: "" -0xfffd: "" -0xfffe: "" -0xffff: "" diff --git a/vendor/github.com/rainycape/unidecode/unidecode_test.go b/vendor/github.com/rainycape/unidecode/unidecode_test.go deleted file mode 100644 index 7ef0de9f2fc..00000000000 --- a/vendor/github.com/rainycape/unidecode/unidecode_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package unidecode - -import ( - "testing" -) - -func testTransliteration(original string, decoded string, t *testing.T) { - if r := Unidecode(original); r != decoded { - t.Errorf("Expected '%s', got '%s'\n", decoded, r) - } -} - -func TestASCII(t *testing.T) { - s := "ABCDEF" - testTransliteration(s, s, t) -} - -func TestKnosos(t *testing.T) { - o := "Κνωσός" - d := "Knosos" - testTransliteration(o, d, t) -} - -func TestBeiJing(t *testing.T) { - o := "\u5317\u4EB0" - d := "Bei Jing " - testTransliteration(o, d, t) -} - -func TestEmoji(t *testing.T) { - o := "Hey Luna t belle 😵😂" - d := "Hey Luna t belle " - testTransliteration(o, d, t) -} - -func BenchmarkUnidecode(b *testing.B) { - cases := []string{ - "ABCDEF", - "Κνωσός", - "\u5317\u4EB0", - } - for ii := 0; ii < b.N; ii++ { - for _, v := range cases { - _ = Unidecode(v) - } - } -} - -func BenchmarkDecodeTable(b *testing.B) { - for ii := 0; ii < b.N; ii++ { - decodeTransliterations() - } -} - -func init() { - decodeTransliterations() -} diff --git a/vendor/github.com/sergi/go-diff/.gitignore b/vendor/github.com/sergi/go-diff/.gitignore deleted file mode 100644 index 00268614f04..00000000000 --- a/vendor/github.com/sergi/go-diff/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# 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 diff --git a/vendor/github.com/sergi/go-diff/Makefile b/vendor/github.com/sergi/go-diff/Makefile deleted file mode 100644 index e013f0b31c0..00000000000 --- a/vendor/github.com/sergi/go-diff/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -.PHONY: all clean clean-coverage install install-dependencies install-tools lint test test-verbose test-with-coverage - -export ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -export PKG := github.com/sergi/go-diff -export ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) - -$(eval $(ARGS):;@:) # turn arguments into do-nothing targets -export ARGS - -ifdef ARGS - PKG_TEST := $(ARGS) -else - PKG_TEST := $(PKG)/... -endif - -all: install-tools install-dependencies install lint test - -clean: - go clean -i $(PKG)/... - go clean -i -race $(PKG)/... -clean-coverage: - find $(ROOT_DIR) | grep .coverprofile | xargs rm -install: - go install -v $(PKG)/... -install-dependencies: - go get -t -v $(PKG)/... - go build -v $(PKG)/... -install-tools: - # Install linting tools - go get -u -v github.com/golang/lint/... - go get -u -v github.com/kisielk/errcheck/... - - # Install code coverage tools - go get -u -v github.com/onsi/ginkgo/ginkgo/... - go get -u -v github.com/modocache/gover/... - go get -u -v github.com/mattn/goveralls/... -lint: - $(ROOT_DIR)/scripts/lint.sh -test: - go test -race -test.timeout 120s $(PKG_TEST) -test-verbose: - go test -race -test.timeout 120s -v $(PKG_TEST) -test-with-coverage: - ginkgo -r -cover -race -skipPackage="testdata" diff --git a/vendor/github.com/sergi/go-diff/README.md b/vendor/github.com/sergi/go-diff/README.md deleted file mode 100644 index 597437bc75a..00000000000 --- a/vendor/github.com/sergi/go-diff/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# go-diff [![GoDoc](https://godoc.org/github.com/sergi/go-diff?status.png)](https://godoc.org/github.com/sergi/go-diff/diffmatchpatch) [![Build Status](https://travis-ci.org/sergi/go-diff.svg?branch=master)](https://travis-ci.org/sergi/go-diff) [![Coverage Status](https://coveralls.io/repos/sergi/go-diff/badge.png?branch=master)](https://coveralls.io/r/sergi/go-diff?branch=master) - -go-diff offers algorithms to perform operations required for synchronizing plain text: - -- Compare two texts and return their differences. -- Perform fuzzy matching of text. -- Apply patches onto text. - -## Installation - -```bash -go get -u github.com/sergi/go-diff/... -``` - -## Usage - -The following example compares two texts and writes out the differences to standard output. - -```go -package main - -import ( - "fmt" - - "github.com/sergi/go-diff/diffmatchpatch" -) - -const ( - text1 = "Lorem ipsum dolor." - text2 = "Lorem dolor sit amet." -) - -func main() { - dmp := diffmatchpatch.New() - - diffs := dmp.DiffMain(text1, text2, false) - - fmt.Println(dmp.DiffPrettyText(diffs)) -} -``` - -## Found a bug or are you missing a feature in go-diff? - -Please make sure to have the latest version of go-diff. If the problem still persists go through the [open issues](https://github.com/sergi/go-diff/issues) in the tracker first. If you cannot find your request just open up a [new issue](https://github.com/sergi/go-diff/issues/new). - -## How to contribute? - -You want to contribute to go-diff? GREAT! If you are here because of a bug you want to fix or a feature you want to add, you can just read on. Otherwise we have a list of [open issues in the tracker](https://github.com/sergi/go-diff/issues). Just choose something you think you can work on and discuss your plans in the issue by commenting on it. - -Please make sure that every behavioral change is accompanied by test cases. Additionally, every contribution must pass the `lint` and `test` Makefile targets which can be run using the following commands in the repository root directory. - -```bash -make lint -make test -``` - -After your contribution passes these commands, [create a PR](https://help.github.com/articles/creating-a-pull-request/) and we will review your contribution. - -## Origins - -go-diff is a Go language port of Neil Fraser's google-diff-match-patch code. His original code is available at [http://code.google.com/p/google-diff-match-patch/](http://code.google.com/p/google-diff-match-patch/). - -## Copyright and License - -The original Google Diff, Match and Patch Library is licensed under the [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0). The full terms of that license are included here in the [APACHE-LICENSE-2.0](/APACHE-LICENSE-2.0) file. - -Diff, Match and Patch Library - -> Written by Neil Fraser -> Copyright (c) 2006 Google Inc. -> - -This Go version of Diff, Match and Patch Library is licensed under the [MIT License](http://www.opensource.org/licenses/MIT) (a.k.a. the Expat License) which is included here in the [LICENSE](/LICENSE) file. - -Go version of Diff, Match and Patch Library - -> Copyright (c) 2012-2016 The go-diff authors. All rights reserved. -> - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/smartystreets/assertions/.gitignore b/vendor/github.com/smartystreets/assertions/.gitignore deleted file mode 100644 index 07d3c71ce2d..00000000000 --- a/vendor/github.com/smartystreets/assertions/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -Thumbs.db -*.iml -/.idea -coverage.out diff --git a/vendor/github.com/smartystreets/assertions/CONTRIBUTING.md b/vendor/github.com/smartystreets/assertions/CONTRIBUTING.md deleted file mode 100644 index 1820ecb3310..00000000000 --- a/vendor/github.com/smartystreets/assertions/CONTRIBUTING.md +++ /dev/null @@ -1,12 +0,0 @@ -# Contributing - -In general, the code posted to the [SmartyStreets github organization](https://github.com/smartystreets) is created to solve specific problems at SmartyStreets that are ancillary to our core products in the address verification industry and may or may not be useful to other organizations or developers. Our reason for posting said code isn't necessarily to solicit feedback or contributions from the community but more as a showcase of some of the approaches to solving problems we have adopted. - -Having stated that, we do consider issues raised by other githubbers as well as contributions submitted via pull requests. When submitting such a pull request, please follow these guidelines: - -- _Look before you leap:_ If the changes you plan to make are significant, it's in everyone's best interest for you to discuss them with a SmartyStreets team member prior to opening a pull request. -- _License and ownership:_ If modifying the `LICENSE.md` file, limit your changes to fixing typographical mistakes. Do NOT modify the actual terms in the license or the copyright by **SmartyStreets, LLC**. Code submitted to SmartyStreets projects becomes property of SmartyStreets and must be compatible with the associated license. -- _Testing:_ If the code you are submitting resides in packages/modules covered by automated tests, be sure to add passing tests that cover your changes and assert expected behavior and state. Submit the additional test cases as part of your change set. -- _Style:_ Match your approach to **naming** and **formatting** with the surrounding code. Basically, the code you submit shouldn't stand out. - - "Naming" refers to such constructs as variables, methods, functions, classes, structs, interfaces, packages, modules, directories, files, etc... - - "Formatting" refers to such constructs as whitespace, horizontal line length, vertical function length, vertical file length, indentation, curly braces, etc... diff --git a/vendor/github.com/smartystreets/assertions/README.md b/vendor/github.com/smartystreets/assertions/README.md deleted file mode 100644 index 58383bb00af..00000000000 --- a/vendor/github.com/smartystreets/assertions/README.md +++ /dev/null @@ -1,575 +0,0 @@ -# assertions --- - import "github.com/smartystreets/assertions" - -Package assertions contains the implementations for all assertions which are -referenced in goconvey's `convey` package -(github.com/smartystreets/goconvey/convey) and gunit -(github.com/smartystreets/gunit) for use with the So(...) method. They can also -be used in traditional Go test functions and even in applications. - -Many of the assertions lean heavily on work done by Aaron Jacobs in his -excellent oglematchers library. (https://github.com/jacobsa/oglematchers) The -ShouldResemble assertion leans heavily on work done by Daniel Jacques in his -very helpful go-render library. (https://github.com/luci/go-render) - -## Usage - -#### func GoConveyMode - -```go -func GoConveyMode(yes bool) -``` -GoConveyMode provides control over JSON serialization of failures. When using -the assertions in this package from the convey package JSON results are very -helpful and can be rendered in a DIFF view. In that case, this function will be -called with a true value to enable the JSON serialization. By default, the -assertions in this package will not serializer a JSON result, making standalone -ussage more convenient. - -#### func ShouldAlmostEqual - -```go -func ShouldAlmostEqual(actual interface{}, expected ...interface{}) string -``` -ShouldAlmostEqual makes sure that two parameters are close enough to being -equal. The acceptable delta may be specified with a third argument, or a very -small default delta will be used. - -#### func ShouldBeBetween - -```go -func ShouldBeBetween(actual interface{}, expected ...interface{}) string -``` -ShouldBeBetween receives exactly three parameters: an actual value, a lower -bound, and an upper bound. It ensures that the actual value is between both -bounds (but not equal to either of them). - -#### func ShouldBeBetweenOrEqual - -```go -func ShouldBeBetweenOrEqual(actual interface{}, expected ...interface{}) string -``` -ShouldBeBetweenOrEqual receives exactly three parameters: an actual value, a -lower bound, and an upper bound. It ensures that the actual value is between -both bounds or equal to one of them. - -#### func ShouldBeBlank - -```go -func ShouldBeBlank(actual interface{}, expected ...interface{}) string -``` -ShouldBeBlank receives exactly 1 string parameter and ensures that it is equal -to "". - -#### func ShouldBeChronological - -```go -func ShouldBeChronological(actual interface{}, expected ...interface{}) string -``` -ShouldBeChronological receives a []time.Time slice and asserts that the are in -chronological order starting with the first time.Time as the earliest. - -#### func ShouldBeEmpty - -```go -func ShouldBeEmpty(actual interface{}, expected ...interface{}) string -``` -ShouldBeEmpty receives a single parameter (actual) and determines whether or not -calling len(actual) would return `0`. It obeys the rules specified by the len -function for determining length: http://golang.org/pkg/builtin/#len - -#### func ShouldBeFalse - -```go -func ShouldBeFalse(actual interface{}, expected ...interface{}) string -``` -ShouldBeFalse receives a single parameter and ensures that it is false. - -#### func ShouldBeGreaterThan - -```go -func ShouldBeGreaterThan(actual interface{}, expected ...interface{}) string -``` -ShouldBeGreaterThan receives exactly two parameters and ensures that the first -is greater than the second. - -#### func ShouldBeGreaterThanOrEqualTo - -```go -func ShouldBeGreaterThanOrEqualTo(actual interface{}, expected ...interface{}) string -``` -ShouldBeGreaterThanOrEqualTo receives exactly two parameters and ensures that -the first is greater than or equal to the second. - -#### func ShouldBeIn - -```go -func ShouldBeIn(actual interface{}, expected ...interface{}) string -``` -ShouldBeIn receives at least 2 parameters. The first is a proposed member of the -collection that is passed in either as the second parameter, or of the -collection that is comprised of all the remaining parameters. This assertion -ensures that the proposed member is in the collection (using ShouldEqual). - -#### func ShouldBeLessThan - -```go -func ShouldBeLessThan(actual interface{}, expected ...interface{}) string -``` -ShouldBeLessThan receives exactly two parameters and ensures that the first is -less than the second. - -#### func ShouldBeLessThanOrEqualTo - -```go -func ShouldBeLessThanOrEqualTo(actual interface{}, expected ...interface{}) string -``` -ShouldBeLessThan receives exactly two parameters and ensures that the first is -less than or equal to the second. - -#### func ShouldBeNil - -```go -func ShouldBeNil(actual interface{}, expected ...interface{}) string -``` -ShouldBeNil receives a single parameter and ensures that it is nil. - -#### func ShouldBeTrue - -```go -func ShouldBeTrue(actual interface{}, expected ...interface{}) string -``` -ShouldBeTrue receives a single parameter and ensures that it is true. - -#### func ShouldBeZeroValue - -```go -func ShouldBeZeroValue(actual interface{}, expected ...interface{}) string -``` -ShouldBeZeroValue receives a single parameter and ensures that it is the Go -equivalent of the default value, or "zero" value. - -#### func ShouldContain - -```go -func ShouldContain(actual interface{}, expected ...interface{}) string -``` -ShouldContain receives exactly two parameters. The first is a slice and the -second is a proposed member. Membership is determined using ShouldEqual. - -#### func ShouldContainKey - -```go -func ShouldContainKey(actual interface{}, expected ...interface{}) string -``` -ShouldContainKey receives exactly two parameters. The first is a map and the -second is a proposed key. Keys are compared with a simple '=='. - -#### func ShouldContainSubstring - -```go -func ShouldContainSubstring(actual interface{}, expected ...interface{}) string -``` -ShouldContainSubstring receives exactly 2 string parameters and ensures that the -first contains the second as a substring. - -#### func ShouldEndWith - -```go -func ShouldEndWith(actual interface{}, expected ...interface{}) string -``` -ShouldEndWith receives exactly 2 string parameters and ensures that the first -ends with the second. - -#### func ShouldEqual - -```go -func ShouldEqual(actual interface{}, expected ...interface{}) string -``` -ShouldEqual receives exactly two parameters and does an equality check. - -#### func ShouldEqualTrimSpace - -```go -func ShouldEqualTrimSpace(actual interface{}, expected ...interface{}) string -``` -ShouldEqualTrimSpace receives exactly 2 string parameters and ensures that the -first is equal to the second after removing all leading and trailing whitespace -using strings.TrimSpace(first). - -#### func ShouldEqualWithout - -```go -func ShouldEqualWithout(actual interface{}, expected ...interface{}) string -``` -ShouldEqualWithout receives exactly 3 string parameters and ensures that the -first is equal to the second after removing all instances of the third from the -first using strings.Replace(first, third, "", -1). - -#### func ShouldHappenAfter - -```go -func ShouldHappenAfter(actual interface{}, expected ...interface{}) string -``` -ShouldHappenAfter receives exactly 2 time.Time arguments and asserts that the -first happens after the second. - -#### func ShouldHappenBefore - -```go -func ShouldHappenBefore(actual interface{}, expected ...interface{}) string -``` -ShouldHappenBefore receives exactly 2 time.Time arguments and asserts that the -first happens before the second. - -#### func ShouldHappenBetween - -```go -func ShouldHappenBetween(actual interface{}, expected ...interface{}) string -``` -ShouldHappenBetween receives exactly 3 time.Time arguments and asserts that the -first happens between (not on) the second and third. - -#### func ShouldHappenOnOrAfter - -```go -func ShouldHappenOnOrAfter(actual interface{}, expected ...interface{}) string -``` -ShouldHappenOnOrAfter receives exactly 2 time.Time arguments and asserts that -the first happens on or after the second. - -#### func ShouldHappenOnOrBefore - -```go -func ShouldHappenOnOrBefore(actual interface{}, expected ...interface{}) string -``` -ShouldHappenOnOrBefore receives exactly 2 time.Time arguments and asserts that -the first happens on or before the second. - -#### func ShouldHappenOnOrBetween - -```go -func ShouldHappenOnOrBetween(actual interface{}, expected ...interface{}) string -``` -ShouldHappenOnOrBetween receives exactly 3 time.Time arguments and asserts that -the first happens between or on the second and third. - -#### func ShouldHappenWithin - -```go -func ShouldHappenWithin(actual interface{}, expected ...interface{}) string -``` -ShouldHappenWithin receives a time.Time, a time.Duration, and a time.Time (3 -arguments) and asserts that the first time.Time happens within or on the -duration specified relative to the other time.Time. - -#### func ShouldHaveLength - -```go -func ShouldHaveLength(actual interface{}, expected ...interface{}) string -``` -ShouldHaveLength receives 2 parameters. The first is a collection to check the -length of, the second being the expected length. It obeys the rules specified by -the len function for determining length: http://golang.org/pkg/builtin/#len - -#### func ShouldHaveSameTypeAs - -```go -func ShouldHaveSameTypeAs(actual interface{}, expected ...interface{}) string -``` -ShouldHaveSameTypeAs receives exactly two parameters and compares their -underlying types for equality. - -#### func ShouldImplement - -```go -func ShouldImplement(actual interface{}, expectedList ...interface{}) string -``` -ShouldImplement receives exactly two parameters and ensures that the first -implements the interface type of the second. - -#### func ShouldNotAlmostEqual - -```go -func ShouldNotAlmostEqual(actual interface{}, expected ...interface{}) string -``` -ShouldNotAlmostEqual is the inverse of ShouldAlmostEqual - -#### func ShouldNotBeBetween - -```go -func ShouldNotBeBetween(actual interface{}, expected ...interface{}) string -``` -ShouldNotBeBetween receives exactly three parameters: an actual value, a lower -bound, and an upper bound. It ensures that the actual value is NOT between both -bounds. - -#### func ShouldNotBeBetweenOrEqual - -```go -func ShouldNotBeBetweenOrEqual(actual interface{}, expected ...interface{}) string -``` -ShouldNotBeBetweenOrEqual receives exactly three parameters: an actual value, a -lower bound, and an upper bound. It ensures that the actual value is nopt -between the bounds nor equal to either of them. - -#### func ShouldNotBeBlank - -```go -func ShouldNotBeBlank(actual interface{}, expected ...interface{}) string -``` -ShouldNotBeBlank receives exactly 1 string parameter and ensures that it is -equal to "". - -#### func ShouldNotBeEmpty - -```go -func ShouldNotBeEmpty(actual interface{}, expected ...interface{}) string -``` -ShouldNotBeEmpty receives a single parameter (actual) and determines whether or -not calling len(actual) would return a value greater than zero. It obeys the -rules specified by the `len` function for determining length: -http://golang.org/pkg/builtin/#len - -#### func ShouldNotBeIn - -```go -func ShouldNotBeIn(actual interface{}, expected ...interface{}) string -``` -ShouldNotBeIn receives at least 2 parameters. The first is a proposed member of -the collection that is passed in either as the second parameter, or of the -collection that is comprised of all the remaining parameters. This assertion -ensures that the proposed member is NOT in the collection (using ShouldEqual). - -#### func ShouldNotBeNil - -```go -func ShouldNotBeNil(actual interface{}, expected ...interface{}) string -``` -ShouldNotBeNil receives a single parameter and ensures that it is not nil. - -#### func ShouldNotContain - -```go -func ShouldNotContain(actual interface{}, expected ...interface{}) string -``` -ShouldNotContain receives exactly two parameters. The first is a slice and the -second is a proposed member. Membership is determinied using ShouldEqual. - -#### func ShouldNotContainKey - -```go -func ShouldNotContainKey(actual interface{}, expected ...interface{}) string -``` -ShouldNotContainKey receives exactly two parameters. The first is a map and the -second is a proposed absent key. Keys are compared with a simple '=='. - -#### func ShouldNotContainSubstring - -```go -func ShouldNotContainSubstring(actual interface{}, expected ...interface{}) string -``` -ShouldNotContainSubstring receives exactly 2 string parameters and ensures that -the first does NOT contain the second as a substring. - -#### func ShouldNotEndWith - -```go -func ShouldNotEndWith(actual interface{}, expected ...interface{}) string -``` -ShouldEndWith receives exactly 2 string parameters and ensures that the first -does not end with the second. - -#### func ShouldNotEqual - -```go -func ShouldNotEqual(actual interface{}, expected ...interface{}) string -``` -ShouldNotEqual receives exactly two parameters and does an inequality check. - -#### func ShouldNotHappenOnOrBetween - -```go -func ShouldNotHappenOnOrBetween(actual interface{}, expected ...interface{}) string -``` -ShouldNotHappenOnOrBetween receives exactly 3 time.Time arguments and asserts -that the first does NOT happen between or on the second or third. - -#### func ShouldNotHappenWithin - -```go -func ShouldNotHappenWithin(actual interface{}, expected ...interface{}) string -``` -ShouldNotHappenWithin receives a time.Time, a time.Duration, and a time.Time (3 -arguments) and asserts that the first time.Time does NOT happen within or on the -duration specified relative to the other time.Time. - -#### func ShouldNotHaveSameTypeAs - -```go -func ShouldNotHaveSameTypeAs(actual interface{}, expected ...interface{}) string -``` -ShouldNotHaveSameTypeAs receives exactly two parameters and compares their -underlying types for inequality. - -#### func ShouldNotImplement - -```go -func ShouldNotImplement(actual interface{}, expectedList ...interface{}) string -``` -ShouldNotImplement receives exactly two parameters and ensures that the first -does NOT implement the interface type of the second. - -#### func ShouldNotPanic - -```go -func ShouldNotPanic(actual interface{}, expected ...interface{}) (message string) -``` -ShouldNotPanic receives a void, niladic function and expects to execute the -function without any panic. - -#### func ShouldNotPanicWith - -```go -func ShouldNotPanicWith(actual interface{}, expected ...interface{}) (message string) -``` -ShouldNotPanicWith receives a void, niladic function and expects to recover a -panic whose content differs from the second argument. - -#### func ShouldNotPointTo - -```go -func ShouldNotPointTo(actual interface{}, expected ...interface{}) string -``` -ShouldNotPointTo receives exactly two parameters and checks to see that they -point to different addresess. - -#### func ShouldNotResemble - -```go -func ShouldNotResemble(actual interface{}, expected ...interface{}) string -``` -ShouldNotResemble receives exactly two parameters and does an inverse deep equal -check (see reflect.DeepEqual) - -#### func ShouldNotStartWith - -```go -func ShouldNotStartWith(actual interface{}, expected ...interface{}) string -``` -ShouldNotStartWith receives exactly 2 string parameters and ensures that the -first does not start with the second. - -#### func ShouldPanic - -```go -func ShouldPanic(actual interface{}, expected ...interface{}) (message string) -``` -ShouldPanic receives a void, niladic function and expects to recover a panic. - -#### func ShouldPanicWith - -```go -func ShouldPanicWith(actual interface{}, expected ...interface{}) (message string) -``` -ShouldPanicWith receives a void, niladic function and expects to recover a panic -with the second argument as the content. - -#### func ShouldPointTo - -```go -func ShouldPointTo(actual interface{}, expected ...interface{}) string -``` -ShouldPointTo receives exactly two parameters and checks to see that they point -to the same address. - -#### func ShouldResemble - -```go -func ShouldResemble(actual interface{}, expected ...interface{}) string -``` -ShouldResemble receives exactly two parameters and does a deep equal check (see -reflect.DeepEqual) - -#### func ShouldStartWith - -```go -func ShouldStartWith(actual interface{}, expected ...interface{}) string -``` -ShouldStartWith receives exactly 2 string parameters and ensures that the first -starts with the second. - -#### func So - -```go -func So(actual interface{}, assert assertion, expected ...interface{}) (bool, string) -``` -So is a convenience function (as opposed to an inconvenience function?) for -running assertions on arbitrary arguments in any context, be it for testing or -even application logging. It allows you to perform assertion-like behavior (and -get nicely formatted messages detailing discrepancies) but without the program -blowing up or panicking. All that is required is to import this package and call -`So` with one of the assertions exported by this package as the second -parameter. The first return parameter is a boolean indicating if the assertion -was true. The second return parameter is the well-formatted message showing why -an assertion was incorrect, or blank if the assertion was correct. - -Example: - - if ok, message := So(x, ShouldBeGreaterThan, y); !ok { - log.Println(message) - } - -#### type Assertion - -```go -type Assertion struct { -} -``` - - -#### func New - -```go -func New(t testingT) *Assertion -``` -New swallows the *testing.T struct and prints failed assertions using t.Error. -Example: assertions.New(t).So(1, should.Equal, 1) - -#### func (*Assertion) Failed - -```go -func (this *Assertion) Failed() bool -``` -Failed reports whether any calls to So (on this Assertion instance) have failed. - -#### func (*Assertion) So - -```go -func (this *Assertion) So(actual interface{}, assert assertion, expected ...interface{}) bool -``` -So calls the standalone So function and additionally, calls t.Error in failure -scenarios. - -#### type FailureView - -```go -type FailureView struct { - Message string `json:"Message"` - Expected string `json:"Expected"` - Actual string `json:"Actual"` -} -``` - -This struct is also declared in -github.com/smartystreets/goconvey/convey/reporting. The json struct tags should -be equal in both declarations. - -#### type Serializer - -```go -type Serializer interface { - // contains filtered or unexported methods -} -``` diff --git a/vendor/github.com/smartystreets/assertions/internal/Makefile b/vendor/github.com/smartystreets/assertions/internal/Makefile deleted file mode 100644 index be7dec553c8..00000000000 --- a/vendor/github.com/smartystreets/assertions/internal/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# This Makefile pulls the latest oglematchers (with dependencies), -# rewrites the imports to match this location, -# and ensures that all the tests pass. -# BTW, things used from oglematchers: Contains, Equals, DeepEquals, GreaterThan, LessThan, GreaterOrEqual, LessOrEqual - -test: - go test github.com/smartystreets/assertions/... - -update: clear clone rewrite trim - -clear: - rm -rf ogle* - rm -rf reqtrace - rm -rf go-render - -clone: - git clone https://github.com/jacobsa/oglematchers.git && rm -rf oglematchers/.git - git clone https://github.com/luci/go-render.git && rm -rf go-render/.git - -rewrite: - grep -rl --exclude Makefile 'github.com/jacobsa' . | xargs sed -i '' 's#github.com/jacobsa#github.com/smartystreets/assertions/internal#g' - -trim: - git checkout oglematchers/contains.go # This file diverged at 6acd0337 - rm oglematchers/*_test.go - rm oglematchers/any.go - rm oglematchers/all_of.go - rm oglematchers/elements_are.go - rm oglematchers/error.go - rm oglematchers/has_same_type_as.go - rm oglematchers/has_substr.go - rm oglematchers/identical_to.go - rm oglematchers/matches_regexp.go - rm oglematchers/new_matcher.go - rm oglematchers/panics.go - rm oglematchers/pointee.go - rm go-render/render/*_test.go diff --git a/vendor/github.com/smartystreets/assertions/internal/go-render/README.md b/vendor/github.com/smartystreets/assertions/internal/go-render/README.md deleted file mode 100644 index a85380c421a..00000000000 --- a/vendor/github.com/smartystreets/assertions/internal/go-render/README.md +++ /dev/null @@ -1,78 +0,0 @@ -go-render: A verbose recursive Go type-to-string conversion library. -==================================================================== - -[![GoDoc](https://godoc.org/github.com/luci/go-render?status.svg)](https://godoc.org/github.com/luci/go-render) -[![Build Status](https://travis-ci.org/luci/go-render.svg)](https://travis-ci.org/luci/go-render) - -This is not an official Google product. - -## Overview - -The *render* package implements a more verbose form of the standard Go string -formatter, `fmt.Sprintf("%#v", value)`, adding: - - Pointer recursion. Normally, Go stops at the first pointer and prints its - address. The *render* package will recurse and continue to render pointer - values. - - Recursion loop detection. Recursion is nice, but if a recursion path detects - a loop, *render* will note this and move on. - - Custom type name rendering. - - Deterministic key sorting for `string`- and `int`-keyed maps. - - Testing! - -Call `render.Render` and pass it an `interface{}`. - -For example: - -```Go -type customType int -type testStruct struct { - S string - V *map[string]int - I interface{} -} - -a := testStruct{ - S: "hello", - V: &map[string]int{"foo": 0, "bar": 1}, - I: customType(42), -} - -fmt.Println("Render test:") -fmt.Printf("fmt.Printf: %#v\n", a))) -fmt.Printf("render.Render: %s\n", Render(a)) -``` - -Yields: -``` -fmt.Printf: render.testStruct{S:"hello", V:(*map[string]int)(0x600dd065), I:42} -render.Render: render.testStruct{S:"hello", V:(*map[string]int){"bar":1, "foo":0}, I:render.customType(42)} -``` - -This is not intended to be a high-performance library, but it's not terrible -either. - -Contributing ------------- - - * Sign the [Google CLA](https://cla.developers.google.com/clas). - * Make sure your `user.email` and `user.name` are configured in `git config`. - * Install the [pcg](https://github.com/maruel/pre-commit-go) git hook: - `go get -u github.com/maruel/pre-commit-go/cmd/... && pcg` - -Run the following to setup the code review tool and create your first review: - - git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git $HOME/src/depot_tools - export PATH="$PATH:$HOME/src/depot_tools" - cd $GOROOT/github.com/luci/go-render - git checkout -b work origin/master - - # hack hack - - git commit -a -m "This is awesome\nR=joe@example.com" - # This will ask for your Google Account credentials. - git cl upload -s - # Wait for LGTM over email. - # Check the commit queue box in codereview website. - # Wait for the change to be tested and landed automatically. - -Use `git cl help` and `git cl help ` for more details. diff --git a/vendor/github.com/smartystreets/assertions/internal/go-render/WATCHLISTS b/vendor/github.com/smartystreets/assertions/internal/go-render/WATCHLISTS deleted file mode 100644 index e4172088dd3..00000000000 --- a/vendor/github.com/smartystreets/assertions/internal/go-render/WATCHLISTS +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Watchlist Rules -# Refer: http://dev.chromium.org/developers/contributing-code/watchlists - -{ - - 'WATCHLIST_DEFINITIONS': { - 'all': { - 'filepath': '.+', - }, - }, - - 'WATCHLISTS': { - 'all': [ - # Add yourself here to get explicitly spammed. - 'maruel@chromium.org', - 'tandrii+luci-go@chromium.org', - 'todd@cloudera.com', - 'andrew.wang@cloudera.com', - ], - }, - -} diff --git a/vendor/github.com/smartystreets/assertions/internal/oglematchers/.gitignore b/vendor/github.com/smartystreets/assertions/internal/oglematchers/.gitignore deleted file mode 100644 index dd8fc7468f4..00000000000 --- a/vendor/github.com/smartystreets/assertions/internal/oglematchers/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.6 -6.out -_obj/ -_test/ -_testmain.go diff --git a/vendor/github.com/smartystreets/assertions/internal/oglematchers/README.md b/vendor/github.com/smartystreets/assertions/internal/oglematchers/README.md deleted file mode 100644 index 215a2bb7a8b..00000000000 --- a/vendor/github.com/smartystreets/assertions/internal/oglematchers/README.md +++ /dev/null @@ -1,58 +0,0 @@ -[![GoDoc](https://godoc.org/github.com/smartystreets/assertions/internal/oglematchers?status.svg)](https://godoc.org/github.com/smartystreets/assertions/internal/oglematchers) - -`oglematchers` is a package for the Go programming language containing a set of -matchers, useful in a testing or mocking framework, inspired by and mostly -compatible with [Google Test][googletest] for C++ and -[Google JS Test][google-js-test]. The package is used by the -[ogletest][ogletest] testing framework and [oglemock][oglemock] mocking -framework, which may be more directly useful to you, but can be generically used -elsewhere as well. - -A "matcher" is simply an object with a `Matches` method defining a set of golang -values matched by the matcher, and a `Description` method describing that set. -For example, here are some matchers: - -```go -// Numbers -Equals(17.13) -LessThan(19) - -// Strings -Equals("taco") -HasSubstr("burrito") -MatchesRegex("t.*o") - -// Combining matchers -AnyOf(LessThan(17), GreaterThan(19)) -``` - -There are lots more; see [here][reference] for a reference. You can also add -your own simply by implementing the `oglematchers.Matcher` interface. - - -Installation ------------- - -First, make sure you have installed Go 1.0.2 or newer. See -[here][golang-install] for instructions. - -Use the following command to install `oglematchers` and keep it up to date: - - go get -u github.com/smartystreets/assertions/internal/oglematchers - - -Documentation -------------- - -See [here][reference] for documentation. Alternatively, you can install the -package and then use `godoc`: - - godoc github.com/smartystreets/assertions/internal/oglematchers - - -[reference]: http://godoc.org/github.com/smartystreets/assertions/internal/oglematchers -[golang-install]: http://golang.org/doc/install.html -[googletest]: http://code.google.com/p/googletest/ -[google-js-test]: http://code.google.com/p/google-js-test/ -[ogletest]: http://github.com/smartystreets/assertions/internal/ogletest -[oglemock]: http://github.com/smartystreets/assertions/internal/oglemock diff --git a/vendor/github.com/smartystreets/goconvey/.gitattributes b/vendor/github.com/smartystreets/goconvey/.gitattributes deleted file mode 100644 index bc2c94aa5da..00000000000 --- a/vendor/github.com/smartystreets/goconvey/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -web/client/resources/js/lib/* linguist-vendored diff --git a/vendor/github.com/smartystreets/goconvey/.gitignore b/vendor/github.com/smartystreets/goconvey/.gitignore deleted file mode 100644 index c9205c5335a..00000000000 --- a/vendor/github.com/smartystreets/goconvey/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -Thumbs.db -examples/output.json -web/client/reports/ -/.idea \ No newline at end of file diff --git a/vendor/github.com/smartystreets/goconvey/CONTRIBUTING.md b/vendor/github.com/smartystreets/goconvey/CONTRIBUTING.md deleted file mode 100644 index cc0e8e8e406..00000000000 --- a/vendor/github.com/smartystreets/goconvey/CONTRIBUTING.md +++ /dev/null @@ -1,35 +0,0 @@ -# Subject: GoConvey maintainers wanted - -We'd like to open the project up to additional maintainers who want to move the project forward in a meaningful way. - -We've spent significant time at SmartyStreets building GoConvey and it has perfectly met (and exceeded) all of our initial design specifications. We've used it to great effect. Being so well-matched to our development workflows at SmartyStreets, we haven't had a need to hack on it lately. This had been frustrating to many in the community who have ideas for the project and would like to see new features released (and some old bugs fixed). The release of Go 1.5 and the new vendoring experiment has been a source of confusion and hassle for those who have already upgraded and find that GoConvey needs to be brought up to speed. - -GoConvey is a popular 2-pronged, open-source github project (1,600+ stargazers, 100+ forks): - -- A package you import in your test code that allows you to write BDD-style tests. -- An executable that runs a local web server which displays auto-updating test results in a web browser. - ----- - -- http://goconvey.co/ -- https://github.com/smartystreets/goconvey -- https://github.com/smartystreets/goconvey/wiki - -_I should mention that the [assertions package](https://github.com/smartystreets/assertions) imported by the convey package is used by other projects at SmartyStreets and so we will be continuing to maintain that project internally._ - -We hope to hear from you soon. Thanks! - ---- - -# Contributing - -In general, the code posted to the [SmartyStreets github organization](https://github.com/smartystreets) is created to solve specific problems at SmartyStreets that are ancillary to our core products in the address verification industry and may or may not be useful to other organizations or developers. Our reason for posting said code isn't necessarily to solicit feedback or contributions from the community but more as a showcase of some of the approaches to solving problems we have adopted. - -Having stated that, we do consider issues raised by other githubbers as well as contributions submitted via pull requests. When submitting such a pull request, please follow these guidelines: - -- _Look before you leap:_ If the changes you plan to make are significant, it's in everyone's best interest for you to discuss them with a SmartyStreets team member prior to opening a pull request. -- _License and ownership:_ If modifying the `LICENSE.md` file, limit your changes to fixing typographical mistakes. Do NOT modify the actual terms in the license or the copyright by **SmartyStreets, LLC**. Code submitted to SmartyStreets projects becomes property of SmartyStreets and must be compatible with the associated license. -- _Testing:_ If the code you are submitting resides in packages/modules covered by automated tests, be sure to add passing tests that cover your changes and assert expected behavior and state. Submit the additional test cases as part of your change set. -- _Style:_ Match your approach to **naming** and **formatting** with the surrounding code. Basically, the code you submit shouldn't stand out. - - "Naming" refers to such constructs as variables, methods, functions, classes, structs, interfaces, packages, modules, directories, files, etc... - - "Formatting" refers to such constructs as whitespace, horizontal line length, vertical function length, vertical file length, indentation, curly braces, etc... diff --git a/vendor/github.com/smartystreets/goconvey/README.md b/vendor/github.com/smartystreets/goconvey/README.md deleted file mode 100644 index 00df48066f5..00000000000 --- a/vendor/github.com/smartystreets/goconvey/README.md +++ /dev/null @@ -1,124 +0,0 @@ -GoConvey is awesome Go testing -============================== - -[![Build Status](https://travis-ci.org/smartystreets/goconvey.png)](https://travis-ci.org/smartystreets/goconvey) -[![GoDoc](https://godoc.org/github.com/smartystreets/goconvey?status.svg)](http://godoc.org/github.com/smartystreets/goconvey) - - -Welcome to GoConvey, a yummy Go testing tool for gophers. Works with `go test`. Use it in the terminal or browser according to your viewing pleasure. **[View full feature tour.](http://goconvey.co)** - -**Features:** - -- Directly integrates with `go test` -- Fully-automatic web UI (works with native Go tests, too) -- Huge suite of regression tests -- Shows test coverage (Go 1.2+) -- Readable, colorized console output (understandable by any manager, IT or not) -- Test code generator -- Desktop notifications (optional) -- Immediately open problem lines in [Sublime Text](http://www.sublimetext.com) ([some assembly required](https://github.com/asuth/subl-handler)) - - -You can ask questions about how to use GoConvey on [StackOverflow](http://stackoverflow.com/questions/ask?tags=goconvey,go&title=GoConvey%3A%20). Use the tags `go` and `goconvey`. - -**Menu:** - -- [Installation](#installation) -- [Quick start](#quick-start) -- [Documentation](#documentation) -- [Screenshots](#screenshots) -- [Contributors](#contributors) - - - - -Installation ------------- - - $ go get github.com/smartystreets/goconvey - -[Quick start](https://github.com/smartystreets/goconvey/wiki#get-going-in-25-seconds) ------------ - -Make a test, for example: - -```go -package package_name - -import ( - "testing" - . "github.com/smartystreets/goconvey/convey" -) - -func TestSpec(t *testing.T) { - - // Only pass t into top-level Convey calls - Convey("Given some integer with a starting value", t, func() { - x := 1 - - Convey("When the integer is incremented", func() { - x++ - - Convey("The value should be greater by one", func() { - So(x, ShouldEqual, 2) - }) - }) - }) -} -``` - - -#### [In the browser](https://github.com/smartystreets/goconvey/wiki/Web-UI) - -Start up the GoConvey web server at your project's path: - - $ $GOPATH/bin/goconvey - -Then watch the test results display in your browser at: - - http://localhost:8080 - - -If the browser doesn't open automatically, please click [http://localhost:8080](http://localhost:8080) to open manually. - -There you have it. -![](http://d79i1fxsrar4t.cloudfront.net/goconvey.co/gc-1-dark.png) -As long as GoConvey is running, test results will automatically update in your browser window. - -![](http://d79i1fxsrar4t.cloudfront.net/goconvey.co/gc-5-dark.png) -The design is responsive, so you can squish the browser real tight if you need to put it beside your code. - - -The [web UI](https://github.com/smartystreets/goconvey/wiki/Web-UI) supports traditional Go tests, so use it even if you're not using GoConvey tests. - - - -#### [In the terminal](https://github.com/smartystreets/goconvey/wiki/Execution) - -Just do what you do best: - - $ go test - -Or if you want the output to include the story: - - $ go test -v - - -[Documentation](https://github.com/smartystreets/goconvey/wiki) ------------ - -Check out the - -- [GoConvey wiki](https://github.com/smartystreets/goconvey/wiki), -- [![GoDoc](https://godoc.org/github.com/smartystreets/goconvey?status.png)](http://godoc.org/github.com/smartystreets/goconvey) -- and the *_test.go files scattered throughout this project. - -[Screenshots](http://goconvey.co) ------------ - -For web UI and terminal screenshots, check out [the full feature tour](http://goconvey.co). - -Contributors ----------------------- - -GoConvey is brought to you by [SmartyStreets](https://github.com/smartystreets) and [several contributors](https://github.com/smartystreets/goconvey/graphs/contributors) (Thanks!). diff --git a/vendor/github.com/smartystreets/goconvey/convey/convey.goconvey b/vendor/github.com/smartystreets/goconvey/convey/convey.goconvey deleted file mode 100644 index a2d9327dc91..00000000000 --- a/vendor/github.com/smartystreets/goconvey/convey/convey.goconvey +++ /dev/null @@ -1,4 +0,0 @@ -#ignore --timeout=1s -#-covermode=count -#-coverpkg=github.com/smartystreets/goconvey/convey,github.com/smartystreets/goconvey/convey/gotest,github.com/smartystreets/goconvey/convey/reporting \ No newline at end of file diff --git a/vendor/github.com/smartystreets/goconvey/convey/reporting/reporting.goconvey b/vendor/github.com/smartystreets/goconvey/convey/reporting/reporting.goconvey deleted file mode 100644 index 79982854b53..00000000000 --- a/vendor/github.com/smartystreets/goconvey/convey/reporting/reporting.goconvey +++ /dev/null @@ -1,2 +0,0 @@ -#ignore --timeout=1s diff --git a/vendor/github.com/smartystreets/goconvey/dependencies.go b/vendor/github.com/smartystreets/goconvey/dependencies.go deleted file mode 100644 index 0839e27fdf2..00000000000 --- a/vendor/github.com/smartystreets/goconvey/dependencies.go +++ /dev/null @@ -1,4 +0,0 @@ -package main - -import _ "github.com/jtolds/gls" -import _ "github.com/smartystreets/assertions" diff --git a/vendor/github.com/smartystreets/goconvey/goconvey.go b/vendor/github.com/smartystreets/goconvey/goconvey.go deleted file mode 100644 index 5b788fc74cf..00000000000 --- a/vendor/github.com/smartystreets/goconvey/goconvey.go +++ /dev/null @@ -1,297 +0,0 @@ -// This executable provides an HTTP server that watches for file system changes -// to .go files within the working directory (and all nested go packages). -// Navigating to the configured host and port in a web browser will display the -// latest results of running `go test` in each go package. -package main - -import ( - "flag" - "fmt" - "log" - "net" - "net/http" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "time" - - "go/build" - - "github.com/smartystreets/goconvey/web/server/api" - "github.com/smartystreets/goconvey/web/server/contract" - "github.com/smartystreets/goconvey/web/server/executor" - "github.com/smartystreets/goconvey/web/server/messaging" - "github.com/smartystreets/goconvey/web/server/parser" - "github.com/smartystreets/goconvey/web/server/system" - "github.com/smartystreets/goconvey/web/server/watch" -) - -func init() { - flags() - folders() -} -func flags() { - flag.IntVar(&port, "port", 8080, "The port at which to serve http.") - flag.StringVar(&host, "host", "127.0.0.1", "The host at which to serve http.") - flag.DurationVar(&nap, "poll", quarterSecond, "The interval to wait between polling the file system for changes.") - flag.IntVar(&packages, "packages", 10, "The number of packages to test in parallel. Higher == faster but more costly in terms of computing.") - flag.StringVar(&gobin, "gobin", "go", "The path to the 'go' binary (default: search on the PATH).") - flag.BoolVar(&cover, "cover", true, "Enable package-level coverage statistics. Requires Go 1.2+ and the go cover tool.") - flag.IntVar(&depth, "depth", -1, "The directory scanning depth. If -1, scan infinitely deep directory structures. 0: scan working directory. 1+: Scan into nested directories, limited to value.") - flag.StringVar(&timeout, "timeout", "0", "The test execution timeout if none is specified in the *.goconvey file (default is '0', which is the same as not providing this option).") - flag.StringVar(&watchedSuffixes, "watchedSuffixes", ".go", "A comma separated list of file suffixes to watch for modifications.") - flag.StringVar(&excludedDirs, "excludedDirs", "vendor,node_modules", "A comma separated list of directories that will be excluded from being watched") - flag.StringVar(&workDir, "workDir", "", "set goconvey working directory (default current directory)") - flag.BoolVar(&autoLaunchBrowser, "launchBrowser", true, "toggle auto launching of browser (default: true)") - - log.SetOutput(os.Stdout) - log.SetFlags(log.LstdFlags | log.Lshortfile) -} -func folders() { - _, file, _, _ := runtime.Caller(0) - here := filepath.Dir(file) - static = filepath.Join(here, "/web/client") - reports = filepath.Join(static, "reports") -} - -func main() { - flag.Parse() - log.Printf(initialConfiguration, host, port, nap, cover) - - working := getWorkDir() - cover = coverageEnabled(cover, reports) - shell := system.NewShell(gobin, reports, cover, timeout) - - watcherInput := make(chan messaging.WatcherCommand) - watcherOutput := make(chan messaging.Folders) - excludedDirItems := strings.Split(excludedDirs, `,`) - watcher := watch.NewWatcher(working, depth, nap, watcherInput, watcherOutput, watchedSuffixes, excludedDirItems) - - parser := parser.NewParser(parser.ParsePackageResults) - tester := executor.NewConcurrentTester(shell) - tester.SetBatchSize(packages) - - longpollChan := make(chan chan string) - executor := executor.NewExecutor(tester, parser, longpollChan) - server := api.NewHTTPServer(working, watcherInput, executor, longpollChan) - listener := createListener() - go runTestOnUpdates(watcherOutput, executor, server) - go watcher.Listen() - if autoLaunchBrowser { - go launchBrowser(listener.Addr().String()) - } - serveHTTP(server, listener) -} - -func browserCmd() (string, bool) { - browser := map[string]string{ - "darwin": "open", - "linux": "xdg-open", - "win32": "start", - } - cmd, ok := browser[runtime.GOOS] - return cmd, ok -} - -func launchBrowser(addr string) { - browser, ok := browserCmd() - if !ok { - log.Printf("Skipped launching browser for this OS: %s", runtime.GOOS) - return - } - - log.Printf("Launching browser on %s", addr) - url := fmt.Sprintf("http://%s", addr) - cmd := exec.Command(browser, url) - - output, err := cmd.CombinedOutput() - if err != nil { - log.Println(err) - } - log.Println(string(output)) -} - -func runTestOnUpdates(queue chan messaging.Folders, executor contract.Executor, server contract.Server) { - for update := range queue { - log.Println("Received request from watcher to execute tests...") - packages := extractPackages(update) - output := executor.ExecuteTests(packages) - root := extractRoot(update, packages) - server.ReceiveUpdate(root, output) - } -} - -func extractPackages(folderList messaging.Folders) []*contract.Package { - packageList := []*contract.Package{} - for _, folder := range folderList { - hasImportCycle := testFilesImportTheirOwnPackage(folder.Path) - packageList = append(packageList, contract.NewPackage(folder, hasImportCycle)) - } - return packageList -} - -func extractRoot(folderList messaging.Folders, packageList []*contract.Package) string { - path := packageList[0].Path - folder := folderList[path] - return folder.Root -} - -// This method exists because of a bug in the go cover tool that -// causes an infinite loop when you try to run `go test -cover` -// on a package that has an import cycle defined in one of it's -// test files. Yuck. -func testFilesImportTheirOwnPackage(packagePath string) bool { - meta, err := build.ImportDir(packagePath, build.AllowBinary) - if err != nil { - return false - } - - for _, dependency := range meta.TestImports { - if dependency == meta.ImportPath { - return true - } - } - return false -} - -func createListener() net.Listener { - l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port)) - if err != nil { - log.Println(err) - } - if l == nil { - os.Exit(1) - } - return l -} - -func serveHTTP(server contract.Server, listener net.Listener) { - serveStaticResources() - serveAjaxMethods(server) - activateServer(listener) -} - -func serveStaticResources() { - http.Handle("/", http.FileServer(http.Dir(static))) -} - -func serveAjaxMethods(server contract.Server) { - http.HandleFunc("/watch", server.Watch) - http.HandleFunc("/ignore", server.Ignore) - http.HandleFunc("/reinstate", server.Reinstate) - http.HandleFunc("/latest", server.Results) - http.HandleFunc("/execute", server.Execute) - http.HandleFunc("/status", server.Status) - http.HandleFunc("/status/poll", server.LongPollStatus) - http.HandleFunc("/pause", server.TogglePause) -} - -func activateServer(listener net.Listener) { - log.Printf("Serving HTTP at: http://%s\n", listener.Addr()) - err := http.Serve(listener, nil) - if err != nil { - log.Println(err) - } -} - -func coverageEnabled(cover bool, reports string) bool { - return (cover && - goVersion_1_2_orGreater() && - coverToolInstalled() && - ensureReportDirectoryExists(reports)) -} -func goVersion_1_2_orGreater() bool { - version := runtime.Version() // 'go1.2....' - major, minor := version[2], version[4] - version_1_2 := major >= byte('1') && minor >= byte('2') - if !version_1_2 { - log.Printf(pleaseUpgradeGoVersion, version) - return false - } - return true -} -func coverToolInstalled() bool { - working := getWorkDir() - command := system.NewCommand(working, "go", "tool", "cover").Execute() - installed := strings.Contains(command.Output, "Usage of 'go tool cover':") - if !installed { - log.Print(coverToolMissing) - return false - } - return true -} -func ensureReportDirectoryExists(reports string) bool { - result, err := exists(reports) - if err != nil { - log.Fatal(err) - } - if result { - return true - } - - if err := os.Mkdir(reports, 0755); err == nil { - return true - } - - log.Printf(reportDirectoryUnavailable, reports) - return false -} -func exists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} -func getWorkDir() string { - working := "" - var err error - if workDir != "" { - working = workDir - } else { - working, err = os.Getwd() - if err != nil { - log.Fatal(err) - } - } - result, err := exists(working) - if err != nil { - log.Fatal(err) - } - if !result { - log.Fatalf("Path:%s does not exists", working) - } - return working -} - -var ( - port int - host string - gobin string - nap time.Duration - packages int - cover bool - depth int - timeout string - watchedSuffixes string - excludedDirs string - autoLaunchBrowser bool - - static string - reports string - - quarterSecond = time.Millisecond * 250 - workDir string -) - -const ( - initialConfiguration = "Initial configuration: [host: %s] [port: %d] [poll: %v] [cover: %v]\n" - pleaseUpgradeGoVersion = "Go version is less that 1.2 (%s), please upgrade to the latest stable version to enable coverage reporting.\n" - coverToolMissing = "Go cover tool is not installed or not accessible: for Go < 1.5 run`go get golang.org/x/tools/cmd/cover`\n For >= Go 1.5 run `go install $GOROOT/src/cmd/cover`\n" - reportDirectoryUnavailable = "Could not find or create the coverage report directory (at: '%s'). You probably won't see any coverage statistics...\n" -) diff --git a/vendor/github.com/smartystreets/goconvey/web/client/resources/fonts/Open_Sans/LICENSE.txt b/vendor/github.com/smartystreets/goconvey/web/client/resources/fonts/Open_Sans/LICENSE.txt new file mode 100755 index 00000000000..75b52484ea4 --- /dev/null +++ b/vendor/github.com/smartystreets/goconvey/web/client/resources/fonts/Open_Sans/LICENSE.txt @@ -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/uber/jaeger-client-go/.gitignore b/vendor/github.com/uber/jaeger-client-go/.gitignore deleted file mode 100644 index 27349079095..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -*.out -*.test -*.xml -*.swp -.idea/ -.tmp/ -*.iml -*.cov -*.html -*.log -gen/thrift/js -gen/thrift/py -vendor/ -crossdock-main -crossdock/jaeger-docker-compose.yml diff --git a/vendor/github.com/uber/jaeger-client-go/.gitmodules b/vendor/github.com/uber/jaeger-client-go/.gitmodules deleted file mode 100644 index 295ebcf6220..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "idl"] - path = idl - url = https://github.com/uber/jaeger-idl.git diff --git a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md b/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md deleted file mode 100644 index d55a37304b3..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md +++ /dev/null @@ -1,154 +0,0 @@ -Changes by Version -================== - -2.11.2 (2018-01-12) -------------------- - -- Add Gopkg.toml to allow using the lib with `dep` - - -2.11.1 (2018-01-03) -------------------- - -- Do not enqueue spans after Reporter is closed (#235, #245) -- Change default flush interval to 1sec (#243) - - -2.11.0 (2017-11-27) -------------------- - -- Normalize metric names and tags to be compatible with Prometheus (#222) - - -2.10.0 (2017-11-14) -------------------- - -- Support custom tracing headers (#176) -- Add BaggageRestrictionManager (#178) and RemoteBaggageRestrictionManager (#182) -- Do not coerce baggage keys to lower case (#196) -- Log span name when span cannot be reported (#198) -- Add option to enable gen128Bit for tracer (#193) and allow custom generator for high bits of trace ID (#219) - - -2.9.0 (2017-07-29) ------------------- - -- Pin thrift <= 0.10 (#179) -- Introduce a parallel interface ContribObserver (#159) - - -2.8.0 (2017-07-05) ------------------- - -- Drop `jaeger.` prefix from `jaeger.hostname` process-level tag -- Add options to set tracer tags - - -2.7.0 (2017-06-21) ------------------- - -- Fix rate limiter balance [#135](https://github.com/uber/jaeger-client-go/pull/135) [#140](https://github.com/uber/jaeger-client-go/pull/140) -- Default client to send Jaeger.thrift [#147](https://github.com/uber/jaeger-client-go/pull/147) -- Save baggage in span [#153](https://github.com/uber/jaeger-client-go/pull/153) -- Move reporter.queueLength to the top of the struct to guarantee 64bit alignment [#158](https://github.com/uber/jaeger-client-go/pull/158) -- Support HTTP transport with jaeger.thrift [#161](https://github.com/uber/jaeger-client-go/pull/161) - - -2.6.0 (2017-03-28) ------------------- - -- Add config option to initialize RPC Metrics feature - - -2.5.0 (2017-03-23) ------------------- - -- Split request latency metric by success/failure [#123](https://github.com/uber/jaeger-client-go/pull/123) -- Add mutex to adaptive sampler and fix race condition [#124](https://github.com/uber/jaeger-client-go/pull/124) -- Fix rate limiter panic [#125](https://github.com/uber/jaeger-client-go/pull/125) - - -2.4.0 (2017-03-21) ------------------- - -- Remove `_ms` suffix from request latency metric name [#121](https://github.com/uber/jaeger-client-go/pull/121) -- Rename all metrics to "request" and "http_request" and use tags for other dimensions [#121](https://github.com/uber/jaeger-client-go/pull/121) - - -2.3.0 (2017-03-20) ------------------- - -- Make Span type public to allow access to non-std methods for testing [#117](https://github.com/uber/jaeger-client-go/pull/117) -- Add a structured way to extract traces for logging with zap [#118](https://github.com/uber/jaeger-client-go/pull/118) - - -2.2.1 (2017-03-14) ------------------- - -- Fix panic caused by updating the remote sampler from adaptive sampler to any other sampler type (https://github.com/uber/jaeger-client-go/pull/111) - - -2.2.0 (2017-03-10) ------------------- - -- Introduce Observer and SpanObserver (https://github.com/uber/jaeger-client-go/pull/94) -- Add RPC metrics emitter as Observer/SpanObserver (https://github.com/uber/jaeger-client-go/pull/103) - - -2.1.2 (2017-02-27) -------------------- - -- Fix leaky bucket bug (https://github.com/uber/jaeger-client-go/pull/99) -- Fix zap logger Infof (https://github.com/uber/jaeger-client-go/pull/100) -- Add tracer initialization godoc examples - - -2.1.1 (2017-02-21) -------------------- - -- Fix inefficient usage of zap.Logger - - -2.1.0 (2017-02-17) -------------------- - -- Add adapter for zap.Logger (https://github.com/uber-go/zap) -- Move logging API to ./log/ package - - -2.0.0 (2017-02-08) -------------------- - -- Support Adaptive Sampling -- Support 128bit Trace IDs -- Change trace/span IDs from uint64 to strong types TraceID and SpanID -- Add Zipkin HTTP B3 Propagation format support #72 -- Rip out existing metrics and use github.com/uber/jaeger-lib/metrics -- Change API for tracer, reporter, sampler initialization - - -1.6.0 (2016-10-14) -------------------- - -- Add Zipkin HTTP transport -- Support external baggage via jaeger-baggage header -- Unpin Thrift version, keep to master - - -1.5.1 (2016-09-27) -------------------- - -- Relax dependency on opentracing to ^1 - - -1.5.0 (2016-09-27) -------------------- - -- Upgrade to opentracing-go 1.0 -- Support KV logging for Spans - - -1.4.0 (2016-09-14) -------------------- - -- Support debug traces via HTTP header "jaeger-debug-id" diff --git a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md b/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md deleted file mode 100644 index 7bf077d6fd2..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md +++ /dev/null @@ -1,164 +0,0 @@ -# How to Contribute to Jaeger - -We'd love your help! - -Jaeger is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub -pull requests. This document outlines some of the conventions on development -workflow, commit message formatting, contact points and other resources to make -it easier to get your contribution accepted. - -We gratefully welcome improvements to documentation as well as to code. - -# Certificate of Origin - -By contributing to this project you agree to the [Developer Certificate of -Origin](https://developercertificate.org/) (DCO). This document was created -by the Linux Kernel community and is a simple statement that you, as a -contributor, have the legal right to make the contribution. See the [DCO](DCO) -file for details. - -## Getting Started - -This library uses [glide](https://github.com/Masterminds/glide) to manage dependencies. - -To get started, make sure you clone the Git repository into the correct location -`github.com/uber/jaeger-client-go` relative to `$GOPATH`: - -``` -mkdir -p $GOPATH/src/github.com/uber -cd $GOPATH/src/github.com/uber -git clone git@github.com:jaegertracing/jaeger-client-go.git jaeger-client-go -cd jaeger-client-go -``` - -Then install dependencies and run the tests: - -``` -git submodule update --init --recursive -glide install -make test -``` - -## Imports grouping - -This projects follows the following pattern for grouping imports in Go files: - * imports from standard library - * imports from other projects - * imports from `jaeger-client-go` project - -For example: - -```go -import ( - "fmt" - - "github.com/uber/jaeger-lib/metrics" - "go.uber.org/zap" - - "github.com/uber/jaeger-client-go/config" -) -``` - -## Making A Change - -*Before making any significant changes, please [open an -issue](https://github.com/jaegertracing/jaeger-client-go/issues).* Discussing your proposed -changes ahead of time will make the contribution process smooth for everyone. - -Once we've discussed your changes and you've got your code ready, make sure -that tests are passing (`make test` or `make cover`) and open your PR. Your -pull request is most likely to be accepted if it: - -* Includes tests for new functionality. -* Follows the guidelines in [Effective - Go](https://golang.org/doc/effective_go.html) and the [Go team's common code - review comments](https://github.com/golang/go/wiki/CodeReviewComments). -* Has a [good commit - message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). -* Each commit must be signed by the author ([see below](#sign-your-work)). - -## License - -By contributing your code, you agree to license your contribution under the terms -of the [Apache License](LICENSE). - -If you are adding a new file it should have a header like below. The easiest -way to add such header is to run `make fmt`. - -``` -// Copyright (c) 2017 The Jaeger Authors. -// -// 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. -``` - -## Sign your work - -The sign-off is a simple line at the end of the explanation for the -patch, which certifies that you wrote it or otherwise have the right to -pass it on as an open-source patch. The rules are pretty simple: if you -can certify the below (from -[developercertificate.org](http://developercertificate.org/)): - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -then you just add a line to every git commit message: - - Signed-off-by: Joe Smith - -using your real name (sorry, no pseudonyms or anonymous contributions.) - -You can add the sign off when creating the git commit via `git commit -s`. - -If you want this to be automatic you can set up some aliases: - -``` -git config --add alias.amend "commit -s --amend" -git config --add alias.c "commit -s" -``` diff --git a/vendor/github.com/uber/jaeger-client-go/DCO b/vendor/github.com/uber/jaeger-client-go/DCO deleted file mode 100644 index 068953d4bd9..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/DCO +++ /dev/null @@ -1,37 +0,0 @@ -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock b/vendor/github.com/uber/jaeger-client-go/Gopkg.lock deleted file mode 100644 index 2b3b1301b44..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock +++ /dev/null @@ -1,135 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/apache/thrift" - packages = ["lib/go/thrift"] - revision = "b2a4d4ae21c789b689dd162deb819665567f481c" - version = "0.10.0" - -[[projects]] - branch = "master" - name = "github.com/beorn7/perks" - packages = ["quantile"] - revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9" - -[[projects]] - branch = "master" - name = "github.com/codahale/hdrhistogram" - packages = ["."] - revision = "3a0bb77429bd3a61596f5e8a3172445844342120" - -[[projects]] - branch = "master" - name = "github.com/crossdock/crossdock-go" - packages = [".","assert","require"] - revision = "049aabb0122b03bc9bd30cab8f3f91fb60166361" - -[[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - branch = "master" - name = "github.com/golang/protobuf" - packages = ["proto"] - revision = "1e59b77b52bf8e4b449a57e6f79f21226d571845" - -[[projects]] - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - revision = "3247c84500bff8d9fb6d579d800f20b3e091582c" - version = "v1.0.0" - -[[projects]] - name = "github.com/opentracing/opentracing-go" - packages = [".","ext","log"] - revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" - version = "v1.0.2" - -[[projects]] - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - name = "github.com/prometheus/client_golang" - packages = ["prometheus"] - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" - -[[projects]] - branch = "master" - name = "github.com/prometheus/client_model" - packages = ["go"] - revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" - -[[projects]] - branch = "master" - name = "github.com/prometheus/common" - packages = ["expfmt","internal/bitbucket.org/ww/goautoneg","model"] - revision = "2e54d0b93cba2fd133edc32211dcc32c06ef72ca" - -[[projects]] - branch = "master" - name = "github.com/prometheus/procfs" - packages = [".","xfs"] - revision = "b15cd069a83443be3154b719d0cc9fe8117f09fb" - -[[projects]] - name = "github.com/stretchr/testify" - packages = ["assert","require","suite"] - revision = "b91bfb9ebec76498946beb6af7c0230c7cc7ba6c" - version = "v1.2.0" - -[[projects]] - name = "github.com/uber-go/atomic" - packages = ["."] - revision = "8474b86a5a6f79c443ce4b2992817ff32cf208b8" - version = "v1.3.1" - -[[projects]] - name = "github.com/uber/jaeger-lib" - packages = ["metrics","metrics/prometheus","metrics/testutils"] - revision = "5519f3beabf28707fca8d3f47f9cff87dad48d96" - version = "v1.3.0" - -[[projects]] - name = "github.com/uber/tchannel-go" - packages = [".","internal/argreader","relay","thrift","thrift/gen-go/meta","tnet","tos","trand","typed"] - revision = "7bcb33f4bb908c21374f8bfdc9d4b1ebcbb8dab0" - version = "v1.8.1" - -[[projects]] - name = "go.uber.org/atomic" - packages = ["."] - revision = "54f72d32435d760d5604f17a82e2435b28dc4ba5" - version = "v1.3.0" - -[[projects]] - name = "go.uber.org/multierr" - packages = ["."] - revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" - version = "v1.1.0" - -[[projects]] - name = "go.uber.org/zap" - packages = [".","buffer","internal/bufferpool","internal/color","internal/exit","zapcore"] - revision = "35aad584952c3e7020db7b839f6b102de6271f89" - version = "v1.7.1" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = ["bpf","context","context/ctxhttp","internal/iana","internal/socket","ipv4","ipv6"] - revision = "434ec0c7fe3742c984919a691b2018a6e9694425" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "7a06a767b8089d38c4676b92b49cab2020b7507e7d5ea2738533c9a9865782ad" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml b/vendor/github.com/uber/jaeger-client-go/Gopkg.toml deleted file mode 100644 index ac3e10fcb56..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml +++ /dev/null @@ -1,35 +0,0 @@ -[[constraint]] - name = "github.com/apache/thrift" - version = ">=0.9.3, <0.11.0" - -[[constraint]] - name = "github.com/crossdock/crossdock-go" - -[[constraint]] - name = "github.com/opentracing/opentracing-go" - version = "^1" - -[[constraint]] - name = "github.com/prometheus/client_golang" - version = "0.8.0" - -[[constraint]] - name = "github.com/stretchr/testify" - version = "^1.1.3" - -[[constraint]] - name = "github.com/uber-go/atomic" - -[[constraint]] - name = "github.com/uber/jaeger-lib" - version = "^1.3" - -[[constraint]] - name = "github.com/uber/tchannel-go" - version = "^1.1.0" - -[[constraint]] - name = "go.uber.org/zap" - -[[constraint]] - name = "golang.org/x/net" diff --git a/vendor/github.com/uber/jaeger-client-go/Makefile b/vendor/github.com/uber/jaeger-client-go/Makefile deleted file mode 100644 index f1231a8db32..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/Makefile +++ /dev/null @@ -1,113 +0,0 @@ -PROJECT_ROOT=github.com/uber/jaeger-client-go -PACKAGES := $(shell glide novendor | grep -v ./thrift-gen/...) -# all .go files that don't exist in hidden directories -ALL_SRC := $(shell find . -name "*.go" | grep -v -e vendor -e thrift-gen \ - -e ".*/\..*" \ - -e ".*/_.*" \ - -e ".*/mocks.*") - --include crossdock/rules.mk - -export GO15VENDOREXPERIMENT=1 - -RACE=-race -GOTEST=go test -v $(RACE) -GOLINT=golint -GOVET=go vet -GOFMT=gofmt -FMT_LOG=fmt.log -LINT_LOG=lint.log - -THRIFT_VER=0.9.3 -THRIFT_IMG=thrift:$(THRIFT_VER) -THRIFT=docker run -v "${PWD}:/data" $(THRIFT_IMG) thrift -THRIFT_GO_ARGS=thrift_import="github.com/apache/thrift/lib/go/thrift" -THRIFT_GEN_DIR=thrift-gen - -PASS=$(shell printf "\033[32mPASS\033[0m") -FAIL=$(shell printf "\033[31mFAIL\033[0m") -COLORIZE=sed ''/PASS/s//$(PASS)/'' | sed ''/FAIL/s//$(FAIL)/'' - -.DEFAULT_GOAL := test-and-lint - -.PHONY: test-and-lint -test-and-lint: test fmt lint - -.PHONY: test -test: - bash -c "set -e; set -o pipefail; $(GOTEST) $(PACKAGES) | $(COLORIZE)" - -.PHONY: fmt -fmt: - $(GOFMT) -e -s -l -w $(ALL_SRC) - ./scripts/updateLicenses.sh - -.PHONY: lint -lint: - $(GOVET) $(PACKAGES) - @cat /dev/null > $(LINT_LOG) - @$(foreach pkg, $(PACKAGES), $(GOLINT) $(pkg) | grep -v crossdock/thrift >> $(LINT_LOG) || true;) - @[ ! -s "$(LINT_LOG)" ] || (echo "Lint Failures" | cat - $(LINT_LOG) && false) - @$(GOFMT) -e -s -l $(ALL_SRC) > $(FMT_LOG) - ./scripts/updateLicenses.sh >> $(FMT_LOG) - @[ ! -s "$(FMT_LOG)" ] || (echo "go fmt or license check failures, run 'make fmt'" | cat - $(FMT_LOG) && false) - - -.PHONY: install -install: - glide --version || go get github.com/Masterminds/glide -ifeq ($(USE_DEP),true) - dep ensure -else - glide install -endif - - -.PHONY: cover -cover: - ./scripts/cover.sh $(shell go list $(PACKAGES)) - go tool cover -html=cover.out -o cover.html - - -# This is not part of the regular test target because we don't want to slow it -# down. -.PHONY: test-examples -test-examples: - make -C examples - -# TODO at the moment we're not generating tchan_*.go files -thrift: idl-submodule thrift-image - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/agent.thrift - sed -i '' 's|"zipkincore"|"$(PROJECT_ROOT)/thrift-gen/zipkincore"|g' $(THRIFT_GEN_DIR)/agent/*.go - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/sampling.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/jaeger.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/zipkincore.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/baggage.thrift - rm -rf thrift-gen/*/*-remote - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/crossdock/thrift/ /data/idl/thrift/crossdock/tracetest.thrift - rm -rf crossdock/thrift/*/*-remote - -idl-submodule: - git submodule init - git submodule update - -thrift-image: - $(THRIFT) -version - -.PHONY: install-dep-ci -install-dep-ci: - - curl -L -s https://github.com/golang/dep/releases/download/v0.3.2/dep-linux-amd64 -o $$GOPATH/bin/dep - - chmod +x $$GOPATH/bin/dep - -.PHONY: install-ci -install-ci: install-dep-ci install - go get github.com/wadey/gocovmerge - go get github.com/mattn/goveralls - go get golang.org/x/tools/cmd/cover - go get github.com/golang/lint/golint - -.PHONY: test-ci -test-ci: - @./scripts/cover.sh $(shell go list $(PACKAGES)) - make lint - diff --git a/vendor/github.com/uber/jaeger-client-go/README.md b/vendor/github.com/uber/jaeger-client-go/README.md deleted file mode 100644 index 347013b09ad..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/README.md +++ /dev/null @@ -1,237 +0,0 @@ -[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![OpenTracing 1.0 Enabled][ot-img]][ot-url] - -# Jaeger Bindings for Go OpenTracing API - -Instrumentation library that implements an -[OpenTracing](http://opentracing.io) Tracer for Jaeger (http://jaegertracing.io). - -**IMPORTANT**: The library's import path is based on its original location under `github.com/uber`. Do not try to import it as `github.com/jaegertracing`, it will not compile. We might revisit this in the next major release. - * :white_check_mark: `import "github.com/uber/jaeger-client-go"` - * :x: `import "github.com/jaegertracing/jaeger-client-go"` - -## How to Contribute - -Please see [CONTRIBUTING.md](CONTRIBUTING.md). - -## Installation - -We recommended using a dependency manager like [glide](https://github.com/Masterminds/glide) -and [semantic versioning](http://semver.org/) when including this library into an application. -For example, Jaeger backend imports this library like this: - -```yaml -- package: github.com/uber/jaeger-client-go - version: ^2.7.0 -``` - -If you instead want to use the latest version in `master`, you can pull it via `go get`. -Note that during `go get` you may see build errors due to incompatible dependencies, which is why -we recommend using semantic versions for dependencies. The error may be fixed by running -`make install` (it will install `glide` if you don't have it): - -```shell -go get -u github.com/uber/jaeger-client-go/ -cd $GOPATH/src/github.com/uber/jaeger-client-go/ -git submodule update --init --recursive -make install -``` - -## Initialization - -See tracer initialization examples in [godoc](https://godoc.org/github.com/uber/jaeger-client-go/config#pkg-examples) -and [config/example_test.go](./config/example_test.go). - -### Closing the tracer via `io.Closer` - -The constructor function for Jaeger Tracer returns the tracer itself and an `io.Closer` instance. -It is recommended to structure your `main()` so that it calls the `Close()` function on the closer -before exiting, e.g. - -```go -tracer, closer, err := cfg.New(...) -defer closer.Close() -``` - -This is especially useful for command-line tools that enable tracing, as well as -for the long-running apps that support graceful shutdown. For example, if your deployment -system sends SIGTERM instead of killing the process and you trap that signal to do a graceful -exit, then having `defer closer.Closer()` ensures that all buffered spans are flushed. - -### Metrics & Monitoring - -The tracer emits a number of different metrics, defined in -[metrics.go](metrics.go). The monitoring backend is expected to support -tag-based metric names, e.g. instead of `statsd`-style string names -like `counters.my-service.jaeger.spans.started.sampled`, the metrics -are defined by a short name and a collection of key/value tags, for -example: `name:jaeger.traces, state:started, sampled:y`. See [metrics.go](./metrics.go) -file for the full list and descriptions of emitted metrics. - -The monitoring backend is represented by the `metrics.Factory` interface from package -[`"github.com/uber/jaeger-lib/metrics"`](github.com/uber/jaeger-lib/metrics). An implementation -of that interface can be passed as an option to either the Configuration object or the Tracer -constructor, for example: - -```go -import ( - "github.com/uber/jaeger-client-go/config" - "github.com/uber/jaeger-lib/metrics/prometheus" -) - - metricsFactory := prometheus.New() - tracer, closer, err := new(config.Configuration).New( - "your-service-name", - config.Metrics(metricsFactory), - ) -``` - -By default, a no-op `metrics.NullFactory` is used. - -### Logging - -The tracer can be configured with an optional logger, which will be -used to log communication errors, or log spans if a logging reporter -option is specified in the configuration. The logging API is abstracted -by the [Logger](logger.go) interface. A logger instance implementing -this interface can be set on the `Config` object before calling the -`New` method. - -Besides the [zap](https://github.com/uber-go/zap) implementation -bundled with this package there is also a [go-kit](https://github.com/go-kit/kit) -one in the [jaeger-lib](https://github.com/uber/jaeger-lib) repository. - -## Instrumentation for Tracing - -Since this tracer is fully compliant with OpenTracing API 1.0, -all code instrumentation should only use the API itself, as described -in the [opentracing-go](https://github.com/opentracing/opentracing-go) documentation. - -## Features - -### Reporters - -A "reporter" is a component that receives the finished spans and reports -them to somewhere. Under normal circumstances, the Tracer -should use the default `RemoteReporter`, which sends the spans out of -process via configurable "transport". For testing purposes, one can -use an `InMemoryReporter` that accumulates spans in a buffer and -allows to retrieve them for later verification. Also available are -`NullReporter`, a no-op reporter that does nothing, a `LoggingReporter` -which logs all finished spans using their `String()` method, and a -`CompositeReporter` that can be used to combine more than one reporter -into one, e.g. to attach a logging reporter to the main remote reporter. - -### Span Reporting Transports - -The remote reporter uses "transports" to actually send the spans out -of process. Currently the supported transports include: - * [Jaeger Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/agent.thrift) over UDP or HTTP, - * [Zipkin Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/zipkincore.thrift) over HTTP. - -### Sampling - -The tracer does not record all spans, but only those that have the -sampling bit set in the `flags`. When a new trace is started and a new -unique ID is generated, a sampling decision is made whether this trace -should be sampled. The sampling decision is propagated to all downstream -calls via the `flags` field of the trace context. The following samplers -are available: - 1. `RemotelyControlledSampler` uses one of the other simpler samplers - and periodically updates it by polling an external server. This - allows dynamic control of the sampling strategies. - 1. `ConstSampler` always makes the same sampling decision for all - trace IDs. it can be configured to either sample all traces, or - to sample none. - 1. `ProbabilisticSampler` uses a fixed sampling rate as a probability - for a given trace to be sampled. The actual decision is made by - comparing the trace ID with a random number multiplied by the - sampling rate. - 1. `RateLimitingSampler` can be used to allow only a certain fixed - number of traces to be sampled per second. - -### Baggage Injection - -The OpenTracing spec allows for [baggage][baggage], which are key value pairs that are added -to the span context and propagated throughout the trace. An external process can inject baggage -by setting the special HTTP Header `jaeger-baggage` on a request: - -```sh -curl -H "jaeger-baggage: key1=value1, key2=value2" http://myhost.com -``` - -Baggage can also be programatically set inside your service: - -```go -if span := opentracing.SpanFromContext(ctx); span != nil { - span.SetBaggageItem("key", "value") -} -``` - -Another service downstream of that can retrieve the baggage in a similar way: - -```go -if span := opentracing.SpanFromContext(ctx); span != nil { - val := span.BaggageItem("key") - println(val) -} -``` - -### Debug Traces (Forced Sampling) - -#### Programmatically - -The OpenTracing API defines a `sampling.priority` standard tag that -can be used to affect the sampling of a span and its children: - -```go -import ( - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" -) - -span := opentracing.SpanFromContext(ctx) -ext.SamplingPriority.Set(span, 1) -``` - -#### Via HTTP Headers - -Jaeger Tracer also understands a special HTTP Header `jaeger-debug-id`, -which can be set in the incoming request, e.g. - -```sh -curl -H "jaeger-debug-id: some-correlation-id" http://myhost.com -``` - -When Jaeger sees this header in the request that otherwise has no -tracing context, it ensures that the new trace started for this -request will be sampled in the "debug" mode (meaning it should survive -all downsampling that might happen in the collection pipeline), and the -root span will have a tag as if this statement was executed: - -```go -span.SetTag("jaeger-debug-id", "some-correlation-id") -``` - -This allows using Jaeger UI to find the trace by this tag. - -### Zipkin HTTP B3 compatible header propagation - -Jaeger Tracer supports Zipkin B3 Propagation HTTP headers, which are used -by a lot of Zipkin tracers. This means that you can use Jaeger in conjunction with e.g. [these OpenZipkin tracers](https://github.com/openzipkin). - -However it is not the default propagation format, see [here](zipkin/README.md#NewZipkinB3HTTPHeaderPropagator) how to set it up. - -## License - -[Apache 2.0 License](LICENSE). - - -[doc-img]: https://godoc.org/github.com/uber/jaeger-client-go?status.svg -[doc]: https://godoc.org/github.com/uber/jaeger-client-go -[ci-img]: https://travis-ci.org/jaegertracing/jaeger-client-go.svg?branch=master -[ci]: https://travis-ci.org/jaegertracing/jaeger-client-go -[cov-img]: https://codecov.io/gh/jaegertracing/jaeger-client-go/branch/master/graph/badge.svg -[cov]: https://codecov.io/gh/jaegertracing/jaeger-client-go -[ot-img]: https://img.shields.io/badge/OpenTracing--1.0-enabled-blue.svg -[ot-url]: http://opentracing.io -[baggage]: https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item diff --git a/vendor/github.com/uber/jaeger-client-go/RELEASE.md b/vendor/github.com/uber/jaeger-client-go/RELEASE.md deleted file mode 100644 index 115e49ab8ad..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/RELEASE.md +++ /dev/null @@ -1,11 +0,0 @@ -# Release Process - -1. Create a PR "Preparing for release X.Y.Z" against master branch - * Alter CHANGELOG.md from ` (unreleased)` to ` (YYYY-MM-DD)` - * Update `JaegerClientVersion` in constants.go to `Go-X.Y.Z` -2. Create a release "Release X.Y.Z" on Github - * Create Tag `vX.Y.Z` - * Copy CHANGELOG.md into the release notes -3. Create a PR "Back to development" against master branch - * Add ` (unreleased)` to CHANGELOG.md - * Update `JaegerClientVersion` in constants.go to `Go-dev` diff --git a/vendor/github.com/uber/jaeger-client-go/glide.lock b/vendor/github.com/uber/jaeger-client-go/glide.lock deleted file mode 100644 index 9ad7a140ae9..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/glide.lock +++ /dev/null @@ -1,109 +0,0 @@ -hash: af5e193de27f73f5a8cef66ae2f0c013bcb9e48ecd69db4a595221f88ba99a71 -updated: 2017-11-21T19:49:03.248636345-05:00 -imports: -- name: github.com/apache/thrift - version: b2a4d4ae21c789b689dd162deb819665567f481c - subpackages: - - lib/go/thrift -- name: github.com/beorn7/perks - version: 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9 - subpackages: - - quantile -- name: github.com/codahale/hdrhistogram - version: f8ad88b59a584afeee9d334eff879b104439117b -- name: github.com/crossdock/crossdock-go - version: 049aabb0122b03bc9bd30cab8f3f91fb60166361 - subpackages: - - assert - - require -- name: github.com/davecgh/go-spew - version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 - subpackages: - - spew -- name: github.com/golang/protobuf - version: 7cc19b78d562895b13596ddce7aafb59dd789318 - subpackages: - - proto -- name: github.com/matttproud/golang_protobuf_extensions - version: c12348ce28de40eed0136aa2b644d0ee0650e56c - subpackages: - - pbutil -- name: github.com/opentracing/opentracing-go - version: 1949ddbfd147afd4d964a9f00b24eb291e0e7c38 - subpackages: - - ext - - log -- name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d - subpackages: - - difflib -- name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 - subpackages: - - prometheus -- name: github.com/prometheus/client_model - version: 6f3806018612930941127f2a7c6c453ba2c527d2 - subpackages: - - go -- name: github.com/prometheus/common - version: 49fee292b27bfff7f354ee0f64e1bc4850462edf - subpackages: - - expfmt - - internal/bitbucket.org/ww/goautoneg - - model -- name: github.com/prometheus/procfs - version: a1dba9ce8baed984a2495b658c82687f8157b98f - subpackages: - - xfs -- name: github.com/stretchr/testify - version: 69483b4bd14f5845b5a1e55bca19e954e827f1d0 - subpackages: - - assert - - require - - suite -- name: github.com/uber-go/atomic - version: 8474b86a5a6f79c443ce4b2992817ff32cf208b8 - subpackages: - - utils -- name: github.com/uber/jaeger-lib - version: c48167d9cae5887393dd5e61efd06a4a48b7fbb3 - subpackages: - - metrics - - metrics/prometheus - - metrics/testutils -- name: github.com/uber/tchannel-go - version: cc230a2942d078a8b01f4a79895dad62e6c572f1 - subpackages: - - atomic - - internal/argreader - - relay - - thrift - - thrift/gen-go/meta - - tnet - - tos - - trace/thrift/gen-go/tcollector - - trand - - typed -- name: go.uber.org/atomic - version: 8474b86a5a6f79c443ce4b2992817ff32cf208b8 -- name: go.uber.org/multierr - version: 3c4937480c32f4c13a875a1829af76c98ca3d40a -- name: go.uber.org/zap - version: 35aad584952c3e7020db7b839f6b102de6271f89 - subpackages: - - buffer - - internal/bufferpool - - internal/color - - internal/exit - - zapcore -- name: golang.org/x/net - version: a337091b0525af65de94df2eb7e98bd9962dcbe2 - subpackages: - - bpf - - context - - context/ctxhttp - - internal/iana - - internal/socket - - ipv4 - - ipv6 -testImports: [] diff --git a/vendor/github.com/uber/jaeger-client-go/glide.yaml b/vendor/github.com/uber/jaeger-client-go/glide.yaml deleted file mode 100644 index c0b6bcbfb3f..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/glide.yaml +++ /dev/null @@ -1,37 +0,0 @@ -package: github.com/uber/jaeger-client-go -import: -- package: github.com/apache/thrift - version: ">=0.9.3, <0.11.0" - subpackages: - - lib/go/thrift -- package: github.com/opentracing/opentracing-go - version: ^1 - subpackages: - - ext - - log -- package: golang.org/x/net - subpackages: - - context -- package: github.com/uber/tchannel-go - version: ^1.1.0 - subpackages: - - atomic - - thrift - - thrift/gen-go/meta - - tnet - - trace/thrift/gen-go/tcollector - - typed -- package: github.com/stretchr/testify - version: ^1.1.3 - subpackages: - - assert - - require - - suite -- package: github.com/crossdock/crossdock-go -- package: github.com/uber/jaeger-lib - version: ^1.2.1 - subpackages: - - metrics -testImport: -- package: github.com/prometheus/client_golang - version: v0.8.0 diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md deleted file mode 100644 index 879948e9c9c..00000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md +++ /dev/null @@ -1,5 +0,0 @@ -An Observer that can be used to emit RPC metrics -================================================ - -It can be attached to the tracer during tracer construction. -See `ExampleObserver` function in [observer_test.go](./observer_test.go). diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/.nocover b/vendor/github.com/uber/jaeger-client-go/thrift/.nocover deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor/github.com/uber/jaeger-lib/.gitignore b/vendor/github.com/uber/jaeger-lib/.gitignore deleted file mode 100644 index 9cc72383320..00000000000 --- a/vendor/github.com/uber/jaeger-lib/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -*.out -*.test -*.xml -*.swp -.idea/ -.tmp/ -*.iml -*.cov -*.html -*.log -vendor/ diff --git a/vendor/github.com/uber/jaeger-lib/CHANGELOG.md b/vendor/github.com/uber/jaeger-lib/CHANGELOG.md deleted file mode 100644 index d91444d597e..00000000000 --- a/vendor/github.com/uber/jaeger-lib/CHANGELOG.md +++ /dev/null @@ -1,37 +0,0 @@ -Changes by Version -================== - -1.3.1 (2018-01-12) -------------------- - -- Add Gopkg.toml to allow using the lib with `dep` - - -1.3.0 (2018-01-08) ------------------- - -- Move rate limiter from client to jaeger-lib [#35](https://github.com/jaegertracing/jaeger-lib/pull/35) - - -1.2.1 (2017-11-14) ------------------- - -- *breaking* Change prometheus.New() to accept options instead of fixed arguments - - -1.2.0 (2017-11-12) ------------------- - -- Support Prometheus metrics directly [#29](https://github.com/jaegertracing/jaeger-lib/pull/29). - - -1.1.0 (2017-09-10) ------------------- - -- Re-releasing the project under Apache 2.0 license. - - -1.0.0 (2017-08-22) ------------------- - -- First semver release. diff --git a/vendor/github.com/uber/jaeger-lib/CONTRIBUTING.md b/vendor/github.com/uber/jaeger-lib/CONTRIBUTING.md deleted file mode 100644 index 8fa7daa05f1..00000000000 --- a/vendor/github.com/uber/jaeger-lib/CONTRIBUTING.md +++ /dev/null @@ -1,163 +0,0 @@ -# How to Contribute to `jaeger-lib` - -We'd love your help! - -Jaeger is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub -pull requests. This document outlines some of the conventions on development -workflow, commit message formatting, contact points and other resources to make -it easier to get your contribution accepted. - -We gratefully welcome improvements to documentation as well as to code. - -# Certificate of Origin - -By contributing to this project you agree to the [Developer Certificate of -Origin](https://developercertificate.org/) (DCO). This document was created -by the Linux Kernel community and is a simple statement that you, as a -contributor, have the legal right to make the contribution. See the [DCO](DCO) -file for details. - -## Getting Started - -This library uses [glide](https://github.com/Masterminds/glide) to manage dependencies. - -To get started, make sure you clone the Git repository into the correct location -`github.com/uber/jaeger-lib` relative to `$GOPATH`: - -``` -mkdir -p $GOPATH/src/github.com/uber -cd $GOPATH/src/github.com/uber -git clone git@github.com:jaegertracing/jaeger-lib.git jaeger-lib -cd jaeger-lib -``` - -Then install dependencies and run the tests: - -``` -git submodule update --init --recursive -glide install -make test -``` - -## Imports grouping - -This projects follows the following pattern for grouping imports in Go files: - * imports from standard library - * imports from other projects - * imports from this `jaeger-lib` project - -For example: - -```go -import ( - "fmt" - - "go.uber.org/zap" - - "github.com/uber/jaeger-lib/metrics" -) -``` - -## Making A Change - -*Before making any significant changes, please [open an -issue](https://github.com/uber/jaeger-lib/issues).* Discussing your proposed -changes ahead of time will make the contribution process smooth for everyone. - -Once we've discussed your changes and you've got your code ready, make sure -that tests are passing (`make test` or `make cover`) and open your PR. Your -pull request is most likely to be accepted if it: - -* Includes tests for new functionality. -* Follows the guidelines in [Effective - Go](https://golang.org/doc/effective_go.html) and the [Go team's common code - review comments](https://github.com/golang/go/wiki/CodeReviewComments). -* Has a [good commit - message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). -* Each commit must be signed by the author ([see below](#sign-your-work)). - -## License - -By contributing your code, you agree to license your contribution under the terms -of the [Apache License](LICENSE). - -If you are adding a new file it should have a header like below. The easiest -way to add such header is to run `make fmt`. - -``` -// Copyright (c) 2017 The Jaeger Authors. -// -// 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. -``` - -## Sign your work - -The sign-off is a simple line at the end of the explanation for the -patch, which certifies that you wrote it or otherwise have the right to -pass it on as an open-source patch. The rules are pretty simple: if you -can certify the below (from -[developercertificate.org](http://developercertificate.org/)): - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -then you just add a line to every git commit message: - - Signed-off-by: Joe Smith - -using your real name (sorry, no pseudonyms or anonymous contributions.) - -You can add the sign off when creating the git commit via `git commit -s`. - -If you want this to be automatic you can set up some aliases: - -``` -git config --add alias.amend "commit -s --amend" -git config --add alias.c "commit -s" -``` diff --git a/vendor/github.com/uber/jaeger-lib/DCO b/vendor/github.com/uber/jaeger-lib/DCO deleted file mode 100644 index 068953d4bd9..00000000000 --- a/vendor/github.com/uber/jaeger-lib/DCO +++ /dev/null @@ -1,37 +0,0 @@ -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - diff --git a/vendor/github.com/uber/jaeger-lib/Gopkg.lock b/vendor/github.com/uber/jaeger-lib/Gopkg.lock deleted file mode 100644 index c42a7f0e8f3..00000000000 --- a/vendor/github.com/uber/jaeger-lib/Gopkg.lock +++ /dev/null @@ -1,114 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/VividCortex/gohistogram" - packages = ["."] - revision = "51564d9861991fb0ad0f531c99ef602d0f9866e6" - version = "v1.0.0" - -[[projects]] - branch = "master" - name = "github.com/beorn7/perks" - packages = ["quantile"] - revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9" - -[[projects]] - name = "github.com/codahale/hdrhistogram" - packages = ["."] - revision = "f8ad88b59a584afeee9d334eff879b104439117b" - -[[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "04cdfd42973bb9c8589fd6a731800cf222fde1a9" - -[[projects]] - branch = "master" - name = "github.com/facebookgo/clock" - packages = ["."] - revision = "600d898af40aa09a7a93ecb9265d87b0504b6f03" - -[[projects]] - name = "github.com/go-kit/kit" - packages = ["log","log/level","metrics","metrics/expvar","metrics/generic","metrics/influx","metrics/internal/lv","metrics/prometheus"] - revision = "a9ca6725cbbea455e61c6bc8a1ed28e81eb3493b" - version = "v0.5.0" - -[[projects]] - name = "github.com/go-logfmt/logfmt" - packages = ["."] - revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" - version = "v0.3.0" - -[[projects]] - name = "github.com/go-stack/stack" - packages = ["."] - revision = "817915b46b97fd7bb80e8ab6b69f01a53ac3eebf" - version = "v1.6.0" - -[[projects]] - name = "github.com/golang/protobuf" - packages = ["proto"] - revision = "7cc19b78d562895b13596ddce7aafb59dd789318" - -[[projects]] - name = "github.com/influxdata/influxdb" - packages = ["client/v2","models","pkg/escape"] - revision = "f3f30726d822c4be8cd00137ba66b6e4fd68cca1" - -[[projects]] - branch = "master" - name = "github.com/kr/logfmt" - packages = ["."] - revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" - -[[projects]] - branch = "master" - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" - -[[projects]] - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - revision = "d8ed2627bdf02c080bf22230dbb337003b7aba2d" - -[[projects]] - name = "github.com/prometheus/client_golang" - packages = ["prometheus"] - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" - -[[projects]] - name = "github.com/prometheus/client_model" - packages = ["go"] - revision = "6f3806018612930941127f2a7c6c453ba2c527d2" - -[[projects]] - name = "github.com/prometheus/common" - packages = ["expfmt","internal/bitbucket.org/ww/goautoneg","model"] - revision = "49fee292b27bfff7f354ee0f64e1bc4850462edf" - -[[projects]] - name = "github.com/prometheus/procfs" - packages = [".","xfs"] - revision = "a1dba9ce8baed984a2495b658c82687f8157b98f" - -[[projects]] - name = "github.com/stretchr/testify" - packages = ["assert","require"] - revision = "05e8a0eda380579888eb53c394909df027f06991" - -[[projects]] - name = "github.com/uber-go/tally" - packages = ["."] - revision = "be9e53c77349ae2dd4b8c03a6dc20ed9a88b9927" - version = "v3.2.0" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "6a38cb6e727212ac18ae744a1a3f17dcd79235e1947fac5f63b41d3162328e1f" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/uber/jaeger-lib/Gopkg.toml b/vendor/github.com/uber/jaeger-lib/Gopkg.toml deleted file mode 100644 index b97e1e39958..00000000000 --- a/vendor/github.com/uber/jaeger-lib/Gopkg.toml +++ /dev/null @@ -1,23 +0,0 @@ -[[constraint]] - name = "github.com/codahale/hdrhistogram" - -[[constraint]] - name = "github.com/go-kit/kit" - version = "0.5.0" - -[[constraint]] - name = "github.com/influxdata/influxdb" - -[[constraint]] - name = "github.com/prometheus/client_golang" - version = "0.8.0" - -[[constraint]] - name = "github.com/prometheus/client_model" - -[[constraint]] - name = "github.com/stretchr/testify" - -[[constraint]] - name = "github.com/uber-go/tally" - version = ">=2.1.0, <4.0.0" diff --git a/vendor/github.com/uber/jaeger-lib/Makefile b/vendor/github.com/uber/jaeger-lib/Makefile deleted file mode 100644 index 73b957b666c..00000000000 --- a/vendor/github.com/uber/jaeger-lib/Makefile +++ /dev/null @@ -1,98 +0,0 @@ -PROJECT_ROOT=github.com/uber/jaeger-lib -PACKAGES := $(shell glide novendor | grep -v ./thrift-gen/...) -# all .go files that don't exist in hidden directories -ALL_SRC := $(shell find . -name "*.go" | grep -v -e vendor -e thrift-gen \ - -e ".*/\..*" \ - -e ".*/_.*" \ - -e ".*/mocks.*") - -export GO15VENDOREXPERIMENT=1 - -GOTEST=go test -v $(RACE) -GOLINT=golint -GOVET=go vet -GOFMT=gofmt -FMT_LOG=fmt.log -LINT_LOG=lint.log - -THRIFT_VER=0.9.3 -THRIFT_IMG=thrift:$(THRIFT_VER) -THRIFT=docker run -v "${PWD}:/data" $(THRIFT_IMG) thrift -THRIFT_GO_ARGS=thrift_import="github.com/apache/thrift/lib/go/thrift" -THRIFT_GEN_DIR=thrift-gen - -PASS=$(shell printf "\033[32mPASS\033[0m") -FAIL=$(shell printf "\033[31mFAIL\033[0m") -COLORIZE=sed ''/PASS/s//$(PASS)/'' | sed ''/FAIL/s//$(FAIL)/'' - -.DEFAULT_GOAL := test-and-lint - -.PHONY: test-and-lint -test-and-lint: test fmt lint - -.PHONY: test -test: - $(GOTEST) $(PACKAGES) | $(COLORIZE) - -.PHONY: fmt -fmt: - $(GOFMT) -e -s -l -w $(ALL_SRC) - ./scripts/updateLicenses.sh - -.PHONY: lint -lint: - $(GOVET) $(PACKAGES) - @cat /dev/null > $(LINT_LOG) - @$(foreach pkg, $(PACKAGES), $(GOLINT) $(pkg) | grep -v crossdock/thrift >> $(LINT_LOG) || true;) - @[ ! -s "$(LINT_LOG)" ] || (echo "Lint Failures" | cat - $(LINT_LOG) && false) - @$(GOFMT) -e -s -l $(ALL_SRC) > $(FMT_LOG) - @./scripts/updateLicenses.sh >> $(FMT_LOG) - @[ ! -s "$(FMT_LOG)" ] || (echo "go fmt or license check failures, run 'make fmt'" | cat - $(FMT_LOG) && false) - - -.PHONY: install -install: - glide --version || go get github.com/Masterminds/glide -ifeq ($(USE_DEP),true) - dep ensure - dep status -else - glide install -endif - - -.PHONY: cover -cover: - ./scripts/cover.sh $(shell go list $(PACKAGES)) - go tool cover -html=cover.out -o cover.html - - -idl-submodule: - git submodule init - git submodule update - -thrift-image: - $(THRIFT) -version - -.PHONY: install-dep-ci -install-dep-ci: - - curl -L -s https://github.com/golang/dep/releases/download/v0.3.2/dep-linux-amd64 -o $$GOPATH/bin/dep - - chmod +x $$GOPATH/bin/dep - -.PHONY: install-ci -install-ci: install - go get github.com/wadey/gocovmerge - go get github.com/mattn/goveralls - go get golang.org/x/tools/cmd/cover - go get github.com/golang/lint/golint - - -.PHONY: test-ci -test-ci: - ./scripts/cover.sh $(shell go list $(PACKAGES)) - make lint - -.PHONY: test-only-ci -test-only-ci: - go test -cover $(PACKAGES) - make lint diff --git a/vendor/github.com/uber/jaeger-lib/README.md b/vendor/github.com/uber/jaeger-lib/README.md deleted file mode 100644 index 1600e7905db..00000000000 --- a/vendor/github.com/uber/jaeger-lib/README.md +++ /dev/null @@ -1,22 +0,0 @@ -[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] - - -# jaeger-lib - -A collection of shared infrastructure libraries used by different -components of [Jaeger](https://github.com/uber/jaeger) backend and [jaeger-client-go](https://github.com/uber/jaeger-client-go). -This library is *not intended to be used standalone*, and provides *no guarantees of backwards compatibility*. - -The library's import path is `github.com/uber/jaeger-lib`. - -## How to Contribute - -Please see [CONTRIBUTING.md](CONTRIBUTING.md). - -[doc-img]: https://godoc.org/github.com/uber/jaeger-lib?status.svg -[doc]: https://godoc.org/github.com/uber/jaeger-lib -[ci-img]: https://travis-ci.org/jaegertracing/jaeger-lib.svg?branch=master -[ci]: https://travis-ci.org/jaegertracing/jaeger-lib -[cov-img]: https://coveralls.io/repos/jaegertracing/jaeger-lib/badge.svg?branch=master&service=github -[cov]: https://coveralls.io/github/jaegertracing/jaeger-lib?branch=master - diff --git a/vendor/github.com/uber/jaeger-lib/glide.lock b/vendor/github.com/uber/jaeger-lib/glide.lock deleted file mode 100644 index 3974d38c718..00000000000 --- a/vendor/github.com/uber/jaeger-lib/glide.lock +++ /dev/null @@ -1,78 +0,0 @@ -hash: 8ca2ebd4305a4aaead18ee8cc5a84da42e95c202d53c1bd78d11436aeb8be8e4 -updated: 2017-09-20T01:48:48.588894144+02:00 -imports: -- name: github.com/beorn7/perks - version: 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9 - subpackages: - - quantile -- name: github.com/codahale/hdrhistogram - version: f8ad88b59a584afeee9d334eff879b104439117b -- name: github.com/davecgh/go-spew - version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 - subpackages: - - spew -- name: github.com/facebookgo/clock - version: 600d898af40aa09a7a93ecb9265d87b0504b6f03 -- name: github.com/go-kit/kit - version: a9ca6725cbbea455e61c6bc8a1ed28e81eb3493b - subpackages: - - log - - log/level - - metrics - - metrics/expvar - - metrics/generic - - metrics/influx - - metrics/internal/lv - - metrics/prometheus -- name: github.com/go-logfmt/logfmt - version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 -- name: github.com/go-stack/stack - version: 817915b46b97fd7bb80e8ab6b69f01a53ac3eebf -- name: github.com/golang/protobuf - version: 7cc19b78d562895b13596ddce7aafb59dd789318 - subpackages: - - proto -- name: github.com/influxdata/influxdb - version: f3f30726d822c4be8cd00137ba66b6e4fd68cca1 - subpackages: - - client/v2 - - models - - pkg/escape -- name: github.com/kr/logfmt - version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 -- name: github.com/matttproud/golang_protobuf_extensions - version: c12348ce28de40eed0136aa2b644d0ee0650e56c - subpackages: - - pbutil -- name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d - subpackages: - - difflib -- name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 - subpackages: - - prometheus -- name: github.com/prometheus/client_model - version: 6f3806018612930941127f2a7c6c453ba2c527d2 - subpackages: - - go -- name: github.com/prometheus/common - version: 49fee292b27bfff7f354ee0f64e1bc4850462edf - subpackages: - - expfmt - - internal/bitbucket.org/ww/goautoneg - - model -- name: github.com/prometheus/procfs - version: a1dba9ce8baed984a2495b658c82687f8157b98f - subpackages: - - xfs -- name: github.com/stretchr/testify - version: 05e8a0eda380579888eb53c394909df027f06991 - subpackages: - - assert - - require -- name: github.com/uber-go/tally - version: be9e53c77349ae2dd4b8c03a6dc20ed9a88b9927 -- name: github.com/VividCortex/gohistogram - version: 51564d9861991fb0ad0f531c99ef602d0f9866e6 -testImports: [] diff --git a/vendor/github.com/uber/jaeger-lib/glide.yaml b/vendor/github.com/uber/jaeger-lib/glide.yaml deleted file mode 100644 index e134d1de075..00000000000 --- a/vendor/github.com/uber/jaeger-lib/glide.yaml +++ /dev/null @@ -1,13 +0,0 @@ -package: github.com/uber/jaeger-lib -import: -- package: github.com/codahale/hdrhistogram -- package: github.com/go-kit/kit - version: v0.5.0 - subpackages: - - metrics/influx -- package: github.com/uber-go/tally - version: '>= 2.1.0, < 4' -- package: github.com/prometheus/client_golang - version: v0.8.0 -testImport: -- package: github.com/stretchr/testify diff --git a/vendor/github.com/yudai/gojsondiff/.gitignore b/vendor/github.com/yudai/gojsondiff/.gitignore deleted file mode 100644 index c56069fe260..00000000000 --- a/vendor/github.com/yudai/gojsondiff/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.test \ No newline at end of file diff --git a/vendor/github.com/yudai/gojsondiff/Makefile b/vendor/github.com/yudai/gojsondiff/Makefile deleted file mode 100644 index 01645989158..00000000000 --- a/vendor/github.com/yudai/gojsondiff/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -test: - if [ `go fmt $(go list ./... | grep -v /vendor/) | wc -l` -gt 0 ]; then echo "go fmt error"; exit 1; fi - -tools: - go get github.com/tools/godep diff --git a/vendor/github.com/yudai/gojsondiff/README.md b/vendor/github.com/yudai/gojsondiff/README.md deleted file mode 100644 index 2c158ee654e..00000000000 --- a/vendor/github.com/yudai/gojsondiff/README.md +++ /dev/null @@ -1,155 +0,0 @@ -# Go JSON Diff (and Patch) - -[![Wercker](https://app.wercker.com/status/00d70daaf40ce277fd4f10290f097b9d/s/master)][wercker] -[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg)][license] - -[wercker]: https://app.wercker.com/project/bykey/00d70daaf40ce277fd4f10290f097b9d -[license]: https://github.com/yudai/gojsondiff/blob/master/LICENS - -## How to use - -### Installation - -```sh -go get github.com/yudai/gojsondiff -``` - -### Comparing two JSON strings - -See `jd/main.go` for how to use this library. - - -## CLI tool - -This repository contains a package that you can use as a CLI tool. - -### Instllation - -```sh -go get github.com/yudai/gojsondiff/jd -``` - -### Usage - -#### Diff - -Just give two json files to the `jd` command: - -```sh -jd one.json another.json -``` - -Outputs would be something like: - -```diff - { - "arr": [ - 0: "arr0", - 1: 21, - 2: { - "num": 1, -- "str": "pek3f" -+ "str": "changed" - }, - 3: [ - 0: 0, -- 1: "1" -+ 1: "changed" - ] - ], - "bool": true, - "num_float": 39.39, - "num_int": 13, - "obj": { - "arr": [ - 0: 17, - 1: "str", - 2: { -- "str": "eafeb" -+ "str": "changed" - } - ], -+ "new": "added", -- "num": 19, - "obj": { -- "num": 14, -+ "num": 9999 -- "str": "efj3" -+ "str": "changed" - }, - "str": "bcded" - }, - "str": "abcde" - } -``` - -When you prefer the delta foramt of [jsondiffpatch](https://github.com/benjamine/jsondiffpatch), add the `-f delta` option. - -```sh -jd -f delta one.json another.json -``` - -This command shows: - -```json -{ - "arr": { - "2": { - "str": [ - "pek3f", - "changed" - ] - }, - "3": { - "1": [ - "1", - "changed" - ], - "_t": "a" - }, - "_t": "a" - }, - "obj": { - "arr": { - "2": { - "str": [ - "eafeb", - "changed" - ] - }, - "_t": "a" - }, - "new": [ - "added" - ], - "num": [ - 19, - 0, - 0 - ], - "obj": { - "num": [ - 14, - 9999 - ], - "str": [ - "efj3", - "changed" - ] - } - } -} -``` - -#### Patch - -Give a diff file in the delta format and the JSON file to the `jp` command. - -```sh -jp diff.delta one.json -``` - - -## License - -MIT License (see `LICENSE` for detail) diff --git a/vendor/github.com/yudai/gojsondiff/wercker.yml b/vendor/github.com/yudai/gojsondiff/wercker.yml deleted file mode 100644 index acda6dcf4ca..00000000000 --- a/vendor/github.com/yudai/gojsondiff/wercker.yml +++ /dev/null @@ -1,11 +0,0 @@ -box: golang:1.6.3 - -build: - steps: - - setup-go-workspace - - script: - name: tools - code: make tools - - script: - name: test - code: make test diff --git a/vendor/github.com/yudai/golcs/README.md b/vendor/github.com/yudai/golcs/README.md deleted file mode 100644 index 4fe8cb3ead0..00000000000 --- a/vendor/github.com/yudai/golcs/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Go Longest Common Subsequence (LCS) - -[![GoDoc](https://godoc.org/github.com/yudai/golcs?status.svg)][godoc] -[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg)][license] - -[godoc]: https://godoc.org/github.com/yudai/golcs -[license]: https://github.com/yudai/golcs/blob/master/LICENSE - -A package to calculate [LCS](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem) of slices. - -## Usage - -```sh -go get github.com/yudai/golcs -``` - -```go -import " github.com/yudai/golcs" - -left = []interface{}{1, 2, 5, 3, 1, 1, 5, 8, 3} -right = []interface{}{1, 2, 3, 3, 4, 4, 5, 1, 6} - -lcs := golcs.New(left, right) - -lcs.Values() // LCS values => []interface{}{1, 2, 5, 1} -lcs.IndexPairs() // Matched indices => [{Left: 0, Right: 0}, {Left: 1, Right: 1}, {Left: 2, Right: 6}, {Left: 4, Right: 7}] -lcs.Length() // Matched length => 4 - -lcs.Table() // Memo table -``` - -All the methods of `Lcs` cache their return values. For example, the memo table is calculated only once and reused when `Values()`, `Length()` and other methods are called. - - -## FAQ - -### How can I give `[]byte` values to `Lcs()` as its arguments? - -As `[]interface{}` is incompatible with `[]othertype` like `[]byte`, you need to create a `[]interface{}` slice and copy the values in your `[]byte` slice into it. Unfortunately, Go doesn't provide any mesure to cast a slice into `[]interface{}` with zero cost. Your copy costs O(n). - -```go -leftBytes := []byte("TGAGTA") -left = make([]interface{}, len(leftBytes)) -for i, v := range leftBytes { - left[i] = v -} - -rightBytes := []byte("GATA") -right = make([]interface{}, len(rightBytes)) -for i, v := range rightBytes { - right[i] = v -} - -lcs.New(left, right) -``` - - -## LICENSE - -The MIT license (See `LICENSE` for detail) diff --git a/vendor/golang.org/x/crypto/.gitattributes b/vendor/golang.org/x/crypto/.gitattributes deleted file mode 100644 index d2f212e5da8..00000000000 --- a/vendor/golang.org/x/crypto/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# 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/crypto/.gitignore b/vendor/golang.org/x/crypto/.gitignore deleted file mode 100644 index 8339fd61d3f..00000000000 --- a/vendor/golang.org/x/crypto/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/crypto/CONTRIBUTING.md b/vendor/golang.org/x/crypto/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d..00000000000 --- a/vendor/golang.org/x/crypto/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# 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/crypto/README.md b/vendor/golang.org/x/crypto/README.md deleted file mode 100644 index c9d6fecd1e5..00000000000 --- a/vendor/golang.org/x/crypto/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Go Cryptography - -This repository holds supplementary Go cryptography libraries. - -## Download/Install - -The easiest way to install is to run `go get -u golang.org/x/crypto/...`. You -can also manually git clone the repository to `$GOPATH/src/golang.org/x/crypto`. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - -The main issue tracker for the crypto repository is located at -https://github.com/golang/go/issues. Prefix your issue with "x/crypto:" in the -subject line, so it is easy to find. - -Note that contributions to the cryptography package receive additional scrutiny -due to their sensitive nature. Patches may take longer than normal to receive -feedback. diff --git a/vendor/golang.org/x/crypto/codereview.cfg b/vendor/golang.org/x/crypto/codereview.cfg deleted file mode 100644 index 3f8b14b64e8..00000000000 --- a/vendor/golang.org/x/crypto/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/net/.gitattributes b/vendor/golang.org/x/net/.gitattributes deleted file mode 100644 index d2f212e5da8..00000000000 --- a/vendor/golang.org/x/net/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# 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/net/.gitignore b/vendor/golang.org/x/net/.gitignore deleted file mode 100644 index 8339fd61d3f..00000000000 --- a/vendor/golang.org/x/net/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/net/CONTRIBUTING.md b/vendor/golang.org/x/net/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d..00000000000 --- a/vendor/golang.org/x/net/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# 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/net/README.md b/vendor/golang.org/x/net/README.md deleted file mode 100644 index 00a9b6eb25f..00000000000 --- a/vendor/golang.org/x/net/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Go Networking - -This repository holds supplementary Go networking libraries. - -## Download/Install - -The easiest way to install is to run `go get -u golang.org/x/net`. You can -also manually git clone the repository to `$GOPATH/src/golang.org/x/net`. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit -changes to this repository, see https://golang.org/doc/contribute.html. -The main issue tracker for the net repository is located at -https://github.com/golang/go/issues. Prefix your issue with "x/net:" in the -subject line, so it is easy to find. diff --git a/vendor/golang.org/x/net/codereview.cfg b/vendor/golang.org/x/net/codereview.cfg deleted file mode 100644 index 3f8b14b64e8..00000000000 --- a/vendor/golang.org/x/net/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/net/http2/.gitignore b/vendor/golang.org/x/net/http2/.gitignore deleted file mode 100644 index 190f12234ad..00000000000 --- a/vendor/golang.org/x/net/http2/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*~ -h2i/h2i diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile deleted file mode 100644 index 53fc5257974..00000000000 --- a/vendor/golang.org/x/net/http2/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -# -# This Dockerfile builds a recent curl with HTTP/2 client support, using -# a recent nghttp2 build. -# -# See the Makefile for how to tag it. If Docker and that image is found, the -# Go tests use this curl binary for integration tests. -# - -FROM ubuntu:trusty - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y git-core build-essential wget - -RUN apt-get install -y --no-install-recommends \ - autotools-dev libtool pkg-config zlib1g-dev \ - libcunit1-dev libssl-dev libxml2-dev libevent-dev \ - automake autoconf - -# The list of packages nghttp2 recommends for h2load: -RUN apt-get install -y --no-install-recommends make binutils \ - autoconf automake autotools-dev \ - libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ - libev-dev libevent-dev libjansson-dev libjemalloc-dev \ - cython python3.4-dev python-setuptools - -# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: -ENV NGHTTP2_VER 895da9a -RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git - -WORKDIR /root/nghttp2 -RUN git reset --hard $NGHTTP2_VER -RUN autoreconf -i -RUN automake -RUN autoconf -RUN ./configure -RUN make -RUN make install - -WORKDIR /root -RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz -RUN tar -zxvf curl-7.45.0.tar.gz -WORKDIR /root/curl-7.45.0 -RUN ./configure --with-ssl --with-nghttp2=/usr/local -RUN make -RUN make install -RUN ldconfig - -CMD ["-h"] -ENTRYPOINT ["/usr/local/bin/curl"] - diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile deleted file mode 100644 index 55fd826f77b..00000000000 --- a/vendor/golang.org/x/net/http2/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -curlimage: - docker build -t gohttp2/curl . - diff --git a/vendor/golang.org/x/net/http2/README b/vendor/golang.org/x/net/http2/README deleted file mode 100644 index 360d5aa3790..00000000000 --- a/vendor/golang.org/x/net/http2/README +++ /dev/null @@ -1,20 +0,0 @@ -This is a work-in-progress HTTP/2 implementation for Go. - -It will eventually live in the Go standard library and won't require -any changes to your code to use. It will just be automatic. - -Status: - -* The server support is pretty good. A few things are missing - but are being worked on. -* The client work has just started but shares a lot of code - is coming along much quicker. - -Docs are at https://godoc.org/golang.org/x/net/http2 - -Demo test server at https://http2.golang.org/ - -Help & bug reports welcome! - -Contributing: https://golang.org/doc/contribute.html -Bugs: https://golang.org/issue/new?title=x/net/http2:+ diff --git a/vendor/golang.org/x/oauth2/CONTRIBUTING.md b/vendor/golang.org/x/oauth2/CONTRIBUTING.md deleted file mode 100644 index 46aa2b12dda..00000000000 --- a/vendor/golang.org/x/oauth2/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# 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://github.com/golang/oauth2/issues), 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/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md deleted file mode 100644 index eb8dcee179e..00000000000 --- a/vendor/golang.org/x/oauth2/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# OAuth2 for Go - -[![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2) -[![GoDoc](https://godoc.org/golang.org/x/oauth2?status.svg)](https://godoc.org/golang.org/x/oauth2) - -oauth2 package contains a client implementation for OAuth 2.0 spec. - -## Installation - -~~~~ -go get golang.org/x/oauth2 -~~~~ - -Or you can manually git clone the repository to -`$(go env GOPATH)/src/golang.org/x/oauth2`. - -See godoc for further documentation and examples. - -* [godoc.org/golang.org/x/oauth2](http://godoc.org/golang.org/x/oauth2) -* [godoc.org/golang.org/x/oauth2/google](http://godoc.org/golang.org/x/oauth2/google) - - -## App Engine - -In change 96e89be (March 2015), we removed the `oauth2.Context2` type in favor -of the [`context.Context`](https://golang.org/x/net/context#Context) type from -the `golang.org/x/net/context` package - -This means it's no longer possible to use the "Classic App Engine" -`appengine.Context` type with the `oauth2` package. (You're using -Classic App Engine if you import the package `"appengine"`.) - -To work around this, you may use the new `"google.golang.org/appengine"` -package. This package has almost the same API as the `"appengine"` package, -but it can be fetched with `go get` and used on "Managed VMs" and well as -Classic App Engine. - -See the [new `appengine` package's readme](https://github.com/golang/appengine#updating-a-go-app-engine-app) -for information on updating your app. - -If you don't want to update your entire app to use the new App Engine packages, -you may use both sets of packages in parallel, using only the new packages -with the `oauth2` package. - -```go -import ( - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - newappengine "google.golang.org/appengine" - newurlfetch "google.golang.org/appengine/urlfetch" - - "appengine" -) - -func handler(w http.ResponseWriter, r *http.Request) { - var c appengine.Context = appengine.NewContext(r) - c.Infof("Logging a message with the old package") - - var ctx context.Context = newappengine.NewContext(r) - client := &http.Client{ - Transport: &oauth2.Transport{ - Source: google.AppEngineTokenSource(ctx, "scope"), - Base: &newurlfetch.Transport{Context: ctx}, - }, - } - client.Get("...") -} -``` - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - -The main issue tracker for the oauth2 repository is located at -https://github.com/golang/oauth2/issues. diff --git a/vendor/golang.org/x/sync/CONTRIBUTING.md b/vendor/golang.org/x/sync/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d..00000000000 --- a/vendor/golang.org/x/sync/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# 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/sync/README.md b/vendor/golang.org/x/sync/README.md deleted file mode 100644 index 1f8436cc9c8..00000000000 --- a/vendor/golang.org/x/sync/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Go Sync - -This repository provides Go concurrency primitives in addition to the -ones provided by the language and "sync" and "sync/atomic" packages. - -## Download/Install - -The easiest way to install is to run `go get -u golang.org/x/sync`. You can -also manually git clone the repository to `$GOPATH/src/golang.org/x/sync`. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - -The main issue tracker for the sync repository is located at -https://github.com/golang/go/issues. Prefix your issue with "x/sync:" in the -subject line, so it is easy to find. diff --git a/vendor/golang.org/x/sync/codereview.cfg b/vendor/golang.org/x/sync/codereview.cfg deleted file mode 100644 index 3f8b14b64e8..00000000000 --- a/vendor/golang.org/x/sync/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/sys/.gitattributes b/vendor/golang.org/x/sys/.gitattributes deleted file mode 100644 index d2f212e5da8..00000000000 --- a/vendor/golang.org/x/sys/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# 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/sys/.gitignore b/vendor/golang.org/x/sys/.gitignore deleted file mode 100644 index 8339fd61d3f..00000000000 --- a/vendor/golang.org/x/sys/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/sys/CONTRIBUTING.md b/vendor/golang.org/x/sys/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d..00000000000 --- a/vendor/golang.org/x/sys/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# 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/sys/README.md b/vendor/golang.org/x/sys/README.md deleted file mode 100644 index ef6c9e59c26..00000000000 --- a/vendor/golang.org/x/sys/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# sys - -This repository holds supplemental Go packages for low-level interactions with -the operating system. - -## Download/Install - -The easiest way to install is to run `go get -u golang.org/x/sys`. You can -also manually git clone the repository to `$GOPATH/src/golang.org/x/sys`. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - -The main issue tracker for the sys repository is located at -https://github.com/golang/go/issues. Prefix your issue with "x/sys:" in the -subject line, so it is easy to find. diff --git a/vendor/golang.org/x/sys/codereview.cfg b/vendor/golang.org/x/sys/codereview.cfg deleted file mode 100644 index 3f8b14b64e8..00000000000 --- a/vendor/golang.org/x/sys/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/sys/unix/.gitignore b/vendor/golang.org/x/sys/unix/.gitignore deleted file mode 100644 index e3e0fc6f896..00000000000 --- a/vendor/golang.org/x/sys/unix/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -_obj/ -unix.test diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/golang.org/x/sys/unix/README.md deleted file mode 100644 index bc6f6031f1b..00000000000 --- a/vendor/golang.org/x/sys/unix/README.md +++ /dev/null @@ -1,173 +0,0 @@ -# Building `sys/unix` - -The sys/unix package provides access to the raw system call interface of the -underlying operating system. See: https://godoc.org/golang.org/x/sys/unix - -Porting Go to a new architecture/OS combination or adding syscalls, types, or -constants to an existing architecture/OS pair requires some manual effort; -however, there are tools that automate much of the process. - -## Build Systems - -There are currently two ways we generate the necessary files. We are currently -migrating the build system to use containers so the builds are reproducible. -This is being done on an OS-by-OS basis. Please update this documentation as -components of the build system change. - -### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) - -The old build system generates the Go files based on the C header files -present on your system. This means that files -for a given GOOS/GOARCH pair must be generated on a system with that OS and -architecture. This also means that the generated code can differ from system -to system, based on differences in the header files. - -To avoid this, if you are using the old build system, only generate the Go -files on an installation with unmodified header files. It is also important to -keep track of which version of the OS the files were generated from (ex. -Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes -and have each OS upgrade correspond to a single change. - -To build the files for your current OS and architecture, make sure GOOS and -GOARCH are set correctly and run `mkall.sh`. This will generate the files for -your specific system. Running `mkall.sh -n` shows the commands that will be run. - -Requirements: bash, perl, go - -### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) - -The new build system uses a Docker container to generate the go files directly -from source checkouts of the kernel and various system libraries. This means -that on any platform that supports Docker, all the files using the new build -system can be generated at once, and generated files will not change based on -what the person running the scripts has installed on their computer. - -The OS specific files for the new build system are located in the `${GOOS}` -directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When -the kernel or system library updates, modify the Dockerfile at -`${GOOS}/Dockerfile` to checkout the new release of the source. - -To build all the files under the new build system, you must be on an amd64/Linux -system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will -then generate all of the files for all of the GOOS/GOARCH pairs in the new build -system. Running `mkall.sh -n` shows the commands that will be run. - -Requirements: bash, perl, go, docker - -## Component files - -This section describes the various files used in the code generation process. -It also contains instructions on how to modify these files to add a new -architecture/OS or to add additional syscalls, types, or constants. Note that -if you are using the new build system, the scripts cannot be called normally. -They must be called from within the docker container. - -### asm files - -The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system -call dispatch. There are three entry points: -``` - func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) - func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) - func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) -``` -The first and second are the standard ones; they differ only in how many -arguments can be passed to the kernel. The third is for low-level use by the -ForkExec wrapper. Unlike the first two, it does not call into the scheduler to -let it know that a system call is running. - -When porting Go to an new architecture/OS, this file must be implemented for -each GOOS/GOARCH pair. - -### mksysnum - -Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` -for the old system). This script takes in a list of header files containing the -syscall number declarations and parses them to produce the corresponding list of -Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated -constants. - -Adding new syscall numbers is mostly done by running the build on a sufficiently -new installation of the target OS (or updating the source checkouts for the -new build system). However, depending on the OS, you make need to update the -parsing in mksysnum. - -### mksyscall.pl - -The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are -hand-written Go files which implement system calls (for unix, the specific OS, -or the specific OS/Architecture pair respectively) that need special handling -and list `//sys` comments giving prototypes for ones that can be generated. - -The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts -them into syscalls. This requires the name of the prototype in the comment to -match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function -prototype can be exported (capitalized) or not. - -Adding a new syscall often just requires adding a new `//sys` function prototype -with the desired arguments and a capitalized name so it is exported. However, if -you want the interface to the syscall to be different, often one will make an -unexported `//sys` prototype, an then write a custom wrapper in -`syscall_${GOOS}.go`. - -### types files - -For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or -`types_${GOOS}.go` on the old system). This file includes standard C headers and -creates Go type aliases to the corresponding C types. The file is then fed -through godef to get the Go compatible definitions. Finally, the generated code -is fed though mkpost.go to format the code correctly and remove any hidden or -private identifiers. This cleaned-up code is written to -`ztypes_${GOOS}_${GOARCH}.go`. - -The hardest part about preparing this file is figuring out which headers to -include and which symbols need to be `#define`d to get the actual data -structures that pass through to the kernel system calls. Some C libraries -preset alternate versions for binary compatibility and translate them on the -way in and out of system calls, but there is almost always a `#define` that can -get the real ones. -See `types_darwin.go` and `linux/types.go` for examples. - -To add a new type, add in the necessary include statement at the top of the -file (if it is not already there) and add in a type alias line. Note that if -your type is significantly different on different architectures, you may need -some `#if/#elif` macros in your include statements. - -### mkerrors.sh - -This script is used to generate the system's various constants. This doesn't -just include the error numbers and error strings, but also the signal numbers -an a wide variety of miscellaneous constants. The constants come from the list -of include files in the `includes_${uname}` variable. A regex then picks out -the desired `#define` statements, and generates the corresponding Go constants. -The error numbers and strings are generated from `#include `, and the -signal numbers and strings are generated from `#include `. All of -these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, -`_errors.c`, which prints out all the constants. - -To add a constant, add the header that includes it to the appropriate variable. -Then, edit the regex (if necessary) to match the desired constant. Avoid making -the regex too broad to avoid matching unintended constants. - - -## Generated files - -### `zerror_${GOOS}_${GOARCH}.go` - -A file containing all of the system's generated error numbers, error strings, -signal numbers, and constants. Generated by `mkerrors.sh` (see above). - -### `zsyscall_${GOOS}_${GOARCH}.go` - -A file containing all the generated syscalls for a specific GOOS and GOARCH. -Generated by `mksyscall.pl` (see above). - -### `zsysnum_${GOOS}_${GOARCH}.go` - -A list of numeric constants for all the syscall number of the specific GOOS -and GOARCH. Generated by mksysnum (see above). - -### `ztypes_${GOOS}_${GOARCH}.go` - -A file containing Go types for passing into (or returning from) syscalls. -Generated by godefs and the types file (see above). diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh deleted file mode 100755 index 1715122bd4b..00000000000 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env bash -# 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 script runs or (given -n) prints suggested commands to generate files for -# the Architecture/OS specified by the GOARCH and GOOS environment variables. -# See README.md for more information about how the build system works. - -GOOSARCH="${GOOS}_${GOARCH}" - -# defaults -mksyscall="./mksyscall.pl" -mkerrors="./mkerrors.sh" -zerrors="zerrors_$GOOSARCH.go" -mksysctl="" -zsysctl="zsysctl_$GOOSARCH.go" -mksysnum= -mktypes= -run="sh" -cmd="" - -case "$1" in --syscalls) - for i in zsyscall*go - do - # Run the command line that appears in the first line - # of the generated file to regenerate it. - sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i - rm _$i - done - exit 0 - ;; --n) - run="cat" - cmd="echo" - shift -esac - -case "$#" in -0) - ;; -*) - echo 'usage: mkall.sh [-n]' 1>&2 - exit 2 -esac - -if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then - # Use then new build system - # Files generated through docker (use $cmd so you can Ctl-C the build or run) - $cmd docker build --tag generate:$GOOS $GOOS - $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS - exit -fi - -GOOSARCH_in=syscall_$GOOSARCH.go -case "$GOOSARCH" in -_* | *_ | _) - echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 - exit 1 - ;; -darwin_386) - mkerrors="$mkerrors -m32" - mksyscall="./mksyscall.pl -l32" - mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -darwin_amd64) - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -darwin_arm) - mkerrors="$mkerrors" - mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -darwin_arm64) - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -dragonfly_amd64) - mkerrors="$mkerrors -m64" - mksyscall="./mksyscall.pl -dragonfly" - mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -freebsd_386) - mkerrors="$mkerrors -m32" - mksyscall="./mksyscall.pl -l32" - mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -freebsd_amd64) - mkerrors="$mkerrors -m64" - mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -freebsd_arm) - mkerrors="$mkerrors" - mksyscall="./mksyscall.pl -l32 -arm" - mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -linux_sparc64) - GOOSARCH_in=syscall_linux_sparc64.go - unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h - mkerrors="$mkerrors -m64" - mksysnum="./mksysnum_linux.pl $unistd_h" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -netbsd_386) - mkerrors="$mkerrors -m32" - mksyscall="./mksyscall.pl -l32 -netbsd" - mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -netbsd_amd64) - mkerrors="$mkerrors -m64" - mksyscall="./mksyscall.pl -netbsd" - mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -netbsd_arm) - mkerrors="$mkerrors" - mksyscall="./mksyscall.pl -l32 -netbsd -arm" - mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -openbsd_386) - mkerrors="$mkerrors -m32" - mksyscall="./mksyscall.pl -l32 -openbsd" - mksysctl="./mksysctl_openbsd.pl" - mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -openbsd_amd64) - mkerrors="$mkerrors -m64" - mksyscall="./mksyscall.pl -openbsd" - mksysctl="./mksysctl_openbsd.pl" - mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -openbsd_arm) - mkerrors="$mkerrors" - mksyscall="./mksyscall.pl -l32 -openbsd -arm" - mksysctl="./mksysctl_openbsd.pl" - mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -solaris_amd64) - mksyscall="./mksyscall_solaris.pl" - mkerrors="$mkerrors -m64" - mksysnum= - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; -*) - echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 - exit 1 - ;; -esac - -( - if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi - case "$GOOS" in - *) - syscall_goos="syscall_$GOOS.go" - case "$GOOS" in - darwin | dragonfly | freebsd | netbsd | openbsd) - syscall_goos="syscall_bsd.go $syscall_goos" - ;; - esac - if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi - ;; - esac - if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi - if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi - if [ -n "$mktypes" ]; then - echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; - fi -) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh deleted file mode 100755 index 4dd40c17243..00000000000 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ /dev/null @@ -1,580 +0,0 @@ -#!/usr/bin/env bash -# 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. - -# Generate Go code listing errors and other #defined constant -# values (ENAMETOOLONG etc.), by asking the preprocessor -# about the definitions. - -unset LANG -export LC_ALL=C -export LC_CTYPE=C - -if test -z "$GOARCH" -o -z "$GOOS"; then - echo 1>&2 "GOARCH or GOOS not defined in environment" - exit 1 -fi - -# Check that we are using the new build system if we should -if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then - if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then - echo 1>&2 "In the new build system, mkerrors should not be called directly." - echo 1>&2 "See README.md" - exit 1 - fi -fi - -CC=${CC:-cc} - -if [[ "$GOOS" = "solaris" ]]; then - # Assumes GNU versions of utilities in PATH. - export PATH=/usr/gnu/bin:$PATH -fi - -uname=$(uname) - -includes_Darwin=' -#define _DARWIN_C_SOURCE -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - -includes_DragonFly=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - -includes_FreeBSD=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if __FreeBSD__ >= 10 -#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 -#undef SIOCAIFADDR -#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data -#undef SIOCSIFPHYADDR -#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data -#endif -' - -includes_Linux=' -#define _LARGEFILE_SOURCE -#define _LARGEFILE64_SOURCE -#ifndef __LP64__ -#define _FILE_OFFSET_BITS 64 -#endif -#define _GNU_SOURCE - -// is broken on powerpc64, as it fails to include definitions of -// these structures. We just include them copied from . -#if defined(__powerpc__) -struct sgttyb { - char sg_ispeed; - char sg_ospeed; - char sg_erase; - char sg_kill; - short sg_flags; -}; - -struct tchars { - char t_intrc; - char t_quitc; - char t_startc; - char t_stopc; - char t_eofc; - char t_brkc; -}; - -struct ltchars { - char t_suspc; - char t_dsuspc; - char t_rprntc; - char t_flushc; - char t_werasc; - char t_lnextc; -}; -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef MSG_FASTOPEN -#define MSG_FASTOPEN 0x20000000 -#endif - -#ifndef PTRACE_GETREGS -#define PTRACE_GETREGS 0xc -#endif - -#ifndef PTRACE_SETREGS -#define PTRACE_SETREGS 0xd -#endif - -#ifndef SOL_NETLINK -#define SOL_NETLINK 270 -#endif - -#ifdef SOL_BLUETOOTH -// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h -// but it is already in bluetooth_linux.go -#undef SOL_BLUETOOTH -#endif - -// Certain constants are missing from the fs/crypto UAPI -#define FS_KEY_DESC_PREFIX "fscrypt:" -#define FS_KEY_DESC_PREFIX_SIZE 8 -#define FS_MAX_KEY_SIZE 64 -' - -includes_NetBSD=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Needed since refers to it... -#define schedppq 1 -' - -includes_OpenBSD=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// We keep some constants not supported in OpenBSD 5.5 and beyond for -// the promise of compatibility. -#define EMUL_ENABLED 0x1 -#define EMUL_NATIVE 0x2 -#define IPV6_FAITH 0x1d -#define IPV6_OPTIONS 0x1 -#define IPV6_RTHDR_STRICT 0x1 -#define IPV6_SOCKOPT_RESERVED1 0x3 -#define SIOCGIFGENERIC 0xc020693a -#define SIOCSIFGENERIC 0x80206939 -#define WALTSIG 0x4 -' - -includes_SunOS=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' - - -includes=' -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -' -ccflags="$@" - -# Write go tool cgo -godefs input. -( - echo package unix - echo - echo '/*' - indirect="includes_$(uname)" - echo "${!indirect} $includes" - echo '*/' - echo 'import "C"' - echo 'import "syscall"' - echo - echo 'const (' - - # The gcc command line prints all the #defines - # it encounters while processing the input - echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | - awk ' - $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} - - $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers - $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} - $2 ~ /^(SCM_SRCRT)$/ {next} - $2 ~ /^(MAP_FAILED)$/ {next} - $2 ~ /^ELF_.*$/ {next}# contains ELF_ARCH, etc. - - $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || - $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} - - $2 !~ /^ETH_/ && - $2 !~ /^EPROC_/ && - $2 !~ /^EQUIV_/ && - $2 !~ /^EXPR_/ && - $2 ~ /^E[A-Z0-9_]+$/ || - $2 ~ /^B[0-9_]+$/ || - $2 ~ /^(OLD|NEW)DEV$/ || - $2 == "BOTHER" || - $2 ~ /^CI?BAUD(EX)?$/ || - $2 == "IBSHIFT" || - $2 ~ /^V[A-Z0-9]+$/ || - $2 ~ /^CS[A-Z0-9]/ || - $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || - $2 ~ /^IGN/ || - $2 ~ /^IX(ON|ANY|OFF)$/ || - $2 ~ /^IN(LCR|PCK)$/ || - $2 ~ /(^FLU?SH)|(FLU?SH$)/ || - $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || - $2 == "BRKINT" || - $2 == "HUPCL" || - $2 == "PENDIN" || - $2 == "TOSTOP" || - $2 == "XCASE" || - $2 == "ALTWERASE" || - $2 == "NOKERNINFO" || - $2 ~ /^PAR/ || - $2 ~ /^SIG[^_]/ || - $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || - $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || - $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || - $2 ~ /^O?XTABS$/ || - $2 ~ /^TC[IO](ON|OFF)$/ || - $2 ~ /^IN_/ || - $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || - $2 ~ /^FALLOC_/ || - $2 == "ICMPV6_FILTER" || - $2 == "SOMAXCONN" || - $2 == "NAME_MAX" || - $2 == "IFNAMSIZ" || - $2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ || - $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ || - $2 ~ /^HW_MACHINE$/ || - $2 ~ /^SYSCTL_VERS/ || - $2 ~ /^(MS|MNT|UMOUNT)_/ || - $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || - $2 ~ /^LINUX_REBOOT_CMD_/ || - $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || - $2 !~ "NLA_TYPE_MASK" && - $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || - $2 ~ /^SIOC/ || - $2 ~ /^TIOC/ || - $2 ~ /^TCGET/ || - $2 ~ /^TCSET/ || - $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || - $2 !~ "RTF_BITS" && - $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || - $2 ~ /^BIOC/ || - $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || - $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || - $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || - $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL)$/ && - $2 ~ /^(BPF|DLT)_/ || - $2 ~ /^CLOCK_/ || - $2 ~ /^CAN_/ || - $2 ~ /^CAP_/ || - $2 ~ /^ALG_/ || - $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || - $2 ~ /^GRND_/ || - $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || - $2 ~ /^KEYCTL_/ || - $2 ~ /^PERF_EVENT_IOC_/ || - $2 ~ /^SECCOMP_MODE_/ || - $2 ~ /^SPLICE_/ || - $2 ~ /^(VM|VMADDR)_/ || - $2 ~ /^IOCTL_VM_SOCKETS_/ || - $2 ~ /^(TASKSTATS|TS)_/ || - $2 ~ /^CGROUPSTATS_/ || - $2 ~ /^GENL_/ || - $2 ~ /^STATX_/ || - $2 ~ /^UTIME_/ || - $2 ~ /^XATTR_(CREATE|REPLACE)/ || - $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || - $2 ~ /^FSOPT_/ || - $2 ~ /^WDIOC_/ || - $2 !~ "WMESGLEN" && - $2 ~ /^W[A-Z0-9]+$/ || - $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} - $2 ~ /^__WCOREFLAG$/ {next} - $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} - - {next} - ' | sort - - echo ')' -) >_const.go - -# Pull out the error names for later. -errors=$( - echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | - sort -) - -# Pull out the signal names for later. -signals=$( - echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | - egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | - sort -) - -# Again, writing regexps to a file. -echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | - sort >_error.grep -echo '#include ' | $CC -x c - -E -dM $ccflags | - awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | - egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | - sort >_signal.grep - -echo '// mkerrors.sh' "$@" -echo '// Code generated by the command above; see README.md. DO NOT EDIT.' -echo -echo "// +build ${GOARCH},${GOOS}" -echo -go tool cgo -godefs -- "$@" _const.go >_error.out -cat _error.out | grep -vf _error.grep | grep -vf _signal.grep -echo -echo '// Errors' -echo 'const (' -cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' -echo ')' - -echo -echo '// Signals' -echo 'const (' -cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' -echo ')' - -# Run C program to print error and syscall strings. -( - echo -E " -#include -#include -#include -#include -#include -#include - -#define nelem(x) (sizeof(x)/sizeof((x)[0])) - -enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below - -int errors[] = { -" - for i in $errors - do - echo -E ' '$i, - done - - echo -E " -}; - -int signals[] = { -" - for i in $signals - do - echo -E ' '$i, - done - - # Use -E because on some systems bash builtin interprets \n itself. - echo -E ' -}; - -static int -intcmp(const void *a, const void *b) -{ - return *(int*)a - *(int*)b; -} - -int -main(void) -{ - int i, e; - char buf[1024], *p; - - printf("\n\n// Error table\n"); - printf("var errors = [...]string {\n"); - qsort(errors, nelem(errors), sizeof errors[0], intcmp); - for(i=0; i 0 && errors[i-1] == e) - continue; - strcpy(buf, strerror(e)); - // lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) - buf[0] += a - A; - printf("\t%d: \"%s\",\n", e, buf); - } - printf("}\n\n"); - - printf("\n\n// Signal table\n"); - printf("var signals = [...]string {\n"); - qsort(signals, nelem(signals), sizeof signals[0], intcmp); - for(i=0; i 0 && signals[i-1] == e) - continue; - strcpy(buf, strsignal(e)); - // lowercase first letter: Bad -> bad, but STREAM -> STREAM. - if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) - buf[0] += a - A; - // cut trailing : number. - p = strrchr(buf, ":"[0]); - if(p) - *p = '\0'; - printf("\t%d: \"%s\",\n", e, buf); - } - printf("}\n\n"); - - return 0; -} - -' -) >_errors.c - -$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/golang.org/x/sys/unix/mksyscall.pl deleted file mode 100755 index 73e26cafa85..00000000000 --- a/vendor/golang.org/x/sys/unix/mksyscall.pl +++ /dev/null @@ -1,340 +0,0 @@ -#!/usr/bin/env perl -# 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 program reads a file containing function prototypes -# (like syscall_darwin.go) and generates system call bodies. -# The prototypes are marked by lines beginning with "//sys" -# and read like func declarations if //sys is replaced by func, but: -# * The parameter lists must give a name for each argument. -# This includes return parameters. -# * The parameter lists must give a type for each argument: -# the (x, y, z int) shorthand is not allowed. -# * If the return parameter is an error number, it must be named errno. - -# A line beginning with //sysnb is like //sys, except that the -# goroutine will not be suspended during the execution of the system -# call. This must only be used for system calls which can never -# block, as otherwise the system call could cause all goroutines to -# hang. - -use strict; - -my $cmdline = "mksyscall.pl " . join(' ', @ARGV); -my $errors = 0; -my $_32bit = ""; -my $plan9 = 0; -my $openbsd = 0; -my $netbsd = 0; -my $dragonfly = 0; -my $arm = 0; # 64-bit value should use (even, odd)-pair -my $tags = ""; # build tags - -if($ARGV[0] eq "-b32") { - $_32bit = "big-endian"; - shift; -} elsif($ARGV[0] eq "-l32") { - $_32bit = "little-endian"; - shift; -} -if($ARGV[0] eq "-plan9") { - $plan9 = 1; - shift; -} -if($ARGV[0] eq "-openbsd") { - $openbsd = 1; - shift; -} -if($ARGV[0] eq "-netbsd") { - $netbsd = 1; - shift; -} -if($ARGV[0] eq "-dragonfly") { - $dragonfly = 1; - shift; -} -if($ARGV[0] eq "-arm") { - $arm = 1; - shift; -} -if($ARGV[0] eq "-tags") { - shift; - $tags = $ARGV[0]; - shift; -} - -if($ARGV[0] =~ /^-/) { - print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; - exit 1; -} - -# Check that we are using the new build system if we should -if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { - if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { - print STDERR "In the new build system, mksyscall should not be called directly.\n"; - print STDERR "See README.md\n"; - exit 1; - } -} - - -sub parseparamlist($) { - my ($list) = @_; - $list =~ s/^\s*//; - $list =~ s/\s*$//; - if($list eq "") { - return (); - } - return split(/\s*,\s*/, $list); -} - -sub parseparam($) { - my ($p) = @_; - if($p !~ /^(\S*) (\S*)$/) { - print STDERR "$ARGV:$.: malformed parameter: $p\n"; - $errors = 1; - return ("xx", "int"); - } - return ($1, $2); -} - -my $text = ""; -while(<>) { - chomp; - s/\s+/ /g; - s/^\s+//; - s/\s+$//; - my $nonblock = /^\/\/sysnb /; - next if !/^\/\/sys / && !$nonblock; - - # Line must be of the form - # func Open(path string, mode int, perm int) (fd int, errno error) - # Split into name, in params, out params. - if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { - print STDERR "$ARGV:$.: malformed //sys declaration\n"; - $errors = 1; - next; - } - my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); - - # Split argument lists on comma. - my @in = parseparamlist($in); - my @out = parseparamlist($out); - - # Try in vain to keep people from editing this file. - # The theory is that they jump into the middle of the file - # without reading the header. - $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - - # Go function header. - my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; - $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; - - # Check if err return available - my $errvar = ""; - foreach my $p (@out) { - my ($name, $type) = parseparam($p); - if($type eq "error") { - $errvar = $name; - last; - } - } - - # Prepare arguments to Syscall. - my @args = (); - my $n = 0; - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @args, "uintptr(unsafe.Pointer($name))"; - } elsif($type eq "string" && $errvar ne "") { - $text .= "\tvar _p$n *byte\n"; - $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; - $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type eq "string") { - print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; - $text .= "\tvar _p$n *byte\n"; - $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type =~ /^\[\](.*)/) { - # Convert slice into pointer, length. - # Have to be careful not to take address of &a[0] if len == 0: - # pass dummy pointer in that case. - # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). - $text .= "\tvar _p$n unsafe.Pointer\n"; - $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; - $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; - $text .= "\n"; - push @args, "uintptr(_p$n)", "uintptr(len($name))"; - $n++; - } elsif($type eq "int64" && ($openbsd || $netbsd)) { - push @args, "0"; - if($_32bit eq "big-endian") { - push @args, "uintptr($name>>32)", "uintptr($name)"; - } elsif($_32bit eq "little-endian") { - push @args, "uintptr($name)", "uintptr($name>>32)"; - } else { - push @args, "uintptr($name)"; - } - } elsif($type eq "int64" && $dragonfly) { - if ($func !~ /^extp(read|write)/i) { - push @args, "0"; - } - if($_32bit eq "big-endian") { - push @args, "uintptr($name>>32)", "uintptr($name)"; - } elsif($_32bit eq "little-endian") { - push @args, "uintptr($name)", "uintptr($name>>32)"; - } else { - push @args, "uintptr($name)"; - } - } elsif($type eq "int64" && $_32bit ne "") { - if(@args % 2 && $arm) { - # arm abi specifies 64-bit argument uses - # (even, odd) pair - push @args, "0" - } - if($_32bit eq "big-endian") { - push @args, "uintptr($name>>32)", "uintptr($name)"; - } else { - push @args, "uintptr($name)", "uintptr($name>>32)"; - } - } else { - push @args, "uintptr($name)"; - } - } - - # Determine which form to use; pad args with zeros. - my $asm = "Syscall"; - if ($nonblock) { - if ($errvar ne "") { - $asm = "RawSyscall"; - } else { - $asm = "RawSyscallNoError"; - } - } else { - if ($errvar eq "") { - $asm = "SyscallNoError"; - } - } - if(@args <= 3) { - while(@args < 3) { - push @args, "0"; - } - } elsif(@args <= 6) { - $asm .= "6"; - while(@args < 6) { - push @args, "0"; - } - } elsif(@args <= 9) { - $asm .= "9"; - while(@args < 9) { - push @args, "0"; - } - } else { - print STDERR "$ARGV:$.: too many arguments to system call\n"; - } - - # System call number. - if($sysname eq "") { - $sysname = "SYS_$func"; - $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar - $sysname =~ y/a-z/A-Z/; - } - - # Actual call. - my $args = join(', ', @args); - my $call = "$asm($sysname, $args)"; - - # Assign return values. - my $body = ""; - my @ret = ("_", "_", "_"); - my $do_errno = 0; - for(my $i=0; $i<@out; $i++) { - my $p = $out[$i]; - my ($name, $type) = parseparam($p); - my $reg = ""; - if($name eq "err" && !$plan9) { - $reg = "e1"; - $ret[2] = $reg; - $do_errno = 1; - } elsif($name eq "err" && $plan9) { - $ret[0] = "r0"; - $ret[2] = "e1"; - next; - } else { - $reg = sprintf("r%d", $i); - $ret[$i] = $reg; - } - if($type eq "bool") { - $reg = "$reg != 0"; - } - if($type eq "int64" && $_32bit ne "") { - # 64-bit number in r1:r0 or r0:r1. - if($i+2 > @out) { - print STDERR "$ARGV:$.: not enough registers for int64 return\n"; - } - if($_32bit eq "big-endian") { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); - } else { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); - } - $ret[$i] = sprintf("r%d", $i); - $ret[$i+1] = sprintf("r%d", $i+1); - } - if($reg ne "e1" || $plan9) { - $body .= "\t$name = $type($reg)\n"; - } - } - if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { - $text .= "\t$call\n"; - } else { - if ($errvar ne "") { - $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; - } else { - $text .= "\t$ret[0], $ret[1] := $call\n"; - } - } - $text .= $body; - - if ($plan9 && $ret[2] eq "e1") { - $text .= "\tif int32(r0) == -1 {\n"; - $text .= "\t\terr = e1\n"; - $text .= "\t}\n"; - } elsif ($do_errno) { - $text .= "\tif e1 != 0 {\n"; - $text .= "\t\terr = errnoErr(e1)\n"; - $text .= "\t}\n"; - } - $text .= "\treturn\n"; - $text .= "}\n\n"; -} - -chomp $text; -chomp $text; - -if($errors) { - exit 1; -} - -print <) { - chomp; - s/\s+/ /g; - s/^\s+//; - s/\s+$//; - $package = $1 if !$package && /^package (\S+)$/; - my $nonblock = /^\/\/sysnb /; - next if !/^\/\/sys / && !$nonblock; - - # Line must be of the form - # func Open(path string, mode int, perm int) (fd int, err error) - # Split into name, in params, out params. - if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { - print STDERR "$ARGV:$.: malformed //sys declaration\n"; - $errors = 1; - next; - } - my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); - - # Split argument lists on comma. - my @in = parseparamlist($in); - my @out = parseparamlist($out); - - # So file name. - if($modname eq "") { - $modname = "libc"; - } - - # System call name. - if($sysname eq "") { - $sysname = "$func"; - } - - # System call pointer variable name. - my $sysvarname = "proc$sysname"; - - my $strconvfunc = "BytePtrFromString"; - my $strconvtype = "*byte"; - - $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. - - # Runtime import of function to allow cross-platform builds. - $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; - # Link symbol to proc address variable. - $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; - # Library proc address variable. - push @vars, $sysvarname; - - # Go function header. - $out = join(', ', @out); - if($out ne "") { - $out = " ($out)"; - } - if($text ne "") { - $text .= "\n" - } - $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; - - # Check if err return available - my $errvar = ""; - foreach my $p (@out) { - my ($name, $type) = parseparam($p); - if($type eq "error") { - $errvar = $name; - last; - } - } - - # Prepare arguments to Syscall. - my @args = (); - my $n = 0; - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @args, "uintptr(unsafe.Pointer($name))"; - } elsif($type eq "string" && $errvar ne "") { - $text .= "\tvar _p$n $strconvtype\n"; - $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; - $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type eq "string") { - print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; - $text .= "\tvar _p$n $strconvtype\n"; - $text .= "\t_p$n, _ = $strconvfunc($name)\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type =~ /^\[\](.*)/) { - # Convert slice into pointer, length. - # Have to be careful not to take address of &a[0] if len == 0: - # pass nil in that case. - $text .= "\tvar _p$n *$1\n"; - $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; - $n++; - } elsif($type eq "int64" && $_32bit ne "") { - if($_32bit eq "big-endian") { - push @args, "uintptr($name >> 32)", "uintptr($name)"; - } else { - push @args, "uintptr($name)", "uintptr($name >> 32)"; - } - } elsif($type eq "bool") { - $text .= "\tvar _p$n uint32\n"; - $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; - push @args, "uintptr(_p$n)"; - $n++; - } else { - push @args, "uintptr($name)"; - } - } - my $nargs = @args; - - # Determine which form to use; pad args with zeros. - my $asm = "sysvicall6"; - if ($nonblock) { - $asm = "rawSysvicall6"; - } - if(@args <= 6) { - while(@args < 6) { - push @args, "0"; - } - } else { - print STDERR "$ARGV:$.: too many arguments to system call\n"; - } - - # Actual call. - my $args = join(', ', @args); - my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; - - # Assign return values. - my $body = ""; - my $failexpr = ""; - my @ret = ("_", "_", "_"); - my @pout= (); - my $do_errno = 0; - for(my $i=0; $i<@out; $i++) { - my $p = $out[$i]; - my ($name, $type) = parseparam($p); - my $reg = ""; - if($name eq "err") { - $reg = "e1"; - $ret[2] = $reg; - $do_errno = 1; - } else { - $reg = sprintf("r%d", $i); - $ret[$i] = $reg; - } - if($type eq "bool") { - $reg = "$reg != 0"; - } - if($type eq "int64" && $_32bit ne "") { - # 64-bit number in r1:r0 or r0:r1. - if($i+2 > @out) { - print STDERR "$ARGV:$.: not enough registers for int64 return\n"; - } - if($_32bit eq "big-endian") { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); - } else { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); - } - $ret[$i] = sprintf("r%d", $i); - $ret[$i+1] = sprintf("r%d", $i+1); - } - if($reg ne "e1") { - $body .= "\t$name = $type($reg)\n"; - } - } - if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { - $text .= "\t$call\n"; - } else { - $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; - } - $text .= $body; - - if ($do_errno) { - $text .= "\tif e1 != 0 {\n"; - $text .= "\t\terr = e1\n"; - $text .= "\t}\n"; - } - $text .= "\treturn\n"; - $text .= "}\n"; -} - -if($errors) { - exit 1; -} - -print < "net.inet", - "net.inet.ipproto" => "net.inet", - "net.inet6.ipv6proto" => "net.inet6", - "net.inet6.ipv6" => "net.inet6.ip6", - "net.inet.icmpv6" => "net.inet6.icmp6", - "net.inet6.divert6" => "net.inet6.divert", - "net.inet6.tcp6" => "net.inet.tcp", - "net.inet6.udp6" => "net.inet.udp", - "mpls" => "net.mpls", - "swpenc" => "vm.swapencrypt" -); - -# Node mappings -my %node_map = ( - "net.inet.ip.ifq" => "net.ifq", - "net.inet.pfsync" => "net.pfsync", - "net.mpls.ifq" => "net.ifq" -); - -my $ctlname; -my %mib = (); -my %sysctl = (); -my $node; - -sub debug() { - print STDERR "$_[0]\n" if $debug; -} - -# Walk the MIB and build a sysctl name to OID mapping. -sub build_sysctl() { - my ($node, $name, $oid) = @_; - my %node = %{$node}; - my @oid = @{$oid}; - - foreach my $key (sort keys %node) { - my @node = @{$node{$key}}; - my $nodename = $name.($name ne '' ? '.' : '').$key; - my @nodeoid = (@oid, $node[0]); - if ($node[1] eq 'CTLTYPE_NODE') { - if (exists $node_map{$nodename}) { - $node = \%mib; - $ctlname = $node_map{$nodename}; - foreach my $part (split /\./, $ctlname) { - $node = \%{@{$$node{$part}}[2]}; - } - } else { - $node = $node[2]; - } - &build_sysctl($node, $nodename, \@nodeoid); - } elsif ($node[1] ne '') { - $sysctl{$nodename} = \@nodeoid; - } - } -} - -foreach my $ctl (@ctls) { - $ctls{$ctl} = $ctl; -} - -# Build MIB -foreach my $header (@headers) { - &debug("Processing $header..."); - open HEADER, "/usr/include/$header" || - print STDERR "Failed to open $header\n"; - while (
) { - if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || - $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || - $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { - if ($1 eq 'CTL_NAMES') { - # Top level. - $node = \%mib; - } else { - # Node. - my $nodename = lc($2); - if ($header =~ /^netinet\//) { - $ctlname = "net.inet.$nodename"; - } elsif ($header =~ /^netinet6\//) { - $ctlname = "net.inet6.$nodename"; - } elsif ($header =~ /^net\//) { - $ctlname = "net.$nodename"; - } else { - $ctlname = "$nodename"; - $ctlname =~ s/^(fs|net|kern)_/$1\./; - } - if (exists $ctl_map{$ctlname}) { - $ctlname = $ctl_map{$ctlname}; - } - if (not exists $ctls{$ctlname}) { - &debug("Ignoring $ctlname..."); - next; - } - - # Walk down from the top of the MIB. - $node = \%mib; - foreach my $part (split /\./, $ctlname) { - if (not exists $$node{$part}) { - &debug("Missing node $part"); - $$node{$part} = [ 0, '', {} ]; - } - $node = \%{@{$$node{$part}}[2]}; - } - } - - # Populate current node with entries. - my $i = -1; - while (defined($_) && $_ !~ /^}/) { - $_ =
; - $i++ if $_ =~ /{.*}/; - next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; - $$node{$1} = [ $i, $2, {} ]; - } - } - } - close HEADER; -} - -&build_sysctl(\%mib, "", []); - -print <){ - if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ - my $name = $1; - my $num = $2; - $name =~ y/a-z/A-Z/; - print " SYS_$name = $num;" - } -} - -print <){ - if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ - my $num = $1; - my $proto = $2; - my $name = "SYS_$3"; - $name =~ y/a-z/A-Z/; - - # There are multiple entries for enosys and nosys, so comment them out. - if($name =~ /^SYS_E?NOSYS$/){ - $name = "// $name"; - } - if($name eq 'SYS_SYS_EXIT'){ - $name = 'SYS_EXIT'; - } - - print " $name = $num; // $proto\n"; - } -} - -print <){ - if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){ - my $num = $1; - my $proto = $2; - my $name = "SYS_$3"; - $name =~ y/a-z/A-Z/; - - # There are multiple entries for enosys and nosys, so comment them out. - if($name =~ /^SYS_E?NOSYS$/){ - $name = "// $name"; - } - if($name eq 'SYS_SYS_EXIT'){ - $name = 'SYS_EXIT'; - } - - print " $name = $num; // $proto\n"; - } -} - -print <){ - if($line =~ /^(.*)\\$/) { - # Handle continuation - $line = $1; - $_ =~ s/^\s+//; - $line .= $_; - } else { - # New line - $line = $_; - } - next if $line =~ /\\$/; - if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { - my $num = $1; - my $proto = $6; - my $compat = $8; - my $name = "$7_$9"; - - $name = "$7_$11" if $11 ne ''; - $name =~ y/a-z/A-Z/; - - if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { - print " $name = $num; // $proto\n"; - } - } -} - -print <){ - if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ - my $num = $1; - my $proto = $3; - my $name = $4; - $name =~ y/a-z/A-Z/; - - # There are multiple entries for enosys and nosys, so comment them out. - if($name =~ /^SYS_E?NOSYS$/){ - $name = "// $name"; - } - if($name eq 'SYS_SYS_EXIT'){ - $name = 'SYS_EXIT'; - } - - print " $name = $num; // $proto\n"; - } -} - -print < 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. - - updateCore := *doCore - if gen.UnicodeVersion() != unicode.Version { - fmt.Printf("Requested Unicode version %s; core unicode version is %s.\n", - gen.UnicodeVersion(), - unicode.Version) - c := collate.New(language.Und, collate.Numeric) - if c.CompareString(gen.UnicodeVersion(), unicode.Version) < 0 && !*force { - os.Exit(2) - } - updateCore = true - goroot := os.Getenv("GOROOT") - appendToFile( - filepath.Join(goroot, "api", "except.txt"), - fmt.Sprintf("pkg unicode, const Version = %q\n", unicode.Version), - ) - const lines = `pkg unicode, const Version = %q -// TODO: add a new line of the following form for each new script and property. -pkg unicode, var *RangeTable -` - appendToFile( - filepath.Join(goroot, "api", "next.txt"), - fmt.Sprintf(lines, gen.UnicodeVersion()), - ) - } - - var unicode = &dependency{} - if updateCore { - fmt.Printf("Updating core to version %s...\n", gen.UnicodeVersion()) - unicode = generate("unicode") - - // Test some users of the unicode packages, especially the ones that - // keep a mirrored table. These may need to be corrected by hand. - generate("regexp", unicode) - generate("strconv", unicode) // mimics Unicode table - generate("strings", unicode) - generate("testing", unicode) // mimics Unicode table - } - - var ( - cldr = generate("./unicode/cldr", unicode) - language = generate("./language", cldr) - internal = generate("./internal", unicode, language) - norm = generate("./unicode/norm", unicode) - rangetable = generate("./unicode/rangetable", unicode) - cases = generate("./cases", unicode, norm, language, rangetable) - width = generate("./width", unicode) - bidi = generate("./unicode/bidi", unicode, norm, rangetable) - mib = generate("./encoding/internal/identifier", unicode) - number = generate("./internal/number", unicode, cldr, language, internal) - _ = generate("./encoding/htmlindex", unicode, language, mib) - _ = generate("./encoding/ianaindex", unicode, language, mib) - _ = generate("./secure/precis", unicode, norm, rangetable, cases, width, bidi) - _ = generate("./internal/cldrtree", language) - _ = generate("./currency", unicode, cldr, language, internal, number) - _ = generate("./feature/plural", unicode, cldr, language, internal, number) - _ = generate("./internal/export/idna", unicode, bidi, norm) - _ = generate("./language/display", unicode, cldr, language, internal, number) - _ = generate("./collate", unicode, norm, cldr, language, rangetable) - _ = generate("./search", unicode, norm, cldr, language, rangetable) - ) - all.Wait() - - // Copy exported packages to the destination golang.org repo. - copyExported("golang.org/x/net/idna") - - if updateCore { - copyVendored() - } - - if hasErrors { - fmt.Println("FAIL") - os.Exit(1) - } - vprintf("SUCCESS\n") -} - -func appendToFile(file, text string) { - fmt.Println("Augmenting", file) - w, err := os.OpenFile(file, os.O_APPEND|os.O_WRONLY, 0600) - if err != nil { - fmt.Println("Failed to open file:", err) - os.Exit(1) - } - defer w.Close() - if _, err := w.WriteString(text); err != nil { - fmt.Println("Failed to write to file:", err) - os.Exit(1) - } -} - -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 -} - -// copyExported copies a package in x/text/internal/export to the -// destination repository. -func copyExported(p string) { - copyPackage( - filepath.Join("internal", "export", path.Base(p)), - filepath.Join("..", filepath.FromSlash(p[len("golang.org/x"):])), - "golang.org/x/text/internal/export/"+path.Base(p), - p) -} - -// copyVendored copies packages used by Go core into the vendored directory. -func copyVendored() { - root := filepath.Join(build.Default.GOROOT, filepath.FromSlash("src/vendor/golang_org/x")) - - err := filepath.Walk(root, func(dir string, info os.FileInfo, err error) error { - if err != nil || !info.IsDir() || root == dir { - return err - } - src := dir[len(root)+1:] - const slash = string(filepath.Separator) - if c := strings.Split(src, slash); c[0] == "text" { - // Copy a text repo package from its normal location. - src = strings.Join(c[1:], slash) - } else { - // Copy the vendored package if it exists in the export directory. - src = filepath.Join("internal", "export", filepath.Base(src)) - } - copyPackage(src, dir, "golang.org", "golang_org") - return nil - }) - if err != nil { - fmt.Printf("Seeding directory %s has failed %v:", root, err) - os.Exit(1) - } -} - -// goGenRE is used to remove go:generate lines. -var goGenRE = regexp.MustCompile("//go:generate[^\n]*\n") - -// copyPackage copies relevant files from a directory in x/text to the -// destination package directory. The destination package is assumed to have -// the same name. For each copied file go:generate lines are removed and -// and package comments are rewritten to the new path. -func copyPackage(dirSrc, dirDst, search, replace string) { - err := filepath.Walk(dirSrc, func(file string, info os.FileInfo, err error) error { - base := filepath.Base(file) - if err != nil || info.IsDir() || - !strings.HasSuffix(base, ".go") || - strings.HasSuffix(base, "_test.go") || - // Don't process subdirectories. - filepath.Dir(file) != dirSrc { - return nil - } - b, err := ioutil.ReadFile(file) - if err != nil || bytes.Contains(b, []byte("\n// +build ignore")) { - return err - } - // Fix paths. - b = bytes.Replace(b, []byte(search), []byte(replace), -1) - // Remove go:generate lines. - b = goGenRE.ReplaceAllLiteral(b, nil) - comment := "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n" - if *doCore { - comment = "// Code generated by running \"go run gen.go -core\" in golang.org/x/text. DO NOT EDIT.\n\n" - } - if !bytes.HasPrefix(b, []byte(comment)) { - b = append([]byte(comment), b...) - } - if b, err = format.Source(b); err != nil { - fmt.Println("Failed to format file:", err) - os.Exit(1) - } - file = filepath.Join(dirDst, base) - vprintf("=== COPY %s\n", file) - return ioutil.WriteFile(file, b, 0666) - }) - if err != nil { - fmt.Println("Copying exported files failed:", err) - os.Exit(1) - } -} - -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/gen.go b/vendor/golang.org/x/text/internal/gen.go deleted file mode 100644 index 1d678af5740..00000000000 --- a/vendor/golang.org/x/text/internal/gen.go +++ /dev/null @@ -1,52 +0,0 @@ -// 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/internal.go b/vendor/golang.org/x/text/internal/internal.go deleted file mode 100644 index eac832850da..00000000000 --- a/vendor/golang.org/x/text/internal/internal.go +++ /dev/null @@ -1,51 +0,0 @@ -// 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/match.go b/vendor/golang.org/x/text/internal/match.go deleted file mode 100644 index a67fcaca13f..00000000000 --- a/vendor/golang.org/x/text/internal/match.go +++ /dev/null @@ -1,67 +0,0 @@ -// 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) *InheritanceMatcher { - tags := &InheritanceMatcher{make(map[language.Tag]int)} - for i, tag := range t { - ct, err := language.All.Canonicalize(tag) - if err != nil { - ct = tag - } - tags.index[ct] = i - } - return tags -} - -type InheritanceMatcher struct { - index 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.index[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/tables.go b/vendor/golang.org/x/text/internal/tables.go deleted file mode 100644 index 85991d3d214..00000000000 --- a/vendor/golang.org/x/text/internal/tables.go +++ /dev/null @@ -1,118 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. 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{ // 768 elements - // Entry 0 - 3F - 0x0000, 0x0053, 0x00e8, 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, 0x0000, 0x002a, 0x0000, 0x002c, 0x0000, 0x002e, - 0x0000, 0x0000, 0x0031, 0x0030, 0x0030, 0x0000, 0x0035, 0x0000, - 0x0037, 0x0000, 0x0039, 0x0000, 0x003b, 0x0000, 0x003d, 0x0000, - // Entry 40 - 7F - 0x0000, 0x0040, 0x0000, 0x0042, 0x0042, 0x0000, 0x0045, 0x0045, - 0x0000, 0x0048, 0x0000, 0x004a, 0x0000, 0x0000, 0x004d, 0x004c, - 0x004c, 0x0000, 0x0051, 0x0051, 0x0051, 0x0051, 0x0000, 0x0056, - 0x0056, 0x0000, 0x0059, 0x0000, 0x005b, 0x0000, 0x005d, 0x0000, - 0x005f, 0x005f, 0x0000, 0x0062, 0x0000, 0x0064, 0x0000, 0x0066, - 0x0000, 0x0068, 0x0068, 0x0000, 0x006b, 0x0000, 0x006d, 0x006d, - 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x0000, 0x0075, 0x0000, - 0x0077, 0x0000, 0x0079, 0x0000, 0x0000, 0x007c, 0x0000, 0x007e, - // Entry 80 - BF - 0x0000, 0x0080, 0x0000, 0x0082, 0x0082, 0x0000, 0x0085, 0x0085, - 0x0000, 0x0088, 0x0089, 0x0089, 0x0089, 0x0088, 0x008a, 0x0089, - 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089, 0x008a, 0x0089, - 0x008a, 0x0089, 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0088, - // Entry C0 - FF - 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, - 0x008a, 0x0089, 0x0089, 0x008a, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, 0x0088, - 0x0088, 0x0089, 0x0089, 0x0088, 0x0089, 0x0089, 0x0089, 0x0089, - 0x0089, 0x0000, 0x00f1, 0x0000, 0x00f3, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f3, 0x00f4, - // Entry 100 - 13F - 0x00f3, 0x00f3, 0x00f4, 0x00f4, 0x00f3, 0x00f4, 0x00f4, 0x00f4, - 0x00f4, 0x00f3, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, - 0x0000, 0x0110, 0x0000, 0x0112, 0x0000, 0x0114, 0x0000, 0x0116, - 0x0116, 0x0000, 0x0119, 0x0119, 0x0119, 0x0119, 0x0000, 0x011e, - 0x0000, 0x0120, 0x0000, 0x0122, 0x0122, 0x0000, 0x0125, 0x0125, - 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, - 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, - 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, - // Entry 140 - 17F - 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, - 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, - 0x0125, 0x0125, 0x0125, 0x0125, 0x0000, 0x0154, 0x0000, 0x0156, - 0x0000, 0x0158, 0x0000, 0x015a, 0x0000, 0x015c, 0x0000, 0x015e, - 0x015e, 0x015e, 0x0000, 0x0162, 0x0000, 0x0000, 0x0165, 0x0000, - 0x0167, 0x0000, 0x0169, 0x0169, 0x0169, 0x0000, 0x016d, 0x0000, - 0x016f, 0x0000, 0x0171, 0x0000, 0x0173, 0x0173, 0x0000, 0x0176, - 0x0000, 0x0178, 0x0000, 0x017a, 0x0000, 0x017c, 0x0000, 0x017e, - // Entry 180 - 1BF - 0x0000, 0x0180, 0x0000, 0x0000, 0x0183, 0x0000, 0x0185, 0x0185, - 0x0185, 0x0185, 0x0000, 0x0000, 0x018b, 0x0000, 0x0000, 0x018e, - 0x0000, 0x0190, 0x0000, 0x0000, 0x0193, 0x0000, 0x0195, 0x0000, - 0x0000, 0x0198, 0x0000, 0x0000, 0x019b, 0x0000, 0x019d, 0x0000, - 0x019f, 0x0000, 0x01a1, 0x0000, 0x01a3, 0x0000, 0x01a5, 0x0000, - 0x01a7, 0x0000, 0x01a9, 0x0000, 0x01ab, 0x0000, 0x01ad, 0x0000, - 0x01af, 0x01af, 0x0000, 0x01b2, 0x0000, 0x01b4, 0x0000, 0x01b6, - 0x0000, 0x01b8, 0x0000, 0x01ba, 0x0000, 0x0000, 0x01bd, 0x0000, - // Entry 1C0 - 1FF - 0x01bf, 0x0000, 0x01c1, 0x0000, 0x01c3, 0x0000, 0x01c5, 0x0000, - 0x01c7, 0x0000, 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x0000, 0x01ce, - 0x0000, 0x01d0, 0x01d0, 0x0000, 0x01d3, 0x0000, 0x01d5, 0x0000, - 0x01d7, 0x0000, 0x01d9, 0x0000, 0x01db, 0x0000, 0x01dd, 0x01dd, - 0x0000, 0x01e0, 0x0000, 0x01e2, 0x0000, 0x01e4, 0x0000, 0x01e6, - 0x0000, 0x01e8, 0x0000, 0x01ea, 0x0000, 0x01ec, 0x0000, 0x01ee, - 0x0000, 0x01f0, 0x0000, 0x01f2, 0x01f2, 0x01f2, 0x0000, 0x01f6, - 0x0000, 0x01f8, 0x0000, 0x01fa, 0x0000, 0x01fc, 0x0000, 0x0000, - // Entry 200 - 23F - 0x01ff, 0x0000, 0x0201, 0x0201, 0x0000, 0x0204, 0x0000, 0x0206, - 0x0206, 0x0000, 0x0209, 0x0209, 0x0000, 0x020c, 0x020c, 0x020c, - 0x020c, 0x020c, 0x020c, 0x020c, 0x0000, 0x0214, 0x0000, 0x0216, - 0x0000, 0x0218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x021e, - 0x0000, 0x0000, 0x0221, 0x0000, 0x0223, 0x0223, 0x0000, 0x0226, - 0x0000, 0x0228, 0x0228, 0x0000, 0x0000, 0x022c, 0x022b, 0x022b, - 0x0000, 0x0000, 0x0231, 0x0000, 0x0233, 0x0000, 0x0235, 0x0000, - 0x0241, 0x0237, 0x0241, 0x0241, 0x0241, 0x0241, 0x0241, 0x0241, - // Entry 240 - 27F - 0x0241, 0x0237, 0x0241, 0x0241, 0x0000, 0x0244, 0x0244, 0x0244, - 0x0000, 0x0248, 0x0000, 0x024a, 0x0000, 0x024c, 0x024c, 0x0000, - 0x024f, 0x0000, 0x0251, 0x0251, 0x0251, 0x0251, 0x0251, 0x0251, - 0x0000, 0x0258, 0x0000, 0x025a, 0x0000, 0x025c, 0x0000, 0x025e, - 0x0000, 0x0260, 0x0000, 0x0262, 0x0000, 0x0000, 0x0265, 0x0265, - 0x0265, 0x0000, 0x0269, 0x0000, 0x026b, 0x0000, 0x026d, 0x0000, - 0x0000, 0x0270, 0x026f, 0x026f, 0x0000, 0x0274, 0x0000, 0x0276, - 0x0000, 0x0278, 0x0000, 0x0000, 0x0000, 0x0000, 0x027d, 0x0000, - // Entry 280 - 2BF - 0x0000, 0x0280, 0x0000, 0x0282, 0x0282, 0x0282, 0x0282, 0x0000, - 0x0287, 0x0287, 0x0287, 0x0000, 0x028b, 0x028b, 0x028b, 0x028b, - 0x028b, 0x0000, 0x0291, 0x0291, 0x0291, 0x0291, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0299, 0x0299, 0x0299, 0x0000, 0x029d, 0x029d, - 0x029d, 0x029d, 0x0000, 0x0000, 0x02a3, 0x02a3, 0x02a3, 0x02a3, - 0x0000, 0x02a8, 0x0000, 0x02aa, 0x02aa, 0x0000, 0x02ad, 0x0000, - 0x02af, 0x0000, 0x02b1, 0x02b1, 0x0000, 0x0000, 0x02b5, 0x0000, - 0x0000, 0x02b8, 0x0000, 0x02ba, 0x02ba, 0x0000, 0x0000, 0x02be, - // Entry 2C0 - 2FF - 0x0000, 0x02c0, 0x0000, 0x02c2, 0x0000, 0x02c4, 0x0000, 0x02c6, - 0x0000, 0x02c8, 0x02c8, 0x0000, 0x0000, 0x02cc, 0x0000, 0x02ce, - 0x02cb, 0x02cb, 0x0000, 0x0000, 0x02d3, 0x02d2, 0x02d2, 0x0000, - 0x0000, 0x02d8, 0x0000, 0x02da, 0x0000, 0x02dc, 0x0000, 0x0000, - 0x02df, 0x0000, 0x02e1, 0x0000, 0x0000, 0x02e4, 0x0000, 0x02e6, - 0x0000, 0x02e8, 0x0000, 0x02ea, 0x02ea, 0x0000, 0x0000, 0x02ee, - 0x02ed, 0x02ed, 0x0000, 0x02f2, 0x0000, 0x02f4, 0x02f4, 0x02f4, - 0x02f4, 0x02f4, 0x0000, 0x02fa, 0x02fb, 0x02fa, 0x0000, 0x02fe, -} // Size: 1560 bytes - -// Total table size 1560 bytes (1KiB); checksum: 4897681C diff --git a/vendor/golang.org/x/text/language/Makefile b/vendor/golang.org/x/text/language/Makefile deleted file mode 100644 index 79f005784fc..00000000000 --- a/vendor/golang.org/x/text/language/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright 2013 The Go 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/secure/doc.go b/vendor/golang.org/x/text/secure/doc.go deleted file mode 100644 index e531c354354..00000000000 --- a/vendor/golang.org/x/text/secure/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// 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/unicode/doc.go b/vendor/golang.org/x/text/unicode/doc.go deleted file mode 100644 index e8f1032d051..00000000000 --- a/vendor/golang.org/x/text/unicode/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// 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/google.golang.org/genproto/CONTRIBUTING.md b/vendor/google.golang.org/genproto/CONTRIBUTING.md deleted file mode 100644 index 2827b7d3fa2..00000000000 --- a/vendor/google.golang.org/genproto/CONTRIBUTING.md +++ /dev/null @@ -1,27 +0,0 @@ -Want to contribute? Great! First, read this page (including the small print at the end). - -### Before you contribute -Before we can use your code, you must sign the -[Google Individual Contributor License Agreement] -(https://cla.developers.google.com/about/google-individual) -(CLA), which you can do online. The CLA is necessary mainly because you own the -copyright to your changes, even after your contribution becomes part of our -codebase, so we need your permission to use and distribute your code. We also -need to be sure of various other things—for instance that you'll tell us if you -know that your code infringes on other people's patents. You don't have to sign -the CLA until after you've submitted your code for review and a member has -approved it, but you must do it before we can put your code into our codebase. -Before you start working on a larger contribution, you should get in touch with -us first through the issue tracker with your idea so that we can help out and -possibly guide you. Coordinating up front makes it much easier to avoid -frustration later on. - -### Code reviews -All submissions, including submissions by project members, require review. We -use Github pull requests for this purpose. - -### The small print -Contributions made by corporations are covered by a different agreement than -the one above, the -[Software Grant and Corporate Contributor License Agreement] -(https://cla.developers.google.com/about/google-corporate). diff --git a/vendor/google.golang.org/genproto/README.md b/vendor/google.golang.org/genproto/README.md deleted file mode 100644 index 51d0bae5f71..00000000000 --- a/vendor/google.golang.org/genproto/README.md +++ /dev/null @@ -1,28 +0,0 @@ -Go generated proto packages -=========================== - -[![Build Status](https://travis-ci.org/google/go-genproto.svg?branch=master)](https://travis-ci.org/google/go-genproto) -[![GoDoc](https://godoc.org/google.golang.org/genproto?status.svg)](https://godoc.org/google.golang.org/genproto) - -> **IMPORTANT** This repository is currently experimental. The structure -> of the contained packages is subject to change. Please see the original -> source repositories (listed below) to find out the status of the each -> protocol buffer's associated service. - -This repository contains the generated Go packages for common protocol buffer -types, and the generated [gRPC][1] code necessary for interacting with Google's gRPC -APIs. - -There are two sources for the proto files used in this repository: - -1. [google/protobuf][2]: the code in the `protobuf` and `ptypes` subdirectories - is derived from this repo. The messages in `protobuf` are used to describe - protocol buffer messages themselves. The messages under `ptypes` define the - common well-known types. -2. [googleapis/googleapis][3]: the code in the `googleapis` is derived from this - repo. The packages here contain types specifically for interacting with Google - APIs. - -[1]: http://grpc.io -[2]: https://github.com/google/protobuf/ -[3]: https://github.com/googleapis/googleapis/ diff --git a/vendor/google.golang.org/genproto/regen.go b/vendor/google.golang.org/genproto/regen.go deleted file mode 100644 index 9c906f2095b..00000000000 --- a/vendor/google.golang.org/genproto/regen.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2016 Google Inc. -// -// 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. - -// +build ignore - -// Regen.go regenerates the genproto repository. -// -// Regen.go recursively walks through each directory named by given arguments, -// looking for all .proto files. (Symlinks are not followed.) -// If the pkg_prefix flag is not an empty string, -// any proto file without `go_package` option -// or whose option does not begin with the prefix is ignored. -// Protoc is executed on remaining files, -// one invocation per set of files declaring the same Go package. -package main - -import ( - "flag" - "fmt" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "regexp" - "strconv" - "strings" -) - -var goPkgOptRe = regexp.MustCompile(`(?m)^option go_package = (.*);`) - -func usage() { - fmt.Fprintln(os.Stderr, `usage: go run regen.go -go_out=path/to/output [-pkg_prefix=pkg/prefix] roots... - -Most users will not need to run this file directly. -To regenerate this repository, run regen.sh instead.`) - flag.PrintDefaults() -} - -func main() { - goOutDir := flag.String("go_out", "", "go_out argument to pass to protoc-gen-go") - pkgPrefix := flag.String("pkg_prefix", "", "only include proto files with go_package starting with this prefix") - flag.Usage = usage - flag.Parse() - - if *goOutDir == "" { - log.Fatal("need go_out flag") - } - - pkgFiles := make(map[string][]string) - walkFn := func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.Mode().IsRegular() || !strings.HasSuffix(path, ".proto") { - return nil - } - pkg, err := goPkg(path) - if err != nil { - return err - } - pkgFiles[pkg] = append(pkgFiles[pkg], path) - return nil - } - for _, root := range flag.Args() { - if err := filepath.Walk(root, walkFn); err != nil { - log.Fatal(err) - } - } - for pkg, fnames := range pkgFiles { - if !strings.HasPrefix(pkg, *pkgPrefix) { - continue - } - if out, err := protoc(*goOutDir, flag.Args(), fnames); err != nil { - log.Fatalf("error executing protoc: %s\n%s", err, out) - } - } -} - -// goPkg reports the import path declared in the given file's -// `go_package` option. If the option is missing, goPkg returns empty string. -func goPkg(fname string) (string, error) { - content, err := ioutil.ReadFile(fname) - if err != nil { - return "", err - } - - var pkgName string - if match := goPkgOptRe.FindSubmatch(content); len(match) > 0 { - pn, err := strconv.Unquote(string(match[1])) - if err != nil { - return "", err - } - pkgName = pn - } - if p := strings.IndexRune(pkgName, ';'); p > 0 { - pkgName = pkgName[:p] - } - return pkgName, nil -} - -// protoc executes the "protoc" command on files named in fnames, -// passing go_out and include flags specified in goOut and includes respectively. -// protoc returns combined output from stdout and stderr. -func protoc(goOut string, includes, fnames []string) ([]byte, error) { - args := []string{"--go_out=plugins=grpc:" + goOut} - for _, inc := range includes { - args = append(args, "-I", inc) - } - args = append(args, fnames...) - return exec.Command("protoc", args...).CombinedOutput() -} diff --git a/vendor/google.golang.org/genproto/regen.sh b/vendor/google.golang.org/genproto/regen.sh deleted file mode 100755 index 8d9c73197de..00000000000 --- a/vendor/google.golang.org/genproto/regen.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 Google Inc. -# -# 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. - -# This script rebuilds the generated code for the protocol buffers. -# To run this you will need protoc and goprotobuf installed; -# see https://github.com/golang/protobuf for instructions. -# You also need Go and Git installed. - -set -e - -PKG=google.golang.org/genproto -PROTO_REPO=https://github.com/google/protobuf -PROTO_SUBDIR=src/google/protobuf -API_REPO=https://github.com/googleapis/googleapis - -function die() { - echo 1>&2 $* - exit 1 -} - -# Sanity check that the right tools are accessible. -for tool in go git protoc protoc-gen-go; do - q=$(which $tool) || die "didn't find $tool" - echo 1>&2 "$tool: $q" -done - -root=$(go list -f '{{.Root}}' $PKG/... | head -n1) -if [ -z "$root" ]; then - die "cannot find root of $PKG" -fi - -remove_dirs= -trap 'rm -rf $remove_dirs' EXIT - -if [ -z "$PROTOBUF" ]; then - proto_repo_dir=$(mktemp -d -t regen-cds-proto.XXXXXX) - git clone -q $PROTO_REPO $proto_repo_dir & - remove_dirs="$proto_repo_dir" - # The protoc include directory is actually the "src" directory of the repo. - protodir="$proto_repo_dir/src" -else - protodir="$PROTOBUF/src" -fi - -if [ -z "$GOOGLEAPIS" ]; then - apidir=$(mktemp -d -t regen-cds-api.XXXXXX) - git clone -q $API_REPO $apidir & - remove_dirs="$remove_dirs $apidir" -else - apidir="$GOOGLEAPIS" -fi - -wait - -# Nuke everything, we'll generate them back -rm -r googleapis/ protobuf/ - -go run regen.go -go_out "$root/src" -pkg_prefix "$PKG" "$apidir" "$protodir" - -# Sanity check the build. -echo 1>&2 "Checking that the libraries build..." -go build -v ./... - -echo 1>&2 "All done!" diff --git a/vendor/google.golang.org/grpc/.please-update b/vendor/google.golang.org/grpc/.please-update deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor/google.golang.org/grpc/CONTRIBUTING.md b/vendor/google.golang.org/grpc/CONTRIBUTING.md deleted file mode 100644 index 8ec6c95747b..00000000000 --- a/vendor/google.golang.org/grpc/CONTRIBUTING.md +++ /dev/null @@ -1,32 +0,0 @@ -# How to contribute - -We definitely welcome your patches and contributions to gRPC! - -If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) - -## Legal requirements - -In order to protect both you and ourselves, you will need to sign the -[Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf). - -## Guidelines for Pull Requests -How to get your contributions merged smoothly and quickly. - -- Create **small PRs** that are narrowly focused on **addressing a single concern**. We often times receive PRs that are trying to fix several things at a time, but only one fix is considered acceptable, nothing gets merged and both author's & review's time is wasted. Create more PRs to address different concerns and everyone will be happy. - -- For speculative changes, consider opening an issue and discussing it first. If you are suggesting a behavioral or API change, consider starting with a [gRFC proposal](https://github.com/grpc/proposal). - -- Provide a good **PR description** as a record of **what** change is being made and **why** it was made. Link to a github issue if it exists. - -- Don't fix code style and formatting unless you are already changing that line to address an issue. PRs with irrelevant changes won't be merged. If you do want to fix formatting or style, do that in a separate PR. - -- Unless your PR is trivial, you should expect there will be reviewer comments that you'll need to address before merging. We expect you to be reasonably responsive to those comments, otherwise the PR will be closed after 2-3 weeks of inactivity. - -- Maintain **clean commit history** and use **meaningful commit messages**. PRs with messy commit history are difficult to review and won't be merged. Use `rebase -i upstream/master` to curate your commit history and/or to bring in latest changes from master (but avoid rebasing in the middle of a code review). - -- Keep your PR up to date with upstream/master (if there are merge conflicts, we can't really merge your change). - -- **All tests need to be passing** before your change can be merged. We recommend you **run tests locally** before creating your PR to catch breakages early on. - -- Exceptions to the rules can be made if there's a compelling reason for doing so. - diff --git a/vendor/google.golang.org/grpc/Makefile b/vendor/google.golang.org/grpc/Makefile deleted file mode 100644 index c44534376af..00000000000 --- a/vendor/google.golang.org/grpc/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -all: test testrace - -deps: - go get -d -v google.golang.org/grpc/... - -updatedeps: - go get -d -v -u -f google.golang.org/grpc/... - -testdeps: - go get -d -v -t google.golang.org/grpc/... - -updatetestdeps: - go get -d -v -t -u -f google.golang.org/grpc/... - -build: deps - go build google.golang.org/grpc/... - -proto: - @ if ! which protoc > /dev/null; then \ - echo "error: protoc not installed" >&2; \ - exit 1; \ - fi - go generate google.golang.org/grpc/... - -test: testdeps - go test -cpu 1,4 -timeout 5m google.golang.org/grpc/... - -testrace: testdeps - go test -race -cpu 1,4 -timeout 7m google.golang.org/grpc/... - -clean: - go clean -i google.golang.org/grpc/... - -.PHONY: \ - all \ - deps \ - updatedeps \ - testdeps \ - updatetestdeps \ - build \ - proto \ - test \ - testrace \ - clean \ - coverage diff --git a/vendor/google.golang.org/grpc/README.md b/vendor/google.golang.org/grpc/README.md deleted file mode 100644 index 118327bb17a..00000000000 --- a/vendor/google.golang.org/grpc/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# gRPC-Go - -[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc) [![GoReportCard](https://goreportcard.com/badge/grpc/grpc-go)](https://goreportcard.com/report/github.com/grpc/grpc-go) - -The Go implementation of [gRPC](https://grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start: Go](https://grpc.io/docs/quickstart/go.html) guide. - -Installation ------------- - -To install this package, you need to install Go and setup your Go workspace on your computer. The simplest way to install the library is to run: - -``` -$ go get -u google.golang.org/grpc -``` - -Prerequisites -------------- - -This requires Go 1.6 or later. Go 1.7 will be required as of the next gRPC-Go -release (1.8). - -Constraints ------------ -The grpc package should only depend on standard Go packages and a small number of exceptions. If your contribution introduces new dependencies which are NOT in the [list](http://godoc.org/google.golang.org/grpc?imports), you need a discussion with gRPC-Go authors and consultants. - -Documentation -------------- -See [API documentation](https://godoc.org/google.golang.org/grpc) for package and API descriptions and find examples in the [examples directory](examples/). - -Performance ------------ -See the current benchmarks for some of the languages supported in [this dashboard](https://performance-dot-grpc-testing.appspot.com/explore?dashboard=5652536396611584&widget=490377658&container=1286539696). - -Status ------- -General Availability [Google Cloud Platform Launch Stages](https://cloud.google.com/terms/launch-stages). - -FAQ ---- - -#### Compiling error, undefined: grpc.SupportPackageIsVersion - -Please update proto package, gRPC package and rebuild the proto files: - - `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}` - - `go get -u google.golang.org/grpc` - - `protoc --go_out=plugins=grpc:. *.proto` diff --git a/vendor/google.golang.org/grpc/codegen.sh b/vendor/google.golang.org/grpc/codegen.sh deleted file mode 100755 index 4cdc6ba7c09..00000000000 --- a/vendor/google.golang.org/grpc/codegen.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# This script serves as an example to demonstrate how to generate the gRPC-Go -# interface and the related messages from .proto file. -# -# It assumes the installation of i) Google proto buffer compiler at -# https://github.com/google/protobuf (after v2.6.1) and ii) the Go codegen -# plugin at https://github.com/golang/protobuf (after 2015-02-20). If you have -# not, please install them first. -# -# We recommend running this script at $GOPATH/src. -# -# If this is not what you need, feel free to make your own scripts. Again, this -# script is for demonstration purpose. -# -proto=$1 -protoc --go_out=plugins=grpc:. $proto diff --git a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto b/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto deleted file mode 100644 index 42d99c109fe..00000000000 --- a/vendor/google.golang.org/grpc/grpclb/grpc_lb_v1/messages/messages.proto +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2016 gRPC authors. -// -// 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. - -syntax = "proto3"; - -package grpc.lb.v1; -option go_package = "google.golang.org/grpc/grpclb/grpc_lb_v1/messages"; - -message Duration { - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. - int64 seconds = 1; - - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - int32 nanos = 2; -} - -message Timestamp { - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - int64 seconds = 1; - - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - int32 nanos = 2; -} - -message LoadBalanceRequest { - oneof load_balance_request_type { - // This message should be sent on the first request to the load balancer. - InitialLoadBalanceRequest initial_request = 1; - - // The client stats should be periodically reported to the load balancer - // based on the duration defined in the InitialLoadBalanceResponse. - ClientStats client_stats = 2; - } -} - -message InitialLoadBalanceRequest { - // Name of load balanced service (IE, balancer.service.com) - // length should be less than 256 bytes. - string name = 1; -} - -// Contains client level statistics that are useful to load balancing. Each -// count except the timestamp should be reset to zero after reporting the stats. -message ClientStats { - // The timestamp of generating the report. - Timestamp timestamp = 1; - - // The total number of RPCs that started. - int64 num_calls_started = 2; - - // The total number of RPCs that finished. - int64 num_calls_finished = 3; - - // The total number of RPCs that were dropped by the client because of rate - // limiting. - int64 num_calls_finished_with_drop_for_rate_limiting = 4; - - // The total number of RPCs that were dropped by the client because of load - // balancing. - int64 num_calls_finished_with_drop_for_load_balancing = 5; - - // The total number of RPCs that failed to reach a server except dropped RPCs. - int64 num_calls_finished_with_client_failed_to_send = 6; - - // The total number of RPCs that finished and are known to have been received - // by a server. - int64 num_calls_finished_known_received = 7; -} - -message LoadBalanceResponse { - oneof load_balance_response_type { - // This message should be sent on the first response to the client. - InitialLoadBalanceResponse initial_response = 1; - - // Contains the list of servers selected by the load balancer. The client - // should send requests to these servers in the specified order. - ServerList server_list = 2; - } -} - -message InitialLoadBalanceResponse { - // This is an application layer redirect that indicates the client should use - // the specified server for load balancing. When this field is non-empty in - // the response, the client should open a separate connection to the - // load_balancer_delegate and call the BalanceLoad method. Its length should - // be less than 64 bytes. - string load_balancer_delegate = 1; - - // This interval defines how often the client should send the client stats - // to the load balancer. Stats should only be reported when the duration is - // positive. - Duration client_stats_report_interval = 2; -} - -message ServerList { - // Contains a list of servers selected by the load balancer. The list will - // be updated when server resolutions change or as needed to balance load - // across more servers. The client should consume the server list in order - // unless instructed otherwise via the client_config. - repeated Server servers = 1; - - // Was google.protobuf.Duration expiration_interval. - reserved 3; -} - -// Contains server information. When none of the [drop_for_*] fields are true, -// use the other fields. When drop_for_rate_limiting is true, ignore all other -// fields. Use drop_for_load_balancing only when it is true and -// drop_for_rate_limiting is false. -message Server { - // A resolved address for the server, serialized in network-byte-order. It may - // either be an IPv4 or IPv6 address. - bytes ip_address = 1; - - // A resolved port number for the server. - int32 port = 2; - - // An opaque but printable token given to the frontend for each pick. All - // frontend requests for that pick must include the token in its initial - // metadata. The token is used by the backend to verify the request and to - // allow the backend to report load to the gRPC LB system. - // - // Its length is variable but less than 50 bytes. - string load_balance_token = 3; - - // Indicates whether this particular request should be dropped by the client - // for rate limiting. - bool drop_for_rate_limiting = 4; - - // Indicates whether this particular request should be dropped by the client - // for load balancing. - bool drop_for_load_balancing = 5; -} diff --git a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.proto b/vendor/google.golang.org/grpc/health/grpc_health_v1/health.proto deleted file mode 100644 index 6072fdc3b80..00000000000 --- a/vendor/google.golang.org/grpc/health/grpc_health_v1/health.proto +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2017 gRPC authors. -// -// 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. - -syntax = "proto3"; - -package grpc.health.v1; - -message HealthCheckRequest { - string service = 1; -} - -message HealthCheckResponse { - enum ServingStatus { - UNKNOWN = 0; - SERVING = 1; - NOT_SERVING = 2; - } - ServingStatus status = 1; -} - -service Health{ - rpc Check(HealthCheckRequest) returns (HealthCheckResponse); -} diff --git a/vendor/google.golang.org/grpc/vet.sh b/vendor/google.golang.org/grpc/vet.sh deleted file mode 100755 index 2ad94fed9cc..00000000000 --- a/vendor/google.golang.org/grpc/vet.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -set -ex # Exit on error; debugging enabled. -set -o pipefail # Fail a pipe if any sub-command fails. - -die() { - echo "$@" >&2 - exit 1 -} - -PATH="$GOPATH/bin:$GOROOT/bin:$PATH" - -# Check proto in manual runs or cron runs. -if [[ "$TRAVIS" != "true" || "$TRAVIS_EVENT_TYPE" = "cron" ]]; then - check_proto="true" -fi - -if [ "$1" = "-install" ]; then - go get -d \ - google.golang.org/grpc/... - go get -u \ - github.com/golang/lint/golint \ - golang.org/x/tools/cmd/goimports \ - honnef.co/go/tools/cmd/staticcheck \ - github.com/client9/misspell/cmd/misspell \ - github.com/golang/protobuf/protoc-gen-go - if [[ "$check_proto" = "true" ]]; then - if [[ "$TRAVIS" = "true" ]]; then - PROTOBUF_VERSION=3.3.0 - PROTOC_FILENAME=protoc-${PROTOBUF_VERSION}-linux-x86_64.zip - pushd /home/travis - wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${PROTOC_FILENAME} - unzip ${PROTOC_FILENAME} - bin/protoc --version - popd - elif ! which protoc > /dev/null; then - die "Please install protoc into your path" - fi - fi - exit 0 -elif [[ "$#" -ne 0 ]]; then - die "Unknown argument(s): $*" -fi - -# TODO: Remove this check and the mangling below once "context" is imported -# directly. -if git status --porcelain | read; then - die "Uncommitted or untracked files found; commit changes first" -fi - -git ls-files "*.go" | xargs grep -L "\(Copyright [0-9]\{4,\} gRPC authors\)\|DO NOT EDIT" 2>&1 | tee /dev/stderr | (! read) -gofmt -s -d -l . 2>&1 | tee /dev/stderr | (! read) -goimports -l . 2>&1 | tee /dev/stderr | (! read) -golint ./... 2>&1 | (grep -vE "(_mock|\.pb)\.go:" || true) | tee /dev/stderr | (! read) - -# Undo any edits made by this script. -cleanup() { - git reset --hard HEAD -} -trap cleanup EXIT - -# Rewrite golang.org/x/net/context -> context imports (see grpc/grpc-go#1484). -# TODO: Remove this mangling once "context" is imported directly (grpc/grpc-go#711). -git ls-files "*.go" | xargs sed -i 's:"golang.org/x/net/context":"context":' -set +o pipefail -# TODO: Stop filtering pb.go files once golang/protobuf#214 is fixed. -go tool vet -all . 2>&1 | grep -vE '(clientconn|transport\/transport_test).go:.*cancel (function|var)' | grep -vF '.pb.go:' | tee /dev/stderr | (! read) -set -o pipefail -git reset --hard HEAD - -if [[ "$check_proto" = "true" ]]; then - PATH="/home/travis/bin:$PATH" make proto && \ - git status --porcelain 2>&1 | (! read) || \ - (git status; git --no-pager diff; exit 1) -fi - -# TODO(menghanl): fix errors in transport_test. -staticcheck -ignore ' -google.golang.org/grpc/transport/transport_test.go:SA2002 -google.golang.org/grpc/benchmark/benchmain/main.go:SA1019 -google.golang.org/grpc/stats/stats_test.go:SA1019 -google.golang.org/grpc/test/end2end_test.go:SA1019 -' ./... -misspell -error . diff --git a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/README.md b/vendor/gopkg.in/alexcesaro/quotedprintable.v3/README.md deleted file mode 100644 index 98ddf829f59..00000000000 --- a/vendor/gopkg.in/alexcesaro/quotedprintable.v3/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# quotedprintable - -## Introduction - -Package quotedprintable implements quoted-printable and message header encoding -as specified by RFC 2045 and RFC 2047. - -It is a copy of the Go 1.5 package `mime/quotedprintable`. It also includes -the new functions of package `mime` concerning RFC 2047. - -This code has minor changes with the standard library code in order to work -with Go 1.0 and newer. - -## Documentation - -https://godoc.org/gopkg.in/alexcesaro/quotedprintable.v3 diff --git a/vendor/gopkg.in/asn1-ber.v1/.travis.yml b/vendor/gopkg.in/asn1-ber.v1/.travis.yml deleted file mode 100644 index 53063d07598..00000000000 --- a/vendor/gopkg.in/asn1-ber.v1/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: go -go: - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - tip -go_import_path: gopkg.in/asn-ber.v1 -install: - - go list -f '{{range .Imports}}{{.}} {{end}}' ./... | xargs go get -v - - go list -f '{{range .TestImports}}{{.}} {{end}}' ./... | xargs go get -v - - go get code.google.com/p/go.tools/cmd/cover || go get golang.org/x/tools/cmd/cover - - go build -v ./... -script: - - go test -v -cover ./... diff --git a/vendor/gopkg.in/asn1-ber.v1/README.md b/vendor/gopkg.in/asn1-ber.v1/README.md deleted file mode 100644 index e3a9560d681..00000000000 --- a/vendor/gopkg.in/asn1-ber.v1/README.md +++ /dev/null @@ -1,24 +0,0 @@ -[![GoDoc](https://godoc.org/gopkg.in/asn1-ber.v1?status.svg)](https://godoc.org/gopkg.in/asn1-ber.v1) [![Build Status](https://travis-ci.org/go-asn1-ber/asn1-ber.svg)](https://travis-ci.org/go-asn1-ber/asn1-ber) - - -ASN1 BER Encoding / Decoding Library for the GO programming language. ---------------------------------------------------------------------- - -Required libraries: - None - -Working: - Very basic encoding / decoding needed for LDAP protocol - -Tests Implemented: - A few - -TODO: - Fix all encoding / decoding to conform to ASN1 BER spec - Implement Tests / Benchmarks - ---- - -The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) -The design is licensed under the Creative Commons 3.0 Attributions license. -Read this article for more details: http://blog.golang.org/gopher diff --git a/vendor/gopkg.in/asn1-ber.v1/ber_test.go b/vendor/gopkg.in/asn1-ber.v1/ber_test.go deleted file mode 100644 index bbd22db6d70..00000000000 --- a/vendor/gopkg.in/asn1-ber.v1/ber_test.go +++ /dev/null @@ -1,168 +0,0 @@ -package ber - -import ( - "bytes" - "math" - - "io" - "testing" -) - -func TestEncodeDecodeInteger(t *testing.T) { - for _, v := range []int64{0, 10, 128, 1024, math.MaxInt64, -1, -100, -128, -1024, math.MinInt64} { - enc := encodeInteger(v) - dec, err := parseInt64(enc) - if err != nil { - t.Fatalf("Error decoding %d : %s", v, err) - } - if v != dec { - t.Error("TestEncodeDecodeInteger failed for %d (got %d)", v, dec) - } - - } -} - -func TestBoolean(t *testing.T) { - var value bool = true - - packet := NewBoolean(ClassUniversal, TypePrimitive, TagBoolean, value, "first Packet, True") - - newBoolean, ok := packet.Value.(bool) - if !ok || newBoolean != value { - t.Error("error during creating packet") - } - - encodedPacket := packet.Bytes() - - newPacket := DecodePacket(encodedPacket) - - newBoolean, ok = newPacket.Value.(bool) - if !ok || newBoolean != value { - t.Error("error during decoding packet") - } - -} - -func TestInteger(t *testing.T) { - var value int64 = 10 - - packet := NewInteger(ClassUniversal, TypePrimitive, TagInteger, value, "Integer, 10") - - { - newInteger, ok := packet.Value.(int64) - if !ok || newInteger != value { - t.Error("error creating packet") - } - } - - encodedPacket := packet.Bytes() - - newPacket := DecodePacket(encodedPacket) - - { - newInteger, ok := newPacket.Value.(int64) - if !ok || int64(newInteger) != value { - t.Error("error decoding packet") - } - } -} - -func TestString(t *testing.T) { - var value string = "Hic sunt dracones" - - packet := NewString(ClassUniversal, TypePrimitive, TagOctetString, value, "String") - - newValue, ok := packet.Value.(string) - if !ok || newValue != value { - t.Error("error during creating packet") - } - - encodedPacket := packet.Bytes() - - newPacket := DecodePacket(encodedPacket) - - newValue, ok = newPacket.Value.(string) - if !ok || newValue != value { - t.Error("error during decoding packet") - } - -} - -func TestSequenceAndAppendChild(t *testing.T) { - - values := []string{ - "HIC SVNT LEONES", - "Iñtërnâtiônàlizætiøn", - "Terra Incognita", - } - - sequence := NewSequence("a sequence") - for _, s := range values { - sequence.AppendChild(NewString(ClassUniversal, TypePrimitive, TagOctetString, s, "String")) - } - - if len(sequence.Children) != len(values) { - t.Errorf("wrong length for children array should be %d, got %d", len(values), len(sequence.Children)) - } - - encodedSequence := sequence.Bytes() - - decodedSequence := DecodePacket(encodedSequence) - if len(decodedSequence.Children) != len(values) { - t.Errorf("wrong length for children array should be %d => %d", len(values), len(decodedSequence.Children)) - } - - for i, s := range values { - if decodedSequence.Children[i].Value.(string) != s { - t.Errorf("expected %d to be %q, got %q", i, s, decodedSequence.Children[i].Value.(string)) - } - } -} - -func TestReadPacket(t *testing.T) { - packet := NewString(ClassUniversal, TypePrimitive, TagOctetString, "Ad impossibilia nemo tenetur", "string") - var buffer io.ReadWriter - buffer = new(bytes.Buffer) - - buffer.Write(packet.Bytes()) - - newPacket, err := ReadPacket(buffer) - if err != nil { - t.Error("error during ReadPacket", err) - } - newPacket.ByteValue = nil - if !bytes.Equal(newPacket.ByteValue, packet.ByteValue) { - t.Error("packets should be the same") - } -} - -func TestBinaryInteger(t *testing.T) { - // data src : http://luca.ntop.org/Teaching/Appunti/asn1.html 5.7 - var data = []struct { - v int64 - e []byte - }{ - {v: 0, e: []byte{0x02, 0x01, 0x00}}, - {v: 127, e: []byte{0x02, 0x01, 0x7F}}, - {v: 128, e: []byte{0x02, 0x02, 0x00, 0x80}}, - {v: 256, e: []byte{0x02, 0x02, 0x01, 0x00}}, - {v: -128, e: []byte{0x02, 0x01, 0x80}}, - {v: -129, e: []byte{0x02, 0x02, 0xFF, 0x7F}}, - {v: math.MaxInt64, e: []byte{0x02, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}, - {v: math.MinInt64, e: []byte{0x02, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, - } - - for _, d := range data { - if b := NewInteger(ClassUniversal, TypePrimitive, TagInteger, int64(d.v), "").Bytes(); !bytes.Equal(d.e, b) { - t.Errorf("Wrong binary generated for %d : got % X, expected % X", d.v, b, d.e) - } - } -} - -func TestBinaryOctetString(t *testing.T) { - // data src : http://luca.ntop.org/Teaching/Appunti/asn1.html 5.10 - - if !bytes.Equal([]byte{0x04, 0x08, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, NewString(ClassUniversal, TypePrimitive, TagOctetString, "\x01\x23\x45\x67\x89\xab\xcd\xef", "").Bytes()) { - t.Error("wrong binary generated") - } -} diff --git a/vendor/gopkg.in/bufio.v1/.travis.yml b/vendor/gopkg.in/bufio.v1/.travis.yml deleted file mode 100644 index ccca6bb4a61..00000000000 --- a/vendor/gopkg.in/bufio.v1/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: go - -go: - - 1.0 - - 1.1 - - 1.2 - - tip - -install: - - go get launchpad.net/gocheck - - go get gopkg.in/bufio.v1 diff --git a/vendor/gopkg.in/bufio.v1/Makefile b/vendor/gopkg.in/bufio.v1/Makefile deleted file mode 100644 index 038ed47e941..00000000000 --- a/vendor/gopkg.in/bufio.v1/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - go test gopkg.in/bufio.v1 diff --git a/vendor/gopkg.in/bufio.v1/README.md b/vendor/gopkg.in/bufio.v1/README.md deleted file mode 100644 index bfb85ee544f..00000000000 --- a/vendor/gopkg.in/bufio.v1/README.md +++ /dev/null @@ -1,4 +0,0 @@ -bufio -===== - -This is a fork of the http://golang.org/pkg/bufio/ package. It adds `ReadN` method that allows reading next `n` bytes from the internal buffer without allocating intermediate buffer. This method works just like the [Buffer.Next](http://golang.org/pkg/bytes/#Buffer.Next) method, but has slightly different signature. diff --git a/vendor/gopkg.in/bufio.v1/buffer_test.go b/vendor/gopkg.in/bufio.v1/buffer_test.go deleted file mode 100644 index ca1ac210513..00000000000 --- a/vendor/gopkg.in/bufio.v1/buffer_test.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bufio - -import ( - "bytes" - "io" - "math/rand" - "runtime" - "testing" - "unicode/utf8" -) - -const N = 10000 // make this bigger for a larger (and slower) test -var data string // test data for write tests -var testBytes []byte // test data; same as data but as a slice. - -func init() { - testBytes = make([]byte, N) - for i := 0; i < N; i++ { - testBytes[i] = 'a' + byte(i%26) - } - data = string(testBytes) -} - -// Verify that contents of buf match the string s. -func check(t *testing.T, testname string, buf *Buffer, s string) { - bytes := buf.Bytes() - str := buf.String() - if buf.Len() != len(bytes) { - t.Errorf("%s: buf.Len() == %d, len(buf.Bytes()) == %d", testname, buf.Len(), len(bytes)) - } - - if buf.Len() != len(str) { - t.Errorf("%s: buf.Len() == %d, len(buf.String()) == %d", testname, buf.Len(), len(str)) - } - - if buf.Len() != len(s) { - t.Errorf("%s: buf.Len() == %d, len(s) == %d", testname, buf.Len(), len(s)) - } - - if string(bytes) != s { - t.Errorf("%s: string(buf.Bytes()) == %q, s == %q", testname, string(bytes), s) - } -} - -// Fill buf through n writes of string fus. -// The initial contents of buf corresponds to the string s; -// the result is the final contents of buf returned as a string. -func fillString(t *testing.T, testname string, buf *Buffer, s string, n int, fus string) string { - check(t, testname+" (fill 1)", buf, s) - for ; n > 0; n-- { - m, err := buf.WriteString(fus) - if m != len(fus) { - t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fus)) - } - if err != nil { - t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err) - } - s += fus - check(t, testname+" (fill 4)", buf, s) - } - return s -} - -// Fill buf through n writes of byte slice fub. -// The initial contents of buf corresponds to the string s; -// the result is the final contents of buf returned as a string. -func fillBytes(t *testing.T, testname string, buf *Buffer, s string, n int, fub []byte) string { - check(t, testname+" (fill 1)", buf, s) - for ; n > 0; n-- { - m, err := buf.Write(fub) - if m != len(fub) { - t.Errorf(testname+" (fill 2): m == %d, expected %d", m, len(fub)) - } - if err != nil { - t.Errorf(testname+" (fill 3): err should always be nil, found err == %s", err) - } - s += string(fub) - check(t, testname+" (fill 4)", buf, s) - } - return s -} - -func TestNewBuffer(t *testing.T) { - buf := NewBuffer(testBytes) - check(t, "NewBuffer", buf, data) -} - -func TestNewBufferString(t *testing.T) { - buf := NewBufferString(data) - check(t, "NewBufferString", buf, data) -} - -// Empty buf through repeated reads into fub. -// The initial contents of buf corresponds to the string s. -func empty(t *testing.T, testname string, buf *Buffer, s string, fub []byte) { - check(t, testname+" (empty 1)", buf, s) - - for { - n, err := buf.Read(fub) - if n == 0 { - break - } - if err != nil { - t.Errorf(testname+" (empty 2): err should always be nil, found err == %s", err) - } - s = s[n:] - check(t, testname+" (empty 3)", buf, s) - } - - check(t, testname+" (empty 4)", buf, "") -} - -func TestBasicOperations(t *testing.T) { - var buf Buffer - - for i := 0; i < 5; i++ { - check(t, "TestBasicOperations (1)", &buf, "") - - buf.Reset() - check(t, "TestBasicOperations (2)", &buf, "") - - buf.Truncate(0) - check(t, "TestBasicOperations (3)", &buf, "") - - n, err := buf.Write([]byte(data[0:1])) - if n != 1 { - t.Errorf("wrote 1 byte, but n == %d", n) - } - if err != nil { - t.Errorf("err should always be nil, but err == %s", err) - } - check(t, "TestBasicOperations (4)", &buf, "a") - - buf.WriteByte(data[1]) - check(t, "TestBasicOperations (5)", &buf, "ab") - - n, err = buf.Write([]byte(data[2:26])) - if n != 24 { - t.Errorf("wrote 25 bytes, but n == %d", n) - } - check(t, "TestBasicOperations (6)", &buf, string(data[0:26])) - - buf.Truncate(26) - check(t, "TestBasicOperations (7)", &buf, string(data[0:26])) - - buf.Truncate(20) - check(t, "TestBasicOperations (8)", &buf, string(data[0:20])) - - empty(t, "TestBasicOperations (9)", &buf, string(data[0:20]), make([]byte, 5)) - empty(t, "TestBasicOperations (10)", &buf, "", make([]byte, 100)) - - buf.WriteByte(data[1]) - c, err := buf.ReadByte() - if err != nil { - t.Error("ReadByte unexpected eof") - } - if c != data[1] { - t.Errorf("ReadByte wrong value c=%v", c) - } - c, err = buf.ReadByte() - if err == nil { - t.Error("ReadByte unexpected not eof") - } - } -} - -func TestLargeStringWrites(t *testing.T) { - var buf Buffer - limit := 30 - if testing.Short() { - limit = 9 - } - for i := 3; i < limit; i += 3 { - s := fillString(t, "TestLargeWrites (1)", &buf, "", 5, data) - empty(t, "TestLargeStringWrites (2)", &buf, s, make([]byte, len(data)/i)) - } - check(t, "TestLargeStringWrites (3)", &buf, "") -} - -func TestLargeByteWrites(t *testing.T) { - var buf Buffer - limit := 30 - if testing.Short() { - limit = 9 - } - for i := 3; i < limit; i += 3 { - s := fillBytes(t, "TestLargeWrites (1)", &buf, "", 5, testBytes) - empty(t, "TestLargeByteWrites (2)", &buf, s, make([]byte, len(data)/i)) - } - check(t, "TestLargeByteWrites (3)", &buf, "") -} - -func TestLargeStringReads(t *testing.T) { - var buf Buffer - for i := 3; i < 30; i += 3 { - s := fillString(t, "TestLargeReads (1)", &buf, "", 5, data[0:len(data)/i]) - empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(data))) - } - check(t, "TestLargeStringReads (3)", &buf, "") -} - -func TestLargeByteReads(t *testing.T) { - var buf Buffer - for i := 3; i < 30; i += 3 { - s := fillBytes(t, "TestLargeReads (1)", &buf, "", 5, testBytes[0:len(testBytes)/i]) - empty(t, "TestLargeReads (2)", &buf, s, make([]byte, len(data))) - } - check(t, "TestLargeByteReads (3)", &buf, "") -} - -func TestMixedReadsAndWrites(t *testing.T) { - var buf Buffer - s := "" - for i := 0; i < 50; i++ { - wlen := rand.Intn(len(data)) - if i%2 == 0 { - s = fillString(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, data[0:wlen]) - } else { - s = fillBytes(t, "TestMixedReadsAndWrites (1)", &buf, s, 1, testBytes[0:wlen]) - } - - rlen := rand.Intn(len(data)) - fub := make([]byte, rlen) - n, _ := buf.Read(fub) - s = s[n:] - } - empty(t, "TestMixedReadsAndWrites (2)", &buf, s, make([]byte, buf.Len())) -} - -func TestNil(t *testing.T) { - var b *Buffer - if b.String() != "" { - t.Errorf("expected ; got %q", b.String()) - } -} - -func TestReadFrom(t *testing.T) { - var buf Buffer - for i := 3; i < 30; i += 3 { - s := fillBytes(t, "TestReadFrom (1)", &buf, "", 5, testBytes[0:len(testBytes)/i]) - var b Buffer - b.ReadFrom(&buf) - empty(t, "TestReadFrom (2)", &b, s, make([]byte, len(data))) - } -} - -func TestWriteTo(t *testing.T) { - var buf Buffer - for i := 3; i < 30; i += 3 { - s := fillBytes(t, "TestWriteTo (1)", &buf, "", 5, testBytes[0:len(testBytes)/i]) - var b Buffer - buf.WriteTo(&b) - empty(t, "TestWriteTo (2)", &b, s, make([]byte, len(data))) - } -} - -func TestRuneIO(t *testing.T) { - const NRune = 1000 - // Built a test slice while we write the data - b := make([]byte, utf8.UTFMax*NRune) - var buf Buffer - n := 0 - for r := rune(0); r < NRune; r++ { - size := utf8.EncodeRune(b[n:], r) - nbytes, err := buf.WriteRune(r) - if err != nil { - t.Fatalf("WriteRune(%U) error: %s", r, err) - } - if nbytes != size { - t.Fatalf("WriteRune(%U) expected %d, got %d", r, size, nbytes) - } - n += size - } - b = b[0:n] - - // Check the resulting bytes - if !bytes.Equal(buf.Bytes(), b) { - t.Fatalf("incorrect result from WriteRune: %q not %q", buf.Bytes(), b) - } - - p := make([]byte, utf8.UTFMax) - // Read it back with ReadRune - for r := rune(0); r < NRune; r++ { - size := utf8.EncodeRune(p, r) - nr, nbytes, err := buf.ReadRune() - if nr != r || nbytes != size || err != nil { - t.Fatalf("ReadRune(%U) got %U,%d not %U,%d (err=%s)", r, nr, nbytes, r, size, err) - } - } - - // Check that UnreadRune works - buf.Reset() - buf.Write(b) - for r := rune(0); r < NRune; r++ { - r1, size, _ := buf.ReadRune() - if err := buf.UnreadRune(); err != nil { - t.Fatalf("UnreadRune(%U) got error %q", r, err) - } - r2, nbytes, err := buf.ReadRune() - if r1 != r2 || r1 != r || nbytes != size || err != nil { - t.Fatalf("ReadRune(%U) after UnreadRune got %U,%d not %U,%d (err=%s)", r, r2, nbytes, r, size, err) - } - } -} - -func TestNext(t *testing.T) { - b := []byte{0, 1, 2, 3, 4} - tmp := make([]byte, 5) - for i := 0; i <= 5; i++ { - for j := i; j <= 5; j++ { - for k := 0; k <= 6; k++ { - // 0 <= i <= j <= 5; 0 <= k <= 6 - // Check that if we start with a buffer - // of length j at offset i and ask for - // Next(k), we get the right bytes. - buf := NewBuffer(b[0:j]) - n, _ := buf.Read(tmp[0:i]) - if n != i { - t.Fatalf("Read %d returned %d", i, n) - } - bb := buf.Next(k) - want := k - if want > j-i { - want = j - i - } - if len(bb) != want { - t.Fatalf("in %d,%d: len(Next(%d)) == %d", i, j, k, len(bb)) - } - for l, v := range bb { - if v != byte(l+i) { - t.Fatalf("in %d,%d: Next(%d)[%d] = %d, want %d", i, j, k, l, v, l+i) - } - } - } - } - } -} - -var readBytesTests = []struct { - buffer string - delim byte - expected []string - err error -}{ - {"", 0, []string{""}, io.EOF}, - {"a\x00", 0, []string{"a\x00"}, nil}, - {"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil}, - {"hello\x01world", 1, []string{"hello\x01"}, nil}, - {"foo\nbar", 0, []string{"foo\nbar"}, io.EOF}, - {"alpha\nbeta\ngamma\n", '\n', []string{"alpha\n", "beta\n", "gamma\n"}, nil}, - {"alpha\nbeta\ngamma", '\n', []string{"alpha\n", "beta\n", "gamma"}, io.EOF}, -} - -func TestReadBytes(t *testing.T) { - for _, test := range readBytesTests { - buf := NewBufferString(test.buffer) - var err error - for _, expected := range test.expected { - var bytes []byte - bytes, err = buf.ReadBytes(test.delim) - if string(bytes) != expected { - t.Errorf("expected %q, got %q", expected, bytes) - } - if err != nil { - break - } - } - if err != test.err { - t.Errorf("expected error %v, got %v", test.err, err) - } - } -} - -func TestReadString(t *testing.T) { - for _, test := range readBytesTests { - buf := NewBufferString(test.buffer) - var err error - for _, expected := range test.expected { - var s string - s, err = buf.ReadString(test.delim) - if s != expected { - t.Errorf("expected %q, got %q", expected, s) - } - if err != nil { - break - } - } - if err != test.err { - t.Errorf("expected error %v, got %v", test.err, err) - } - } -} - -func BenchmarkReadString(b *testing.B) { - const n = 32 << 10 - - data := make([]byte, n) - data[n-1] = 'x' - b.SetBytes(int64(n)) - for i := 0; i < b.N; i++ { - buf := NewBuffer(data) - _, err := buf.ReadString('x') - if err != nil { - b.Fatal(err) - } - } -} - -func TestGrow(t *testing.T) { - x := []byte{'x'} - y := []byte{'y'} - tmp := make([]byte, 72) - for _, startLen := range []int{0, 100, 1000, 10000, 100000} { - xBytes := bytes.Repeat(x, startLen) - for _, growLen := range []int{0, 100, 1000, 10000, 100000} { - buf := NewBuffer(xBytes) - // If we read, this affects buf.off, which is good to test. - readBytes, _ := buf.Read(tmp) - buf.Grow(growLen) - yBytes := bytes.Repeat(y, growLen) - // Check no allocation occurs in write, as long as we're single-threaded. - var m1, m2 runtime.MemStats - runtime.ReadMemStats(&m1) - buf.Write(yBytes) - runtime.ReadMemStats(&m2) - if runtime.GOMAXPROCS(-1) == 1 && m1.Mallocs != m2.Mallocs { - t.Errorf("allocation occurred during write") - } - // Check that buffer has correct data. - if !bytes.Equal(buf.Bytes()[0:startLen-readBytes], xBytes[readBytes:]) { - t.Errorf("bad initial data at %d %d", startLen, growLen) - } - if !bytes.Equal(buf.Bytes()[startLen-readBytes:startLen-readBytes+growLen], yBytes) { - t.Errorf("bad written data at %d %d", startLen, growLen) - } - } - } -} - -// Was a bug: used to give EOF reading empty slice at EOF. -func TestReadEmptyAtEOF(t *testing.T) { - b := new(Buffer) - slice := make([]byte, 0) - n, err := b.Read(slice) - if err != nil { - t.Errorf("read error: %v", err) - } - if n != 0 { - t.Errorf("wrong count; got %d want 0", n) - } -} - -func TestBufferUnreadByte(t *testing.T) { - b := new(Buffer) - b.WriteString("abcdefghijklmnopqrstuvwxyz") - - _, err := b.ReadBytes('m') - if err != nil { - t.Fatalf("ReadBytes: %v", err) - } - - err = b.UnreadByte() - if err != nil { - t.Fatalf("UnreadByte: %v", err) - } - c, err := b.ReadByte() - if err != nil { - t.Fatalf("ReadByte: %v", err) - } - if c != 'm' { - t.Errorf("ReadByte = %q; want %q", c, 'm') - } -} - -// Tests that we occasionally compact. Issue 5154. -func TestBufferGrowth(t *testing.T) { - var b Buffer - buf := make([]byte, 1024) - b.Write(buf[0:1]) - var cap0 int - for i := 0; i < 5<<10; i++ { - b.Write(buf) - b.Read(buf) - if i == 0 { - cap0 = b.Cap() - } - } - cap1 := b.Cap() - // (*Buffer).grow allows for 2x capacity slop before sliding, - // so set our error threshold at 3x. - if cap1 > cap0*3 { - t.Errorf("buffer cap = %d; too big (grew from %d)", cap1, cap0) - } -} - -// From Issue 5154. -func BenchmarkBufferNotEmptyWriteRead(b *testing.B) { - buf := make([]byte, 1024) - for i := 0; i < b.N; i++ { - var b Buffer - b.Write(buf[0:1]) - for i := 0; i < 5<<10; i++ { - b.Write(buf) - b.Read(buf) - } - } -} - -// Check that we don't compact too often. From Issue 5154. -func BenchmarkBufferFullSmallReads(b *testing.B) { - buf := make([]byte, 1024) - for i := 0; i < b.N; i++ { - var b Buffer - b.Write(buf) - for b.Len()+20 < b.Cap() { - b.Write(buf[:10]) - } - for i := 0; i < 5<<10; i++ { - b.Read(buf[:1]) - b.Write(buf[:1]) - } - } -} diff --git a/vendor/gopkg.in/bufio.v1/bufio_test.go b/vendor/gopkg.in/bufio.v1/bufio_test.go deleted file mode 100644 index f19d9bd282a..00000000000 --- a/vendor/gopkg.in/bufio.v1/bufio_test.go +++ /dev/null @@ -1,1418 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bufio_test - -import ( - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "strings" - "testing" - "testing/iotest" - "time" - "unicode/utf8" - - . "gopkg.in/bufio.v1" -) - -// Reads from a reader and rot13s the result. -type rot13Reader struct { - r io.Reader -} - -func newRot13Reader(r io.Reader) *rot13Reader { - r13 := new(rot13Reader) - r13.r = r - return r13 -} - -func (r13 *rot13Reader) Read(p []byte) (int, error) { - n, err := r13.r.Read(p) - if err != nil { - return n, err - } - for i := 0; i < n; i++ { - c := p[i] | 0x20 // lowercase byte - if 'a' <= c && c <= 'm' { - p[i] += 13 - } else if 'n' <= c && c <= 'z' { - p[i] -= 13 - } - } - return n, nil -} - -// Call ReadByte to accumulate the text of a file -func readBytes(buf *Reader) string { - var b [1000]byte - nb := 0 - for { - c, err := buf.ReadByte() - if err == io.EOF { - break - } - if err == nil { - b[nb] = c - nb++ - } else if err != iotest.ErrTimeout { - panic("Data: " + err.Error()) - } - } - return string(b[0:nb]) -} - -func TestReaderSimple(t *testing.T) { - data := "hello world" - b := NewReader(strings.NewReader(data)) - if s := readBytes(b); s != "hello world" { - t.Errorf("simple hello world test failed: got %q", s) - } - - b = NewReader(newRot13Reader(strings.NewReader(data))) - if s := readBytes(b); s != "uryyb jbeyq" { - t.Errorf("rot13 hello world test failed: got %q", s) - } -} - -type readMaker struct { - name string - fn func(io.Reader) io.Reader -} - -var readMakers = []readMaker{ - {"full", func(r io.Reader) io.Reader { return r }}, - {"byte", iotest.OneByteReader}, - {"half", iotest.HalfReader}, - {"data+err", iotest.DataErrReader}, - {"timeout", iotest.TimeoutReader}, -} - -// Call ReadString (which ends up calling everything else) -// to accumulate the text of a file. -func readLines(b *Reader) string { - s := "" - for { - s1, err := b.ReadString('\n') - if err == io.EOF { - break - } - if err != nil && err != iotest.ErrTimeout { - panic("GetLines: " + err.Error()) - } - s += s1 - } - return s -} - -// Call Read to accumulate the text of a file -func reads(buf *Reader, m int) string { - var b [1000]byte - nb := 0 - for { - n, err := buf.Read(b[nb : nb+m]) - nb += n - if err == io.EOF { - break - } - } - return string(b[0:nb]) -} - -type bufReader struct { - name string - fn func(*Reader) string -} - -var bufreaders = []bufReader{ - {"1", func(b *Reader) string { return reads(b, 1) }}, - {"2", func(b *Reader) string { return reads(b, 2) }}, - {"3", func(b *Reader) string { return reads(b, 3) }}, - {"4", func(b *Reader) string { return reads(b, 4) }}, - {"5", func(b *Reader) string { return reads(b, 5) }}, - {"7", func(b *Reader) string { return reads(b, 7) }}, - {"bytes", readBytes}, - {"lines", readLines}, -} - -const minReadBufferSize = 16 - -var bufsizes = []int{ - 0, minReadBufferSize, 23, 32, 46, 64, 93, 128, 1024, 4096, -} - -func TestReader(t *testing.T) { - var texts [31]string - str := "" - all := "" - for i := 0; i < len(texts)-1; i++ { - texts[i] = str + "\n" - all += texts[i] - str += string(i%26 + 'a') - } - texts[len(texts)-1] = all - - for h := 0; h < len(texts); h++ { - text := texts[h] - for i := 0; i < len(readMakers); i++ { - for j := 0; j < len(bufreaders); j++ { - for k := 0; k < len(bufsizes); k++ { - readmaker := readMakers[i] - bufreader := bufreaders[j] - bufsize := bufsizes[k] - read := readmaker.fn(strings.NewReader(text)) - buf := NewReaderSize(read, bufsize) - s := bufreader.fn(buf) - if s != text { - t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q", - readmaker.name, bufreader.name, bufsize, text, s) - } - } - } - } - } -} - -type zeroReader struct{} - -func (zeroReader) Read(p []byte) (int, error) { - return 0, nil -} - -func TestZeroReader(t *testing.T) { - var z zeroReader - r := NewReader(z) - - c := make(chan error) - go func() { - _, err := r.ReadByte() - c <- err - }() - - select { - case err := <-c: - if err == nil { - t.Error("error expected") - } else if err != io.ErrNoProgress { - t.Error("unexpected error:", err) - } - case <-time.After(time.Second): - t.Error("test timed out (endless loop in ReadByte?)") - } -} - -// A StringReader delivers its data one string segment at a time via Read. -type StringReader struct { - data []string - step int -} - -func (r *StringReader) Read(p []byte) (n int, err error) { - if r.step < len(r.data) { - s := r.data[r.step] - n = copy(p, s) - r.step++ - } else { - err = io.EOF - } - return -} - -func readRuneSegments(t *testing.T, segments []string) { - got := "" - want := strings.Join(segments, "") - r := NewReader(&StringReader{data: segments}) - for { - r, _, err := r.ReadRune() - if err != nil { - if err != io.EOF { - return - } - break - } - got += string(r) - } - if got != want { - t.Errorf("segments=%v got=%s want=%s", segments, got, want) - } -} - -var segmentList = [][]string{ - {}, - {""}, - {"日", "本語"}, - {"\u65e5", "\u672c", "\u8a9e"}, - {"\U000065e5", "\U0000672c", "\U00008a9e"}, - {"\xe6", "\x97\xa5\xe6", "\x9c\xac\xe8\xaa\x9e"}, - {"Hello", ", ", "World", "!"}, - {"Hello", ", ", "", "World", "!"}, -} - -func TestReadRune(t *testing.T) { - for _, s := range segmentList { - readRuneSegments(t, s) - } -} - -func TestUnreadRune(t *testing.T) { - segments := []string{"Hello, world:", "日本語"} - r := NewReader(&StringReader{data: segments}) - got := "" - want := strings.Join(segments, "") - // Normal execution. - for { - r1, _, err := r.ReadRune() - if err != nil { - if err != io.EOF { - t.Error("unexpected error on ReadRune:", err) - } - break - } - got += string(r1) - // Put it back and read it again. - if err = r.UnreadRune(); err != nil { - t.Fatal("unexpected error on UnreadRune:", err) - } - r2, _, err := r.ReadRune() - if err != nil { - t.Fatal("unexpected error reading after unreading:", err) - } - if r1 != r2 { - t.Fatalf("incorrect rune after unread: got %c, want %c", r1, r2) - } - } - if got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestReaderUnreadByte(t *testing.T) { - segments := []string{"Hello, ", "world"} - r := NewReader(&StringReader{data: segments}) - got := "" - want := strings.Join(segments, "") - // Normal execution. - for { - b1, err := r.ReadByte() - if err != nil { - if err != io.EOF { - t.Error("unexpected error on ReadByte:", err) - } - break - } - got += string(b1) - // Put it back and read it again. - if err = r.UnreadByte(); err != nil { - t.Fatal("unexpected error on UnreadByte:", err) - } - b2, err := r.ReadByte() - if err != nil { - t.Fatal("unexpected error reading after unreading:", err) - } - if b1 != b2 { - t.Fatalf("incorrect byte after unread: got %q, want %q", b1, b2) - } - } - if got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestUnreadByteMultiple(t *testing.T) { - segments := []string{"Hello, ", "world"} - data := strings.Join(segments, "") - for n := 0; n <= len(data); n++ { - r := NewReader(&StringReader{data: segments}) - // Read n bytes. - for i := 0; i < n; i++ { - b, err := r.ReadByte() - if err != nil { - t.Fatalf("n = %d: unexpected error on ReadByte: %v", n, err) - } - if b != data[i] { - t.Fatalf("n = %d: incorrect byte returned from ReadByte: got %q, want %q", n, b, data[i]) - } - } - // Unread one byte if there is one. - if n > 0 { - if err := r.UnreadByte(); err != nil { - t.Errorf("n = %d: unexpected error on UnreadByte: %v", n, err) - } - } - // Test that we cannot unread any further. - if err := r.UnreadByte(); err == nil { - t.Errorf("n = %d: expected error on UnreadByte", n) - } - } -} - -func TestUnreadByteOthers(t *testing.T) { - // A list of readers to use in conjunction with UnreadByte. - var readers = []func(*Reader, byte) ([]byte, error){ - (*Reader).ReadBytes, - (*Reader).ReadSlice, - func(r *Reader, delim byte) ([]byte, error) { - data, err := r.ReadString(delim) - return []byte(data), err - }, - // ReadLine doesn't fit the data/pattern easily - // so we leave it out. It should be covered via - // the ReadSlice test since ReadLine simply calls - // ReadSlice, and it's that function that handles - // the last byte. - } - - // Try all readers with UnreadByte. - for rno, read := range readers { - // Some input data that is longer than the minimum reader buffer size. - const n = 10 - var buf bytes.Buffer - for i := 0; i < n; i++ { - buf.WriteString("abcdefg") - } - - r := NewReaderSize(&buf, minReadBufferSize) - readTo := func(delim byte, want string) { - data, err := read(r, delim) - if err != nil { - t.Fatalf("#%d: unexpected error reading to %c: %v", rno, delim, err) - } - if got := string(data); got != want { - t.Fatalf("#%d: got %q, want %q", rno, got, want) - } - } - - // Read the data with occasional UnreadByte calls. - for i := 0; i < n; i++ { - readTo('d', "abcd") - for j := 0; j < 3; j++ { - if err := r.UnreadByte(); err != nil { - t.Fatalf("#%d: unexpected error on UnreadByte: %v", rno, err) - } - readTo('d', "d") - } - readTo('g', "efg") - } - - // All data should have been read. - _, err := r.ReadByte() - if err != io.EOF { - t.Errorf("#%d: got error %v; want EOF", rno, err) - } - } -} - -// Test that UnreadRune fails if the preceding operation was not a ReadRune. -func TestUnreadRuneError(t *testing.T) { - buf := make([]byte, 3) // All runes in this test are 3 bytes long - r := NewReader(&StringReader{data: []string{"日本語日本語日本語"}}) - if r.UnreadRune() == nil { - t.Error("expected error on UnreadRune from fresh buffer") - } - _, _, err := r.ReadRune() - if err != nil { - t.Error("unexpected error on ReadRune (1):", err) - } - if err = r.UnreadRune(); err != nil { - t.Error("unexpected error on UnreadRune (1):", err) - } - if r.UnreadRune() == nil { - t.Error("expected error after UnreadRune (1)") - } - // Test error after Read. - _, _, err = r.ReadRune() // reset state - if err != nil { - t.Error("unexpected error on ReadRune (2):", err) - } - _, err = r.Read(buf) - if err != nil { - t.Error("unexpected error on Read (2):", err) - } - if r.UnreadRune() == nil { - t.Error("expected error after Read (2)") - } - // Test error after ReadByte. - _, _, err = r.ReadRune() // reset state - if err != nil { - t.Error("unexpected error on ReadRune (2):", err) - } - for _ = range buf { - _, err = r.ReadByte() - if err != nil { - t.Error("unexpected error on ReadByte (2):", err) - } - } - if r.UnreadRune() == nil { - t.Error("expected error after ReadByte") - } - // Test error after UnreadByte. - _, _, err = r.ReadRune() // reset state - if err != nil { - t.Error("unexpected error on ReadRune (3):", err) - } - _, err = r.ReadByte() - if err != nil { - t.Error("unexpected error on ReadByte (3):", err) - } - err = r.UnreadByte() - if err != nil { - t.Error("unexpected error on UnreadByte (3):", err) - } - if r.UnreadRune() == nil { - t.Error("expected error after UnreadByte (3)") - } -} - -func TestUnreadRuneAtEOF(t *testing.T) { - // UnreadRune/ReadRune should error at EOF (was a bug; used to panic) - r := NewReader(strings.NewReader("x")) - r.ReadRune() - r.ReadRune() - r.UnreadRune() - _, _, err := r.ReadRune() - if err == nil { - t.Error("expected error at EOF") - } else if err != io.EOF { - t.Error("expected EOF; got", err) - } -} - -func TestReadWriteRune(t *testing.T) { - const NRune = 1000 - byteBuf := new(bytes.Buffer) - w := NewWriter(byteBuf) - // Write the runes out using WriteRune - buf := make([]byte, utf8.UTFMax) - for r := rune(0); r < NRune; r++ { - size := utf8.EncodeRune(buf, r) - nbytes, err := w.WriteRune(r) - if err != nil { - t.Fatalf("WriteRune(0x%x) error: %s", r, err) - } - if nbytes != size { - t.Fatalf("WriteRune(0x%x) expected %d, got %d", r, size, nbytes) - } - } - w.Flush() - - r := NewReader(byteBuf) - // Read them back with ReadRune - for r1 := rune(0); r1 < NRune; r1++ { - size := utf8.EncodeRune(buf, r1) - nr, nbytes, err := r.ReadRune() - if nr != r1 || nbytes != size || err != nil { - t.Fatalf("ReadRune(0x%x) got 0x%x,%d not 0x%x,%d (err=%s)", r1, nr, nbytes, r1, size, err) - } - } -} - -func TestWriter(t *testing.T) { - var data [8192]byte - - for i := 0; i < len(data); i++ { - data[i] = byte(' ' + i%('~'-' ')) - } - w := new(bytes.Buffer) - for i := 0; i < len(bufsizes); i++ { - for j := 0; j < len(bufsizes); j++ { - nwrite := bufsizes[i] - bs := bufsizes[j] - - // Write nwrite bytes using buffer size bs. - // Check that the right amount makes it out - // and that the data is correct. - - w.Reset() - buf := NewWriterSize(w, bs) - context := fmt.Sprintf("nwrite=%d bufsize=%d", nwrite, bs) - n, e1 := buf.Write(data[0:nwrite]) - if e1 != nil || n != nwrite { - t.Errorf("%s: buf.Write %d = %d, %v", context, nwrite, n, e1) - continue - } - if e := buf.Flush(); e != nil { - t.Errorf("%s: buf.Flush = %v", context, e) - } - - written := w.Bytes() - if len(written) != nwrite { - t.Errorf("%s: %d bytes written", context, len(written)) - } - for l := 0; l < len(written); l++ { - if written[i] != data[i] { - t.Errorf("wrong bytes written") - t.Errorf("want=%q", data[0:len(written)]) - t.Errorf("have=%q", written) - } - } - } - } -} - -// Check that write errors are returned properly. - -type errorWriterTest struct { - n, m int - err error - expect error -} - -func (w errorWriterTest) Write(p []byte) (int, error) { - return len(p) * w.n / w.m, w.err -} - -var errorWriterTests = []errorWriterTest{ - {0, 1, nil, io.ErrShortWrite}, - {1, 2, nil, io.ErrShortWrite}, - {1, 1, nil, nil}, - {0, 1, io.ErrClosedPipe, io.ErrClosedPipe}, - {1, 2, io.ErrClosedPipe, io.ErrClosedPipe}, - {1, 1, io.ErrClosedPipe, io.ErrClosedPipe}, -} - -func TestWriteErrors(t *testing.T) { - for _, w := range errorWriterTests { - buf := NewWriter(w) - _, e := buf.Write([]byte("hello world")) - if e != nil { - t.Errorf("Write hello to %v: %v", w, e) - continue - } - // Two flushes, to verify the error is sticky. - for i := 0; i < 2; i++ { - e = buf.Flush() - if e != w.expect { - t.Errorf("Flush %d/2 %v: got %v, wanted %v", i+1, w, e, w.expect) - } - } - } -} - -func TestNewReaderSizeIdempotent(t *testing.T) { - const BufSize = 1000 - b := NewReaderSize(strings.NewReader("hello world"), BufSize) - // Does it recognize itself? - b1 := NewReaderSize(b, BufSize) - if b1 != b { - t.Error("NewReaderSize did not detect underlying Reader") - } - // Does it wrap if existing buffer is too small? - b2 := NewReaderSize(b, 2*BufSize) - if b2 == b { - t.Error("NewReaderSize did not enlarge buffer") - } -} - -func TestNewWriterSizeIdempotent(t *testing.T) { - const BufSize = 1000 - b := NewWriterSize(new(bytes.Buffer), BufSize) - // Does it recognize itself? - b1 := NewWriterSize(b, BufSize) - if b1 != b { - t.Error("NewWriterSize did not detect underlying Writer") - } - // Does it wrap if existing buffer is too small? - b2 := NewWriterSize(b, 2*BufSize) - if b2 == b { - t.Error("NewWriterSize did not enlarge buffer") - } -} - -func TestWriteString(t *testing.T) { - const BufSize = 8 - buf := new(bytes.Buffer) - b := NewWriterSize(buf, BufSize) - b.WriteString("0") // easy - b.WriteString("123456") // still easy - b.WriteString("7890") // easy after flush - b.WriteString("abcdefghijklmnopqrstuvwxy") // hard - b.WriteString("z") - if err := b.Flush(); err != nil { - t.Error("WriteString", err) - } - s := "01234567890abcdefghijklmnopqrstuvwxyz" - if string(buf.Bytes()) != s { - t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes())) - } -} - -func TestBufferFull(t *testing.T) { - const longString = "And now, hello, world! It is the time for all good men to come to the aid of their party" - buf := NewReaderSize(strings.NewReader(longString), minReadBufferSize) - line, err := buf.ReadSlice('!') - if string(line) != "And now, hello, " || err != ErrBufferFull { - t.Errorf("first ReadSlice(,) = %q, %v", line, err) - } - line, err = buf.ReadSlice('!') - if string(line) != "world!" || err != nil { - t.Errorf("second ReadSlice(,) = %q, %v", line, err) - } -} - -func TestPeek(t *testing.T) { - p := make([]byte, 10) - // string is 16 (minReadBufferSize) long. - buf := NewReaderSize(strings.NewReader("abcdefghijklmnop"), minReadBufferSize) - if s, err := buf.Peek(1); string(s) != "a" || err != nil { - t.Fatalf("want %q got %q, err=%v", "a", string(s), err) - } - if s, err := buf.Peek(4); string(s) != "abcd" || err != nil { - t.Fatalf("want %q got %q, err=%v", "abcd", string(s), err) - } - if _, err := buf.Peek(-1); err != ErrNegativeCount { - t.Fatalf("want ErrNegativeCount got %v", err) - } - if _, err := buf.Peek(32); err != ErrBufferFull { - t.Fatalf("want ErrBufFull got %v", err) - } - if _, err := buf.Read(p[0:3]); string(p[0:3]) != "abc" || err != nil { - t.Fatalf("want %q got %q, err=%v", "abc", string(p[0:3]), err) - } - if s, err := buf.Peek(1); string(s) != "d" || err != nil { - t.Fatalf("want %q got %q, err=%v", "d", string(s), err) - } - if s, err := buf.Peek(2); string(s) != "de" || err != nil { - t.Fatalf("want %q got %q, err=%v", "de", string(s), err) - } - if _, err := buf.Read(p[0:3]); string(p[0:3]) != "def" || err != nil { - t.Fatalf("want %q got %q, err=%v", "def", string(p[0:3]), err) - } - if s, err := buf.Peek(4); string(s) != "ghij" || err != nil { - t.Fatalf("want %q got %q, err=%v", "ghij", string(s), err) - } - if _, err := buf.Read(p[0:]); string(p[0:]) != "ghijklmnop" || err != nil { - t.Fatalf("want %q got %q, err=%v", "ghijklmnop", string(p[0:minReadBufferSize]), err) - } - if s, err := buf.Peek(0); string(s) != "" || err != nil { - t.Fatalf("want %q got %q, err=%v", "", string(s), err) - } - if _, err := buf.Peek(1); err != io.EOF { - t.Fatalf("want EOF got %v", err) - } - - // Test for issue 3022, not exposing a reader's error on a successful Peek. - buf = NewReaderSize(dataAndEOFReader("abcd"), 32) - if s, err := buf.Peek(2); string(s) != "ab" || err != nil { - t.Errorf(`Peek(2) on "abcd", EOF = %q, %v; want "ab", nil`, string(s), err) - } - if s, err := buf.Peek(4); string(s) != "abcd" || err != nil { - t.Errorf(`Peek(4) on "abcd", EOF = %q, %v; want "abcd", nil`, string(s), err) - } - if n, err := buf.Read(p[0:5]); string(p[0:n]) != "abcd" || err != nil { - t.Fatalf("Read after peek = %q, %v; want abcd, EOF", p[0:n], err) - } - if n, err := buf.Read(p[0:1]); string(p[0:n]) != "" || err != io.EOF { - t.Fatalf(`second Read after peek = %q, %v; want "", EOF`, p[0:n], err) - } -} - -type dataAndEOFReader string - -func (r dataAndEOFReader) Read(p []byte) (int, error) { - return copy(p, r), io.EOF -} - -func TestPeekThenUnreadRune(t *testing.T) { - // This sequence used to cause a crash. - r := NewReader(strings.NewReader("x")) - r.ReadRune() - r.Peek(1) - r.UnreadRune() - r.ReadRune() // Used to panic here -} - -var testOutput = []byte("0123456789abcdefghijklmnopqrstuvwxy") -var testInput = []byte("012\n345\n678\n9ab\ncde\nfgh\nijk\nlmn\nopq\nrst\nuvw\nxy") -var testInputrn = []byte("012\r\n345\r\n678\r\n9ab\r\ncde\r\nfgh\r\nijk\r\nlmn\r\nopq\r\nrst\r\nuvw\r\nxy\r\n\n\r\n") - -// TestReader wraps a []byte and returns reads of a specific length. -type testReader struct { - data []byte - stride int -} - -func (t *testReader) Read(buf []byte) (n int, err error) { - n = t.stride - if n > len(t.data) { - n = len(t.data) - } - if n > len(buf) { - n = len(buf) - } - copy(buf, t.data) - t.data = t.data[n:] - if len(t.data) == 0 { - err = io.EOF - } - return -} - -func testReadLine(t *testing.T, input []byte) { - //for stride := 1; stride < len(input); stride++ { - for stride := 1; stride < 2; stride++ { - done := 0 - reader := testReader{input, stride} - l := NewReaderSize(&reader, len(input)+1) - for { - line, isPrefix, err := l.ReadLine() - if len(line) > 0 && err != nil { - t.Errorf("ReadLine returned both data and error: %s", err) - } - if isPrefix { - t.Errorf("ReadLine returned prefix") - } - if err != nil { - if err != io.EOF { - t.Fatalf("Got unknown error: %s", err) - } - break - } - if want := testOutput[done : done+len(line)]; !bytes.Equal(want, line) { - t.Errorf("Bad line at stride %d: want: %x got: %x", stride, want, line) - } - done += len(line) - } - if done != len(testOutput) { - t.Errorf("ReadLine didn't return everything: got: %d, want: %d (stride: %d)", done, len(testOutput), stride) - } - } -} - -func TestReadLine(t *testing.T) { - testReadLine(t, testInput) - testReadLine(t, testInputrn) -} - -func TestLineTooLong(t *testing.T) { - data := make([]byte, 0) - for i := 0; i < minReadBufferSize*5/2; i++ { - data = append(data, '0'+byte(i%10)) - } - buf := bytes.NewReader(data) - l := NewReaderSize(buf, minReadBufferSize) - line, isPrefix, err := l.ReadLine() - if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil { - t.Errorf("bad result for first line: got %q want %q %v", line, data[:minReadBufferSize], err) - } - data = data[len(line):] - line, isPrefix, err = l.ReadLine() - if !isPrefix || !bytes.Equal(line, data[:minReadBufferSize]) || err != nil { - t.Errorf("bad result for second line: got %q want %q %v", line, data[:minReadBufferSize], err) - } - data = data[len(line):] - line, isPrefix, err = l.ReadLine() - if isPrefix || !bytes.Equal(line, data[:minReadBufferSize/2]) || err != nil { - t.Errorf("bad result for third line: got %q want %q %v", line, data[:minReadBufferSize/2], err) - } - line, isPrefix, err = l.ReadLine() - if isPrefix || err == nil { - t.Errorf("expected no more lines: %x %s", line, err) - } -} - -func TestReadAfterLines(t *testing.T) { - line1 := "this is line1" - restData := "this is line2\nthis is line 3\n" - inbuf := bytes.NewReader([]byte(line1 + "\n" + restData)) - outbuf := new(bytes.Buffer) - maxLineLength := len(line1) + len(restData)/2 - l := NewReaderSize(inbuf, maxLineLength) - line, isPrefix, err := l.ReadLine() - if isPrefix || err != nil || string(line) != line1 { - t.Errorf("bad result for first line: isPrefix=%v err=%v line=%q", isPrefix, err, string(line)) - } - n, err := io.Copy(outbuf, l) - if int(n) != len(restData) || err != nil { - t.Errorf("bad result for Read: n=%d err=%v", n, err) - } - if outbuf.String() != restData { - t.Errorf("bad result for Read: got %q; expected %q", outbuf.String(), restData) - } -} - -func TestReadEmptyBuffer(t *testing.T) { - l := NewReaderSize(new(bytes.Buffer), minReadBufferSize) - line, isPrefix, err := l.ReadLine() - if err != io.EOF { - t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err) - } -} - -func TestLinesAfterRead(t *testing.T) { - l := NewReaderSize(bytes.NewReader([]byte("foo")), minReadBufferSize) - _, err := ioutil.ReadAll(l) - if err != nil { - t.Error(err) - return - } - - line, isPrefix, err := l.ReadLine() - if err != io.EOF { - t.Errorf("expected EOF from ReadLine, got '%s' %t %s", line, isPrefix, err) - } -} - -func TestReadLineNonNilLineOrError(t *testing.T) { - r := NewReader(strings.NewReader("line 1\n")) - for i := 0; i < 2; i++ { - l, _, err := r.ReadLine() - if l != nil && err != nil { - t.Fatalf("on line %d/2; ReadLine=%#v, %v; want non-nil line or Error, but not both", - i+1, l, err) - } - } -} - -type readLineResult struct { - line []byte - isPrefix bool - err error -} - -var readLineNewlinesTests = []struct { - input string - expect []readLineResult -}{ - {"012345678901234\r\n012345678901234\r\n", []readLineResult{ - {[]byte("012345678901234"), true, nil}, - {nil, false, nil}, - {[]byte("012345678901234"), true, nil}, - {nil, false, nil}, - {nil, false, io.EOF}, - }}, - {"0123456789012345\r012345678901234\r", []readLineResult{ - {[]byte("0123456789012345"), true, nil}, - {[]byte("\r012345678901234"), true, nil}, - {[]byte("\r"), false, nil}, - {nil, false, io.EOF}, - }}, -} - -func TestReadLineNewlines(t *testing.T) { - for _, e := range readLineNewlinesTests { - testReadLineNewlines(t, e.input, e.expect) - } -} - -func testReadLineNewlines(t *testing.T, input string, expect []readLineResult) { - b := NewReaderSize(strings.NewReader(input), minReadBufferSize) - for i, e := range expect { - line, isPrefix, err := b.ReadLine() - if !bytes.Equal(line, e.line) { - t.Errorf("%q call %d, line == %q, want %q", input, i, line, e.line) - return - } - if isPrefix != e.isPrefix { - t.Errorf("%q call %d, isPrefix == %v, want %v", input, i, isPrefix, e.isPrefix) - return - } - if err != e.err { - t.Errorf("%q call %d, err == %v, want %v", input, i, err, e.err) - return - } - } -} - -func createTestInput(n int) []byte { - input := make([]byte, n) - for i := range input { - // 101 and 251 are arbitrary prime numbers. - // The idea is to create an input sequence - // which doesn't repeat too frequently. - input[i] = byte(i % 251) - if i%101 == 0 { - input[i] ^= byte(i / 101) - } - } - return input -} - -func TestReaderWriteTo(t *testing.T) { - input := createTestInput(8192) - r := NewReader(onlyReader{bytes.NewReader(input)}) - w := new(bytes.Buffer) - if n, err := r.WriteTo(w); err != nil || n != int64(len(input)) { - t.Fatalf("r.WriteTo(w) = %d, %v, want %d, nil", n, err, len(input)) - } - - for i, val := range w.Bytes() { - if val != input[i] { - t.Errorf("after write: out[%d] = %#x, want %#x", i, val, input[i]) - } - } -} - -type errorWriterToTest struct { - rn, wn int - rerr, werr error - expected error -} - -func (r errorWriterToTest) Read(p []byte) (int, error) { - return len(p) * r.rn, r.rerr -} - -func (w errorWriterToTest) Write(p []byte) (int, error) { - return len(p) * w.wn, w.werr -} - -var errorWriterToTests = []errorWriterToTest{ - {1, 0, nil, io.ErrClosedPipe, io.ErrClosedPipe}, - {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe}, - {0, 0, io.ErrUnexpectedEOF, io.ErrClosedPipe, io.ErrClosedPipe}, - {0, 1, io.EOF, nil, nil}, -} - -func TestReaderWriteToErrors(t *testing.T) { - for i, rw := range errorWriterToTests { - r := NewReader(rw) - if _, err := r.WriteTo(rw); err != rw.expected { - t.Errorf("r.WriteTo(errorWriterToTests[%d]) = _, %v, want _,%v", i, err, rw.expected) - } - } -} - -func TestWriterReadFrom(t *testing.T) { - ws := []func(io.Writer) io.Writer{ - func(w io.Writer) io.Writer { return onlyWriter{w} }, - func(w io.Writer) io.Writer { return w }, - } - - rs := []func(io.Reader) io.Reader{ - iotest.DataErrReader, - func(r io.Reader) io.Reader { return r }, - } - - for ri, rfunc := range rs { - for wi, wfunc := range ws { - input := createTestInput(8192) - b := new(bytes.Buffer) - w := NewWriter(wfunc(b)) - r := rfunc(bytes.NewReader(input)) - if n, err := w.ReadFrom(r); err != nil || n != int64(len(input)) { - t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil", wi, ri, n, err, len(input)) - continue - } - if err := w.Flush(); err != nil { - t.Errorf("Flush returned %v", err) - continue - } - if got, want := b.String(), string(input); got != want { - t.Errorf("ws[%d], rs[%d]:\ngot %q\nwant %q\n", wi, ri, got, want) - } - } - } -} - -type errorReaderFromTest struct { - rn, wn int - rerr, werr error - expected error -} - -func (r errorReaderFromTest) Read(p []byte) (int, error) { - return len(p) * r.rn, r.rerr -} - -func (w errorReaderFromTest) Write(p []byte) (int, error) { - return len(p) * w.wn, w.werr -} - -var errorReaderFromTests = []errorReaderFromTest{ - {0, 1, io.EOF, nil, nil}, - {1, 1, io.EOF, nil, nil}, - {0, 1, io.ErrClosedPipe, nil, io.ErrClosedPipe}, - {0, 0, io.ErrClosedPipe, io.ErrShortWrite, io.ErrClosedPipe}, - {1, 0, nil, io.ErrShortWrite, io.ErrShortWrite}, -} - -func TestWriterReadFromErrors(t *testing.T) { - for i, rw := range errorReaderFromTests { - w := NewWriter(rw) - if _, err := w.ReadFrom(rw); err != rw.expected { - t.Errorf("w.ReadFrom(errorReaderFromTests[%d]) = _, %v, want _,%v", i, err, rw.expected) - } - } -} - -// TestWriterReadFromCounts tests that using io.Copy to copy into a -// bufio.Writer does not prematurely flush the buffer. For example, when -// buffering writes to a network socket, excessive network writes should be -// avoided. -func TestWriterReadFromCounts(t *testing.T) { - var w0 writeCountingDiscard - b0 := NewWriterSize(&w0, 1234) - b0.WriteString(strings.Repeat("x", 1000)) - if w0 != 0 { - t.Fatalf("write 1000 'x's: got %d writes, want 0", w0) - } - b0.WriteString(strings.Repeat("x", 200)) - if w0 != 0 { - t.Fatalf("write 1200 'x's: got %d writes, want 0", w0) - } - io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 30))}) - if w0 != 0 { - t.Fatalf("write 1230 'x's: got %d writes, want 0", w0) - } - io.Copy(b0, onlyReader{strings.NewReader(strings.Repeat("x", 9))}) - if w0 != 1 { - t.Fatalf("write 1239 'x's: got %d writes, want 1", w0) - } - - var w1 writeCountingDiscard - b1 := NewWriterSize(&w1, 1234) - b1.WriteString(strings.Repeat("x", 1200)) - b1.Flush() - if w1 != 1 { - t.Fatalf("flush 1200 'x's: got %d writes, want 1", w1) - } - b1.WriteString(strings.Repeat("x", 89)) - if w1 != 1 { - t.Fatalf("write 1200 + 89 'x's: got %d writes, want 1", w1) - } - io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 700))}) - if w1 != 1 { - t.Fatalf("write 1200 + 789 'x's: got %d writes, want 1", w1) - } - io.Copy(b1, onlyReader{strings.NewReader(strings.Repeat("x", 600))}) - if w1 != 2 { - t.Fatalf("write 1200 + 1389 'x's: got %d writes, want 2", w1) - } - b1.Flush() - if w1 != 3 { - t.Fatalf("flush 1200 + 1389 'x's: got %d writes, want 3", w1) - } -} - -// A writeCountingDiscard is like ioutil.Discard and counts the number of times -// Write is called on it. -type writeCountingDiscard int - -func (w *writeCountingDiscard) Write(p []byte) (int, error) { - *w++ - return len(p), nil -} - -type negativeReader int - -func (r *negativeReader) Read([]byte) (int, error) { return -1, nil } - -func TestNegativeRead(t *testing.T) { - // should panic with a description pointing at the reader, not at itself. - // (should NOT panic with slice index error, for example.) - b := NewReader(new(negativeReader)) - defer func() { - switch err := recover().(type) { - case nil: - t.Fatal("read did not panic") - case error: - if !strings.Contains(err.Error(), "reader returned negative count from Read") { - t.Fatalf("wrong panic: %v", err) - } - default: - t.Fatalf("unexpected panic value: %T(%v)", err, err) - } - }() - b.Read(make([]byte, 100)) -} - -var errFake = errors.New("fake error") - -type errorThenGoodReader struct { - didErr bool - nread int -} - -func (r *errorThenGoodReader) Read(p []byte) (int, error) { - r.nread++ - if !r.didErr { - r.didErr = true - return 0, errFake - } - return len(p), nil -} - -func TestReaderClearError(t *testing.T) { - r := &errorThenGoodReader{} - b := NewReader(r) - buf := make([]byte, 1) - if _, err := b.Read(nil); err != nil { - t.Fatalf("1st nil Read = %v; want nil", err) - } - if _, err := b.Read(buf); err != errFake { - t.Fatalf("1st Read = %v; want errFake", err) - } - if _, err := b.Read(nil); err != nil { - t.Fatalf("2nd nil Read = %v; want nil", err) - } - if _, err := b.Read(buf); err != nil { - t.Fatalf("3rd Read with buffer = %v; want nil", err) - } - if r.nread != 2 { - t.Errorf("num reads = %d; want 2", r.nread) - } -} - -// Test for golang.org/issue/5947 -func TestWriterReadFromWhileFull(t *testing.T) { - buf := new(bytes.Buffer) - w := NewWriterSize(buf, 10) - - // Fill buffer exactly. - n, err := w.Write([]byte("0123456789")) - if n != 10 || err != nil { - t.Fatalf("Write returned (%v, %v), want (10, nil)", n, err) - } - - // Use ReadFrom to read in some data. - n2, err := w.ReadFrom(strings.NewReader("abcdef")) - if n2 != 6 || err != nil { - t.Fatalf("ReadFrom returned (%v, %v), want (6, nil)", n2, err) - } -} - -type emptyThenNonEmptyReader struct { - r io.Reader - n int -} - -func (r *emptyThenNonEmptyReader) Read(p []byte) (int, error) { - if r.n <= 0 { - return r.r.Read(p) - } - r.n-- - return 0, nil -} - -// Test for golang.org/issue/7611 -func TestWriterReadFromUntilEOF(t *testing.T) { - buf := new(bytes.Buffer) - w := NewWriterSize(buf, 5) - - // Partially fill buffer - n, err := w.Write([]byte("0123")) - if n != 4 || err != nil { - t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err) - } - - // Use ReadFrom to read in some data. - r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 3} - n2, err := w.ReadFrom(r) - if n2 != 4 || err != nil { - t.Fatalf("ReadFrom returned (%v, %v), want (4, nil)", n2, err) - } - w.Flush() - if got, want := string(buf.Bytes()), "0123abcd"; got != want { - t.Fatalf("buf.Bytes() returned %q, want %q", got, want) - } -} - -func TestWriterReadFromErrNoProgress(t *testing.T) { - buf := new(bytes.Buffer) - w := NewWriterSize(buf, 5) - - // Partially fill buffer - n, err := w.Write([]byte("0123")) - if n != 4 || err != nil { - t.Fatalf("Write returned (%v, %v), want (4, nil)", n, err) - } - - // Use ReadFrom to read in some data. - r := &emptyThenNonEmptyReader{r: strings.NewReader("abcd"), n: 100} - n2, err := w.ReadFrom(r) - if n2 != 0 || err != io.ErrNoProgress { - t.Fatalf("buf.Bytes() returned (%v, %v), want (0, io.ErrNoProgress)", n2, err) - } -} - -func TestReaderReset(t *testing.T) { - r := NewReader(strings.NewReader("foo foo")) - buf := make([]byte, 3) - r.Read(buf) - if string(buf) != "foo" { - t.Errorf("buf = %q; want foo", buf) - } - r.Reset(strings.NewReader("bar bar")) - all, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err) - } - if string(all) != "bar bar" { - t.Errorf("ReadAll = %q; want bar bar", all) - } -} - -func TestWriterReset(t *testing.T) { - var buf1, buf2 bytes.Buffer - w := NewWriter(&buf1) - w.WriteString("foo") - w.Reset(&buf2) // and not flushed - w.WriteString("bar") - w.Flush() - if buf1.String() != "" { - t.Errorf("buf1 = %q; want empty", buf1.String()) - } - if buf2.String() != "bar" { - t.Errorf("buf2 = %q; want bar", buf2.String()) - } -} - -// An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have. -type onlyReader struct { - io.Reader -} - -// An onlyWriter only implements io.Writer, no matter what other methods the underlying implementation may have. -type onlyWriter struct { - io.Writer -} - -func BenchmarkReaderCopyOptimal(b *testing.B) { - // Optimal case is where the underlying reader implements io.WriterTo - srcBuf := bytes.NewBuffer(make([]byte, 8192)) - src := NewReader(srcBuf) - dstBuf := new(bytes.Buffer) - dst := onlyWriter{dstBuf} - for i := 0; i < b.N; i++ { - srcBuf.Reset() - src.Reset(srcBuf) - dstBuf.Reset() - io.Copy(dst, src) - } -} - -func BenchmarkReaderCopyUnoptimal(b *testing.B) { - // Unoptimal case is where the underlying reader doesn't implement io.WriterTo - srcBuf := bytes.NewBuffer(make([]byte, 8192)) - src := NewReader(onlyReader{srcBuf}) - dstBuf := new(bytes.Buffer) - dst := onlyWriter{dstBuf} - for i := 0; i < b.N; i++ { - srcBuf.Reset() - src.Reset(onlyReader{srcBuf}) - dstBuf.Reset() - io.Copy(dst, src) - } -} - -func BenchmarkReaderCopyNoWriteTo(b *testing.B) { - srcBuf := bytes.NewBuffer(make([]byte, 8192)) - srcReader := NewReader(srcBuf) - src := onlyReader{srcReader} - dstBuf := new(bytes.Buffer) - dst := onlyWriter{dstBuf} - for i := 0; i < b.N; i++ { - srcBuf.Reset() - srcReader.Reset(srcBuf) - dstBuf.Reset() - io.Copy(dst, src) - } -} - -func BenchmarkReaderWriteToOptimal(b *testing.B) { - const bufSize = 16 << 10 - buf := make([]byte, bufSize) - r := bytes.NewReader(buf) - srcReader := NewReaderSize(onlyReader{r}, 1<<10) - if _, ok := ioutil.Discard.(io.ReaderFrom); !ok { - b.Fatal("ioutil.Discard doesn't support ReaderFrom") - } - for i := 0; i < b.N; i++ { - r.Seek(0, 0) - srcReader.Reset(onlyReader{r}) - n, err := srcReader.WriteTo(ioutil.Discard) - if err != nil { - b.Fatal(err) - } - if n != bufSize { - b.Fatalf("n = %d; want %d", n, bufSize) - } - } -} - -func BenchmarkWriterCopyOptimal(b *testing.B) { - // Optimal case is where the underlying writer implements io.ReaderFrom - srcBuf := bytes.NewBuffer(make([]byte, 8192)) - src := onlyReader{srcBuf} - dstBuf := new(bytes.Buffer) - dst := NewWriter(dstBuf) - for i := 0; i < b.N; i++ { - srcBuf.Reset() - dstBuf.Reset() - dst.Reset(dstBuf) - io.Copy(dst, src) - } -} - -func BenchmarkWriterCopyUnoptimal(b *testing.B) { - srcBuf := bytes.NewBuffer(make([]byte, 8192)) - src := onlyReader{srcBuf} - dstBuf := new(bytes.Buffer) - dst := NewWriter(onlyWriter{dstBuf}) - for i := 0; i < b.N; i++ { - srcBuf.Reset() - dstBuf.Reset() - dst.Reset(onlyWriter{dstBuf}) - io.Copy(dst, src) - } -} - -func BenchmarkWriterCopyNoReadFrom(b *testing.B) { - srcBuf := bytes.NewBuffer(make([]byte, 8192)) - src := onlyReader{srcBuf} - dstBuf := new(bytes.Buffer) - dstWriter := NewWriter(dstBuf) - dst := onlyWriter{dstWriter} - for i := 0; i < b.N; i++ { - srcBuf.Reset() - dstBuf.Reset() - dstWriter.Reset(dstBuf) - io.Copy(dst, src) - } -} - -func BenchmarkReaderEmpty(b *testing.B) { - b.ReportAllocs() - str := strings.Repeat("x", 16<<10) - for i := 0; i < b.N; i++ { - br := NewReader(strings.NewReader(str)) - n, err := io.Copy(ioutil.Discard, br) - if err != nil { - b.Fatal(err) - } - if n != int64(len(str)) { - b.Fatal("wrong length") - } - } -} - -func BenchmarkWriterEmpty(b *testing.B) { - b.ReportAllocs() - str := strings.Repeat("x", 1<<10) - bs := []byte(str) - for i := 0; i < b.N; i++ { - bw := NewWriter(ioutil.Discard) - bw.Flush() - bw.WriteByte('a') - bw.Flush() - bw.WriteRune('B') - bw.Flush() - bw.Write(bs) - bw.Flush() - bw.WriteString(str) - bw.Flush() - } -} - -func BenchmarkWriterFlush(b *testing.B) { - b.ReportAllocs() - bw := NewWriter(ioutil.Discard) - str := strings.Repeat("x", 50) - for i := 0; i < b.N; i++ { - bw.WriteString(str) - bw.Flush() - } -} diff --git a/vendor/gopkg.in/bufio.v1/export_test.go b/vendor/gopkg.in/bufio.v1/export_test.go deleted file mode 100644 index 16629d0224c..00000000000 --- a/vendor/gopkg.in/bufio.v1/export_test.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package bufio - -func (b *Buffer) Cap() int { - return cap(b.buf) -} diff --git a/vendor/gopkg.in/gomail.v2/CHANGELOG.md b/vendor/gopkg.in/gomail.v2/CHANGELOG.md deleted file mode 100644 index a797ab4c094..00000000000 --- a/vendor/gopkg.in/gomail.v2/CHANGELOG.md +++ /dev/null @@ -1,20 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -## [2.0.0] - 2015-09-02 - -- Mailer has been removed. It has been replaced by Dialer and Sender. -- `File` type and the `CreateFile` and `OpenFile` functions have been removed. -- `Message.Attach` and `Message.Embed` have a new signature. -- `Message.GetBodyWriter` has been removed. Use `Message.AddAlternativeWriter` -instead. -- `Message.Export` has been removed. `Message.WriteTo` can be used instead. -- `Message.DelHeader` has been removed. -- The `Bcc` header field is no longer sent. It is far more simpler and -efficient: the same message is sent to all recipients instead of sending a -different email to each Bcc address. -- LoginAuth has been removed. `NewPlainDialer` now implements the LOGIN -authentication mechanism when needed. -- Go 1.2 is now required instead of Go 1.3. No external dependency are used when -using Go 1.5. diff --git a/vendor/gopkg.in/gomail.v2/CONTRIBUTING.md b/vendor/gopkg.in/gomail.v2/CONTRIBUTING.md deleted file mode 100644 index d5601c257a7..00000000000 --- a/vendor/gopkg.in/gomail.v2/CONTRIBUTING.md +++ /dev/null @@ -1,20 +0,0 @@ -Thank you for contributing to Gomail! Here are a few guidelines: - -## Bugs - -If you think you found a bug, create an issue and supply the minimum amount -of code triggering the bug so it can be reproduced. - - -## Fixing a bug - -If you want to fix a bug, you can send a pull request. It should contains a -new test or update an existing one to cover that bug. - - -## New feature proposal - -If you think Gomail lacks a feature, you can open an issue or send a pull -request. I want to keep Gomail code and API as simple as possible so please -describe your needs so we can discuss whether this feature should be added to -Gomail or not. diff --git a/vendor/gopkg.in/gomail.v2/README.md b/vendor/gopkg.in/gomail.v2/README.md deleted file mode 100644 index b3be9e146bc..00000000000 --- a/vendor/gopkg.in/gomail.v2/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# Gomail -[![Build Status](https://travis-ci.org/go-gomail/gomail.svg?branch=v2)](https://travis-ci.org/go-gomail/gomail) [![Code Coverage](http://gocover.io/_badge/gopkg.in/gomail.v2)](http://gocover.io/gopkg.in/gomail.v2) [![Documentation](https://godoc.org/gopkg.in/gomail.v2?status.svg)](https://godoc.org/gopkg.in/gomail.v2) - -## Introduction - -Gomail is a simple and efficient package to send emails. It is well tested and -documented. - -Gomail can only send emails using an SMTP server. But the API is flexible and it -is easy to implement other methods for sending emails using a local Postfix, an -API, etc. - -It is versioned using [gopkg.in](https://gopkg.in) so I promise -there will never be backward incompatible changes within each version. - -It requires Go 1.2 or newer. With Go 1.5, no external dependencies are used. - - -## Features - -Gomail supports: -- Attachments -- Embedded images -- HTML and text templates -- Automatic encoding of special characters -- SSL and TLS -- Sending multiple emails with the same SMTP connection - - -## Documentation - -https://godoc.org/gopkg.in/gomail.v2 - - -## Download - - go get gopkg.in/gomail.v2 - - -## Examples - -See the [examples in the documentation](https://godoc.org/gopkg.in/gomail.v2#example-package). - - -## FAQ - -### x509: certificate signed by unknown authority - -If you get this error it means the certificate used by the SMTP server is not -considered valid by the client running Gomail. As a quick workaround you can -bypass the verification of the server's certificate chain and host name by using -`SetTLSConfig`: - - package main - - import ( - "crypto/tls" - - "gopkg.in/gomail.v2" - ) - - func main() { - d := gomail.NewDialer("smtp.example.com", 587, "user", "123456") - d.TLSConfig = &tls.Config{InsecureSkipVerify: true} - - // Send emails using d. - } - -Note, however, that this is insecure and should not be used in production. - - -## Contribute - -Contributions are more than welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for -more info. - - -## Change log - -See [CHANGELOG.md](CHANGELOG.md). - - -## License - -[MIT](LICENSE) - - -## Contact - -You can ask questions on the [Gomail -thread](https://groups.google.com/d/topic/golang-nuts/jMxZHzvvEVg/discussion) -in the Go mailing-list. diff --git a/vendor/gopkg.in/ini.v1/.gitignore b/vendor/gopkg.in/ini.v1/.gitignore deleted file mode 100644 index 12411127b39..00000000000 --- a/vendor/gopkg.in/ini.v1/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -testdata/conf_out.ini -ini.sublime-project -ini.sublime-workspace -testdata/conf_reflect.ini -.idea -/.vscode diff --git a/vendor/gopkg.in/ini.v1/.travis.yml b/vendor/gopkg.in/ini.v1/.travis.yml deleted file mode 100644 index b097527e1a9..00000000000 --- a/vendor/gopkg.in/ini.v1/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -sudo: false -language: go -go: - - 1.5.x - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - -script: - - go get golang.org/x/tools/cmd/cover - - go get github.com/smartystreets/goconvey - - mkdir -p $HOME/gopath/src/gopkg.in - - ln -s $HOME/gopath/src/github.com/go-ini/ini $HOME/gopath/src/gopkg.in/ini.v1 - - go test -v -cover -race diff --git a/vendor/gopkg.in/ini.v1/Makefile b/vendor/gopkg.in/ini.v1/Makefile deleted file mode 100644 index 1316911d2df..00000000000 --- a/vendor/gopkg.in/ini.v1/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -.PHONY: build test bench vet coverage - -build: vet bench - -test: - go test -v -cover -race - -bench: - go test -v -cover -race -test.bench=. -test.benchmem - -vet: - go vet - -coverage: - go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out \ No newline at end of file diff --git a/vendor/gopkg.in/ini.v1/README.md b/vendor/gopkg.in/ini.v1/README.md deleted file mode 100644 index f4ff27cd30c..00000000000 --- a/vendor/gopkg.in/ini.v1/README.md +++ /dev/null @@ -1,763 +0,0 @@ -INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini) [![Sourcegraph](https://sourcegraph.com/github.com/go-ini/ini/-/badge.svg)](https://sourcegraph.com/github.com/go-ini/ini?badge) -=== - -![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200) - -Package ini provides INI file read and write functionality in Go. - -[简体中文](README_ZH.md) - -## Feature - -- Load multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites. -- Read with recursion values. -- Read with parent-child sections. -- Read with auto-increment key names. -- Read with multiple-line values. -- Read with tons of helper methods. -- Read and convert values to Go types. -- Read and **WRITE** comments of sections and keys. -- Manipulate sections, keys and comments with ease. -- Keep sections and keys in order as you parse and save. - -## Installation - -To use a tagged revision: - - go get gopkg.in/ini.v1 - -To use with latest changes: - - go get github.com/go-ini/ini - -Please add `-u` flag to update in the future. - -### Testing - -If you want to test on your machine, please apply `-t` flag: - - go get -t gopkg.in/ini.v1 - -Please add `-u` flag to update in the future. - -## Getting Started - -### Loading from data sources - -A **Data Source** is either raw data in type `[]byte`, a file name with type `string` or `io.ReadCloser`. You can load **as many data sources as you want**. Passing other types will simply return an error. - -```go -cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data")))) -``` - -Or start with an empty object: - -```go -cfg := ini.Empty() -``` - -When you cannot decide how many data sources to load at the beginning, you will still be able to **Append()** them later. - -```go -err := cfg.Append("other file", []byte("other raw data")) -``` - -If you have a list of files with possibilities that some of them may not available at the time, and you don't know exactly which ones, you can use `LooseLoad` to ignore nonexistent files without returning error. - -```go -cfg, err := ini.LooseLoad("filename", "filename_404") -``` - -The cool thing is, whenever the file is available to load while you're calling `Reload` method, it will be counted as usual. - -#### Ignore cases of key name - -When you do not care about cases of section and key names, you can use `InsensitiveLoad` to force all names to be lowercased while parsing. - -```go -cfg, err := ini.InsensitiveLoad("filename") -//... - -// sec1 and sec2 are the exactly same section object -sec1, err := cfg.GetSection("Section") -sec2, err := cfg.GetSection("SecTIOn") - -// key1 and key2 are the exactly same key object -key1, err := sec1.GetKey("Key") -key2, err := sec2.GetKey("KeY") -``` - -#### MySQL-like boolean key - -MySQL's configuration allows a key without value as follows: - -```ini -[mysqld] -... -skip-host-cache -skip-name-resolve -``` - -By default, this is considered as missing value. But if you know you're going to deal with those cases, you can assign advanced load options: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{AllowBooleanKeys: true}, "my.cnf")) -``` - -The value of those keys are always `true`, and when you save to a file, it will keep in the same foramt as you read. - -To generate such keys in your program, you could use `NewBooleanKey`: - -```go -key, err := sec.NewBooleanKey("skip-host-cache") -``` - -#### Comment - -Take care that following format will be treated as comment: - -1. Line begins with `#` or `;` -2. Words after `#` or `;` -3. Words after section name (i.e words after `[some section name]`) - -If you want to save a value with `#` or `;`, please quote them with ``` ` ``` or ``` """ ```. - -Alternatively, you can use following `LoadOptions` to completely ignore inline comments: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true}, "app.ini")) -``` - -### Working with sections - -To get a section, you would need to: - -```go -section, err := cfg.GetSection("section name") -``` - -For a shortcut for default section, just give an empty string as name: - -```go -section, err := cfg.GetSection("") -``` - -When you're pretty sure the section exists, following code could make your life easier: - -```go -section := cfg.Section("section name") -``` - -What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you. - -To create a new section: - -```go -err := cfg.NewSection("new section") -``` - -To get a list of sections or section names: - -```go -sections := cfg.Sections() -names := cfg.SectionStrings() -``` - -### Working with keys - -To get a key under a section: - -```go -key, err := cfg.Section("").GetKey("key name") -``` - -Same rule applies to key operations: - -```go -key := cfg.Section("").Key("key name") -``` - -To check if a key exists: - -```go -yes := cfg.Section("").HasKey("key name") -``` - -To create a new key: - -```go -err := cfg.Section("").NewKey("name", "value") -``` - -To get a list of keys or key names: - -```go -keys := cfg.Section("").Keys() -names := cfg.Section("").KeyStrings() -``` - -To get a clone hash of keys and corresponding values: - -```go -hash := cfg.Section("").KeysHash() -``` - -### Working with values - -To get a string value: - -```go -val := cfg.Section("").Key("key name").String() -``` - -To validate key value on the fly: - -```go -val := cfg.Section("").Key("key name").Validate(func(in string) string { - if len(in) == 0 { - return "default" - } - return in -}) -``` - -If you do not want any auto-transformation (such as recursive read) for the values, you can get raw value directly (this way you get much better performance): - -```go -val := cfg.Section("").Key("key name").Value() -``` - -To check if raw value exists: - -```go -yes := cfg.Section("").HasValue("test value") -``` - -To get value with types: - -```go -// For boolean values: -// true when value is: 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On -// false when value is: 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off -v, err = cfg.Section("").Key("BOOL").Bool() -v, err = cfg.Section("").Key("FLOAT64").Float64() -v, err = cfg.Section("").Key("INT").Int() -v, err = cfg.Section("").Key("INT64").Int64() -v, err = cfg.Section("").Key("UINT").Uint() -v, err = cfg.Section("").Key("UINT64").Uint64() -v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) -v, err = cfg.Section("").Key("TIME").Time() // RFC3339 - -v = cfg.Section("").Key("BOOL").MustBool() -v = cfg.Section("").Key("FLOAT64").MustFloat64() -v = cfg.Section("").Key("INT").MustInt() -v = cfg.Section("").Key("INT64").MustInt64() -v = cfg.Section("").Key("UINT").MustUint() -v = cfg.Section("").Key("UINT64").MustUint64() -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) -v = cfg.Section("").Key("TIME").MustTime() // RFC3339 - -// Methods start with Must also accept one argument for default value -// when key not found or fail to parse value to given type. -// Except method MustString, which you have to pass a default value. - -v = cfg.Section("").Key("String").MustString("default") -v = cfg.Section("").Key("BOOL").MustBool(true) -v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) -v = cfg.Section("").Key("INT").MustInt(10) -v = cfg.Section("").Key("INT64").MustInt64(99) -v = cfg.Section("").Key("UINT").MustUint(3) -v = cfg.Section("").Key("UINT64").MustUint64(6) -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) -v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339 -``` - -What if my value is three-line long? - -```ini -[advance] -ADDRESS = """404 road, -NotFound, State, 5000 -Earth""" -``` - -Not a problem! - -```go -cfg.Section("advance").Key("ADDRESS").String() - -/* --- start --- -404 road, -NotFound, State, 5000 -Earth ------- end --- */ -``` - -That's cool, how about continuation lines? - -```ini -[advance] -two_lines = how about \ - continuation lines? -lots_of_lines = 1 \ - 2 \ - 3 \ - 4 -``` - -Piece of cake! - -```go -cfg.Section("advance").Key("two_lines").String() // how about continuation lines? -cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4 -``` - -Well, I hate continuation lines, how do I disable that? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{ - IgnoreContinuation: true, -}, "filename") -``` - -Holy crap! - -Note that single quotes around values will be stripped: - -```ini -foo = "some value" // foo: some value -bar = 'some value' // bar: some value -``` - -Sometimes you downloaded file from [Crowdin](https://crowdin.com/) has values like the following (value is surrounded by double quotes and quotes in the value are escaped): - -```ini -create_repo="created repository %s" -``` - -How do you transform this to regular format automatically? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{UnescapeValueDoubleQuotes: true}, "en-US.ini")) -cfg.Section("").Key("create_repo").String() -// You got: created repository %s -``` - -That's all? Hmm, no. - -#### Helper methods of working with values - -To get value with given candidates: - -```go -v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) -v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) -v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) -v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) -v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) -v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) -v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) -v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 -``` - -Default value will be presented if value of key is not in candidates you given, and default value does not need be one of candidates. - -To validate value in a given range: - -```go -vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) -vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) -vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) -vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) -vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) -vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) -vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339 -``` - -##### Auto-split values into a slice - -To use zero value of type for invalid inputs: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] -vals = cfg.Section("").Key("STRINGS").Strings(",") -vals = cfg.Section("").Key("FLOAT64S").Float64s(",") -vals = cfg.Section("").Key("INTS").Ints(",") -vals = cfg.Section("").Key("INT64S").Int64s(",") -vals = cfg.Section("").Key("UINTS").Uints(",") -vals = cfg.Section("").Key("UINT64S").Uint64s(",") -vals = cfg.Section("").Key("TIMES").Times(",") -``` - -To exclude invalid values out of result slice: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [2.2] -vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",") -vals = cfg.Section("").Key("INTS").ValidInts(",") -vals = cfg.Section("").Key("INT64S").ValidInt64s(",") -vals = cfg.Section("").Key("UINTS").ValidUints(",") -vals = cfg.Section("").Key("UINT64S").ValidUint64s(",") -vals = cfg.Section("").Key("TIMES").ValidTimes(",") -``` - -Or to return nothing but error when have invalid inputs: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> error -vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",") -vals = cfg.Section("").Key("INTS").StrictInts(",") -vals = cfg.Section("").Key("INT64S").StrictInt64s(",") -vals = cfg.Section("").Key("UINTS").StrictUints(",") -vals = cfg.Section("").Key("UINT64S").StrictUint64s(",") -vals = cfg.Section("").Key("TIMES").StrictTimes(",") -``` - -### Save your configuration - -Finally, it's time to save your configuration to somewhere. - -A typical way to save configuration is writing it to a file: - -```go -// ... -err = cfg.SaveTo("my.ini") -err = cfg.SaveToIndent("my.ini", "\t") -``` - -Another way to save is writing to a `io.Writer` interface: - -```go -// ... -cfg.WriteTo(writer) -cfg.WriteToIndent(writer, "\t") -``` - -By default, spaces are used to align "=" sign between key and values, to disable that: - -```go -ini.PrettyFormat = false -``` - -## Advanced Usage - -### Recursive Values - -For all value of keys, there is a special syntax `%()s`, where `` is the key name in same section or default section, and `%()s` will be replaced by corresponding value(empty string if key not found). You can use this syntax at most 99 level of recursions. - -```ini -NAME = ini - -[author] -NAME = Unknwon -GITHUB = https://github.com/%(NAME)s - -[package] -FULL_NAME = github.com/go-ini/%(NAME)s -``` - -```go -cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon -cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini -``` - -### Parent-child Sections - -You can use `.` in section name to indicate parent-child relationship between two or more sections. If the key not found in the child section, library will try again on its parent section until there is no parent section. - -```ini -NAME = ini -VERSION = v1 -IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s - -[package] -CLONE_URL = https://%(IMPORT_PATH)s - -[package.sub] -``` - -```go -cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1 -``` - -#### Retrieve parent keys available to a child section - -```go -cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"] -``` - -### Unparseable Sections - -Sometimes, you have sections that do not contain key-value pairs but raw content, to handle such case, you can use `LoadOptions.UnparsableSections`: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS] -<1> This slide has the fuel listed in the wrong units `)) - -body := cfg.Section("COMMENTS").Body() - -/* --- start --- -<1> This slide has the fuel listed in the wrong units ------- end --- */ -``` - -### Auto-increment Key Names - -If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter. - -```ini -[features] --: Support read/write comments of keys and sections --: Support auto-increment of key names --: Support load multiple files to overwrite key values -``` - -```go -cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"} -``` - -### Map To Struct - -Want more objective way to play with INI? Cool. - -```ini -Name = Unknwon -age = 21 -Male = true -Born = 1993-01-01T20:17:05Z - -[Note] -Content = Hi is a good man! -Cities = HangZhou, Boston -``` - -```go -type Note struct { - Content string - Cities []string -} - -type Person struct { - Name string - Age int `ini:"age"` - Male bool - Born time.Time - Note - Created time.Time `ini:"-"` -} - -func main() { - cfg, err := ini.Load("path/to/ini") - // ... - p := new(Person) - err = cfg.MapTo(p) - // ... - - // Things can be simpler. - err = ini.MapTo(p, "path/to/ini") - // ... - - // Just map a section? Fine. - n := new(Note) - err = cfg.Section("Note").MapTo(n) - // ... -} -``` - -Can I have default value for field? Absolutely. - -Assign it before you map to struct. It will keep the value as it is if the key is not presented or got wrong type. - -```go -// ... -p := &Person{ - Name: "Joe", -} -// ... -``` - -It's really cool, but what's the point if you can't give me my file back from struct? - -### Reflect From Struct - -Why not? - -```go -type Embeded struct { - Dates []time.Time `delim:"|" comment:"Time data"` - Places []string `ini:"places,omitempty"` - None []int `ini:",omitempty"` -} - -type Author struct { - Name string `ini:"NAME"` - Male bool - Age int `comment:"Author's age"` - GPA float64 - NeverMind string `ini:"-"` - *Embeded `comment:"Embeded section"` -} - -func main() { - a := &Author{"Unknwon", true, 21, 2.8, "", - &Embeded{ - []time.Time{time.Now(), time.Now()}, - []string{"HangZhou", "Boston"}, - []int{}, - }} - cfg := ini.Empty() - err = ini.ReflectFrom(cfg, a) - // ... -} -``` - -So, what do I get? - -```ini -NAME = Unknwon -Male = true -; Author's age -Age = 21 -GPA = 2.8 - -; Embeded section -[Embeded] -; Time data -Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00 -places = HangZhou,Boston -``` - -#### Name Mapper - -To save your time and make your code cleaner, this library supports [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) between struct field and actual section and key name. - -There are 2 built-in name mappers: - -- `AllCapsUnderscore`: it converts to format `ALL_CAPS_UNDERSCORE` then match section or key. -- `TitleUnderscore`: it converts to format `title_underscore` then match section or key. - -To use them: - -```go -type Info struct { - PackageName string -} - -func main() { - err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini")) - // ... - - cfg, err := ini.Load([]byte("PACKAGE_NAME=ini")) - // ... - info := new(Info) - cfg.NameMapper = ini.AllCapsUnderscore - err = cfg.MapTo(info) - // ... -} -``` - -Same rules of name mapper apply to `ini.ReflectFromWithMapper` function. - -#### Value Mapper - -To expand values (e.g. from environment variables), you can use the `ValueMapper` to transform values: - -```go -type Env struct { - Foo string `ini:"foo"` -} - -func main() { - cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n") - cfg.ValueMapper = os.ExpandEnv - // ... - env := &Env{} - err = cfg.Section("env").MapTo(env) -} -``` - -This would set the value of `env.Foo` to the value of the environment variable `MY_VAR`. - -#### Other Notes On Map/Reflect - -Any embedded struct is treated as a section by default, and there is no automatic parent-child relations in map/reflect feature: - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child -} - -type Config struct { - City string - Parent -} -``` - -Example configuration: - -```ini -City = Boston - -[Parent] -Name = Unknwon - -[Child] -Age = 21 -``` - -What if, yes, I'm paranoid, I want embedded struct to be in the same section. Well, all roads lead to Rome. - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child `ini:"Parent"` -} - -type Config struct { - City string - Parent -} -``` - -Example configuration: - -```ini -City = Boston - -[Parent] -Name = Unknwon -Age = 21 -``` - -## Getting Help - -- [API Documentation](https://gowalker.org/gopkg.in/ini.v1) -- [File An Issue](https://github.com/go-ini/ini/issues/new) - -## FAQs - -### What does `BlockMode` field do? - -By default, library lets you read and write values so we need a locker to make sure your data is safe. But in cases that you are very sure about only reading data through the library, you can set `cfg.BlockMode = false` to speed up read operations about **50-70%** faster. - -### Why another INI library? - -Many people are using my another INI library [goconfig](https://github.com/Unknwon/goconfig), so the reason for this one is I would like to make more Go style code. Also when you set `cfg.BlockMode = false`, this one is about **10-30%** faster. - -To make those changes I have to confirm API broken, so it's safer to keep it in another place and start using `gopkg.in` to version my package at this time.(PS: shorter import path) - -## License - -This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/gopkg.in/ini.v1/README_ZH.md b/vendor/gopkg.in/ini.v1/README_ZH.md deleted file mode 100644 index 69aefef12e9..00000000000 --- a/vendor/gopkg.in/ini.v1/README_ZH.md +++ /dev/null @@ -1,750 +0,0 @@ -本包提供了 Go 语言中读写 INI 文件的功能。 - -## 功能特性 - -- 支持覆盖加载多个数据源(`[]byte`、文件和 `io.ReadCloser`) -- 支持递归读取键值 -- 支持读取父子分区 -- 支持读取自增键名 -- 支持读取多行的键值 -- 支持大量辅助方法 -- 支持在读取时直接转换为 Go 语言类型 -- 支持读取和 **写入** 分区和键的注释 -- 轻松操作分区、键值和注释 -- 在保存文件时分区和键值会保持原有的顺序 - -## 下载安装 - -使用一个特定版本: - - go get gopkg.in/ini.v1 - -使用最新版: - - go get github.com/go-ini/ini - -如需更新请添加 `-u` 选项。 - -### 测试安装 - -如果您想要在自己的机器上运行测试,请使用 `-t` 标记: - - go get -t gopkg.in/ini.v1 - -如需更新请添加 `-u` 选项。 - -## 开始使用 - -### 从数据源加载 - -一个 **数据源** 可以是 `[]byte` 类型的原始数据,`string` 类型的文件路径或 `io.ReadCloser`。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。 - -```go -cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data")))) -``` - -或者从一个空白的文件开始: - -```go -cfg := ini.Empty() -``` - -当您在一开始无法决定需要加载哪些数据源时,仍可以使用 **Append()** 在需要的时候加载它们。 - -```go -err := cfg.Append("other file", []byte("other raw data")) -``` - -当您想要加载一系列文件,但是不能够确定其中哪些文件是不存在的,可以通过调用函数 `LooseLoad` 来忽略它们(`Load` 会因为文件不存在而返回错误): - -```go -cfg, err := ini.LooseLoad("filename", "filename_404") -``` - -更牛逼的是,当那些之前不存在的文件在重新调用 `Reload` 方法的时候突然出现了,那么它们会被正常加载。 - -#### 忽略键名的大小写 - -有时候分区和键的名称大小写混合非常烦人,这个时候就可以通过 `InsensitiveLoad` 将所有分区和键名在读取里强制转换为小写: - -```go -cfg, err := ini.InsensitiveLoad("filename") -//... - -// sec1 和 sec2 指向同一个分区对象 -sec1, err := cfg.GetSection("Section") -sec2, err := cfg.GetSection("SecTIOn") - -// key1 和 key2 指向同一个键对象 -key1, err := sec1.GetKey("Key") -key2, err := sec2.GetKey("KeY") -``` - -#### 类似 MySQL 配置中的布尔值键 - -MySQL 的配置文件中会出现没有具体值的布尔类型的键: - -```ini -[mysqld] -... -skip-host-cache -skip-name-resolve -``` - -默认情况下这被认为是缺失值而无法完成解析,但可以通过高级的加载选项对它们进行处理: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{AllowBooleanKeys: true}, "my.cnf")) -``` - -这些键的值永远为 `true`,且在保存到文件时也只会输出键名。 - -如果您想要通过程序来生成此类键,则可以使用 `NewBooleanKey`: - -```go -key, err := sec.NewBooleanKey("skip-host-cache") -``` - -#### 关于注释 - -下述几种情况的内容将被视为注释: - -1. 所有以 `#` 或 `;` 开头的行 -2. 所有在 `#` 或 `;` 之后的内容 -3. 分区标签后的文字 (即 `[分区名]` 之后的内容) - -如果你希望使用包含 `#` 或 `;` 的值,请使用 ``` ` ``` 或 ``` """ ``` 进行包覆。 - -除此之外,您还可以通过 `LoadOptions` 完全忽略行内注释: - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true}, "app.ini")) -``` - -### 操作分区(Section) - -获取指定分区: - -```go -section, err := cfg.GetSection("section name") -``` - -如果您想要获取默认分区,则可以用空字符串代替分区名: - -```go -section, err := cfg.GetSection("") -``` - -当您非常确定某个分区是存在的,可以使用以下简便方法: - -```go -section := cfg.Section("section name") -``` - -如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。 - -创建一个分区: - -```go -err := cfg.NewSection("new section") -``` - -获取所有分区对象或名称: - -```go -sections := cfg.Sections() -names := cfg.SectionStrings() -``` - -### 操作键(Key) - -获取某个分区下的键: - -```go -key, err := cfg.Section("").GetKey("key name") -``` - -和分区一样,您也可以直接获取键而忽略错误处理: - -```go -key := cfg.Section("").Key("key name") -``` - -判断某个键是否存在: - -```go -yes := cfg.Section("").HasKey("key name") -``` - -创建一个新的键: - -```go -err := cfg.Section("").NewKey("name", "value") -``` - -获取分区下的所有键或键名: - -```go -keys := cfg.Section("").Keys() -names := cfg.Section("").KeyStrings() -``` - -获取分区下的所有键值对的克隆: - -```go -hash := cfg.Section("").KeysHash() -``` - -### 操作键值(Value) - -获取一个类型为字符串(string)的值: - -```go -val := cfg.Section("").Key("key name").String() -``` - -获取值的同时通过自定义函数进行处理验证: - -```go -val := cfg.Section("").Key("key name").Validate(func(in string) string { - if len(in) == 0 { - return "default" - } - return in -}) -``` - -如果您不需要任何对值的自动转变功能(例如递归读取),可以直接获取原值(这种方式性能最佳): - -```go -val := cfg.Section("").Key("key name").Value() -``` - -判断某个原值是否存在: - -```go -yes := cfg.Section("").HasValue("test value") -``` - -获取其它类型的值: - -```go -// 布尔值的规则: -// true 当值为:1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On -// false 当值为:0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off -v, err = cfg.Section("").Key("BOOL").Bool() -v, err = cfg.Section("").Key("FLOAT64").Float64() -v, err = cfg.Section("").Key("INT").Int() -v, err = cfg.Section("").Key("INT64").Int64() -v, err = cfg.Section("").Key("UINT").Uint() -v, err = cfg.Section("").Key("UINT64").Uint64() -v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) -v, err = cfg.Section("").Key("TIME").Time() // RFC3339 - -v = cfg.Section("").Key("BOOL").MustBool() -v = cfg.Section("").Key("FLOAT64").MustFloat64() -v = cfg.Section("").Key("INT").MustInt() -v = cfg.Section("").Key("INT64").MustInt64() -v = cfg.Section("").Key("UINT").MustUint() -v = cfg.Section("").Key("UINT64").MustUint64() -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) -v = cfg.Section("").Key("TIME").MustTime() // RFC3339 - -// 由 Must 开头的方法名允许接收一个相同类型的参数来作为默认值, -// 当键不存在或者转换失败时,则会直接返回该默认值。 -// 但是,MustString 方法必须传递一个默认值。 - -v = cfg.Seciont("").Key("String").MustString("default") -v = cfg.Section("").Key("BOOL").MustBool(true) -v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) -v = cfg.Section("").Key("INT").MustInt(10) -v = cfg.Section("").Key("INT64").MustInt64(99) -v = cfg.Section("").Key("UINT").MustUint(3) -v = cfg.Section("").Key("UINT64").MustUint64(6) -v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) -v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339 -``` - -如果我的值有好多行怎么办? - -```ini -[advance] -ADDRESS = """404 road, -NotFound, State, 5000 -Earth""" -``` - -嗯哼?小 case! - -```go -cfg.Section("advance").Key("ADDRESS").String() - -/* --- start --- -404 road, -NotFound, State, 5000 -Earth ------- end --- */ -``` - -赞爆了!那要是我属于一行的内容写不下想要写到第二行怎么办? - -```ini -[advance] -two_lines = how about \ - continuation lines? -lots_of_lines = 1 \ - 2 \ - 3 \ - 4 -``` - -简直是小菜一碟! - -```go -cfg.Section("advance").Key("two_lines").String() // how about continuation lines? -cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4 -``` - -可是我有时候觉得两行连在一起特别没劲,怎么才能不自动连接两行呢? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{ - IgnoreContinuation: true, -}, "filename") -``` - -哇靠给力啊! - -需要注意的是,值两侧的单引号会被自动剔除: - -```ini -foo = "some value" // foo: some value -bar = 'some value' // bar: some value -``` - -有时您会获得像从 [Crowdin](https://crowdin.com/) 网站下载的文件那样具有特殊格式的值(值使用双引号括起来,内部的双引号被转义): - -```ini -create_repo="创建了仓库 %s" -``` - -那么,怎么自动地将这类值进行处理呢? - -```go -cfg, err := ini.LoadSources(ini.LoadOptions{UnescapeValueDoubleQuotes: true}, "en-US.ini")) -cfg.Section("").Key("create_repo").String() -// You got: 创建了仓库 %s -``` - -这就是全部了?哈哈,当然不是。 - -#### 操作键值的辅助方法 - -获取键值时设定候选值: - -```go -v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) -v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) -v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) -v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) -v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) -v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) -v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) -v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 -``` - -如果获取到的值不是候选值的任意一个,则会返回默认值,而默认值不需要是候选值中的一员。 - -验证获取的值是否在指定范围内: - -```go -vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) -vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) -vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) -vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) -vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) -vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) -vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339 -``` - -##### 自动分割键值到切片(slice) - -当存在无效输入时,使用零值代替: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0] -vals = cfg.Section("").Key("STRINGS").Strings(",") -vals = cfg.Section("").Key("FLOAT64S").Float64s(",") -vals = cfg.Section("").Key("INTS").Ints(",") -vals = cfg.Section("").Key("INT64S").Int64s(",") -vals = cfg.Section("").Key("UINTS").Uints(",") -vals = cfg.Section("").Key("UINT64S").Uint64s(",") -vals = cfg.Section("").Key("TIMES").Times(",") -``` - -从结果切片中剔除无效输入: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> [2.2] -vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",") -vals = cfg.Section("").Key("INTS").ValidInts(",") -vals = cfg.Section("").Key("INT64S").ValidInt64s(",") -vals = cfg.Section("").Key("UINTS").ValidUints(",") -vals = cfg.Section("").Key("UINT64S").ValidUint64s(",") -vals = cfg.Section("").Key("TIMES").ValidTimes(",") -``` - -当存在无效输入时,直接返回错误: - -```go -// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4] -// Input: how, 2.2, are, you -> error -vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",") -vals = cfg.Section("").Key("INTS").StrictInts(",") -vals = cfg.Section("").Key("INT64S").StrictInt64s(",") -vals = cfg.Section("").Key("UINTS").StrictUints(",") -vals = cfg.Section("").Key("UINT64S").StrictUint64s(",") -vals = cfg.Section("").Key("TIMES").StrictTimes(",") -``` - -### 保存配置 - -终于到了这个时刻,是时候保存一下配置了。 - -比较原始的做法是输出配置到某个文件: - -```go -// ... -err = cfg.SaveTo("my.ini") -err = cfg.SaveToIndent("my.ini", "\t") -``` - -另一个比较高级的做法是写入到任何实现 `io.Writer` 接口的对象中: - -```go -// ... -cfg.WriteTo(writer) -cfg.WriteToIndent(writer, "\t") -``` - -默认情况下,空格将被用于对齐键值之间的等号以美化输出结果,以下代码可以禁用该功能: - -```go -ini.PrettyFormat = false -``` - -## 高级用法 - -### 递归读取键值 - -在获取所有键值的过程中,特殊语法 `%()s` 会被应用,其中 `` 可以是相同分区或者默认分区下的键名。字符串 `%()s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。 - -```ini -NAME = ini - -[author] -NAME = Unknwon -GITHUB = https://github.com/%(NAME)s - -[package] -FULL_NAME = github.com/go-ini/%(NAME)s -``` - -```go -cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon -cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini -``` - -### 读取父子分区 - -您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。 - -```ini -NAME = ini -VERSION = v1 -IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s - -[package] -CLONE_URL = https://%(IMPORT_PATH)s - -[package.sub] -``` - -```go -cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1 -``` - -#### 获取上级父分区下的所有键名 - -```go -cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"] -``` - -### 无法解析的分区 - -如果遇到一些比较特殊的分区,它们不包含常见的键值对,而是没有固定格式的纯文本,则可以使用 `LoadOptions.UnparsableSections` 进行处理: - -```go -cfg, err := LoadSources(ini.LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS] -<1> This slide has the fuel listed in the wrong units `)) - -body := cfg.Section("COMMENTS").Body() - -/* --- start --- -<1> This slide has the fuel listed in the wrong units ------- end --- */ -``` - -### 读取自增键名 - -如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。 - -```ini -[features] --: Support read/write comments of keys and sections --: Support auto-increment of key names --: Support load multiple files to overwrite key values -``` - -```go -cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"} -``` - -### 映射到结构 - -想要使用更加面向对象的方式玩转 INI 吗?好主意。 - -```ini -Name = Unknwon -age = 21 -Male = true -Born = 1993-01-01T20:17:05Z - -[Note] -Content = Hi is a good man! -Cities = HangZhou, Boston -``` - -```go -type Note struct { - Content string - Cities []string -} - -type Person struct { - Name string - Age int `ini:"age"` - Male bool - Born time.Time - Note - Created time.Time `ini:"-"` -} - -func main() { - cfg, err := ini.Load("path/to/ini") - // ... - p := new(Person) - err = cfg.MapTo(p) - // ... - - // 一切竟可以如此的简单。 - err = ini.MapTo(p, "path/to/ini") - // ... - - // 嗯哼?只需要映射一个分区吗? - n := new(Note) - err = cfg.Section("Note").MapTo(n) - // ... -} -``` - -结构的字段怎么设置默认值呢?很简单,只要在映射之前对指定字段进行赋值就可以了。如果键未找到或者类型错误,该值不会发生改变。 - -```go -// ... -p := &Person{ - Name: "Joe", -} -// ... -``` - -这样玩 INI 真的好酷啊!然而,如果不能还给我原来的配置文件,有什么卵用? - -### 从结构反射 - -可是,我有说不能吗? - -```go -type Embeded struct { - Dates []time.Time `delim:"|" comment:"Time data"` - Places []string `ini:"places,omitempty"` - None []int `ini:",omitempty"` -} - -type Author struct { - Name string `ini:"NAME"` - Male bool - Age int `comment:"Author's age"` - GPA float64 - NeverMind string `ini:"-"` - *Embeded `comment:"Embeded section"` -} - -func main() { - a := &Author{"Unknwon", true, 21, 2.8, "", - &Embeded{ - []time.Time{time.Now(), time.Now()}, - []string{"HangZhou", "Boston"}, - []int{}, - }} - cfg := ini.Empty() - err = ini.ReflectFrom(cfg, a) - // ... -} -``` - -瞧瞧,奇迹发生了。 - -```ini -NAME = Unknwon -Male = true -; Author's age -Age = 21 -GPA = 2.8 - -; Embeded section -[Embeded] -; Time data -Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00 -places = HangZhou,Boston -``` - -#### 名称映射器(Name Mapper) - -为了节省您的时间并简化代码,本库支持类型为 [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) 的名称映射器,该映射器负责结构字段名与分区名和键名之间的映射。 - -目前有 2 款内置的映射器: - -- `AllCapsUnderscore`:该映射器将字段名转换至格式 `ALL_CAPS_UNDERSCORE` 后再去匹配分区名和键名。 -- `TitleUnderscore`:该映射器将字段名转换至格式 `title_underscore` 后再去匹配分区名和键名。 - -使用方法: - -```go -type Info struct{ - PackageName string -} - -func main() { - err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini")) - // ... - - cfg, err := ini.Load([]byte("PACKAGE_NAME=ini")) - // ... - info := new(Info) - cfg.NameMapper = ini.AllCapsUnderscore - err = cfg.MapTo(info) - // ... -} -``` - -使用函数 `ini.ReflectFromWithMapper` 时也可应用相同的规则。 - -#### 值映射器(Value Mapper) - -值映射器允许使用一个自定义函数自动展开值的具体内容,例如:运行时获取环境变量: - -```go -type Env struct { - Foo string `ini:"foo"` -} - -func main() { - cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n") - cfg.ValueMapper = os.ExpandEnv - // ... - env := &Env{} - err = cfg.Section("env").MapTo(env) -} -``` - -本例中,`env.Foo` 将会是运行时所获取到环境变量 `MY_VAR` 的值。 - -#### 映射/反射的其它说明 - -任何嵌入的结构都会被默认认作一个不同的分区,并且不会自动产生所谓的父子分区关联: - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child -} - -type Config struct { - City string - Parent -} -``` - -示例配置文件: - -```ini -City = Boston - -[Parent] -Name = Unknwon - -[Child] -Age = 21 -``` - -很好,但是,我就是要嵌入结构也在同一个分区。好吧,你爹是李刚! - -```go -type Child struct { - Age string -} - -type Parent struct { - Name string - Child `ini:"Parent"` -} - -type Config struct { - City string - Parent -} -``` - -示例配置文件: - -```ini -City = Boston - -[Parent] -Name = Unknwon -Age = 21 -``` - -## 获取帮助 - -- [API 文档](https://gowalker.org/gopkg.in/ini.v1) -- [创建工单](https://github.com/go-ini/ini/issues/new) - -## 常见问题 - -### 字段 `BlockMode` 是什么? - -默认情况下,本库会在您进行读写操作时采用锁机制来确保数据时间。但在某些情况下,您非常确定只进行读操作。此时,您可以通过设置 `cfg.BlockMode = false` 来将读操作提升大约 **50-70%** 的性能。 - -### 为什么要写另一个 INI 解析库? - -许多人都在使用我的 [goconfig](https://github.com/Unknwon/goconfig) 来完成对 INI 文件的操作,但我希望使用更加 Go 风格的代码。并且当您设置 `cfg.BlockMode = false` 时,会有大约 **10-30%** 的性能提升。 - -为了做出这些改变,我必须对 API 进行破坏,所以新开一个仓库是最安全的做法。除此之外,本库直接使用 `gopkg.in` 来进行版本化发布。(其实真相是导入路径更短了) diff --git a/vendor/gopkg.in/macaron.v1/.gitignore b/vendor/gopkg.in/macaron.v1/.gitignore deleted file mode 100644 index fc5aca3e479..00000000000 --- a/vendor/gopkg.in/macaron.v1/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -macaron.sublime-project -macaron.sublime-workspace -.idea diff --git a/vendor/gopkg.in/macaron.v1/README.md b/vendor/gopkg.in/macaron.v1/README.md deleted file mode 100644 index b395b3893a2..00000000000 --- a/vendor/gopkg.in/macaron.v1/README.md +++ /dev/null @@ -1,93 +0,0 @@ -Macaron [![Build Status](https://travis-ci.org/go-macaron/macaron.svg?branch=v1)](https://travis-ci.org/go-macaron/macaron) -======================= - -![Macaron Logo](https://raw.githubusercontent.com/go-macaron/macaron/v1/macaronlogo.png) - -Package macaron is a high productive and modular web framework in Go. - -## Getting Started - -The minimum requirement of Go is **1.3**. - -To install Macaron: - - go get gopkg.in/macaron.v1 - -The very basic usage of Macaron: - -```go -package main - -import "gopkg.in/macaron.v1" - -func main() { - m := macaron.Classic() - m.Get("/", func() string { - return "Hello world!" - }) - m.Run() -} -``` - -## Features - -- Powerful routing with suburl. -- Flexible routes combinations. -- Unlimited nested group routers. -- Directly integrate with existing services. -- Dynamically change template files at runtime. -- Allow to use in-memory template and static files. -- Easy to plugin/unplugin features with modular design. -- Handy dependency injection powered by [inject](https://github.com/codegangsta/inject). -- Better router layer and less reflection make faster speed. - -## Middlewares - -Middlewares allow you easily plugin/unplugin features for your Macaron applications. - -There are already many [middlewares](https://github.com/go-macaron) to simplify your work: - -- render - Go template engine -- static - Serves static files -- [gzip](https://github.com/go-macaron/gzip) - Gzip compression to all responses -- [binding](https://github.com/go-macaron/binding) - Request data binding and validation -- [i18n](https://github.com/go-macaron/i18n) - Internationalization and Localization -- [cache](https://github.com/go-macaron/cache) - Cache manager -- [session](https://github.com/go-macaron/session) - Session manager -- [csrf](https://github.com/go-macaron/csrf) - Generates and validates csrf tokens -- [captcha](https://github.com/go-macaron/captcha) - Captcha service -- [pongo2](https://github.com/go-macaron/pongo2) - Pongo2 template engine support -- [sockets](https://github.com/go-macaron/sockets) - WebSockets channels binding -- [bindata](https://github.com/go-macaron/bindata) - Embed binary data as static and template files -- [toolbox](https://github.com/go-macaron/toolbox) - Health check, pprof, profile and statistic services -- [oauth2](https://github.com/go-macaron/oauth2) - OAuth 2.0 backend -- [authz](https://github.com/go-macaron/authz) - ACL/RBAC/ABAC authorization based on Casbin -- [switcher](https://github.com/go-macaron/switcher) - Multiple-site support -- [method](https://github.com/go-macaron/method) - HTTP method override -- [permissions2](https://github.com/xyproto/permissions2) - Cookies, users and permissions -- [renders](https://github.com/go-macaron/renders) - Beego-like render engine(Macaron has built-in template engine, this is another option) -- [piwik](https://github.com/veecue/piwik-middleware) - Server-side piwik analytics - -## Use Cases - -- [Gogs](https://gogs.io): A painless self-hosted Git Service -- [Grafana](http://grafana.org/): The open platform for beautiful analytics and monitoring -- [Peach](https://peachdocs.org): A modern web documentation server -- [Go Walker](https://gowalker.org): Go online API documentation -- [Switch](https://gopm.io): Gopm registry -- [Critical Stack Intel](https://intel.criticalstack.com/): A 100% free intel marketplace from Critical Stack, Inc. - -## Getting Help - -- [API Reference](https://gowalker.org/gopkg.in/macaron.v1) -- [Documentation](https://go-macaron.com) -- [FAQs](https://go-macaron.com/docs/faqs) - -## Credits - -- Basic design of [Martini](https://github.com/go-martini/martini). -- Logo is modified by [@insionng](https://github.com/insionng) based on [Tribal Dragon](http://xtremeyamazaki.deviantart.com/art/Tribal-Dragon-27005087). - -## License - -This project is under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/gopkg.in/macaron.v1/fixtures/symlink b/vendor/gopkg.in/macaron.v1/fixtures/symlink new file mode 120000 index 00000000000..ea5233d8e93 --- /dev/null +++ b/vendor/gopkg.in/macaron.v1/fixtures/symlink @@ -0,0 +1 @@ +basic \ No newline at end of file diff --git a/vendor/gopkg.in/macaron.v1/macaronlogo.png b/vendor/gopkg.in/macaron.v1/macaronlogo.png deleted file mode 100644 index 399759769a8..00000000000 Binary files a/vendor/gopkg.in/macaron.v1/macaronlogo.png and /dev/null differ diff --git a/vendor/gopkg.in/redis.v2/.travis.yml b/vendor/gopkg.in/redis.v2/.travis.yml deleted file mode 100644 index c3cf4b8a6e3..00000000000 --- a/vendor/gopkg.in/redis.v2/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go - -services: -- redis-server - -go: - - 1.1 - - 1.2 - - 1.3 - - tip - -install: - - go get gopkg.in/bufio.v1 - - go get gopkg.in/check.v1 - - mkdir -p $HOME/gopath/src/gopkg.in - - ln -s `pwd` $HOME/gopath/src/gopkg.in/redis.v2 - -before_script: - - redis-server testdata/sentinel.conf --sentinel & diff --git a/vendor/gopkg.in/redis.v2/Makefile b/vendor/gopkg.in/redis.v2/Makefile deleted file mode 100644 index b250d9bfa96..00000000000 --- a/vendor/gopkg.in/redis.v2/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -all: - go test gopkg.in/redis.v2 -cpu=1,2,4 - go test gopkg.in/redis.v2 -short -race diff --git a/vendor/gopkg.in/redis.v2/README.md b/vendor/gopkg.in/redis.v2/README.md deleted file mode 100644 index ddf875f9a19..00000000000 --- a/vendor/gopkg.in/redis.v2/README.md +++ /dev/null @@ -1,46 +0,0 @@ -Redis client for Golang [![Build Status](https://travis-ci.org/go-redis/redis.png?branch=master)](https://travis-ci.org/go-redis/redis) -======================= - -Supports: - -- Redis 2.8 commands except QUIT, MONITOR, SLOWLOG and SYNC. -- Pub/sub. -- Transactions. -- Pipelining. -- Connection pool. -- TLS connections. -- Thread safety. -- Timeouts. -- Redis Sentinel. - -API docs: http://godoc.org/gopkg.in/redis.v2. -Examples: http://godoc.org/gopkg.in/redis.v2#pkg-examples. - -Installation ------------- - -Install: - - go get gopkg.in/redis.v2 - -Look and feel -------------- - -Some corner cases: - - SORT list LIMIT 0 2 ASC - vals, err := client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result() - - ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2 - vals, err := client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{ - Min: "-inf", - Max: "+inf", - Offset: 0, - Count: 2, - }).Result() - - ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM - vals, err := client.ZInterStore("out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2").Result() - - EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello" - vals, err := client.Eval("return {KEYS[1],ARGV[1]}", []string{"key"}, []string{"hello"}).Result() diff --git a/vendor/gopkg.in/redis.v2/example_test.go b/vendor/gopkg.in/redis.v2/example_test.go deleted file mode 100644 index dbc95131033..00000000000 --- a/vendor/gopkg.in/redis.v2/example_test.go +++ /dev/null @@ -1,180 +0,0 @@ -package redis_test - -import ( - "fmt" - "strconv" - - "gopkg.in/redis.v2" -) - -var client *redis.Client - -func init() { - client = redis.NewTCPClient(&redis.Options{ - Addr: ":6379", - }) - client.FlushDb() -} - -func ExampleNewTCPClient() { - client := redis.NewTCPClient(&redis.Options{ - Addr: "localhost:6379", - Password: "", // no password set - DB: 0, // use default DB - }) - - pong, err := client.Ping().Result() - fmt.Println(pong, err) - // Output: PONG -} - -func ExampleNewFailoverClient() { - client := redis.NewFailoverClient(&redis.FailoverOptions{ - MasterName: "master", - SentinelAddrs: []string{":26379"}, - }) - - pong, err := client.Ping().Result() - fmt.Println(pong, err) - // Output: PONG -} - -func ExampleClient() { - if err := client.Set("foo", "bar").Err(); err != nil { - panic(err) - } - - v, err := client.Get("hello").Result() - fmt.Printf("%q %q %v", v, err, err == redis.Nil) - // Output: "" "redis: nil" true -} - -func ExampleClient_Incr() { - if err := client.Incr("counter").Err(); err != nil { - panic(err) - } - - n, err := client.Get("counter").Int64() - fmt.Println(n, err) - // Output: 1 -} - -func ExampleClient_Pipelined() { - cmds, err := client.Pipelined(func(c *redis.Pipeline) error { - c.Set("key1", "hello1") - c.Get("key1") - return nil - }) - fmt.Println(err) - set := cmds[0].(*redis.StatusCmd) - fmt.Println(set) - get := cmds[1].(*redis.StringCmd) - fmt.Println(get) - // Output: - // SET key1 hello1: OK - // GET key1: hello1 -} - -func ExamplePipeline() { - pipeline := client.Pipeline() - set := pipeline.Set("key1", "hello1") - get := pipeline.Get("key1") - cmds, err := pipeline.Exec() - fmt.Println(cmds, err) - fmt.Println(set) - fmt.Println(get) - // Output: [SET key1 hello1: OK GET key1: hello1] - // SET key1 hello1: OK - // GET key1: hello1 -} - -func ExampleMulti() { - incr := func(tx *redis.Multi) ([]redis.Cmder, error) { - s, err := tx.Get("key").Result() - if err != nil && err != redis.Nil { - return nil, err - } - n, _ := strconv.ParseInt(s, 10, 64) - - return tx.Exec(func() error { - tx.Set("key", strconv.FormatInt(n+1, 10)) - return nil - }) - } - - client.Del("key") - - tx := client.Multi() - defer tx.Close() - - watch := tx.Watch("key") - _ = watch.Err() - - for { - cmds, err := incr(tx) - if err == redis.TxFailedErr { - continue - } else if err != nil { - panic(err) - } - fmt.Println(cmds, err) - break - } - - // Output: [SET key 1: OK] -} - -func ExamplePubSub() { - pubsub := client.PubSub() - defer pubsub.Close() - - err := pubsub.Subscribe("mychannel") - _ = err - - msg, err := pubsub.Receive() - fmt.Println(msg, err) - - pub := client.Publish("mychannel", "hello") - _ = pub.Err() - - msg, err = pubsub.Receive() - fmt.Println(msg, err) - - // Output: subscribe: mychannel - // Message -} - -func ExampleScript() { - setnx := redis.NewScript(` - if redis.call("get", KEYS[1]) == false then - redis.call("set", KEYS[1], ARGV[1]) - return 1 - end - return 0 - `) - - v1, err := setnx.Run(client, []string{"keynx"}, []string{"foo"}).Result() - fmt.Println(v1.(int64), err) - - v2, err := setnx.Run(client, []string{"keynx"}, []string{"bar"}).Result() - fmt.Println(v2.(int64), err) - - get := client.Get("keynx") - fmt.Println(get) - - // Output: 1 - // 0 - // GET keynx: foo -} - -func Example_customCommand() { - Get := func(client *redis.Client, key string) *redis.StringCmd { - cmd := redis.NewStringCmd("GET", key) - client.Process(cmd) - return cmd - } - - v, err := Get(client, "key_does_not_exist").Result() - fmt.Printf("%q %s", v, err) - // Output: "" redis: nil -} diff --git a/vendor/gopkg.in/redis.v2/export_test.go b/vendor/gopkg.in/redis.v2/export_test.go deleted file mode 100644 index 7f7fa67972b..00000000000 --- a/vendor/gopkg.in/redis.v2/export_test.go +++ /dev/null @@ -1,5 +0,0 @@ -package redis - -func (c *baseClient) Pool() pool { - return c.connPool -} diff --git a/vendor/gopkg.in/redis.v2/parser_test.go b/vendor/gopkg.in/redis.v2/parser_test.go deleted file mode 100644 index 1b9e15810a8..00000000000 --- a/vendor/gopkg.in/redis.v2/parser_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package redis - -import ( - "testing" - - "gopkg.in/bufio.v1" -) - -func BenchmarkParseReplyStatus(b *testing.B) { - benchmarkParseReply(b, "+OK\r\n", nil, false) -} - -func BenchmarkParseReplyInt(b *testing.B) { - benchmarkParseReply(b, ":1\r\n", nil, false) -} - -func BenchmarkParseReplyError(b *testing.B) { - benchmarkParseReply(b, "-Error message\r\n", nil, true) -} - -func BenchmarkParseReplyString(b *testing.B) { - benchmarkParseReply(b, "$5\r\nhello\r\n", nil, false) -} - -func BenchmarkParseReplySlice(b *testing.B) { - benchmarkParseReply(b, "*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n", parseSlice, false) -} - -func benchmarkParseReply(b *testing.B, reply string, p multiBulkParser, wanterr bool) { - b.StopTimer() - - buf := &bufio.Buffer{} - rd := bufio.NewReader(buf) - for i := 0; i < b.N; i++ { - buf.WriteString(reply) - } - - b.StartTimer() - - for i := 0; i < b.N; i++ { - _, err := parseReply(rd, p) - if !wanterr && err != nil { - panic(err) - } - } -} - -func BenchmarkAppendArgs(b *testing.B) { - buf := make([]byte, 0, 64) - args := []string{"hello", "world", "foo", "bar"} - for i := 0; i < b.N; i++ { - appendArgs(buf, args) - } -} diff --git a/vendor/gopkg.in/redis.v2/rate_limit_test.go b/vendor/gopkg.in/redis.v2/rate_limit_test.go deleted file mode 100644 index 2f0d41a2eb9..00000000000 --- a/vendor/gopkg.in/redis.v2/rate_limit_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package redis - -import ( - "sync" - "testing" - "time" -) - -func TestRateLimiter(t *testing.T) { - var n = 100000 - if testing.Short() { - n = 1000 - } - rl := newRateLimiter(time.Minute, n) - - wg := &sync.WaitGroup{} - for i := 0; i < n; i++ { - wg.Add(1) - go func() { - if !rl.Check() { - panic("check failed") - } - wg.Done() - }() - } - wg.Wait() - - if rl.Check() && rl.Check() { - t.Fatal("check passed") - } -} diff --git a/vendor/gopkg.in/redis.v2/redis_test.go b/vendor/gopkg.in/redis.v2/redis_test.go deleted file mode 100644 index 49f84d0e1e4..00000000000 --- a/vendor/gopkg.in/redis.v2/redis_test.go +++ /dev/null @@ -1,3333 +0,0 @@ -package redis_test - -import ( - "bytes" - "fmt" - "io" - "net" - "sort" - "strconv" - "sync" - "testing" - "time" - - "gopkg.in/redis.v2" - - . "gopkg.in/check.v1" -) - -const redisAddr = ":6379" - -//------------------------------------------------------------------------------ - -func sortStrings(slice []string) []string { - sort.Strings(slice) - return slice -} - -//------------------------------------------------------------------------------ - -type RedisConnectorTest struct{} - -var _ = Suite(&RedisConnectorTest{}) - -func (t *RedisConnectorTest) TestShutdown(c *C) { - c.Skip("shutdowns server") - - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - - shutdown := client.Shutdown() - c.Check(shutdown.Err(), Equals, io.EOF) - c.Check(shutdown.Val(), Equals, "") - - ping := client.Ping() - c.Check(ping.Err(), ErrorMatches, "dial tcp :[0-9]+: connection refused") - c.Check(ping.Val(), Equals, "") -} - -func (t *RedisConnectorTest) TestNewTCPClient(c *C) { - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - ping := client.Ping() - c.Check(ping.Err(), IsNil) - c.Check(ping.Val(), Equals, "PONG") - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestNewUnixClient(c *C) { - c.Skip("not available on Travis CI") - - client := redis.NewUnixClient(&redis.Options{ - Addr: "/tmp/redis.sock", - }) - ping := client.Ping() - c.Check(ping.Err(), IsNil) - c.Check(ping.Val(), Equals, "PONG") - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestDialer(c *C) { - client := redis.NewClient(&redis.Options{ - Dialer: func() (net.Conn, error) { - return net.Dial("tcp", redisAddr) - }, - }) - ping := client.Ping() - c.Check(ping.Err(), IsNil) - c.Check(ping.Val(), Equals, "PONG") - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestClose(c *C) { - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - c.Assert(client.Close(), IsNil) - - ping := client.Ping() - c.Assert(ping.Err(), Not(IsNil)) - c.Assert(ping.Err().Error(), Equals, "redis: client is closed") - - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestPubSubClose(c *C) { - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - - pubsub := client.PubSub() - c.Assert(pubsub.Close(), IsNil) - - _, err := pubsub.Receive() - c.Assert(err, Not(IsNil)) - c.Assert(err.Error(), Equals, "redis: client is closed") - - ping := client.Ping() - c.Assert(ping.Err(), IsNil) - - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestMultiClose(c *C) { - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - - multi := client.Multi() - c.Assert(multi.Close(), IsNil) - - _, err := multi.Exec(func() error { - multi.Ping() - return nil - }) - c.Assert(err, Not(IsNil)) - c.Assert(err.Error(), Equals, "redis: client is closed") - - ping := client.Ping() - c.Assert(ping.Err(), IsNil) - - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestPipelineClose(c *C) { - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - - _, err := client.Pipelined(func(pipeline *redis.Pipeline) error { - c.Assert(pipeline.Close(), IsNil) - pipeline.Ping() - return nil - }) - c.Assert(err, Not(IsNil)) - c.Assert(err.Error(), Equals, "redis: client is closed") - - ping := client.Ping() - c.Assert(ping.Err(), IsNil) - - c.Assert(client.Close(), IsNil) -} - -func (t *RedisConnectorTest) TestIdleTimeout(c *C) { - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - IdleTimeout: time.Nanosecond, - }) - for i := 0; i < 10; i++ { - c.Assert(client.Ping().Err(), IsNil) - } -} - -func (t *RedisConnectorTest) TestSelectDb(c *C) { - client1 := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - DB: 1, - }) - c.Assert(client1.Set("key", "db1").Err(), IsNil) - - client2 := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - DB: 2, - }) - c.Assert(client2.Get("key").Err(), Equals, redis.Nil) -} - -//------------------------------------------------------------------------------ - -type RedisConnPoolTest struct { - client *redis.Client -} - -var _ = Suite(&RedisConnPoolTest{}) - -func (t *RedisConnPoolTest) SetUpTest(c *C) { - t.client = redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) -} - -func (t *RedisConnPoolTest) TearDownTest(c *C) { - c.Assert(t.client.FlushDb().Err(), IsNil) - c.Assert(t.client.Close(), IsNil) -} - -func (t *RedisConnPoolTest) TestConnPoolMaxSize(c *C) { - wg := &sync.WaitGroup{} - for i := 0; i < 1000; i++ { - wg.Add(1) - go func() { - ping := t.client.Ping() - c.Assert(ping.Err(), IsNil) - c.Assert(ping.Val(), Equals, "PONG") - wg.Done() - }() - } - wg.Wait() - - c.Assert(t.client.Pool().Size(), Equals, 10) - c.Assert(t.client.Pool().Len(), Equals, 10) -} - -func (t *RedisConnPoolTest) TestConnPoolMaxSizeOnPipelineClient(c *C) { - const N = 1000 - - wg := &sync.WaitGroup{} - wg.Add(N) - for i := 0; i < N; i++ { - go func() { - pipeline := t.client.Pipeline() - ping := pipeline.Ping() - cmds, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 1) - c.Assert(ping.Err(), IsNil) - c.Assert(ping.Val(), Equals, "PONG") - - c.Assert(pipeline.Close(), IsNil) - - wg.Done() - }() - } - wg.Wait() - - c.Assert(t.client.Pool().Size(), Equals, 10) - c.Assert(t.client.Pool().Len(), Equals, 10) -} - -func (t *RedisConnPoolTest) TestConnPoolMaxSizeOnMultiClient(c *C) { - const N = 1000 - - wg := &sync.WaitGroup{} - wg.Add(N) - for i := 0; i < N; i++ { - go func() { - multi := t.client.Multi() - var ping *redis.StatusCmd - cmds, err := multi.Exec(func() error { - ping = multi.Ping() - return nil - }) - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 1) - c.Assert(ping.Err(), IsNil) - c.Assert(ping.Val(), Equals, "PONG") - - c.Assert(multi.Close(), IsNil) - - wg.Done() - }() - } - wg.Wait() - - c.Assert(t.client.Pool().Size(), Equals, 10) - c.Assert(t.client.Pool().Len(), Equals, 10) -} - -func (t *RedisConnPoolTest) TestConnPoolMaxSizeOnPubSub(c *C) { - const N = 10 - - wg := &sync.WaitGroup{} - wg.Add(N) - for i := 0; i < N; i++ { - go func() { - defer wg.Done() - pubsub := t.client.PubSub() - c.Assert(pubsub.Subscribe(), IsNil) - c.Assert(pubsub.Close(), IsNil) - }() - } - wg.Wait() - - c.Assert(t.client.Pool().Size(), Equals, 0) - c.Assert(t.client.Pool().Len(), Equals, 0) -} - -func (t *RedisConnPoolTest) TestConnPoolRemovesBrokenConn(c *C) { - cn, _, err := t.client.Pool().Get() - c.Assert(err, IsNil) - c.Assert(cn.Close(), IsNil) - c.Assert(t.client.Pool().Put(cn), IsNil) - - ping := t.client.Ping() - c.Assert(ping.Err().Error(), Equals, "use of closed network connection") - c.Assert(ping.Val(), Equals, "") - - ping = t.client.Ping() - c.Assert(ping.Err(), IsNil) - c.Assert(ping.Val(), Equals, "PONG") - - c.Assert(t.client.Pool().Size(), Equals, 1) - c.Assert(t.client.Pool().Len(), Equals, 1) -} - -func (t *RedisConnPoolTest) TestConnPoolReusesConn(c *C) { - for i := 0; i < 1000; i++ { - ping := t.client.Ping() - c.Assert(ping.Err(), IsNil) - c.Assert(ping.Val(), Equals, "PONG") - } - - c.Assert(t.client.Pool().Size(), Equals, 1) - c.Assert(t.client.Pool().Len(), Equals, 1) -} - -//------------------------------------------------------------------------------ - -type RedisTest struct { - client *redis.Client -} - -var _ = Suite(&RedisTest{}) - -func Test(t *testing.T) { TestingT(t) } - -func (t *RedisTest) SetUpTest(c *C) { - t.client = redis.NewTCPClient(&redis.Options{ - Addr: ":6379", - }) - - // This is much faster than Flushall. - c.Assert(t.client.Select(1).Err(), IsNil) - c.Assert(t.client.FlushDb().Err(), IsNil) - c.Assert(t.client.Select(0).Err(), IsNil) - c.Assert(t.client.FlushDb().Err(), IsNil) -} - -func (t *RedisTest) TearDownTest(c *C) { - c.Assert(t.client.Close(), IsNil) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestCmdStringMethod(c *C) { - set := t.client.Set("foo", "bar") - c.Assert(set.String(), Equals, "SET foo bar: OK") - - get := t.client.Get("foo") - c.Assert(get.String(), Equals, "GET foo: bar") -} - -func (t *RedisTest) TestCmdStringMethodError(c *C) { - get2 := t.client.Get("key_does_not_exists") - c.Assert(get2.String(), Equals, "GET key_does_not_exists: redis: nil") -} - -func (t *RedisTest) TestRunWithouthCheckingErrVal(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") - - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") -} - -func (t *RedisTest) TestGetSpecChars(c *C) { - set := t.client.Set("key", "hello1\r\nhello2\r\n") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello1\r\nhello2\r\n") -} - -func (t *RedisTest) TestGetBigVal(c *C) { - val := string(bytes.Repeat([]byte{'*'}, 1<<16)) - - set := t.client.Set("key", val) - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, val) -} - -func (t *RedisTest) TestManyKeys(c *C) { - var n = 100000 - - for i := 0; i < n; i++ { - t.client.Set("keys.key"+strconv.Itoa(i), "hello"+strconv.Itoa(i)) - } - keys := t.client.Keys("keys.*") - c.Assert(keys.Err(), IsNil) - c.Assert(len(keys.Val()), Equals, n) -} - -func (t *RedisTest) TestManyKeys2(c *C) { - var n = 100000 - - keys := []string{"non-existent-key"} - for i := 0; i < n; i++ { - key := "keys.key" + strconv.Itoa(i) - t.client.Set(key, "hello"+strconv.Itoa(i)) - keys = append(keys, key) - } - keys = append(keys, "non-existent-key") - - mget := t.client.MGet(keys...) - c.Assert(mget.Err(), IsNil) - c.Assert(len(mget.Val()), Equals, n+2) - vals := mget.Val() - for i := 0; i < n; i++ { - c.Assert(vals[i+1], Equals, "hello"+strconv.Itoa(i)) - } - c.Assert(vals[0], Equals, nil) - c.Assert(vals[n+1], Equals, nil) -} - -func (t *RedisTest) TestStringCmdHelpers(c *C) { - set := t.client.Set("key", "10") - c.Assert(set.Err(), IsNil) - - n, err := t.client.Get("key").Int64() - c.Assert(err, IsNil) - c.Assert(n, Equals, int64(10)) - - un, err := t.client.Get("key").Uint64() - c.Assert(err, IsNil) - c.Assert(un, Equals, uint64(10)) - - f, err := t.client.Get("key").Float64() - c.Assert(err, IsNil) - c.Assert(f, Equals, float64(10)) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestAuth(c *C) { - auth := t.client.Auth("password") - c.Assert(auth.Err(), ErrorMatches, "ERR Client sent AUTH, but no password is set") - c.Assert(auth.Val(), Equals, "") -} - -func (t *RedisTest) TestEcho(c *C) { - echo := t.client.Echo("hello") - c.Assert(echo.Err(), IsNil) - c.Assert(echo.Val(), Equals, "hello") -} - -func (t *RedisTest) TestPing(c *C) { - ping := t.client.Ping() - c.Assert(ping.Err(), IsNil) - c.Assert(ping.Val(), Equals, "PONG") -} - -func (t *RedisTest) TestSelect(c *C) { - sel := t.client.Select(1) - c.Assert(sel.Err(), IsNil) - c.Assert(sel.Val(), Equals, "OK") -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestCmdKeysDel(c *C) { - set := t.client.Set("key1", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - set = t.client.Set("key2", "World") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - del := t.client.Del("key1", "key2", "key3") - c.Assert(del.Err(), IsNil) - c.Assert(del.Val(), Equals, int64(2)) -} - -func (t *RedisTest) TestCmdKeysDump(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - dump := t.client.Dump("key") - c.Assert(dump.Err(), IsNil) - c.Assert(dump.Val(), Equals, "\x00\x05hello\x06\x00\xf5\x9f\xb7\xf6\x90a\x1c\x99") -} - -func (t *RedisTest) TestCmdKeysExists(c *C) { - set := t.client.Set("key1", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - exists := t.client.Exists("key1") - c.Assert(exists.Err(), IsNil) - c.Assert(exists.Val(), Equals, true) - - exists = t.client.Exists("key2") - c.Assert(exists.Err(), IsNil) - c.Assert(exists.Val(), Equals, false) -} - -func (t *RedisTest) TestCmdKeysExpire(c *C) { - set := t.client.Set("key", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - expire := t.client.Expire("key", 10*time.Second) - c.Assert(expire.Err(), IsNil) - c.Assert(expire.Val(), Equals, true) - - ttl := t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val(), Equals, 10*time.Second) - - set = t.client.Set("key", "Hello World") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - ttl = t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val() < 0, Equals, true) -} - -func (t *RedisTest) TestCmdKeysExpireAt(c *C) { - set := t.client.Set("key", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - exists := t.client.Exists("key") - c.Assert(exists.Err(), IsNil) - c.Assert(exists.Val(), Equals, true) - - expireAt := t.client.ExpireAt("key", time.Now().Add(-time.Hour)) - c.Assert(expireAt.Err(), IsNil) - c.Assert(expireAt.Val(), Equals, true) - - exists = t.client.Exists("key") - c.Assert(exists.Err(), IsNil) - c.Assert(exists.Val(), Equals, false) -} - -func (t *RedisTest) TestCmdKeysKeys(c *C) { - mset := t.client.MSet("one", "1", "two", "2", "three", "3", "four", "4") - c.Assert(mset.Err(), IsNil) - c.Assert(mset.Val(), Equals, "OK") - - keys := t.client.Keys("*o*") - c.Assert(keys.Err(), IsNil) - c.Assert(sortStrings(keys.Val()), DeepEquals, []string{"four", "one", "two"}) - - keys = t.client.Keys("t??") - c.Assert(keys.Err(), IsNil) - c.Assert(keys.Val(), DeepEquals, []string{"two"}) - - keys = t.client.Keys("*") - c.Assert(keys.Err(), IsNil) - c.Assert( - sortStrings(keys.Val()), - DeepEquals, - []string{"four", "one", "three", "two"}, - ) -} - -func (t *RedisTest) TestCmdKeysMigrate(c *C) { - migrate := t.client.Migrate("localhost", "6380", "key", 0, 0) - c.Assert(migrate.Err(), IsNil) - c.Assert(migrate.Val(), Equals, "NOKEY") - - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - migrate = t.client.Migrate("localhost", "6380", "key", 0, 0) - c.Assert(migrate.Err(), ErrorMatches, "IOERR error or timeout writing to target instance") - c.Assert(migrate.Val(), Equals, "") -} - -func (t *RedisTest) TestCmdKeysMove(c *C) { - move := t.client.Move("key", 1) - c.Assert(move.Err(), IsNil) - c.Assert(move.Val(), Equals, false) - - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - move = t.client.Move("key", 1) - c.Assert(move.Err(), IsNil) - c.Assert(move.Val(), Equals, true) - - get := t.client.Get("key") - c.Assert(get.Err(), Equals, redis.Nil) - c.Assert(get.Val(), Equals, "") - - sel := t.client.Select(1) - c.Assert(sel.Err(), IsNil) - c.Assert(sel.Val(), Equals, "OK") - - get = t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestCmdKeysObject(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - refCount := t.client.ObjectRefCount("key") - c.Assert(refCount.Err(), IsNil) - c.Assert(refCount.Val(), Equals, int64(1)) - - enc := t.client.ObjectEncoding("key") - c.Assert(enc.Err(), IsNil) - c.Assert(enc.Val(), Equals, "raw") - - idleTime := t.client.ObjectIdleTime("key") - c.Assert(idleTime.Err(), IsNil) - c.Assert(idleTime.Val(), Equals, time.Duration(0)) -} - -func (t *RedisTest) TestCmdKeysPersist(c *C) { - set := t.client.Set("key", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - expire := t.client.Expire("key", 10*time.Second) - c.Assert(expire.Err(), IsNil) - c.Assert(expire.Val(), Equals, true) - - ttl := t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val(), Equals, 10*time.Second) - - persist := t.client.Persist("key") - c.Assert(persist.Err(), IsNil) - c.Assert(persist.Val(), Equals, true) - - ttl = t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val() < 0, Equals, true) -} - -func (t *RedisTest) TestCmdKeysPExpire(c *C) { - set := t.client.Set("key", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - expiration := 900 * time.Millisecond - pexpire := t.client.PExpire("key", expiration) - c.Assert(pexpire.Err(), IsNil) - c.Assert(pexpire.Val(), Equals, true) - - ttl := t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val(), Equals, time.Second) - - pttl := t.client.PTTL("key") - c.Assert(pttl.Err(), IsNil) - c.Assert(pttl.Val() <= expiration, Equals, true) - c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true) -} - -func (t *RedisTest) TestCmdKeysPExpireAt(c *C) { - set := t.client.Set("key", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - expiration := 900 * time.Millisecond - pexpireat := t.client.PExpireAt("key", time.Now().Add(expiration)) - c.Assert(pexpireat.Err(), IsNil) - c.Assert(pexpireat.Val(), Equals, true) - - ttl := t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val(), Equals, time.Second) - - pttl := t.client.PTTL("key") - c.Assert(pttl.Err(), IsNil) - c.Assert(pttl.Val() <= expiration, Equals, true) - c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true) -} - -func (t *RedisTest) TestCmdKeysPTTL(c *C) { - set := t.client.Set("key", "Hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - expiration := time.Second - expire := t.client.Expire("key", expiration) - c.Assert(expire.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - pttl := t.client.PTTL("key") - c.Assert(pttl.Err(), IsNil) - c.Assert(pttl.Val() <= expiration, Equals, true) - c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true) -} - -func (t *RedisTest) TestCmdKeysRandomKey(c *C) { - randomKey := t.client.RandomKey() - c.Assert(randomKey.Err(), Equals, redis.Nil) - c.Assert(randomKey.Val(), Equals, "") - - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - randomKey = t.client.RandomKey() - c.Assert(randomKey.Err(), IsNil) - c.Assert(randomKey.Val(), Equals, "key") -} - -func (t *RedisTest) TestCmdKeysRename(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - status := t.client.Rename("key", "key1") - c.Assert(status.Err(), IsNil) - c.Assert(status.Val(), Equals, "OK") - - get := t.client.Get("key1") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestCmdKeysRenameNX(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - renameNX := t.client.RenameNX("key", "key1") - c.Assert(renameNX.Err(), IsNil) - c.Assert(renameNX.Val(), Equals, true) - - get := t.client.Get("key1") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestCmdKeysRestore(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - dump := t.client.Dump("key") - c.Assert(dump.Err(), IsNil) - - del := t.client.Del("key") - c.Assert(del.Err(), IsNil) - - restore := t.client.Restore("key", 0, dump.Val()) - c.Assert(restore.Err(), IsNil) - c.Assert(restore.Val(), Equals, "OK") - - type_ := t.client.Type("key") - c.Assert(type_.Err(), IsNil) - c.Assert(type_.Val(), Equals, "string") - - lRange := t.client.Get("key") - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), Equals, "hello") -} - -func (t *RedisTest) TestCmdKeysSort(c *C) { - lPush := t.client.LPush("list", "1") - c.Assert(lPush.Err(), IsNil) - c.Assert(lPush.Val(), Equals, int64(1)) - lPush = t.client.LPush("list", "3") - c.Assert(lPush.Err(), IsNil) - c.Assert(lPush.Val(), Equals, int64(2)) - lPush = t.client.LPush("list", "2") - c.Assert(lPush.Err(), IsNil) - c.Assert(lPush.Val(), Equals, int64(3)) - - sort := t.client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC"}) - c.Assert(sort.Err(), IsNil) - c.Assert(sort.Val(), DeepEquals, []string{"1", "2"}) -} - -func (t *RedisTest) TestCmdKeysSortBy(c *C) { - lPush := t.client.LPush("list", "1") - c.Assert(lPush.Err(), IsNil) - c.Assert(lPush.Val(), Equals, int64(1)) - lPush = t.client.LPush("list", "3") - c.Assert(lPush.Err(), IsNil) - c.Assert(lPush.Val(), Equals, int64(2)) - lPush = t.client.LPush("list", "2") - c.Assert(lPush.Err(), IsNil) - c.Assert(lPush.Val(), Equals, int64(3)) - - set := t.client.Set("weight_1", "5") - c.Assert(set.Err(), IsNil) - set = t.client.Set("weight_2", "2") - c.Assert(set.Err(), IsNil) - set = t.client.Set("weight_3", "8") - c.Assert(set.Err(), IsNil) - - sort := t.client.Sort("list", redis.Sort{Offset: 0, Count: 2, Order: "ASC", By: "weight_*"}) - c.Assert(sort.Err(), IsNil) - c.Assert(sort.Val(), DeepEquals, []string{"2", "1"}) -} - -func (t *RedisTest) TestCmdKeysTTL(c *C) { - ttl := t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val() < 0, Equals, true) - - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - expire := t.client.Expire("key", 60*time.Second) - c.Assert(expire.Err(), IsNil) - c.Assert(expire.Val(), Equals, true) - - ttl = t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val(), Equals, 60*time.Second) -} - -func (t *RedisTest) TestCmdKeysType(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - type_ := t.client.Type("key") - c.Assert(type_.Err(), IsNil) - c.Assert(type_.Val(), Equals, "string") -} - -func (t *RedisTest) TestCmdScan(c *C) { - for i := 0; i < 1000; i++ { - set := t.client.Set(fmt.Sprintf("key%d", i), "hello") - c.Assert(set.Err(), IsNil) - } - - cursor, keys, err := t.client.Scan(0, "", 0).Result() - c.Assert(err, IsNil) - c.Assert(cursor > 0, Equals, true) - c.Assert(len(keys) > 0, Equals, true) -} - -func (t *RedisTest) TestCmdSScan(c *C) { - for i := 0; i < 1000; i++ { - sadd := t.client.SAdd("myset", fmt.Sprintf("member%d", i)) - c.Assert(sadd.Err(), IsNil) - } - - cursor, keys, err := t.client.SScan("myset", 0, "", 0).Result() - c.Assert(err, IsNil) - c.Assert(cursor > 0, Equals, true) - c.Assert(len(keys) > 0, Equals, true) -} - -func (t *RedisTest) TestCmdHScan(c *C) { - for i := 0; i < 1000; i++ { - sadd := t.client.HSet("myhash", fmt.Sprintf("key%d", i), "hello") - c.Assert(sadd.Err(), IsNil) - } - - cursor, keys, err := t.client.HScan("myhash", 0, "", 0).Result() - c.Assert(err, IsNil) - c.Assert(cursor > 0, Equals, true) - c.Assert(len(keys) > 0, Equals, true) -} - -func (t *RedisTest) TestCmdZScan(c *C) { - for i := 0; i < 1000; i++ { - sadd := t.client.ZAdd("myset", redis.Z{float64(i), fmt.Sprintf("member%d", i)}) - c.Assert(sadd.Err(), IsNil) - } - - cursor, keys, err := t.client.ZScan("myset", 0, "", 0).Result() - c.Assert(err, IsNil) - c.Assert(cursor > 0, Equals, true) - c.Assert(len(keys) > 0, Equals, true) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestStringsAppend(c *C) { - exists := t.client.Exists("key") - c.Assert(exists.Err(), IsNil) - c.Assert(exists.Val(), Equals, false) - - append := t.client.Append("key", "Hello") - c.Assert(append.Err(), IsNil) - c.Assert(append.Val(), Equals, int64(5)) - - append = t.client.Append("key", " World") - c.Assert(append.Err(), IsNil) - c.Assert(append.Val(), Equals, int64(11)) - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "Hello World") -} - -func (t *RedisTest) TestStringsBitCount(c *C) { - set := t.client.Set("key", "foobar") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - bitCount := t.client.BitCount("key", nil) - c.Assert(bitCount.Err(), IsNil) - c.Assert(bitCount.Val(), Equals, int64(26)) - - bitCount = t.client.BitCount("key", &redis.BitCount{0, 0}) - c.Assert(bitCount.Err(), IsNil) - c.Assert(bitCount.Val(), Equals, int64(4)) - - bitCount = t.client.BitCount("key", &redis.BitCount{1, 1}) - c.Assert(bitCount.Err(), IsNil) - c.Assert(bitCount.Val(), Equals, int64(6)) -} - -func (t *RedisTest) TestStringsBitOpAnd(c *C) { - set := t.client.Set("key1", "1") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - set = t.client.Set("key2", "0") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - bitOpAnd := t.client.BitOpAnd("dest", "key1", "key2") - c.Assert(bitOpAnd.Err(), IsNil) - c.Assert(bitOpAnd.Val(), Equals, int64(1)) - - get := t.client.Get("dest") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "0") -} - -func (t *RedisTest) TestStringsBitOpOr(c *C) { - set := t.client.Set("key1", "1") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - set = t.client.Set("key2", "0") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - bitOpOr := t.client.BitOpOr("dest", "key1", "key2") - c.Assert(bitOpOr.Err(), IsNil) - c.Assert(bitOpOr.Val(), Equals, int64(1)) - - get := t.client.Get("dest") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "1") -} - -func (t *RedisTest) TestStringsBitOpXor(c *C) { - set := t.client.Set("key1", "\xff") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - set = t.client.Set("key2", "\x0f") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - bitOpXor := t.client.BitOpXor("dest", "key1", "key2") - c.Assert(bitOpXor.Err(), IsNil) - c.Assert(bitOpXor.Val(), Equals, int64(1)) - - get := t.client.Get("dest") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "\xf0") -} - -func (t *RedisTest) TestStringsBitOpNot(c *C) { - set := t.client.Set("key1", "\x00") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - bitOpNot := t.client.BitOpNot("dest", "key1") - c.Assert(bitOpNot.Err(), IsNil) - c.Assert(bitOpNot.Val(), Equals, int64(1)) - - get := t.client.Get("dest") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "\xff") -} - -func (t *RedisTest) TestStringsDecr(c *C) { - set := t.client.Set("key", "10") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - decr := t.client.Decr("key") - c.Assert(decr.Err(), IsNil) - c.Assert(decr.Val(), Equals, int64(9)) - - set = t.client.Set("key", "234293482390480948029348230948") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - decr = t.client.Decr("key") - c.Assert(decr.Err(), ErrorMatches, "ERR value is not an integer or out of range") - c.Assert(decr.Val(), Equals, int64(0)) -} - -func (t *RedisTest) TestStringsDecrBy(c *C) { - set := t.client.Set("key", "10") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - decrBy := t.client.DecrBy("key", 5) - c.Assert(decrBy.Err(), IsNil) - c.Assert(decrBy.Val(), Equals, int64(5)) -} - -func (t *RedisTest) TestStringsGet(c *C) { - get := t.client.Get("_") - c.Assert(get.Err(), Equals, redis.Nil) - c.Assert(get.Val(), Equals, "") - - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - get = t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestStringsGetBit(c *C) { - setBit := t.client.SetBit("key", 7, 1) - c.Assert(setBit.Err(), IsNil) - c.Assert(setBit.Val(), Equals, int64(0)) - - getBit := t.client.GetBit("key", 0) - c.Assert(getBit.Err(), IsNil) - c.Assert(getBit.Val(), Equals, int64(0)) - - getBit = t.client.GetBit("key", 7) - c.Assert(getBit.Err(), IsNil) - c.Assert(getBit.Val(), Equals, int64(1)) - - getBit = t.client.GetBit("key", 100) - c.Assert(getBit.Err(), IsNil) - c.Assert(getBit.Val(), Equals, int64(0)) -} - -func (t *RedisTest) TestStringsGetRange(c *C) { - set := t.client.Set("key", "This is a string") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - getRange := t.client.GetRange("key", 0, 3) - c.Assert(getRange.Err(), IsNil) - c.Assert(getRange.Val(), Equals, "This") - - getRange = t.client.GetRange("key", -3, -1) - c.Assert(getRange.Err(), IsNil) - c.Assert(getRange.Val(), Equals, "ing") - - getRange = t.client.GetRange("key", 0, -1) - c.Assert(getRange.Err(), IsNil) - c.Assert(getRange.Val(), Equals, "This is a string") - - getRange = t.client.GetRange("key", 10, 100) - c.Assert(getRange.Err(), IsNil) - c.Assert(getRange.Val(), Equals, "string") -} - -func (t *RedisTest) TestStringsGetSet(c *C) { - incr := t.client.Incr("key") - c.Assert(incr.Err(), IsNil) - c.Assert(incr.Val(), Equals, int64(1)) - - getSet := t.client.GetSet("key", "0") - c.Assert(getSet.Err(), IsNil) - c.Assert(getSet.Val(), Equals, "1") - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "0") -} - -func (t *RedisTest) TestStringsIncr(c *C) { - set := t.client.Set("key", "10") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - incr := t.client.Incr("key") - c.Assert(incr.Err(), IsNil) - c.Assert(incr.Val(), Equals, int64(11)) - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "11") -} - -func (t *RedisTest) TestStringsIncrBy(c *C) { - set := t.client.Set("key", "10") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - incrBy := t.client.IncrBy("key", 5) - c.Assert(incrBy.Err(), IsNil) - c.Assert(incrBy.Val(), Equals, int64(15)) -} - -func (t *RedisTest) TestIncrByFloat(c *C) { - set := t.client.Set("key", "10.50") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - incrByFloat := t.client.IncrByFloat("key", 0.1) - c.Assert(incrByFloat.Err(), IsNil) - c.Assert(incrByFloat.Val(), Equals, 10.6) - - set = t.client.Set("key", "5.0e3") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - incrByFloat = t.client.IncrByFloat("key", 2.0e2) - c.Assert(incrByFloat.Err(), IsNil) - c.Assert(incrByFloat.Val(), Equals, float64(5200)) -} - -func (t *RedisTest) TestIncrByFloatOverflow(c *C) { - incrByFloat := t.client.IncrByFloat("key", 996945661) - c.Assert(incrByFloat.Err(), IsNil) - c.Assert(incrByFloat.Val(), Equals, float64(996945661)) -} - -func (t *RedisTest) TestStringsMSetMGet(c *C) { - mSet := t.client.MSet("key1", "hello1", "key2", "hello2") - c.Assert(mSet.Err(), IsNil) - c.Assert(mSet.Val(), Equals, "OK") - - mGet := t.client.MGet("key1", "key2", "_") - c.Assert(mGet.Err(), IsNil) - c.Assert(mGet.Val(), DeepEquals, []interface{}{"hello1", "hello2", nil}) -} - -func (t *RedisTest) TestStringsMSetNX(c *C) { - mSetNX := t.client.MSetNX("key1", "hello1", "key2", "hello2") - c.Assert(mSetNX.Err(), IsNil) - c.Assert(mSetNX.Val(), Equals, true) - - mSetNX = t.client.MSetNX("key2", "hello1", "key3", "hello2") - c.Assert(mSetNX.Err(), IsNil) - c.Assert(mSetNX.Val(), Equals, false) -} - -func (t *RedisTest) TestStringsPSetEx(c *C) { - expiration := 50 * time.Millisecond - psetex := t.client.PSetEx("key", expiration, "hello") - c.Assert(psetex.Err(), IsNil) - c.Assert(psetex.Val(), Equals, "OK") - - pttl := t.client.PTTL("key") - c.Assert(pttl.Err(), IsNil) - c.Assert(pttl.Val() <= expiration, Equals, true) - c.Assert(pttl.Val() >= expiration-time.Millisecond, Equals, true) - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestStringsSetGet(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestStringsSetEx(c *C) { - setEx := t.client.SetEx("key", 10*time.Second, "hello") - c.Assert(setEx.Err(), IsNil) - c.Assert(setEx.Val(), Equals, "OK") - - ttl := t.client.TTL("key") - c.Assert(ttl.Err(), IsNil) - c.Assert(ttl.Val(), Equals, 10*time.Second) -} - -func (t *RedisTest) TestStringsSetNX(c *C) { - setNX := t.client.SetNX("key", "hello") - c.Assert(setNX.Err(), IsNil) - c.Assert(setNX.Val(), Equals, true) - - setNX = t.client.SetNX("key", "hello2") - c.Assert(setNX.Err(), IsNil) - c.Assert(setNX.Val(), Equals, false) - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestStringsSetRange(c *C) { - set := t.client.Set("key", "Hello World") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - range_ := t.client.SetRange("key", 6, "Redis") - c.Assert(range_.Err(), IsNil) - c.Assert(range_.Val(), Equals, int64(11)) - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "Hello Redis") -} - -func (t *RedisTest) TestStringsStrLen(c *C) { - set := t.client.Set("key", "hello") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - strLen := t.client.StrLen("key") - c.Assert(strLen.Err(), IsNil) - c.Assert(strLen.Val(), Equals, int64(5)) - - strLen = t.client.StrLen("_") - c.Assert(strLen.Err(), IsNil) - c.Assert(strLen.Val(), Equals, int64(0)) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestCmdHDel(c *C) { - hSet := t.client.HSet("hash", "key", "hello") - c.Assert(hSet.Err(), IsNil) - - hDel := t.client.HDel("hash", "key") - c.Assert(hDel.Err(), IsNil) - c.Assert(hDel.Val(), Equals, int64(1)) - - hDel = t.client.HDel("hash", "key") - c.Assert(hDel.Err(), IsNil) - c.Assert(hDel.Val(), Equals, int64(0)) -} - -func (t *RedisTest) TestCmdHExists(c *C) { - hSet := t.client.HSet("hash", "key", "hello") - c.Assert(hSet.Err(), IsNil) - - hExists := t.client.HExists("hash", "key") - c.Assert(hExists.Err(), IsNil) - c.Assert(hExists.Val(), Equals, true) - - hExists = t.client.HExists("hash", "key1") - c.Assert(hExists.Err(), IsNil) - c.Assert(hExists.Val(), Equals, false) -} - -func (t *RedisTest) TestCmdHGet(c *C) { - hSet := t.client.HSet("hash", "key", "hello") - c.Assert(hSet.Err(), IsNil) - - hGet := t.client.HGet("hash", "key") - c.Assert(hGet.Err(), IsNil) - c.Assert(hGet.Val(), Equals, "hello") - - hGet = t.client.HGet("hash", "key1") - c.Assert(hGet.Err(), Equals, redis.Nil) - c.Assert(hGet.Val(), Equals, "") -} - -func (t *RedisTest) TestCmdHGetAll(c *C) { - hSet := t.client.HSet("hash", "key1", "hello1") - c.Assert(hSet.Err(), IsNil) - hSet = t.client.HSet("hash", "key2", "hello2") - c.Assert(hSet.Err(), IsNil) - - hGetAll := t.client.HGetAll("hash") - c.Assert(hGetAll.Err(), IsNil) - c.Assert(hGetAll.Val(), DeepEquals, []string{"key1", "hello1", "key2", "hello2"}) -} - -func (t *RedisTest) TestCmdHGetAllMap(c *C) { - hSet := t.client.HSet("hash", "key1", "hello1") - c.Assert(hSet.Err(), IsNil) - hSet = t.client.HSet("hash", "key2", "hello2") - c.Assert(hSet.Err(), IsNil) - - hGetAll := t.client.HGetAllMap("hash") - c.Assert(hGetAll.Err(), IsNil) - c.Assert(hGetAll.Val(), DeepEquals, map[string]string{"key1": "hello1", "key2": "hello2"}) -} - -func (t *RedisTest) TestCmdHIncrBy(c *C) { - hSet := t.client.HSet("hash", "key", "5") - c.Assert(hSet.Err(), IsNil) - - hIncrBy := t.client.HIncrBy("hash", "key", 1) - c.Assert(hIncrBy.Err(), IsNil) - c.Assert(hIncrBy.Val(), Equals, int64(6)) - - hIncrBy = t.client.HIncrBy("hash", "key", -1) - c.Assert(hIncrBy.Err(), IsNil) - c.Assert(hIncrBy.Val(), Equals, int64(5)) - - hIncrBy = t.client.HIncrBy("hash", "key", -10) - c.Assert(hIncrBy.Err(), IsNil) - c.Assert(hIncrBy.Val(), Equals, int64(-5)) -} - -func (t *RedisTest) TestCmdHIncrByFloat(c *C) { - hSet := t.client.HSet("hash", "field", "10.50") - c.Assert(hSet.Err(), IsNil) - c.Assert(hSet.Val(), Equals, true) - - hIncrByFloat := t.client.HIncrByFloat("hash", "field", 0.1) - c.Assert(hIncrByFloat.Err(), IsNil) - c.Assert(hIncrByFloat.Val(), Equals, 10.6) - - hSet = t.client.HSet("hash", "field", "5.0e3") - c.Assert(hSet.Err(), IsNil) - c.Assert(hSet.Val(), Equals, false) - - hIncrByFloat = t.client.HIncrByFloat("hash", "field", 2.0e2) - c.Assert(hIncrByFloat.Err(), IsNil) - c.Assert(hIncrByFloat.Val(), Equals, float64(5200)) -} - -func (t *RedisTest) TestCmdHKeys(c *C) { - hkeys := t.client.HKeys("hash") - c.Assert(hkeys.Err(), IsNil) - c.Assert(hkeys.Val(), DeepEquals, []string{}) - - hset := t.client.HSet("hash", "key1", "hello1") - c.Assert(hset.Err(), IsNil) - hset = t.client.HSet("hash", "key2", "hello2") - c.Assert(hset.Err(), IsNil) - - hkeys = t.client.HKeys("hash") - c.Assert(hkeys.Err(), IsNil) - c.Assert(hkeys.Val(), DeepEquals, []string{"key1", "key2"}) -} - -func (t *RedisTest) TestCmdHLen(c *C) { - hSet := t.client.HSet("hash", "key1", "hello1") - c.Assert(hSet.Err(), IsNil) - hSet = t.client.HSet("hash", "key2", "hello2") - c.Assert(hSet.Err(), IsNil) - - hLen := t.client.HLen("hash") - c.Assert(hLen.Err(), IsNil) - c.Assert(hLen.Val(), Equals, int64(2)) -} - -func (t *RedisTest) TestCmdHMGet(c *C) { - hSet := t.client.HSet("hash", "key1", "hello1") - c.Assert(hSet.Err(), IsNil) - hSet = t.client.HSet("hash", "key2", "hello2") - c.Assert(hSet.Err(), IsNil) - - hMGet := t.client.HMGet("hash", "key1", "key2", "_") - c.Assert(hMGet.Err(), IsNil) - c.Assert(hMGet.Val(), DeepEquals, []interface{}{"hello1", "hello2", nil}) -} - -func (t *RedisTest) TestCmdHMSet(c *C) { - hMSet := t.client.HMSet("hash", "key1", "hello1", "key2", "hello2") - c.Assert(hMSet.Err(), IsNil) - c.Assert(hMSet.Val(), Equals, "OK") - - hGet := t.client.HGet("hash", "key1") - c.Assert(hGet.Err(), IsNil) - c.Assert(hGet.Val(), Equals, "hello1") - - hGet = t.client.HGet("hash", "key2") - c.Assert(hGet.Err(), IsNil) - c.Assert(hGet.Val(), Equals, "hello2") -} - -func (t *RedisTest) TestCmdHSet(c *C) { - hSet := t.client.HSet("hash", "key", "hello") - c.Assert(hSet.Err(), IsNil) - c.Assert(hSet.Val(), Equals, true) - - hGet := t.client.HGet("hash", "key") - c.Assert(hGet.Err(), IsNil) - c.Assert(hGet.Val(), Equals, "hello") -} - -func (t *RedisTest) TestCmdHSetNX(c *C) { - hSetNX := t.client.HSetNX("hash", "key", "hello") - c.Assert(hSetNX.Err(), IsNil) - c.Assert(hSetNX.Val(), Equals, true) - - hSetNX = t.client.HSetNX("hash", "key", "hello") - c.Assert(hSetNX.Err(), IsNil) - c.Assert(hSetNX.Val(), Equals, false) - - hGet := t.client.HGet("hash", "key") - c.Assert(hGet.Err(), IsNil) - c.Assert(hGet.Val(), Equals, "hello") -} - -func (t *RedisTest) TestCmdHVals(c *C) { - hSet := t.client.HSet("hash", "key1", "hello1") - c.Assert(hSet.Err(), IsNil) - hSet = t.client.HSet("hash", "key2", "hello2") - c.Assert(hSet.Err(), IsNil) - - hVals := t.client.HVals("hash") - c.Assert(hVals.Err(), IsNil) - c.Assert(hVals.Val(), DeepEquals, []string{"hello1", "hello2"}) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestCmdListsBLPop(c *C) { - rPush := t.client.RPush("list1", "a", "b", "c") - c.Assert(rPush.Err(), IsNil) - - bLPop := t.client.BLPop(0, "list1", "list2") - c.Assert(bLPop.Err(), IsNil) - c.Assert(bLPop.Val(), DeepEquals, []string{"list1", "a"}) -} - -func (t *RedisTest) TestCmdListsBLPopBlocks(c *C) { - started := make(chan bool) - done := make(chan bool) - go func() { - started <- true - bLPop := t.client.BLPop(0, "list") - c.Assert(bLPop.Err(), IsNil) - c.Assert(bLPop.Val(), DeepEquals, []string{"list", "a"}) - done <- true - }() - <-started - - select { - case <-done: - c.Error("BLPop is not blocked") - case <-time.After(time.Second): - // ok - } - - rPush := t.client.RPush("list", "a") - c.Assert(rPush.Err(), IsNil) - - select { - case <-done: - // ok - case <-time.After(time.Second): - c.Error("BLPop is still blocked") - // ok - } -} - -func (t *RedisTest) TestCmdListsBLPopTimeout(c *C) { - bLPop := t.client.BLPop(1, "list1") - c.Assert(bLPop.Err(), Equals, redis.Nil) - c.Assert(bLPop.Val(), IsNil) -} - -func (t *RedisTest) TestCmdListsBRPop(c *C) { - rPush := t.client.RPush("list1", "a", "b", "c") - c.Assert(rPush.Err(), IsNil) - - bRPop := t.client.BRPop(0, "list1", "list2") - c.Assert(bRPop.Err(), IsNil) - c.Assert(bRPop.Val(), DeepEquals, []string{"list1", "c"}) -} - -func (t *RedisTest) TestCmdListsBRPopBlocks(c *C) { - started := make(chan bool) - done := make(chan bool) - go func() { - started <- true - brpop := t.client.BRPop(0, "list") - c.Assert(brpop.Err(), IsNil) - c.Assert(brpop.Val(), DeepEquals, []string{"list", "a"}) - done <- true - }() - <-started - - select { - case <-done: - c.Error("BRPop is not blocked") - case <-time.After(time.Second): - // ok - } - - rPush := t.client.RPush("list", "a") - c.Assert(rPush.Err(), IsNil) - - select { - case <-done: - // ok - case <-time.After(time.Second): - c.Error("BRPop is still blocked") - // ok - } -} - -func (t *RedisTest) TestCmdListsBRPopLPush(c *C) { - rPush := t.client.RPush("list1", "a", "b", "c") - c.Assert(rPush.Err(), IsNil) - - bRPopLPush := t.client.BRPopLPush("list1", "list2", 0) - c.Assert(bRPopLPush.Err(), IsNil) - c.Assert(bRPopLPush.Val(), Equals, "c") -} - -func (t *RedisTest) TestCmdListsLIndex(c *C) { - lPush := t.client.LPush("list", "World") - c.Assert(lPush.Err(), IsNil) - lPush = t.client.LPush("list", "Hello") - c.Assert(lPush.Err(), IsNil) - - lIndex := t.client.LIndex("list", 0) - c.Assert(lIndex.Err(), IsNil) - c.Assert(lIndex.Val(), Equals, "Hello") - - lIndex = t.client.LIndex("list", -1) - c.Assert(lIndex.Err(), IsNil) - c.Assert(lIndex.Val(), Equals, "World") - - lIndex = t.client.LIndex("list", 3) - c.Assert(lIndex.Err(), Equals, redis.Nil) - c.Assert(lIndex.Val(), Equals, "") -} - -func (t *RedisTest) TestCmdListsLInsert(c *C) { - rPush := t.client.RPush("list", "Hello") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "World") - c.Assert(rPush.Err(), IsNil) - - lInsert := t.client.LInsert("list", "BEFORE", "World", "There") - c.Assert(lInsert.Err(), IsNil) - c.Assert(lInsert.Val(), Equals, int64(3)) - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "There", "World"}) -} - -func (t *RedisTest) TestCmdListsLLen(c *C) { - lPush := t.client.LPush("list", "World") - c.Assert(lPush.Err(), IsNil) - lPush = t.client.LPush("list", "Hello") - c.Assert(lPush.Err(), IsNil) - - lLen := t.client.LLen("list") - c.Assert(lLen.Err(), IsNil) - c.Assert(lLen.Val(), Equals, int64(2)) -} - -func (t *RedisTest) TestCmdListsLPop(c *C) { - rPush := t.client.RPush("list", "one") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "two") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "three") - c.Assert(rPush.Err(), IsNil) - - lPop := t.client.LPop("list") - c.Assert(lPop.Err(), IsNil) - c.Assert(lPop.Val(), Equals, "one") - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"two", "three"}) -} - -func (t *RedisTest) TestCmdListsLPush(c *C) { - lPush := t.client.LPush("list", "World") - c.Assert(lPush.Err(), IsNil) - lPush = t.client.LPush("list", "Hello") - c.Assert(lPush.Err(), IsNil) - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"}) -} - -func (t *RedisTest) TestCmdListsLPushX(c *C) { - lPush := t.client.LPush("list", "World") - c.Assert(lPush.Err(), IsNil) - - lPushX := t.client.LPushX("list", "Hello") - c.Assert(lPushX.Err(), IsNil) - c.Assert(lPushX.Val(), Equals, int64(2)) - - lPushX = t.client.LPushX("list2", "Hello") - c.Assert(lPushX.Err(), IsNil) - c.Assert(lPushX.Val(), Equals, int64(0)) - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"}) - - lRange = t.client.LRange("list2", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{}) -} - -func (t *RedisTest) TestCmdListsLRange(c *C) { - rPush := t.client.RPush("list", "one") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "two") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "three") - c.Assert(rPush.Err(), IsNil) - - lRange := t.client.LRange("list", 0, 0) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"one"}) - - lRange = t.client.LRange("list", -3, 2) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"one", "two", "three"}) - - lRange = t.client.LRange("list", -100, 100) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"one", "two", "three"}) - - lRange = t.client.LRange("list", 5, 10) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{}) -} - -func (t *RedisTest) TestCmdListsLRem(c *C) { - rPush := t.client.RPush("list", "hello") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "hello") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "key") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "hello") - c.Assert(rPush.Err(), IsNil) - - lRem := t.client.LRem("list", -2, "hello") - c.Assert(lRem.Err(), IsNil) - c.Assert(lRem.Val(), Equals, int64(2)) - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"hello", "key"}) -} - -func (t *RedisTest) TestCmdListsLSet(c *C) { - rPush := t.client.RPush("list", "one") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "two") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "three") - c.Assert(rPush.Err(), IsNil) - - lSet := t.client.LSet("list", 0, "four") - c.Assert(lSet.Err(), IsNil) - c.Assert(lSet.Val(), Equals, "OK") - - lSet = t.client.LSet("list", -2, "five") - c.Assert(lSet.Err(), IsNil) - c.Assert(lSet.Val(), Equals, "OK") - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"four", "five", "three"}) -} - -func (t *RedisTest) TestCmdListsLTrim(c *C) { - rPush := t.client.RPush("list", "one") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "two") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "three") - c.Assert(rPush.Err(), IsNil) - - lTrim := t.client.LTrim("list", 1, -1) - c.Assert(lTrim.Err(), IsNil) - c.Assert(lTrim.Val(), Equals, "OK") - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"two", "three"}) -} - -func (t *RedisTest) TestCmdListsRPop(c *C) { - rPush := t.client.RPush("list", "one") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "two") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "three") - c.Assert(rPush.Err(), IsNil) - - rPop := t.client.RPop("list") - c.Assert(rPop.Err(), IsNil) - c.Assert(rPop.Val(), Equals, "three") - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"one", "two"}) -} - -func (t *RedisTest) TestCmdListsRPopLPush(c *C) { - rPush := t.client.RPush("list", "one") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "two") - c.Assert(rPush.Err(), IsNil) - rPush = t.client.RPush("list", "three") - c.Assert(rPush.Err(), IsNil) - - rPopLPush := t.client.RPopLPush("list", "list2") - c.Assert(rPopLPush.Err(), IsNil) - c.Assert(rPopLPush.Val(), Equals, "three") - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"one", "two"}) - - lRange = t.client.LRange("list2", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"three"}) -} - -func (t *RedisTest) TestCmdListsRPush(c *C) { - rPush := t.client.RPush("list", "Hello") - c.Assert(rPush.Err(), IsNil) - c.Assert(rPush.Val(), Equals, int64(1)) - - rPush = t.client.RPush("list", "World") - c.Assert(rPush.Err(), IsNil) - c.Assert(rPush.Val(), Equals, int64(2)) - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"}) -} - -func (t *RedisTest) TestCmdListsRPushX(c *C) { - rPush := t.client.RPush("list", "Hello") - c.Assert(rPush.Err(), IsNil) - c.Assert(rPush.Val(), Equals, int64(1)) - - rPushX := t.client.RPushX("list", "World") - c.Assert(rPushX.Err(), IsNil) - c.Assert(rPushX.Val(), Equals, int64(2)) - - rPushX = t.client.RPushX("list2", "World") - c.Assert(rPushX.Err(), IsNil) - c.Assert(rPushX.Val(), Equals, int64(0)) - - lRange := t.client.LRange("list", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{"Hello", "World"}) - - lRange = t.client.LRange("list2", 0, -1) - c.Assert(lRange.Err(), IsNil) - c.Assert(lRange.Val(), DeepEquals, []string{}) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestSAdd(c *C) { - sAdd := t.client.SAdd("set", "Hello") - c.Assert(sAdd.Err(), IsNil) - c.Assert(sAdd.Val(), Equals, int64(1)) - - sAdd = t.client.SAdd("set", "World") - c.Assert(sAdd.Err(), IsNil) - c.Assert(sAdd.Val(), Equals, int64(1)) - - sAdd = t.client.SAdd("set", "World") - c.Assert(sAdd.Err(), IsNil) - c.Assert(sAdd.Val(), Equals, int64(0)) - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"Hello", "World"}) -} - -func (t *RedisTest) TestSCard(c *C) { - sAdd := t.client.SAdd("set", "Hello") - c.Assert(sAdd.Err(), IsNil) - c.Assert(sAdd.Val(), Equals, int64(1)) - - sAdd = t.client.SAdd("set", "World") - c.Assert(sAdd.Err(), IsNil) - c.Assert(sAdd.Val(), Equals, int64(1)) - - sCard := t.client.SCard("set") - c.Assert(sCard.Err(), IsNil) - c.Assert(sCard.Val(), Equals, int64(2)) -} - -func (t *RedisTest) TestSDiff(c *C) { - sAdd := t.client.SAdd("set1", "a") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "b") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "c") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "c") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "d") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "e") - c.Assert(sAdd.Err(), IsNil) - - sDiff := t.client.SDiff("set1", "set2") - c.Assert(sDiff.Err(), IsNil) - c.Assert(sortStrings(sDiff.Val()), DeepEquals, []string{"a", "b"}) -} - -func (t *RedisTest) TestSDiffStore(c *C) { - sAdd := t.client.SAdd("set1", "a") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "b") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "c") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "c") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "d") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "e") - c.Assert(sAdd.Err(), IsNil) - - sDiffStore := t.client.SDiffStore("set", "set1", "set2") - c.Assert(sDiffStore.Err(), IsNil) - c.Assert(sDiffStore.Val(), Equals, int64(2)) - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"a", "b"}) -} - -func (t *RedisTest) TestSInter(c *C) { - sAdd := t.client.SAdd("set1", "a") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "b") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "c") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "c") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "d") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "e") - c.Assert(sAdd.Err(), IsNil) - - sInter := t.client.SInter("set1", "set2") - c.Assert(sInter.Err(), IsNil) - c.Assert(sInter.Val(), DeepEquals, []string{"c"}) -} - -func (t *RedisTest) TestSInterStore(c *C) { - sAdd := t.client.SAdd("set1", "a") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "b") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "c") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "c") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "d") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "e") - c.Assert(sAdd.Err(), IsNil) - - sInterStore := t.client.SInterStore("set", "set1", "set2") - c.Assert(sInterStore.Err(), IsNil) - c.Assert(sInterStore.Val(), Equals, int64(1)) - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sMembers.Val(), DeepEquals, []string{"c"}) -} - -func (t *RedisTest) TestIsMember(c *C) { - sAdd := t.client.SAdd("set", "one") - c.Assert(sAdd.Err(), IsNil) - - sIsMember := t.client.SIsMember("set", "one") - c.Assert(sIsMember.Err(), IsNil) - c.Assert(sIsMember.Val(), Equals, true) - - sIsMember = t.client.SIsMember("set", "two") - c.Assert(sIsMember.Err(), IsNil) - c.Assert(sIsMember.Val(), Equals, false) -} - -func (t *RedisTest) TestSMembers(c *C) { - sAdd := t.client.SAdd("set", "Hello") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "World") - c.Assert(sAdd.Err(), IsNil) - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"Hello", "World"}) -} - -func (t *RedisTest) TestSMove(c *C) { - sAdd := t.client.SAdd("set1", "one") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "two") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "three") - c.Assert(sAdd.Err(), IsNil) - - sMove := t.client.SMove("set1", "set2", "two") - c.Assert(sMove.Err(), IsNil) - c.Assert(sMove.Val(), Equals, true) - - sMembers := t.client.SMembers("set1") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sMembers.Val(), DeepEquals, []string{"one"}) - - sMembers = t.client.SMembers("set2") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sortStrings(sMembers.Val()), DeepEquals, []string{"three", "two"}) -} - -func (t *RedisTest) TestSPop(c *C) { - sAdd := t.client.SAdd("set", "one") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "two") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "three") - c.Assert(sAdd.Err(), IsNil) - - sPop := t.client.SPop("set") - c.Assert(sPop.Err(), IsNil) - c.Assert(sPop.Val(), Not(Equals), "") - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sMembers.Val(), HasLen, 2) -} - -func (t *RedisTest) TestSRandMember(c *C) { - sAdd := t.client.SAdd("set", "one") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "two") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "three") - c.Assert(sAdd.Err(), IsNil) - - sRandMember := t.client.SRandMember("set") - c.Assert(sRandMember.Err(), IsNil) - c.Assert(sRandMember.Val(), Not(Equals), "") - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sMembers.Val(), HasLen, 3) -} - -func (t *RedisTest) TestSRem(c *C) { - sAdd := t.client.SAdd("set", "one") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "two") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set", "three") - c.Assert(sAdd.Err(), IsNil) - - sRem := t.client.SRem("set", "one") - c.Assert(sRem.Err(), IsNil) - c.Assert(sRem.Val(), Equals, int64(1)) - - sRem = t.client.SRem("set", "four") - c.Assert(sRem.Err(), IsNil) - c.Assert(sRem.Val(), Equals, int64(0)) - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert( - sortStrings(sMembers.Val()), - DeepEquals, - []string{"three", "two"}, - ) -} - -func (t *RedisTest) TestSUnion(c *C) { - sAdd := t.client.SAdd("set1", "a") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "b") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "c") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "c") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "d") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "e") - c.Assert(sAdd.Err(), IsNil) - - sUnion := t.client.SUnion("set1", "set2") - c.Assert(sUnion.Err(), IsNil) - c.Assert(sUnion.Val(), HasLen, 5) -} - -func (t *RedisTest) TestSUnionStore(c *C) { - sAdd := t.client.SAdd("set1", "a") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "b") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set1", "c") - c.Assert(sAdd.Err(), IsNil) - - sAdd = t.client.SAdd("set2", "c") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "d") - c.Assert(sAdd.Err(), IsNil) - sAdd = t.client.SAdd("set2", "e") - c.Assert(sAdd.Err(), IsNil) - - sUnionStore := t.client.SUnionStore("set", "set1", "set2") - c.Assert(sUnionStore.Err(), IsNil) - c.Assert(sUnionStore.Val(), Equals, int64(5)) - - sMembers := t.client.SMembers("set") - c.Assert(sMembers.Err(), IsNil) - c.Assert(sMembers.Val(), HasLen, 5) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestZAdd(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - c.Assert(zAdd.Val(), Equals, int64(1)) - - zAdd = t.client.ZAdd("zset", redis.Z{1, "uno"}) - c.Assert(zAdd.Err(), IsNil) - c.Assert(zAdd.Val(), Equals, int64(1)) - - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - c.Assert(zAdd.Val(), Equals, int64(1)) - - zAdd = t.client.ZAdd("zset", redis.Z{3, "two"}) - c.Assert(zAdd.Err(), IsNil) - c.Assert(zAdd.Val(), Equals, int64(0)) - - val, err := t.client.ZRangeWithScores("zset", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {1, "uno"}, {3, "two"}}) -} - -func (t *RedisTest) TestZCard(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - - zCard := t.client.ZCard("zset") - c.Assert(zCard.Err(), IsNil) - c.Assert(zCard.Val(), Equals, int64(2)) -} - -func (t *RedisTest) TestZCount(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zCount := t.client.ZCount("zset", "-inf", "+inf") - c.Assert(zCount.Err(), IsNil) - c.Assert(zCount.Val(), Equals, int64(3)) - - zCount = t.client.ZCount("zset", "(1", "3") - c.Assert(zCount.Err(), IsNil) - c.Assert(zCount.Val(), Equals, int64(2)) -} - -func (t *RedisTest) TestZIncrBy(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - - zIncrBy := t.client.ZIncrBy("zset", 2, "one") - c.Assert(zIncrBy.Err(), IsNil) - c.Assert(zIncrBy.Val(), Equals, float64(3)) - - val, err := t.client.ZRangeWithScores("zset", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {3, "one"}}) -} - -func (t *RedisTest) TestZInterStore(c *C) { - zAdd := t.client.ZAdd("zset1", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset1", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - - zAdd = t.client.ZAdd("zset2", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset2", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset3", redis.Z{3, "two"}) - c.Assert(zAdd.Err(), IsNil) - - zInterStore := t.client.ZInterStore( - "out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2") - c.Assert(zInterStore.Err(), IsNil) - c.Assert(zInterStore.Val(), Equals, int64(2)) - - val, err := t.client.ZRangeWithScores("out", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{5, "one"}, {10, "two"}}) -} - -func (t *RedisTest) TestZRange(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRange := t.client.ZRange("zset", 0, -1) - c.Assert(zRange.Err(), IsNil) - c.Assert(zRange.Val(), DeepEquals, []string{"one", "two", "three"}) - - zRange = t.client.ZRange("zset", 2, 3) - c.Assert(zRange.Err(), IsNil) - c.Assert(zRange.Val(), DeepEquals, []string{"three"}) - - zRange = t.client.ZRange("zset", -2, -1) - c.Assert(zRange.Err(), IsNil) - c.Assert(zRange.Val(), DeepEquals, []string{"two", "three"}) -} - -func (t *RedisTest) TestZRangeWithScores(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - val, err := t.client.ZRangeWithScores("zset", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {2, "two"}, {3, "three"}}) - - val, err = t.client.ZRangeWithScores("zset", 2, 3).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{3, "three"}}) - - val, err = t.client.ZRangeWithScores("zset", -2, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {3, "three"}}) -} - -func (t *RedisTest) TestZRangeByScore(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRangeByScore := t.client.ZRangeByScore("zset", redis.ZRangeByScore{ - Min: "-inf", - Max: "+inf", - }) - c.Assert(zRangeByScore.Err(), IsNil) - c.Assert(zRangeByScore.Val(), DeepEquals, []string{"one", "two", "three"}) - - zRangeByScore = t.client.ZRangeByScore("zset", redis.ZRangeByScore{ - Min: "1", - Max: "2", - }) - c.Assert(zRangeByScore.Err(), IsNil) - c.Assert(zRangeByScore.Val(), DeepEquals, []string{"one", "two"}) - - zRangeByScore = t.client.ZRangeByScore("zset", redis.ZRangeByScore{ - Min: "(1", - Max: "2", - }) - c.Assert(zRangeByScore.Err(), IsNil) - c.Assert(zRangeByScore.Val(), DeepEquals, []string{"two"}) - - zRangeByScore = t.client.ZRangeByScore("zset", redis.ZRangeByScore{ - Min: "(1", - Max: "(2", - }) - c.Assert(zRangeByScore.Err(), IsNil) - c.Assert(zRangeByScore.Val(), DeepEquals, []string{}) -} - -func (t *RedisTest) TestZRangeByScoreWithScoresMap(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - val, err := t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{ - Min: "-inf", - Max: "+inf", - }).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {2, "two"}, {3, "three"}}) - - val, err = t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{ - Min: "1", - Max: "2", - }).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {2, "two"}}) - - val, err = t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{ - Min: "(1", - Max: "2", - }).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{2, "two"}}) - - val, err = t.client.ZRangeByScoreWithScores("zset", redis.ZRangeByScore{ - Min: "(1", - Max: "(2", - }).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{}) -} - -func (t *RedisTest) TestZRank(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRank := t.client.ZRank("zset", "three") - c.Assert(zRank.Err(), IsNil) - c.Assert(zRank.Val(), Equals, int64(2)) - - zRank = t.client.ZRank("zset", "four") - c.Assert(zRank.Err(), Equals, redis.Nil) - c.Assert(zRank.Val(), Equals, int64(0)) -} - -func (t *RedisTest) TestZRem(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRem := t.client.ZRem("zset", "two") - c.Assert(zRem.Err(), IsNil) - c.Assert(zRem.Val(), Equals, int64(1)) - - val, err := t.client.ZRangeWithScores("zset", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{1, "one"}, {3, "three"}}) -} - -func (t *RedisTest) TestZRemRangeByRank(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRemRangeByRank := t.client.ZRemRangeByRank("zset", 0, 1) - c.Assert(zRemRangeByRank.Err(), IsNil) - c.Assert(zRemRangeByRank.Val(), Equals, int64(2)) - - val, err := t.client.ZRangeWithScores("zset", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{3, "three"}}) -} - -func (t *RedisTest) TestZRemRangeByScore(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRemRangeByScore := t.client.ZRemRangeByScore("zset", "-inf", "(2") - c.Assert(zRemRangeByScore.Err(), IsNil) - c.Assert(zRemRangeByScore.Val(), Equals, int64(1)) - - val, err := t.client.ZRangeWithScores("zset", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {3, "three"}}) -} - -func (t *RedisTest) TestZRevRange(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRevRange := t.client.ZRevRange("zset", "0", "-1") - c.Assert(zRevRange.Err(), IsNil) - c.Assert(zRevRange.Val(), DeepEquals, []string{"three", "two", "one"}) - - zRevRange = t.client.ZRevRange("zset", "2", "3") - c.Assert(zRevRange.Err(), IsNil) - c.Assert(zRevRange.Val(), DeepEquals, []string{"one"}) - - zRevRange = t.client.ZRevRange("zset", "-2", "-1") - c.Assert(zRevRange.Err(), IsNil) - c.Assert(zRevRange.Val(), DeepEquals, []string{"two", "one"}) -} - -func (t *RedisTest) TestZRevRangeWithScoresMap(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - val, err := t.client.ZRevRangeWithScores("zset", "0", "-1").Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{3, "three"}, {2, "two"}, {1, "one"}}) - - val, err = t.client.ZRevRangeWithScores("zset", "2", "3").Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{1, "one"}}) - - val, err = t.client.ZRevRangeWithScores("zset", "-2", "-1").Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{2, "two"}, {1, "one"}}) -} - -func (t *RedisTest) TestZRevRangeByScore(c *C) { - zadd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zadd.Err(), IsNil) - zadd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zadd.Err(), IsNil) - zadd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zadd.Err(), IsNil) - - vals, err := t.client.ZRevRangeByScore( - "zset", redis.ZRangeByScore{Max: "+inf", Min: "-inf"}).Result() - c.Assert(err, IsNil) - c.Assert(vals, DeepEquals, []string{"three", "two", "one"}) - - vals, err = t.client.ZRevRangeByScore( - "zset", redis.ZRangeByScore{Max: "2", Min: "(1"}).Result() - c.Assert(err, IsNil) - c.Assert(vals, DeepEquals, []string{"two"}) - - vals, err = t.client.ZRevRangeByScore( - "zset", redis.ZRangeByScore{Max: "(2", Min: "(1"}).Result() - c.Assert(err, IsNil) - c.Assert(vals, DeepEquals, []string{}) -} - -func (t *RedisTest) TestZRevRangeByScoreWithScores(c *C) { - zadd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zadd.Err(), IsNil) - zadd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zadd.Err(), IsNil) - zadd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zadd.Err(), IsNil) - - vals, err := t.client.ZRevRangeByScoreWithScores( - "zset", redis.ZRangeByScore{Max: "+inf", Min: "-inf"}).Result() - c.Assert(err, IsNil) - c.Assert(vals, DeepEquals, []redis.Z{{3, "three"}, {2, "two"}, {1, "one"}}) -} - -func (t *RedisTest) TestZRevRangeByScoreWithScoresMap(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - val, err := t.client.ZRevRangeByScoreWithScores( - "zset", redis.ZRangeByScore{Max: "+inf", Min: "-inf"}).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{3, "three"}, {2, "two"}, {1, "one"}}) - - val, err = t.client.ZRevRangeByScoreWithScores( - "zset", redis.ZRangeByScore{Max: "2", Min: "(1"}).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{2, "two"}}) - - val, err = t.client.ZRevRangeByScoreWithScores( - "zset", redis.ZRangeByScore{Max: "(2", Min: "(1"}).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{}) -} - -func (t *RedisTest) TestZRevRank(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zRevRank := t.client.ZRevRank("zset", "one") - c.Assert(zRevRank.Err(), IsNil) - c.Assert(zRevRank.Val(), Equals, int64(2)) - - zRevRank = t.client.ZRevRank("zset", "four") - c.Assert(zRevRank.Err(), Equals, redis.Nil) - c.Assert(zRevRank.Val(), Equals, int64(0)) -} - -func (t *RedisTest) TestZScore(c *C) { - zAdd := t.client.ZAdd("zset", redis.Z{1.001, "one"}) - c.Assert(zAdd.Err(), IsNil) - - zScore := t.client.ZScore("zset", "one") - c.Assert(zScore.Err(), IsNil) - c.Assert(zScore.Val(), Equals, float64(1.001)) -} - -func (t *RedisTest) TestZUnionStore(c *C) { - zAdd := t.client.ZAdd("zset1", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset1", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - - zAdd = t.client.ZAdd("zset2", redis.Z{1, "one"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset2", redis.Z{2, "two"}) - c.Assert(zAdd.Err(), IsNil) - zAdd = t.client.ZAdd("zset2", redis.Z{3, "three"}) - c.Assert(zAdd.Err(), IsNil) - - zUnionStore := t.client.ZUnionStore( - "out", redis.ZStore{Weights: []int64{2, 3}}, "zset1", "zset2") - c.Assert(zUnionStore.Err(), IsNil) - c.Assert(zUnionStore.Val(), Equals, int64(3)) - - val, err := t.client.ZRangeWithScores("out", 0, -1).Result() - c.Assert(err, IsNil) - c.Assert(val, DeepEquals, []redis.Z{{5, "one"}, {9, "three"}, {10, "two"}}) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestPatternPubSub(c *C) { - pubsub := t.client.PubSub() - defer func() { - c.Assert(pubsub.Close(), IsNil) - }() - - c.Assert(pubsub.PSubscribe("mychannel*"), IsNil) - - pub := t.client.Publish("mychannel1", "hello") - c.Assert(pub.Err(), IsNil) - c.Assert(pub.Val(), Equals, int64(1)) - - c.Assert(pubsub.PUnsubscribe("mychannel*"), IsNil) - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Subscription) - c.Assert(subscr.Kind, Equals, "psubscribe") - c.Assert(subscr.Channel, Equals, "mychannel*") - c.Assert(subscr.Count, Equals, 1) - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.PMessage) - c.Assert(subscr.Channel, Equals, "mychannel1") - c.Assert(subscr.Pattern, Equals, "mychannel*") - c.Assert(subscr.Payload, Equals, "hello") - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Subscription) - c.Assert(subscr.Kind, Equals, "punsubscribe") - c.Assert(subscr.Channel, Equals, "mychannel*") - c.Assert(subscr.Count, Equals, 0) - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err.(net.Error).Timeout(), Equals, true) - c.Assert(msgi, IsNil) - } -} - -func (t *RedisTest) TestPubSub(c *C) { - pubsub := t.client.PubSub() - defer func() { - c.Assert(pubsub.Close(), IsNil) - }() - - c.Assert(pubsub.Subscribe("mychannel", "mychannel2"), IsNil) - - pub := t.client.Publish("mychannel", "hello") - c.Assert(pub.Err(), IsNil) - c.Assert(pub.Val(), Equals, int64(1)) - - pub = t.client.Publish("mychannel2", "hello2") - c.Assert(pub.Err(), IsNil) - c.Assert(pub.Val(), Equals, int64(1)) - - c.Assert(pubsub.Unsubscribe("mychannel", "mychannel2"), IsNil) - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Subscription) - c.Assert(subscr.Kind, Equals, "subscribe") - c.Assert(subscr.Channel, Equals, "mychannel") - c.Assert(subscr.Count, Equals, 1) - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Subscription) - c.Assert(subscr.Kind, Equals, "subscribe") - c.Assert(subscr.Channel, Equals, "mychannel2") - c.Assert(subscr.Count, Equals, 2) - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Message) - c.Assert(subscr.Channel, Equals, "mychannel") - c.Assert(subscr.Payload, Equals, "hello") - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - msg := msgi.(*redis.Message) - c.Assert(msg.Channel, Equals, "mychannel2") - c.Assert(msg.Payload, Equals, "hello2") - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Subscription) - c.Assert(subscr.Kind, Equals, "unsubscribe") - c.Assert(subscr.Channel, Equals, "mychannel") - c.Assert(subscr.Count, Equals, 1) - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err, IsNil) - subscr := msgi.(*redis.Subscription) - c.Assert(subscr.Kind, Equals, "unsubscribe") - c.Assert(subscr.Channel, Equals, "mychannel2") - c.Assert(subscr.Count, Equals, 0) - } - - { - msgi, err := pubsub.ReceiveTimeout(time.Second) - c.Assert(err.(net.Error).Timeout(), Equals, true) - c.Assert(msgi, IsNil) - } -} - -func (t *RedisTest) TestPubSubChannels(c *C) { - channels, err := t.client.PubSubChannels("mychannel*").Result() - c.Assert(err, IsNil) - c.Assert(channels, HasLen, 0) - c.Assert(channels, Not(IsNil)) - - pubsub := t.client.PubSub() - defer pubsub.Close() - - c.Assert(pubsub.Subscribe("mychannel", "mychannel2"), IsNil) - - channels, err = t.client.PubSubChannels("mychannel*").Result() - c.Assert(err, IsNil) - c.Assert(sortStrings(channels), DeepEquals, []string{"mychannel", "mychannel2"}) - - channels, err = t.client.PubSubChannels("").Result() - c.Assert(err, IsNil) - c.Assert(channels, HasLen, 0) - - channels, err = t.client.PubSubChannels("*").Result() - c.Assert(err, IsNil) - c.Assert(len(channels) >= 2, Equals, true) -} - -func (t *RedisTest) TestPubSubNumSub(c *C) { - pubsub := t.client.PubSub() - defer pubsub.Close() - - c.Assert(pubsub.Subscribe("mychannel", "mychannel2"), IsNil) - - channels, err := t.client.PubSubNumSub("mychannel", "mychannel2", "mychannel3").Result() - c.Assert(err, IsNil) - c.Assert( - channels, - DeepEquals, - []interface{}{"mychannel", int64(1), "mychannel2", int64(1), "mychannel3", int64(0)}, - ) -} - -func (t *RedisTest) TestPubSubNumPat(c *C) { - num, err := t.client.PubSubNumPat().Result() - c.Assert(err, IsNil) - c.Assert(num, Equals, int64(0)) - - pubsub := t.client.PubSub() - defer pubsub.Close() - - c.Assert(pubsub.PSubscribe("mychannel*"), IsNil) - - num, err = t.client.PubSubNumPat().Result() - c.Assert(err, IsNil) - c.Assert(num, Equals, int64(1)) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestPipeline(c *C) { - set := t.client.Set("key2", "hello2") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - pipeline := t.client.Pipeline() - defer func() { - c.Assert(pipeline.Close(), IsNil) - }() - - set = pipeline.Set("key1", "hello1") - get := pipeline.Get("key2") - incr := pipeline.Incr("key3") - getNil := pipeline.Get("key4") - - cmds, err := pipeline.Exec() - c.Assert(err, Equals, redis.Nil) - c.Assert(cmds, HasLen, 4) - - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello2") - - c.Assert(incr.Err(), IsNil) - c.Assert(incr.Val(), Equals, int64(1)) - - c.Assert(getNil.Err(), Equals, redis.Nil) - c.Assert(getNil.Val(), Equals, "") -} - -func (t *RedisTest) TestPipelineDiscardQueued(c *C) { - pipeline := t.client.Pipeline() - - pipeline.Get("key") - pipeline.Discard() - cmds, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 0) - - c.Assert(pipeline.Close(), IsNil) -} - -func (t *RedisTest) TestPipelined(c *C) { - var get *redis.StringCmd - cmds, err := t.client.Pipelined(func(pipe *redis.Pipeline) error { - get = pipe.Get("foo") - return nil - }) - c.Assert(err, Equals, redis.Nil) - c.Assert(cmds, HasLen, 1) - c.Assert(cmds[0], Equals, get) - c.Assert(get.Err(), Equals, redis.Nil) - c.Assert(get.Val(), Equals, "") -} - -func (t *RedisTest) TestPipelineErrValNotSet(c *C) { - pipeline := t.client.Pipeline() - defer func() { - c.Assert(pipeline.Close(), IsNil) - }() - - get := pipeline.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "") -} - -func (t *RedisTest) TestPipelineRunQueuedOnEmptyQueue(c *C) { - pipeline := t.client.Pipeline() - defer func() { - c.Assert(pipeline.Close(), IsNil) - }() - - cmds, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 0) -} - -// TODO: make thread safe? -func (t *RedisTest) TestPipelineIncr(c *C) { - const N = 20000 - key := "TestPipelineIncr" - - pipeline := t.client.Pipeline() - - wg := &sync.WaitGroup{} - wg.Add(N) - for i := 0; i < N; i++ { - pipeline.Incr(key) - wg.Done() - } - wg.Wait() - - cmds, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(len(cmds), Equals, 20000) - for _, cmd := range cmds { - if cmd.Err() != nil { - c.Errorf("got %v, expected nil", cmd.Err()) - } - } - - get := t.client.Get(key) - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, strconv.Itoa(N)) - - c.Assert(pipeline.Close(), IsNil) -} - -func (t *RedisTest) TestPipelineEcho(c *C) { - const N = 1000 - - wg := &sync.WaitGroup{} - wg.Add(N) - for i := 0; i < N; i++ { - go func(i int) { - pipeline := t.client.Pipeline() - - msg1 := "echo" + strconv.Itoa(i) - msg2 := "echo" + strconv.Itoa(i+1) - - echo1 := pipeline.Echo(msg1) - echo2 := pipeline.Echo(msg2) - - cmds, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 2) - - c.Assert(echo1.Err(), IsNil) - c.Assert(echo1.Val(), Equals, msg1) - - c.Assert(echo2.Err(), IsNil) - c.Assert(echo2.Val(), Equals, msg2) - - c.Assert(pipeline.Close(), IsNil) - - wg.Done() - }(i) - } - wg.Wait() -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestMultiExec(c *C) { - multi := t.client.Multi() - defer func() { - c.Assert(multi.Close(), IsNil) - }() - - var ( - set *redis.StatusCmd - get *redis.StringCmd - ) - cmds, err := multi.Exec(func() error { - set = multi.Set("key", "hello") - get = multi.Get("key") - return nil - }) - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 2) - - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello") -} - -func (t *RedisTest) TestMultiExecDiscard(c *C) { - multi := t.client.Multi() - defer func() { - c.Assert(multi.Close(), IsNil) - }() - - cmds, err := multi.Exec(func() error { - multi.Set("key1", "hello1") - multi.Discard() - multi.Set("key2", "hello2") - return nil - }) - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 1) - - get := t.client.Get("key1") - c.Assert(get.Err(), Equals, redis.Nil) - c.Assert(get.Val(), Equals, "") - - get = t.client.Get("key2") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "hello2") -} - -func (t *RedisTest) TestMultiExecEmpty(c *C) { - multi := t.client.Multi() - defer func() { - c.Assert(multi.Close(), IsNil) - }() - - cmds, err := multi.Exec(func() error { return nil }) - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 0) - - ping := multi.Ping() - c.Check(ping.Err(), IsNil) - c.Check(ping.Val(), Equals, "PONG") -} - -func (t *RedisTest) TestMultiExecOnEmptyQueue(c *C) { - multi := t.client.Multi() - defer func() { - c.Assert(multi.Close(), IsNil) - }() - - cmds, err := multi.Exec(func() error { return nil }) - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 0) -} - -func (t *RedisTest) TestMultiExecIncr(c *C) { - multi := t.client.Multi() - defer func() { - c.Assert(multi.Close(), IsNil) - }() - - cmds, err := multi.Exec(func() error { - for i := int64(0); i < 20000; i++ { - multi.Incr("key") - } - return nil - }) - c.Assert(err, IsNil) - c.Assert(len(cmds), Equals, 20000) - for _, cmd := range cmds { - if cmd.Err() != nil { - c.Errorf("got %v, expected nil", cmd.Err()) - } - } - - get := t.client.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Equals, "20000") -} - -func (t *RedisTest) transactionalIncr(c *C) ([]redis.Cmder, error) { - multi := t.client.Multi() - defer func() { - c.Assert(multi.Close(), IsNil) - }() - - watch := multi.Watch("key") - c.Assert(watch.Err(), IsNil) - c.Assert(watch.Val(), Equals, "OK") - - get := multi.Get("key") - c.Assert(get.Err(), IsNil) - c.Assert(get.Val(), Not(Equals), redis.Nil) - - v, err := strconv.ParseInt(get.Val(), 10, 64) - c.Assert(err, IsNil) - - return multi.Exec(func() error { - multi.Set("key", strconv.FormatInt(v+1, 10)) - return nil - }) -} - -func (t *RedisTest) TestWatchUnwatch(c *C) { - var n = 10000 - if testing.Short() { - n = 1000 - } - - set := t.client.Set("key", "0") - c.Assert(set.Err(), IsNil) - - wg := &sync.WaitGroup{} - for i := 0; i < n; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for { - cmds, err := t.transactionalIncr(c) - if err == redis.TxFailedErr { - continue - } - c.Assert(err, IsNil) - c.Assert(cmds, HasLen, 1) - c.Assert(cmds[0].Err(), IsNil) - break - } - }() - } - wg.Wait() - - val, err := t.client.Get("key").Int64() - c.Assert(err, IsNil) - c.Assert(val, Equals, int64(n)) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestRaceEcho(c *C) { - var n = 10000 - if testing.Short() { - n = 1000 - } - - wg := &sync.WaitGroup{} - wg.Add(n) - for i := 0; i < n; i++ { - go func(i int) { - msg := "echo" + strconv.Itoa(i) - echo := t.client.Echo(msg) - c.Assert(echo.Err(), IsNil) - c.Assert(echo.Val(), Equals, msg) - wg.Done() - }(i) - } - wg.Wait() -} - -func (t *RedisTest) TestRaceIncr(c *C) { - var n = 10000 - if testing.Short() { - n = 1000 - } - - wg := &sync.WaitGroup{} - wg.Add(n) - for i := 0; i < n; i++ { - go func() { - incr := t.client.Incr("TestRaceIncr") - if err := incr.Err(); err != nil { - panic(err) - } - wg.Done() - }() - } - wg.Wait() - - val, err := t.client.Get("TestRaceIncr").Result() - c.Assert(err, IsNil) - c.Assert(val, Equals, strconv.Itoa(n)) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestCmdBgRewriteAOF(c *C) { - r := t.client.BgRewriteAOF() - c.Assert(r.Err(), IsNil) - c.Assert(r.Val(), Equals, "Background append only file rewriting started") -} - -func (t *RedisTest) TestCmdBgSave(c *C) { - // workaround for "ERR Can't BGSAVE while AOF log rewriting is in progress" - time.Sleep(time.Second) - - r := t.client.BgSave() - c.Assert(r.Err(), IsNil) - c.Assert(r.Val(), Equals, "Background saving started") -} - -func (t *RedisTest) TestCmdClientKill(c *C) { - r := t.client.ClientKill("1.1.1.1:1111") - c.Assert(r.Err(), ErrorMatches, "ERR No such client") - c.Assert(r.Val(), Equals, "") -} - -func (t *RedisTest) TestCmdConfigGet(c *C) { - r := t.client.ConfigGet("*") - c.Assert(r.Err(), IsNil) - c.Assert(len(r.Val()) > 0, Equals, true) -} - -func (t *RedisTest) TestCmdConfigResetStat(c *C) { - r := t.client.ConfigResetStat() - c.Assert(r.Err(), IsNil) - c.Assert(r.Val(), Equals, "OK") -} - -func (t *RedisTest) TestCmdConfigSet(c *C) { - configGet := t.client.ConfigGet("maxmemory") - c.Assert(configGet.Err(), IsNil) - c.Assert(configGet.Val(), HasLen, 2) - c.Assert(configGet.Val()[0], Equals, "maxmemory") - - configSet := t.client.ConfigSet("maxmemory", configGet.Val()[1].(string)) - c.Assert(configSet.Err(), IsNil) - c.Assert(configSet.Val(), Equals, "OK") -} - -func (t *RedisTest) TestCmdDbSize(c *C) { - dbSize := t.client.DbSize() - c.Assert(dbSize.Err(), IsNil) - c.Assert(dbSize.Val(), Equals, int64(0)) -} - -func (t *RedisTest) TestCmdFlushAll(c *C) { - // TODO -} - -func (t *RedisTest) TestCmdFlushDb(c *C) { - // TODO -} - -func (t *RedisTest) TestCmdInfo(c *C) { - info := t.client.Info() - c.Assert(info.Err(), IsNil) - c.Assert(info.Val(), Not(Equals), "") -} - -func (t *RedisTest) TestCmdLastSave(c *C) { - lastSave := t.client.LastSave() - c.Assert(lastSave.Err(), IsNil) - c.Assert(lastSave.Val(), Not(Equals), 0) -} - -func (t *RedisTest) TestCmdSave(c *C) { - save := t.client.Save() - c.Assert(save.Err(), IsNil) - c.Assert(save.Val(), Equals, "OK") -} - -func (t *RedisTest) TestSlaveOf(c *C) { - slaveOf := t.client.SlaveOf("localhost", "8888") - c.Assert(slaveOf.Err(), IsNil) - c.Assert(slaveOf.Val(), Equals, "OK") - - slaveOf = t.client.SlaveOf("NO", "ONE") - c.Assert(slaveOf.Err(), IsNil) - c.Assert(slaveOf.Val(), Equals, "OK") -} - -func (t *RedisTest) TestTime(c *C) { - time := t.client.Time() - c.Assert(time.Err(), IsNil) - c.Assert(time.Val(), HasLen, 2) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestScriptingEval(c *C) { - eval := t.client.Eval( - "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}", - []string{"key1", "key2"}, - []string{"first", "second"}, - ) - c.Assert(eval.Err(), IsNil) - c.Assert(eval.Val(), DeepEquals, []interface{}{"key1", "key2", "first", "second"}) - - eval = t.client.Eval( - "return redis.call('set',KEYS[1],'bar')", - []string{"foo"}, - []string{}, - ) - c.Assert(eval.Err(), IsNil) - c.Assert(eval.Val(), Equals, "OK") - - eval = t.client.Eval("return 10", []string{}, []string{}) - c.Assert(eval.Err(), IsNil) - c.Assert(eval.Val(), Equals, int64(10)) - - eval = t.client.Eval("return {1,2,{3,'Hello World!'}}", []string{}, []string{}) - c.Assert(eval.Err(), IsNil) - // DeepEquals can't compare nested slices. - c.Assert( - fmt.Sprintf("%#v", eval.Val()), - Equals, - `[]interface {}{1, 2, []interface {}{3, "Hello World!"}}`, - ) -} - -func (t *RedisTest) TestScriptingEvalSha(c *C) { - set := t.client.Set("foo", "bar") - c.Assert(set.Err(), IsNil) - c.Assert(set.Val(), Equals, "OK") - - eval := t.client.Eval("return redis.call('get','foo')", nil, nil) - c.Assert(eval.Err(), IsNil) - c.Assert(eval.Val(), Equals, "bar") - - evalSha := t.client.EvalSha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791", nil, nil) - c.Assert(evalSha.Err(), IsNil) - c.Assert(evalSha.Val(), Equals, "bar") - - evalSha = t.client.EvalSha("ffffffffffffffffffffffffffffffffffffffff", nil, nil) - c.Assert(evalSha.Err(), ErrorMatches, "NOSCRIPT No matching script. Please use EVAL.") - c.Assert(evalSha.Val(), Equals, nil) -} - -func (t *RedisTest) TestScriptingScriptExists(c *C) { - scriptLoad := t.client.ScriptLoad("return 1") - c.Assert(scriptLoad.Err(), IsNil) - c.Assert(scriptLoad.Val(), Equals, "e0e1f9fabfc9d4800c877a703b823ac0578ff8db") - - scriptExists := t.client.ScriptExists( - "e0e1f9fabfc9d4800c877a703b823ac0578ff8db", - "ffffffffffffffffffffffffffffffffffffffff", - ) - c.Assert(scriptExists.Err(), IsNil) - c.Assert(scriptExists.Val(), DeepEquals, []bool{true, false}) -} - -func (t *RedisTest) TestScriptingScriptFlush(c *C) { - scriptFlush := t.client.ScriptFlush() - c.Assert(scriptFlush.Err(), IsNil) - c.Assert(scriptFlush.Val(), Equals, "OK") -} - -func (t *RedisTest) TestScriptingScriptKill(c *C) { - scriptKill := t.client.ScriptKill() - c.Assert(scriptKill.Err(), ErrorMatches, ".*No scripts in execution right now.") - c.Assert(scriptKill.Val(), Equals, "") -} - -func (t *RedisTest) TestScriptingScriptLoad(c *C) { - scriptLoad := t.client.ScriptLoad("return redis.call('get','foo')") - c.Assert(scriptLoad.Err(), IsNil) - c.Assert(scriptLoad.Val(), Equals, "6b1bf486c81ceb7edf3c093f4c48582e38c0e791") -} - -func (t *RedisTest) TestScriptingNewScript(c *C) { - s := redis.NewScript("return 1") - run := s.Run(t.client, nil, nil) - c.Assert(run.Err(), IsNil) - c.Assert(run.Val(), Equals, int64(1)) -} - -func (t *RedisTest) TestScriptingEvalAndPipeline(c *C) { - pipeline := t.client.Pipeline() - s := redis.NewScript("return 1") - run := s.Eval(pipeline, nil, nil) - _, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(run.Err(), IsNil) - c.Assert(run.Val(), Equals, int64(1)) -} - -func (t *RedisTest) TestScriptingEvalShaAndPipeline(c *C) { - s := redis.NewScript("return 1") - c.Assert(s.Load(t.client).Err(), IsNil) - - pipeline := t.client.Pipeline() - run := s.Eval(pipeline, nil, nil) - _, err := pipeline.Exec() - c.Assert(err, IsNil) - c.Assert(run.Err(), IsNil) - c.Assert(run.Val(), Equals, int64(1)) -} - -//------------------------------------------------------------------------------ - -func (t *RedisTest) TestCmdDebugObject(c *C) { - { - debug := t.client.DebugObject("foo") - c.Assert(debug.Err(), Not(IsNil)) - c.Assert(debug.Err().Error(), Equals, "ERR no such key") - } - - { - t.client.Set("foo", "bar") - debug := t.client.DebugObject("foo") - c.Assert(debug.Err(), IsNil) - c.Assert(debug.Val(), FitsTypeOf, "") - c.Assert(debug.Val(), Not(Equals), "") - } -} - -//------------------------------------------------------------------------------ - -func BenchmarkRedisPing(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - b.StartTimer() - - for i := 0; i < b.N; i++ { - if err := client.Ping().Err(); err != nil { - panic(err) - } - } -} - -func BenchmarkRedisSet(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - b.StartTimer() - - for i := 0; i < b.N; i++ { - if err := client.Set("key", "hello").Err(); err != nil { - panic(err) - } - } -} - -func BenchmarkRedisGetNil(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - if err := client.FlushDb().Err(); err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - if err := client.Get("key").Err(); err != redis.Nil { - b.Fatal(err) - } - } -} - -func BenchmarkRedisGet(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - if err := client.Set("key", "hello").Err(); err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - if err := client.Get("key").Err(); err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkRedisMGet(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - if err := client.MSet("key1", "hello1", "key2", "hello2").Err(); err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - if err := client.MGet("key1", "key2").Err(); err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkSetExpire(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - b.StartTimer() - - for i := 0; i < b.N; i++ { - if err := client.Set("key", "hello").Err(); err != nil { - b.Fatal(err) - } - if err := client.Expire("key", time.Second).Err(); err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkPipeline(b *testing.B) { - b.StopTimer() - client := redis.NewTCPClient(&redis.Options{ - Addr: redisAddr, - }) - b.StartTimer() - - for i := 0; i < b.N; i++ { - _, err := client.Pipelined(func(pipe *redis.Pipeline) error { - pipe.Set("key", "hello") - pipe.Expire("key", time.Second) - return nil - }) - if err != nil { - b.Fatal(err) - } - } -} diff --git a/vendor/gopkg.in/redis.v2/sentinel_test.go b/vendor/gopkg.in/redis.v2/sentinel_test.go deleted file mode 100644 index ede59bd51e2..00000000000 --- a/vendor/gopkg.in/redis.v2/sentinel_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package redis_test - -import ( - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "testing" - "text/template" - "time" - - "gopkg.in/redis.v2" -) - -func startRedis(port string) (*exec.Cmd, error) { - cmd := exec.Command("redis-server", "--port", port) - if false { - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - } - if err := cmd.Start(); err != nil { - return nil, err - } - return cmd, nil -} - -func startRedisSlave(port, slave string) (*exec.Cmd, error) { - cmd := exec.Command("redis-server", "--port", port, "--slaveof", "127.0.0.1", slave) - if false { - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - } - if err := cmd.Start(); err != nil { - return nil, err - } - return cmd, nil -} - -func startRedisSentinel(port, masterName, masterPort string) (*exec.Cmd, error) { - dir, err := ioutil.TempDir("", "sentinel") - if err != nil { - return nil, err - } - - sentinelConfFilepath := filepath.Join(dir, "sentinel.conf") - tpl, err := template.New("sentinel.conf").Parse(sentinelConf) - if err != nil { - return nil, err - } - - data := struct { - Port string - MasterName string - MasterPort string - }{ - Port: port, - MasterName: masterName, - MasterPort: masterPort, - } - if err := writeTemplateToFile(sentinelConfFilepath, tpl, data); err != nil { - return nil, err - } - - cmd := exec.Command("redis-server", sentinelConfFilepath, "--sentinel") - if true { - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - } - if err := cmd.Start(); err != nil { - return nil, err - } - - return cmd, nil -} - -func writeTemplateToFile(path string, t *template.Template, data interface{}) error { - f, err := os.Create(path) - if err != nil { - return err - } - defer f.Close() - return t.Execute(f, data) -} - -func TestSentinel(t *testing.T) { - masterName := "mymaster" - masterPort := "8123" - slavePort := "8124" - sentinelPort := "8125" - - masterCmd, err := startRedis(masterPort) - if err != nil { - t.Fatal(err) - } - defer masterCmd.Process.Kill() - - // Wait for master to start. - time.Sleep(200 * time.Millisecond) - - master := redis.NewTCPClient(&redis.Options{ - Addr: ":" + masterPort, - }) - if err := master.Ping().Err(); err != nil { - t.Fatal(err) - } - - slaveCmd, err := startRedisSlave(slavePort, masterPort) - if err != nil { - t.Fatal(err) - } - defer slaveCmd.Process.Kill() - - // Wait for slave to start. - time.Sleep(200 * time.Millisecond) - - slave := redis.NewTCPClient(&redis.Options{ - Addr: ":" + slavePort, - }) - if err := slave.Ping().Err(); err != nil { - t.Fatal(err) - } - - sentinelCmd, err := startRedisSentinel(sentinelPort, masterName, masterPort) - if err != nil { - t.Fatal(err) - } - defer sentinelCmd.Process.Kill() - - // Wait for sentinel to start. - time.Sleep(200 * time.Millisecond) - - sentinel := redis.NewTCPClient(&redis.Options{ - Addr: ":" + sentinelPort, - }) - if err := sentinel.Ping().Err(); err != nil { - t.Fatal(err) - } - defer sentinel.Shutdown() - - client := redis.NewFailoverClient(&redis.FailoverOptions{ - MasterName: masterName, - SentinelAddrs: []string{":" + sentinelPort}, - }) - - if err := client.Set("foo", "master").Err(); err != nil { - t.Fatal(err) - } - - val, err := master.Get("foo").Result() - if err != nil { - t.Fatal(err) - } - if val != "master" { - t.Fatalf(`got %q, expected "master"`, val) - } - - // Kill Redis master. - if err := masterCmd.Process.Kill(); err != nil { - t.Fatal(err) - } - if err := master.Ping().Err(); err == nil { - t.Fatalf("master was not killed") - } - - // Wait for Redis sentinel to elect new master. - time.Sleep(5 * time.Second) - - // Check that client picked up new master. - val, err = client.Get("foo").Result() - if err != nil { - t.Fatal(err) - } - if val != "master" { - t.Fatalf(`got %q, expected "master"`, val) - } -} - -var sentinelConf = ` -port {{ .Port }} - -sentinel monitor {{ .MasterName }} 127.0.0.1 {{ .MasterPort }} 1 -sentinel down-after-milliseconds {{ .MasterName }} 1000 -sentinel failover-timeout {{ .MasterName }} 2000 -sentinel parallel-syncs {{ .MasterName }} 1 -` diff --git a/vendor/gopkg.in/yaml.v2/README.md b/vendor/gopkg.in/yaml.v2/README.md deleted file mode 100644 index 2ed3314c739..00000000000 --- a/vendor/gopkg.in/yaml.v2/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# 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 Apache License 2.0. Please see the LICENSE file for details. - - -Example -------- - -Some more examples can be found in the "examples" folder. - -```Go -package main - -import ( - "fmt" - "log" - - "gopkg.in/yaml.v2" -) - -var data = ` -a: Easy! -b: - c: 2 - d: [3, 4] -` - -// Note: struct fields must be public in order for unmarshal to -// correctly populate the data. -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 -``` -