diff --git a/README.md b/README.md index 852cae2..098f237 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Gocommon [![Build Status](https://travis-ci.org/nyaruka/gocommon.svg?branch=master)](https://travis-ci.org/nyaruka/gocommon) [![Coverage Status](https://coveralls.io/repos/github/nyaruka/gocommon/badge.svg?branch=master)](https://coveralls.io/github/nyaruka/gocommon?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/nyaruka/gocommon)](https://goreportcard.com/report/github.com/nyaruka/gocommon) -Common functionality in goflow and courier. +Common functionality in [mailroom](https://github.com/nyaruka/mailroom), [goflow](https://github.com/nyaruka/goflow) and [courier](https://github.com/nyaruka/courier). ## Running Tests -You can run all the tests (excluding tests in vendor packages) with: +You can run all the tests with: ``` % go test github.com/nyaruka/gocommon/... diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2496b85 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module github.com/nyaruka/gocommon + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/nyaruka/phonenumbers v1.0.34 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..f19d396 --- /dev/null +++ b/go.sum @@ -0,0 +1,14 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/nyaruka/phonenumbers v1.0.34 h1:e1ydu+tsOB2ZNjgebZIRy65QpfADWmx6YBlBJWTtG/o= +github.com/nyaruka/phonenumbers v1.0.34/go.mod h1:GQ0cTHlrxPrhoLwyQ1blyN1hO794ygt6FTHWrFB5SSc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/net v0.0.0-20180921000356-2f5d2388922f h1:QM2QVxvDoW9PFSPp/zy9FgxJLfaWTZlS61KEPtBwacM= +golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/github.com/golang/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/golang/protobuf/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/github.com/golang/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 1b1b192..0000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,31 +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. - diff --git a/vendor/github.com/golang/protobuf/Make.protobuf b/vendor/github.com/golang/protobuf/Make.protobuf deleted file mode 100644 index 15071de..0000000 --- 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 a1421d8..0000000 --- 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 9c4c815..0000000 --- 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 e2e0651..0000000 --- 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/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go deleted file mode 100644 index e392575..0000000 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ /dev/null @@ -1,229 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 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. - -// Protocol buffer deep copy and merge. -// TODO: RawMessage. - -package proto - -import ( - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - - out := reflect.New(in.Type().Elem()) - // out is empty so a merge is a deep copy. - mergeStruct(out.Elem(), in.Elem()) - return out.Interface().(Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - // Explicit test prior to mergeStruct so that mistyped nils will fail - panic("proto: type mismatch") - } - if in.IsNil() { - // Merging nil into non-nil is a quiet no-op - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - sprop := GetProperties(in.Type()) - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) - } - - if emIn, ok := extendable(in.Addr().Interface()); ok { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -// mergeAny performs a merge between two values of the same type. -// viaPtr indicates whether the values were indirected through a pointer (implying proto2). -// prop is set if this is a struct field (it may be nil). -func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - if !viaPtr && isProto3Zero(in) { - return - } - out.Set(in) - case reflect.Interface: - // Probably a oneof field; copy non-nil values. - if in.IsNil() { - return - } - // Allocate destination if it is not set, or set to a different type. - // Otherwise we will merge as normal. - if out.IsNil() || out.Elem().Type() != in.Elem().Type() { - out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) - } - mergeAny(out.Elem(), in.Elem(), false, nil) - case reflect.Map: - if in.Len() == 0 { - return - } - if out.IsNil() { - out.Set(reflect.MakeMap(in.Type())) - } - // For maps with value types of *T or []byte we need to deep copy each value. - elemKind := in.Type().Elem().Kind() - for _, key := range in.MapKeys() { - var val reflect.Value - switch elemKind { - case reflect.Ptr: - val = reflect.New(in.Type().Elem().Elem()) - mergeAny(val, in.MapIndex(key), false, nil) - case reflect.Slice: - val = in.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - default: - val = in.MapIndex(key) - } - out.SetMapIndex(key, val) - } - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem(), true, nil) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value, and should not - // be merged. - if prop != nil && prop.proto3 && in.Len() == 0 { - return - } - - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i), false, nil) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value), false, nil) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go deleted file mode 100644 index aa20729..0000000 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ /dev/null @@ -1,970 +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. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" - "os" - "reflect" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// ErrInternalBadWireType is returned by generated code when an incorrect -// wire type is encountered. It does not get returned to user code. -var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") - -// The fundamental decoders that interpret bytes on the wire. -// Those that take integer types all return uint64 and are -// therefore of type valueDecoder. - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -func (p *Buffer) decodeVarintSlow() (x uint64, err error) { - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - i := p.index - buf := p.buf - - if i >= len(buf) { - return 0, io.ErrUnexpectedEOF - } else if buf[i] < 0x80 { - p.index++ - return uint64(buf[i]), nil - } else if len(buf)-i < 10 { - return p.decodeVarintSlow() - } - - var b uint64 - // we already checked the first byte - x = uint64(buf[i]) - 0x80 - i++ - - b = uint64(buf[i]) - i++ - x += b << 7 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 7 - - b = uint64(buf[i]) - i++ - x += b << 14 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 14 - - b = uint64(buf[i]) - i++ - x += b << 21 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 21 - - b = uint64(buf[i]) - i++ - x += b << 28 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 28 - - b = uint64(buf[i]) - i++ - x += b << 35 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 35 - - b = uint64(buf[i]) - i++ - x += b << 42 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 42 - - b = uint64(buf[i]) - i++ - x += b << 49 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 49 - - b = uint64(buf[i]) - i++ - x += b << 56 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 56 - - b = uint64(buf[i]) - i++ - x += b << 63 - if b&0x80 == 0 { - goto done - } - // x -= 0x80 << 63 // Always zero. - - return 0, errOverflow - -done: - p.index = i - return x, nil -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// These are not ValueDecoders: they produce an array of bytes or a string. -// bytes, embedded messages - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return nil, err - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -// If the protocol buffer has extensions, and the field matches, add it as an extension. -// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. -func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { - oi := o.index - - err := o.skip(t, tag, wire) - if err != nil { - return err - } - - if !unrecField.IsValid() { - return nil - } - - ptr := structPointer_Bytes(base, unrecField) - - // Add the skipped field to struct field - obuf := o.buf - - o.buf = *ptr - o.EncodeVarint(uint64(tag<<3 | wire)) - *ptr = append(o.buf, obuf[oi:o.index]...) - - o.buf = obuf - - return nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -func (o *Buffer) skip(t reflect.Type, tag, wire int) error { - - var u uint64 - var err error - - switch wire { - case WireVarint: - _, err = o.DecodeVarint() - case WireFixed64: - _, err = o.DecodeFixed64() - case WireBytes: - _, err = o.DecodeRawBytes(false) - case WireFixed32: - _, err = o.DecodeFixed32() - case WireStartGroup: - for { - u, err = o.DecodeVarint() - if err != nil { - break - } - fwire := int(u & 0x7) - if fwire == WireEndGroup { - break - } - ftag := int(u >> 3) - err = o.skip(t, ftag, fwire) - if err != nil { - break - } - } - default: - err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) - } - return err -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The method should reset the receiver before -// decoding starts. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - return UnmarshalMerge(buf, pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// DecodeMessage reads a count-delimited message from the Buffer. -func (p *Buffer) DecodeMessage(pb Message) error { - enc, err := p.DecodeRawBytes(false) - if err != nil { - return err - } - return NewBuffer(enc).Unmarshal(pb) -} - -// DecodeGroup reads a tag-delimited group from the Buffer. -func (p *Buffer) DecodeGroup(pb Message) error { - typ, base, err := getbase(pb) - if err != nil { - return err - } - return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -// -// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - typ, base, err := getbase(pb) - if err != nil { - return err - } - - err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) - - if collectStats { - stats.Decode++ - } - - return err -} - -// unmarshalType does the work of unmarshaling a structure. -func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { - var state errorState - required, reqFields := prop.reqCount, uint64(0) - - var err error - for err == nil && o.index < len(o.buf) { - oi := o.index - var u uint64 - u, err = o.DecodeVarint() - if err != nil { - break - } - wire := int(u & 0x7) - if wire == WireEndGroup { - if is_group { - if required > 0 { - // Not enough information to determine the exact field. - // (See below.) - return &RequiredNotSetError{"{Unknown}"} - } - return nil // input is satisfied - } - return fmt.Errorf("proto: %s: wiretype end group for non-group", st) - } - tag := int(u >> 3) - if tag <= 0 { - return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) - } - fieldnum, ok := prop.decoderTags.get(tag) - if !ok { - // Maybe it's an extension? - if prop.extendable { - if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - extmap := e.extensionsWrite() - ext := extmap[int32(tag)] // may be missing - ext.enc = append(ext.enc, o.buf[oi:o.index]...) - extmap[int32(tag)] = ext - } - continue - } - } - // Maybe it's a oneof? - if prop.oneofUnmarshaler != nil { - m := structPointer_Interface(base, st).(Message) - // First return value indicates whether tag is a oneof field. - ok, err = prop.oneofUnmarshaler(m, tag, wire, o) - if err == ErrInternalBadWireType { - // Map the error to something more descriptive. - // Do the formatting here to save generated code space. - err = fmt.Errorf("bad wiretype for oneof field in %T", m) - } - if ok { - continue - } - } - err = o.skipAndSave(st, tag, wire, base, prop.unrecField) - continue - } - p := prop.Prop[fieldnum] - - if p.dec == nil { - fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) - continue - } - dec := p.dec - if wire != WireStartGroup && wire != p.WireType { - if wire == WireBytes && p.packedDec != nil { - // a packable field - dec = p.packedDec - } else { - err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) - continue - } - } - decErr := dec(o, p, base) - if decErr != nil && !state.shouldContinue(decErr, p) { - err = decErr - } - if err == nil && p.Required { - // Successfully decoded a required field. - if tag <= 64 { - // use bitmap for fields 1-64 to catch field reuse. - var mask uint64 = 1 << uint64(tag-1) - if reqFields&mask == 0 { - // new required field - reqFields |= mask - required-- - } - } else { - // This is imprecise. It can be fooled by a required field - // with a tag > 64 that is encoded twice; that's very rare. - // A fully correct implementation would require allocating - // a data structure, which we would like to avoid. - required-- - } - } - } - if err == nil { - if is_group { - return io.ErrUnexpectedEOF - } - if state.err != nil { - return state.err - } - if required > 0 { - // Not enough information to determine the exact field. If we use extra - // CPU, we could determine the field only if the missing required field - // has a tag <= 64 and we check reqFields. - return &RequiredNotSetError{"{Unknown}"} - } - } - return err -} - -// Individual type decoders -// For each, -// u is the decoded value, -// v is a pointer to the field (pointer) in the struct - -// Sizes of the pools to allocate inside the Buffer. -// The goal is modest amortization and allocation -// on at least 16-byte boundaries. -const ( - boolPoolSize = 16 - uint32PoolSize = 8 - uint64PoolSize = 4 -) - -// Decode a bool. -func (o *Buffer) dec_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_Bool(base, p.field) = &o.bools[0] - o.bools = o.bools[1:] - return nil -} - -func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - *structPointer_BoolVal(base, p.field) = u != 0 - return nil -} - -// Decode an int32. -func (o *Buffer) dec_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) - return nil -} - -func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) - return nil -} - -// Decode an int64. -func (o *Buffer) dec_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, u) - return nil -} - -func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64Val_Set(structPointer_Word64Val(base, p.field), o, u) - return nil -} - -// Decode a string. -func (o *Buffer) dec_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_String(base, p.field) = &s - return nil -} - -func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_StringVal(base, p.field) = s - return nil -} - -// Decode a slice of bytes ([]byte). -func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - *structPointer_Bytes(base, p.field) = b - return nil -} - -// Decode a slice of bools ([]bool). -func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - v := structPointer_BoolSlice(base, p.field) - *v = append(*v, u != 0) - return nil -} - -// Decode a slice of bools ([]bool) in packed format. -func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { - v := structPointer_BoolSlice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded bools - fin := o.index + nb - if fin < o.index { - return errOverflow - } - - y := *v - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - y = append(y, u != 0) - } - - *v = y - return nil -} - -// Decode a slice of int32s ([]int32). -func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - structPointer_Word32Slice(base, p.field).Append(uint32(u)) - return nil -} - -// Decode a slice of int32s ([]int32) in packed format. -func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int32s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(uint32(u)) - } - return nil -} - -// Decode a slice of int64s ([]int64). -func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - - structPointer_Word64Slice(base, p.field).Append(u) - return nil -} - -// Decode a slice of int64s ([]int64) in packed format. -func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int64s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(u) - } - return nil -} - -// Decode a slice of strings ([]string). -func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - v := structPointer_StringSlice(base, p.field) - *v = append(*v, s) - return nil -} - -// Decode a slice of slice of bytes ([][]byte). -func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - v := structPointer_BytesSlice(base, p.field) - *v = append(*v, b) - return nil -} - -// Decode a map field. -func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - oi := o.index // index at the end of this map entry - o.index -= len(raw) // move buffer back to start of map entry - - mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V - if mptr.Elem().IsNil() { - mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) - } - v := mptr.Elem() // map[K]V - - // Prepare addressable doubly-indirect placeholders for the key and value types. - // See enc_new_map for why. - keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K - keybase := toStructPointer(keyptr.Addr()) // **K - - var valbase structPointer - var valptr reflect.Value - switch p.mtype.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valptr = reflect.ValueOf(&dummy) // *[]byte - valbase = toStructPointer(valptr) // *[]byte - case reflect.Ptr: - // message; valptr is **Msg; need to allocate the intermediate pointer - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valptr.Set(reflect.New(valptr.Type().Elem())) - valbase = toStructPointer(valptr) - default: - // everything else - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valbase = toStructPointer(valptr.Addr()) // **V - } - - // Decode. - // This parses a restricted wire format, namely the encoding of a message - // with two fields. See enc_new_map for the format. - for o.index < oi { - // tagcode for key and value properties are always a single byte - // because they have tags 1 and 2. - tagcode := o.buf[o.index] - o.index++ - switch tagcode { - case p.mkeyprop.tagcode[0]: - if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { - return err - } - case p.mvalprop.tagcode[0]: - if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { - return err - } - default: - // TODO: Should we silently skip this instead? - return fmt.Errorf("proto: bad map data tag %d", raw[0]) - } - } - keyelem, valelem := keyptr.Elem(), valptr.Elem() - if !keyelem.IsValid() { - keyelem = reflect.Zero(p.mtype.Key()) - } - if !valelem.IsValid() { - valelem = reflect.Zero(p.mtype.Elem()) - } - - v.SetMapIndex(keyelem, valelem) - return nil -} - -// Decode a group. -func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - return o.unmarshalType(p.stype, p.sprop, true, bas) -} - -// Decode an embedded message. -func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := structPointer_Interface(bas, p.stype) - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of embedded messages. -func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, false, base) -} - -// Decode a slice of embedded groups. -func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, true, base) -} - -// Decode a slice of structs ([]*struct). -func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { - v := reflect.New(p.stype) - bas := toStructPointer(v) - structPointer_StructPointerSlice(base, p.field).Append(bas) - - if is_group { - err := o.unmarshalType(p.stype, p.sprop, is_group, bas) - return err - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := v.Interface() - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, bas) - - o.buf = obuf - o.index = oi - - return err -} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go deleted file mode 100644 index 8b84d1b..0000000 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ /dev/null @@ -1,1362 +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. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "fmt" - "reflect" - "sort" -) - -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - -var ( - // errRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - errRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // errOneofHasNil is the error returned if Marshal is called with - // a struct with a oneof field containing a nil element. - errOneofHasNil = errors.New("proto: oneof field has nil value") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") - - // ErrTooLarge is the error returned if Marshal is called with a - // message that encodes to >2GB. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// maxMarshalSize is the largest allowed size of an encoded protobuf, -// since C++ and Java use signed int32s for the size. -const maxMarshalSize = 1<<31 - 1 - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -// SizeVarint returns the varint encoding size of an integer. -func SizeVarint(x uint64) int { - return sizeVarint(x) -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -func sizeFixed64(x uint64) int { - return 8 -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -func sizeFixed32(x uint64) int { - return 4 -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63))) -} - -func sizeZigzag64(x uint64) int { - return sizeVarint((x << 1) ^ uint64((int64(x) >> 63))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -func sizeZigzag32(x uint64) int { - return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -func sizeRawBytes(b []byte) int { - return sizeVarint(uint64(len(b))) + - len(b) -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -func sizeStringBytes(s string) int { - return sizeVarint(uint64(len(s))) + - len(s) -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, returning the data. -func Marshal(pb Message) ([]byte, error) { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - return m.Marshal() - } - p := NewBuffer(nil) - err := p.Marshal(pb) - if p.buf == nil && err == nil { - // Return a non-nil slice on success. - return []byte{}, nil - } - return p.buf, err -} - -// EncodeMessage writes the protocol buffer to the Buffer, -// prefixed by a varint-encoded length. -func (p *Buffer) EncodeMessage(pb Message) error { - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - var state errorState - err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) - } - return err -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, writing the result to the -// Buffer. -func (p *Buffer) Marshal(pb Message) error { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - data, err := m.Marshal() - p.buf = append(p.buf, data...) - return err - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - err = p.enc_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Encode++ // Parens are to work around a goimports bug. - } - - if len(p.buf) > maxMarshalSize { - return ErrTooLarge - } - return err -} - -// Size returns the encoded size of a protocol buffer. -func Size(pb Message) (n int) { - // Can the object marshal itself? If so, Size is slow. - // TODO: add Size to Marshaler, or add a Sizer interface. - if m, ok := pb.(Marshaler); ok { - b, _ := m.Marshal() - return len(b) - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return 0 - } - if err == nil { - n = size_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Size++ // Parens are to work around a goimports bug. - } - - return -} - -// Individual type encoders. - -// Encode a bool. -func (o *Buffer) enc_bool(p *Properties, base structPointer) error { - v := *structPointer_Bool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { - v := *structPointer_BoolVal(base, p.field) - if !v { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, 1) - return nil -} - -func size_bool(p *Properties, base structPointer) int { - v := *structPointer_Bool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -func size_proto3_bool(p *Properties, base structPointer) int { - v := *structPointer_BoolVal(base, p.field) - if !v && !p.oneof { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode an int32. -func (o *Buffer) enc_int32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a uint32. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := word32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := word32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode an int64. -func (o *Buffer) enc_int64(p *Properties, base structPointer) error { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return ErrNil - } - x := word64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return 0 - } - x := word64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -func size_proto3_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a string. -func (o *Buffer) enc_string(p *Properties, base structPointer) error { - v := *structPointer_String(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { - v := *structPointer_StringVal(base, p.field) - if v == "" { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(v) - return nil -} - -func size_string(p *Properties, base structPointer) (n int) { - v := *structPointer_String(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -func size_proto3_string(p *Properties, base structPointer) (n int) { - v := *structPointer_StringVal(base, p.field) - if v == "" && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeStringBytes(v) - return -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} - -// Encode a message struct. -func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return state.err - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -func size_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a group struct. -func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { - var state errorState - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return ErrNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - err := o.enc_struct(p.sprop, b) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return state.err -} - -func size_struct_group(p *Properties, base structPointer) (n int) { - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return 0 - } - - n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) - n += size_struct(p.sprop, b) - n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return -} - -// Encode a slice of bools ([]bool). -func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - for _, x := range s { - o.buf = append(o.buf, p.tagcode...) - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_bool(p *Properties, base structPointer) int { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - return l * (len(p.tagcode) + 1) // each bool takes exactly one byte -} - -// Encode a slice of bools ([]bool) in packed format. -func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(l)) // each bool takes exactly one byte - for _, x := range s { - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_packed_bool(p *Properties, base structPointer) (n int) { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - n += len(p.tagcode) - n += sizeVarint(uint64(l)) - n += l // each bool takes exactly one byte - return -} - -// Encode a slice of bytes ([]byte). -func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func size_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -// Encode a slice of int32s ([]int32). -func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of int32s ([]int32) in packed format. -func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(buf, uint64(x)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - bufSize += p.valSize(uint64(x)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of uint32s ([]uint32). -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := s.Index(i) - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := s.Index(i) - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of uint32s ([]uint32) in packed format. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, uint64(s.Index(i))) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(uint64(s.Index(i))) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of int64s ([]int64). -func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, s.Index(i)) - } - return nil -} - -func size_slice_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - n += p.valSize(s.Index(i)) - } - return -} - -// Encode a slice of int64s ([]int64) in packed format. -func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, s.Index(i)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(s.Index(i)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of slice of bytes ([][]byte). -func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(ss[i]) - } - return nil -} - -func size_slice_slice_byte(p *Properties, base structPointer) (n int) { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return 0 - } - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeRawBytes(ss[i]) - } - return -} - -// Encode a slice of strings ([]string). -func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(ss[i]) - } - return nil -} - -func size_slice_string(p *Properties, base structPointer) (n int) { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeStringBytes(ss[i]) - } - return -} - -// Encode a slice of message structs ([]*struct). -func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return errRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - } - return state.err -} - -func size_slice_struct_message(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -// Encode a slice of group structs ([]*struct). -func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return errRepeatedHasNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - - err := o.enc_struct(p.sprop, b) - - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - } - return state.err -} - -func size_slice_struct_group(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) - n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return // return size up to this point - } - - n += size_struct(p.sprop, b) - } - return -} - -// Encode an extension map. -func (o *Buffer) enc_map(p *Properties, base structPointer) error { - exts := structPointer_ExtMap(base, p.field) - if err := encodeExtensionsMap(*exts); err != nil { - return err - } - - return o.enc_map_body(*exts) -} - -func (o *Buffer) enc_exts(p *Properties, base structPointer) error { - exts := structPointer_Extensions(base, p.field) - - v, mu := exts.extensionsRead() - if v == nil { - return nil - } - - mu.Lock() - defer mu.Unlock() - if err := encodeExtensionsMap(v); err != nil { - return err - } - - return o.enc_map_body(v) -} - -func (o *Buffer) enc_map_body(v map[int32]Extension) error { - // Fast-path for common cases: zero or one extensions. - if len(v) <= 1 { - for _, e := range v { - o.buf = append(o.buf, e.enc...) - } - return nil - } - - // Sort keys to provide a deterministic encoding. - keys := make([]int, 0, len(v)) - for k := range v { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - o.buf = append(o.buf, v[int32(k)].enc...) - } - return nil -} - -func size_map(p *Properties, base structPointer) int { - v := structPointer_ExtMap(base, p.field) - return extensionsMapSize(*v) -} - -func size_exts(p *Properties, base structPointer) int { - v := structPointer_Extensions(base, p.field) - return extensionsSize(v) -} - -// Encode a map field. -func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { - var state errorState // XXX: or do we need to plumb this through? - - /* - A map defined as - map map_field = N; - is encoded in the same way as - message MapFieldEntry { - key_type key = 1; - value_type value = 2; - } - repeated MapFieldEntry map_field = N; - */ - - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - if v.Len() == 0 { - return nil - } - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - enc := func() error { - if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { - return err - } - if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { - return err - } - return nil - } - - // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - - keycopy.Set(key) - valcopy.Set(val) - - o.buf = append(o.buf, p.tagcode...) - if err := o.enc_len_thing(enc, &state); err != nil { - return err - } - } - return nil -} - -func size_new_map(p *Properties, base structPointer) int { - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - n := 0 - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - keycopy.Set(key) - valcopy.Set(val) - - // Tag codes for key and val are the responsibility of the sub-sizer. - keysize := p.mkeyprop.size(p.mkeyprop, keybase) - valsize := p.mvalprop.size(p.mvalprop, valbase) - entry := keysize + valsize - // Add on tag code and length of map entry itself. - n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry - } - return n -} - -// mapEncodeScratch returns a new reflect.Value matching the map's value type, -// and a structPointer suitable for passing to an encoder or sizer. -func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { - // Prepare addressable doubly-indirect placeholders for the key and value types. - // This is needed because the element-type encoders expect **T, but the map iteration produces T. - - keycopy = reflect.New(mapType.Key()).Elem() // addressable K - keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K - keyptr.Set(keycopy.Addr()) // - keybase = toStructPointer(keyptr.Addr()) // **K - - // Value types are more varied and require special handling. - switch mapType.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte - valbase = toStructPointer(valcopy.Addr()) - case reflect.Ptr: - // message; the generated field type is map[K]*Msg (so V is *Msg), - // so we only need one level of indirection. - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valbase = toStructPointer(valcopy.Addr()) - default: - // everything else - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V - valptr.Set(valcopy.Addr()) // - valbase = toStructPointer(valptr.Addr()) // **V - } - return -} - -// Encode a struct. -func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { - var state errorState - // Encode fields in tag order so that decoders may use optimizations - // that depend on the ordering. - // https://developers.google.com/protocol-buffers/docs/encoding#order - for _, i := range prop.order { - p := prop.Prop[i] - if p.enc != nil { - err := p.enc(o, p, base) - if err != nil { - if err == ErrNil { - if p.Required && state.err == nil { - state.err = &RequiredNotSetError{p.Name} - } - } else if err == errRepeatedHasNil { - // Give more context to nil values in repeated fields. - return errors.New("repeated field " + p.OrigName + " has nil element") - } else if !state.shouldContinue(err, p) { - return err - } - } - if len(o.buf) > maxMarshalSize { - return ErrTooLarge - } - } - } - - // Do oneof fields. - if prop.oneofMarshaler != nil { - m := structPointer_Interface(base, prop.stype).(Message) - if err := prop.oneofMarshaler(m, o); err == ErrNil { - return errOneofHasNil - } else if err != nil { - return err - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - if len(o.buf)+len(v) > maxMarshalSize { - return ErrTooLarge - } - if len(v) > 0 { - o.buf = append(o.buf, v...) - } - } - - return state.err -} - -func size_struct(prop *StructProperties, base structPointer) (n int) { - for _, i := range prop.order { - p := prop.Prop[i] - if p.size != nil { - n += p.size(p, base) - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - n += len(v) - } - - // Factor in any oneof fields. - if prop.oneofSizer != nil { - m := structPointer_Interface(base, prop.stype).(Message) - n += prop.oneofSizer(m) - } - - return -} - -var zeroes [20]byte // longer than any conceivable sizeVarint - -// Encode a struct, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { - return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) -} - -// Encode something, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { - iLen := len(o.buf) - o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length - iMsg := len(o.buf) - err := enc() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - lMsg := len(o.buf) - iMsg - lLen := sizeVarint(uint64(lMsg)) - switch x := lLen - (iMsg - iLen); { - case x > 0: // actual length is x bytes larger than the space we reserved - // Move msg x bytes right. - o.buf = append(o.buf, zeroes[:x]...) - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - case x < 0: // actual length is x bytes smaller than the space we reserved - // Move msg x bytes left. - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - o.buf = o.buf[:len(o.buf)+x] // x is negative - } - // Encode the length in the reserved space. - o.buf = o.buf[:iLen] - o.EncodeVarint(uint64(lMsg)) - o.buf = o.buf[:len(o.buf)+lMsg] - return state.err -} - -// errorState maintains the first error that occurs and updates that error -// with additional context. -type errorState struct { - err error -} - -// shouldContinue reports whether encoding should continue upon encountering the -// given error. If the error is RequiredNotSetError, shouldContinue returns true -// and, if this is the first appearance of that error, remembers it for future -// reporting. -// -// If prop is not nil, it may update any error with additional context about the -// field with the error. -func (s *errorState) shouldContinue(err error, prop *Properties) bool { - // Ignore unset required fields. - reqNotSet, ok := err.(*RequiredNotSetError) - if !ok { - return false - } - if s.err == nil { - if prop != nil { - err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} - } - s.err = err - } - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go deleted file mode 100644 index 2ed1cf5..0000000 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 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. - -// Protocol buffer comparison. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. If the message is defined - in a proto3 .proto file, fields are not "set"; specifically, - zero length proto3 "bytes" fields are equal (nil == {}). - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal. Note a "bytes" field, - although represented by []byte, is not a repeated field and the - rule for the scalar fields described above applies. - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Two map fields are equal iff their lengths are the same, - and they contain the same set of elements. Zero-length map - fields are equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - sprop := GetProperties(v1.Type()) - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - b1, ok := f1.Interface().(raw) - if ok { - b2 := f2.Interface().(raw) - // RawMessage - if !bytes.Equal(b1.Bytes(), b2.Bytes()) { - return false - } - continue - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2, sprop.Prop[i]) { - return false - } - } - - if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_InternalExtensions") - if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - if !bytes.Equal(u1, u2) { - return false - } - - return true -} - -// v1 and v2 are known to have the same type. -// prop may be nil. -func equalAny(v1, v2 reflect.Value, prop *Properties) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Interface: - // Probably a oneof field; compare the inner values. - n1, n2 := v1.IsNil(), v2.IsNil() - if n1 || n2 { - return n1 == n2 - } - e1, e2 := v1.Elem(), v2.Elem() - if e1.Type() != e2.Type() { - return false - } - return equalAny(e1, e2, nil) - case reflect.Map: - if v1.Len() != v2.Len() { - return false - } - for _, key := range v1.MapKeys() { - val2 := v2.MapIndex(key) - if !val2.IsValid() { - // This key was not found in the second map. - return false - } - if !equalAny(v1.MapIndex(key), val2, nil) { - return false - } - } - return true - case reflect.Ptr: - // Maps may have nil values in them, so check for nil. - if v1.IsNil() && v2.IsNil() { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return equalAny(v1.Elem(), v2.Elem(), prop) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value. - if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i), prop) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// x1 and x2 are InternalExtensions. -func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { - em1, _ := x1.extensionsRead() - em2, _ := x2.extensionsRead() - return equalExtMap(base, em1, em2) -} - -func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1, m2 := e1.value, e2.value - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - continue - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - } - - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index eaad218..0000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,587 +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. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer generated by the current -// proto compiler that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange - extensionsWrite() map[int32]Extension - extensionsRead() (map[int32]Extension, sync.Locker) -} - -// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous -// version of the proto compiler that may be extended. -type extendableProtoV1 interface { - Message - ExtensionRangeArray() []ExtensionRange - ExtensionMap() map[int32]Extension -} - -// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. -type extensionAdapter struct { - extendableProtoV1 -} - -func (e extensionAdapter) extensionsWrite() map[int32]Extension { - return e.ExtensionMap() -} - -func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - return e.ExtensionMap(), notLocker{} -} - -// notLocker is a sync.Locker whose Lock and Unlock methods are nops. -type notLocker struct{} - -func (n notLocker) Lock() {} -func (n notLocker) Unlock() {} - -// extendable returns the extendableProto interface for the given generated proto message. -// If the proto message has the old extension format, it returns a wrapper that implements -// the extendableProto interface. -func extendable(p interface{}) (extendableProto, bool) { - if ep, ok := p.(extendableProto); ok { - return ep, ok - } - if ep, ok := p.(extendableProtoV1); ok { - return extensionAdapter{ep}, ok - } - return nil, false -} - -// XXX_InternalExtensions is an internal representation of proto extensions. -// -// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, -// thus gaining the unexported 'extensions' method, which can be called only from the proto package. -// -// The methods of XXX_InternalExtensions are not concurrency safe in general, -// but calls to logically read-only methods such as has and get may be executed concurrently. -type XXX_InternalExtensions struct { - // The struct must be indirect so that if a user inadvertently copies a - // generated message and its embedded XXX_InternalExtensions, they - // avoid the mayhem of a copied mutex. - // - // The mutex serializes all logically read-only operations to p.extensionMap. - // It is up to the client to ensure that write operations to p.extensionMap are - // mutually exclusive with other accesses. - p *struct { - mu sync.Mutex - extensionMap map[int32]Extension - } -} - -// extensionsWrite returns the extension map, creating it on first use. -func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { - if e.p == nil { - e.p = new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }) - e.p.extensionMap = make(map[int32]Extension) - } - return e.p.extensionMap -} - -// extensionsRead returns the extensions map for read-only use. It may be nil. -// The caller must hold the returned mutex's lock when accessing Elements within the map. -func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { - if e.p == nil { - return nil, nil - } - return e.p.extensionMap, &e.p.mu -} - -var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() -var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style - Filename string // name of the file in which the extension is defined -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - value interface{} - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base Message, id int32, b []byte) { - epb, ok := extendable(base) - if !ok { - return - } - extmap := epb.extensionsWrite() - extmap[id] = Extension{enc: b} -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extendableProto, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - var pbi interface{} = pb - // Check the extended type. - if ea, ok := pbi.(extensionAdapter); ok { - pbi = ea.extendableProtoV1 - } - if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensions(e *XXX_InternalExtensions) error { - m, mu := e.extensionsRead() - if m == nil { - return nil // fast path - } - mu.Lock() - defer mu.Unlock() - return encodeExtensionsMap(m) -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensionsMap(m map[int32]Extension) error { - for k, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - m[k] = e - } - return nil -} - -func extensionsSize(e *XXX_InternalExtensions) (n int) { - m, mu := e.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - defer mu.Unlock() - return extensionsMapSize(m) -} - -func extensionsMapSize(m map[int32]Extension) (n int) { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - n += props.size(props, toStructPointer(x)) - } - return -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb Message, extension *ExtensionDesc) bool { - // TODO: Check types, field numbers, etc.? - epb, ok := extendable(pb) - if !ok { - return false - } - extmap, mu := epb.extensionsRead() - if extmap == nil { - return false - } - mu.Lock() - _, ok = extmap[extension.Field] - mu.Unlock() - return ok -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb Message, extension *ExtensionDesc) { - epb, ok := extendable(pb) - if !ok { - return - } - // TODO: Check types, field numbers, etc.? - extmap := epb.extensionsWrite() - delete(extmap, extension.Field) -} - -// GetExtension parses and returns the given extension of pb. -// If the extension is not present and has no default value it returns ErrMissingExtension. -func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") - } - - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err - } - - emap, mu := epb.extensionsRead() - if emap == nil { - return defaultExtensionValue(extension) - } - mu.Lock() - defer mu.Unlock() - e, ok := emap[extension.Field] - if !ok { - // defaultExtensionValue returns the default value or - // ErrMissingExtension if there is no default. - return defaultExtensionValue(extension) - } - - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return e.value, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = v - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return e.value, nil -} - -// defaultExtensionValue returns the default value for extension. -// If no default for an extension is defined ErrMissingExtension is returned. -func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - t := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - - sf, _, err := fieldDefault(t, props) - if err != nil { - return nil, err - } - - if sf == nil || sf.value == nil { - // There is no default value. - return nil, ErrMissingExtension - } - - if t.Kind() != reflect.Ptr { - // We do not need to return a Ptr, we can directly return sf.value. - return sf.value, nil - } - - // We need to return an interface{} that is a pointer to sf.value. - value := reflect.New(t).Elem() - value.Set(reflect.New(value.Type().Elem())) - if sf.kind == reflect.Int32 { - // We may have an int32 or an enum, but the underlying data is int32. - // Since we can't set an int32 into a non int32 reflect.value directly - // set it as a int32. - value.Elem().SetInt(int64(sf.value.(int32))) - } else { - value.Elem().Set(reflect.ValueOf(sf.value)) - } - return value.Interface(), nil -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - o := NewBuffer(b) - - t := reflect.TypeOf(extension.ExtensionType) - - props := extensionProperties(extension) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate a "field" to store the pointer/slice itself; the - // pointer/slice will be stored here. We pass - // the address of this field to props.dec. - // This passes a zero field and a *t and lets props.dec - // interpret it as a *struct{ x t }. - value := reflect.New(t).Elem() - - for { - // Discard wire type and field number varint. It isn't needed. - if _, err := o.DecodeVarint(); err != nil { - return nil, err - } - - if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { - return nil, err - } - - if o.index >= len(o.buf) { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") - } - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(epb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. -// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing -// just the Field field, which defines the extension's field number. -func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, ok := extendable(pb) - if !ok { - return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) - } - registeredExtensions := RegisteredExtensions(pb) - - emap, mu := epb.extensionsRead() - if emap == nil { - return nil, nil - } - mu.Lock() - defer mu.Unlock() - extensions := make([]*ExtensionDesc, 0, len(emap)) - for extid, e := range emap { - desc := e.desc - if desc == nil { - desc = registeredExtensions[extid] - if desc == nil { - desc = &ExtensionDesc{Field: extid} - } - } - - extensions = append(extensions, desc) - } - return extensions, nil -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - epb, ok := extendable(pb) - if !ok { - return errors.New("proto: not an extendable proto") - } - if err := checkExtensionTypes(epb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return errors.New("proto: bad extension value type") - } - // nil extension values need to be caught early, because the - // encoder can't distinguish an ErrNil due to a nil extension - // from an ErrNil due to a missing field. Extensions are - // always optional, so the encoder would just swallow the error - // and drop all the extensions from the encoded message. - if reflect.ValueOf(value).IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) - } - - extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: value} - return nil -} - -// ClearAllExtensions clears all extensions from pb. -func ClearAllExtensions(pb Message) { - epb, ok := extendable(pb) - if !ok { - return - } - m := epb.extensionsWrite() - for k := range m { - delete(m, k) - } -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go deleted file mode 100644 index 1c22550..0000000 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ /dev/null @@ -1,897 +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. - -/* -Package proto 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. - 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 by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. - - Nested messages, 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. - -The simplest way to describe this is to see an example. -Given file test.proto, containing - - 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; - } - oneof union { - int32 number = 6; - string name = 7; - } - } - -The resulting file, test.pb.go, is: - - package example - - import proto "github.com/golang/protobuf/proto" - import math "math" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data) - if err != nil { - return err - } - *x = FOO(value) - return nil - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - // Types that are valid to be assigned to Union: - // *Test_Number - // *Test_Name - Union isTest_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` - } - func (m *Test) Reset() { *m = Test{} } - func (m *Test) String() string { return proto.CompactTextString(m) } - func (*Test) ProtoMessage() {} - - type isTest_Union interface { - isTest_Union() - } - - type Test_Number struct { - Number int32 `protobuf:"varint,6,opt,name=number"` - } - type Test_Name struct { - Name string `protobuf:"bytes,7,opt,name=name"` - } - - func (*Test_Number) isTest_Union() {} - func (*Test_Name) isTest_Union() {} - - func (m *Test) GetUnion() isTest_Union { - if m != nil { - return m.Union - } - return nil - } - const Default_Test_Type int32 = 77 - - func (m *Test) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" - } - - func (m *Test) GetType() int32 { - if m != nil && m.Type != nil { - return *m.Type - } - return Default_Test_Type - } - - func (m *Test) GetOptionalgroup() *Test_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - } - func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } - func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } - - func (m *Test_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" - } - - func (m *Test) GetNumber() int32 { - if x, ok := m.GetUnion().(*Test_Number); ok { - return x.Number - } - return 0 - } - - func (m *Test) GetName() string { - if x, ok := m.GetUnion().(*Test_Name); ok { - return x.Name - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - -To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/golang/protobuf/proto" - pb "./example.pb" - ) - - func main() { - test := &pb.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &pb.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - Union: &pb.Test_Name{"fred"}, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &pb.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()) - } - // Use a type switch to determine which oneof was set. - switch u := test.Union.(type) { - case *pb.Test_Number: // u.Number contains the number. - case *pb.Test_Name: // u.Name contains the string. - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "fmt" - "log" - "reflect" - "sort" - "strconv" - "sync" -) - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// Stats records allocation details about the protocol buffer encoders -// and decoders. Useful for tuning the library itself. -type Stats struct { - Emalloc uint64 // mallocs in encode - Dmalloc uint64 // mallocs in decode - Encode uint64 // number of encodes - Decode uint64 // number of decodes - Chit uint64 // number of cache hits - Cmiss uint64 // number of cache misses - Size uint64 // number of sizes -} - -// Set to true to enable stats collection. -const collectStats = false - -var stats Stats - -// GetStats returns a copy of the global Stats structure. -func GetStats() Stats { return stats } - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // read point - - // pools of basic types to amortize allocation. - bools []bool - uint32s []uint32 - uint64s []uint64 - - // extra pools, only used with pointer_reflect.go - int32s []int32 - int64s []int64 - float32s []float32 - float64s []float64 -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (p *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := p.buf - index := p.index - p.buf = b - p.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := p.index - if index == len(p.buf) { - break - } - - op, err := p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = p.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = p.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = p.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - - case WireVarint: - u, err = p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) - } - fmt.Printf("\n") - - p.buf = obuf - p.index = index -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a pointer to a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - v = v.Elem() - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - // f is *T or []*T or map[T]*T - switch f.Kind() { - case reflect.Ptr: - if f.IsNil() { - continue - } - setDefaults(f, recur, zeros) - - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - - case reflect.Map: - for _, k := range f.MapKeys() { - e := f.MapIndex(k) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - sf, nested, err := fieldDefault(ft, prop) - switch { - case err != nil: - log.Print(err) - case nested: - dm.nested = append(dm.nested, fi) - case sf != nil: - sf.index = fi - dm.scalars = append(dm.scalars, *sf) - } - } - - return dm -} - -// fieldDefault returns the scalarField for field type ft. -// sf will be nil if the field can not have a default. -// nestedMessage will be true if this is a nested message. -// Note that sf.index is not set on return. -func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { - var canHaveDefault bool - switch ft.Kind() { - case reflect.Ptr: - if ft.Elem().Kind() == reflect.Struct { - nestedMessage = true - } else { - canHaveDefault = true // proto2 scalar field - } - - case reflect.Slice: - switch ft.Elem().Kind() { - case reflect.Ptr: - nestedMessage = true // repeated message - case reflect.Uint8: - canHaveDefault = true // bytes field - } - - case reflect.Map: - if ft.Elem().Kind() == reflect.Ptr { - nestedMessage = true // map with message values - } - } - - if !canHaveDefault { - if nestedMessage { - return nil, true, nil - } - return nil, false, nil - } - - // We now know that ft is a pointer or slice. - sf = &scalarField{kind: ft.Elem().Kind()} - - // scalar fields without defaults - if !prop.HasDefault { - return sf, false, nil - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) - } - sf.value = x - default: - return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) - } - - return sf, false, nil -} - -// Map fields may have key types of non-float scalars, strings and enums. -// The easiest way to sort them in some deterministic order is to use fmt. -// If this turns out to be inefficient we can always consider other options, -// such as doing a Schwartzian transform. - -func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{ - vs: vs, - // default Less function: textual comparison - less: func(a, b reflect.Value) bool { - return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) - }, - } - - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; - // numeric keys are sorted numerically. - if len(vs) == 0 { - return s - } - switch vs[0].Kind() { - case reflect.Int32, reflect.Int64: - s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } - case reflect.Uint32, reflect.Uint64: - s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - } - - return s -} - -type mapKeySorter struct { - vs []reflect.Value - less func(a, b reflect.Value) bool -} - -func (s mapKeySorter) Len() int { return len(s.vs) } -func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } -func (s mapKeySorter) Less(i, j int) bool { - return s.less(s.vs[i], s.vs[j]) -} - -// isProto3Zero reports whether v is a zero proto3 value. -func isProto3Zero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return !v.Bool() - case reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint32, reflect.Uint64: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.String: - return v.String() == "" - } - return false -} - -// ProtoPackageIsVersion2 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion2 = true - -// ProtoPackageIsVersion1 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion1 = true diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go deleted file mode 100644 index fd982de..0000000 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ /dev/null @@ -1,311 +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. - -package proto - -/* - * Support for message sets. - */ - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "reflect" - "sort" -) - -// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var errNoMessageTypeID = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and messageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type messageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure messageSet is a Message. -var _ Message = (*messageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *messageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *messageSet) Has(pb Message) bool { - if ms.find(pb) != nil { - return true - } - return false -} - -func (ms *messageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return errNoMessageTypeID - } - return nil // TODO: return error instead? -} - -func (ms *messageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return errNoMessageTypeID - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *messageSet) Reset() { *ms = messageSet{} } -func (ms *messageSet) String() string { return CompactTextString(ms) } -func (*messageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// MarshalMessageSet encodes the extension map represented by m in the message set wire format. -// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - if err := encodeExtensions(exts); err != nil { - return nil, err - } - m, _ = exts.extensionsRead() - case map[int32]Extension: - if err := encodeExtensionsMap(exts); err != nil { - return nil, err - } - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - - // Sort extension IDs to provide a deterministic encoding. - // See also enc_map in encode.go. - ids := make([]int, 0, len(m)) - for id := range m { - ids = append(ids, int(id)) - } - sort.Ints(ids) - - ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} - for _, id := range ids { - e := m[int32(id)] - // Remove the wire type and field number varint, as well as the length varint. - msg := skipVarint(skipVarint(e.enc)) - - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: Int32(int32(id)), - Message: msg, - }) - } - return Marshal(ms) -} - -// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, exts interface{}) error { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m = exts.extensionsWrite() - case map[int32]Extension: - m = exts - default: - return errors.New("proto: not an extension map") - } - - ms := new(messageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} - -// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. -// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m, _ = exts.extensionsRead() - case map[int32]Extension: - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - var b bytes.Buffer - b.WriteByte('{') - - // Process the map in key order for deterministic output. - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) // int32Slice defined in text.go - - for i, id := range ids { - ext := m[id] - if i > 0 { - b.WriteByte(',') - } - - msd, ok := messageSetMap[id] - if !ok { - // Unknown type; we can't render it, so skip it. - continue - } - fmt.Fprintf(&b, `"[%s]":`, msd.name) - - x := ext.value - if x == nil { - x = reflect.New(msd.t.Elem()).Interface() - if err := Unmarshal(ext.enc, x.(Message)); err != nil { - return nil, err - } - } - d, err := json.Marshal(x) - if err != nil { - return nil, err - } - b.Write(d) - } - b.WriteByte('}') - return b.Bytes(), nil -} - -// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. -// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { - // Common-case fast path. - if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { - return nil - } - - // This is fairly tricky, and it's not clear that it is needed. - return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") -} - -// A global registry of types that can be used in a MessageSet. - -var messageSetMap = make(map[int32]messageSetDesc) - -type messageSetDesc struct { - t reflect.Type // pointer to struct - name string -} - -// RegisterMessageSetType is called from the generated code. -func RegisterMessageSetType(m Message, fieldNum int32, name string) { - messageSetMap[fieldNum] = messageSetDesc{ - t: reflect.TypeOf(m), - name: name, - } -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go deleted file mode 100644 index fb512e2..0000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,484 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 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. - -// +build appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "math" - "reflect" -) - -// A structPointer is a pointer to a struct. -type structPointer struct { - v reflect.Value -} - -// toStructPointer returns a structPointer equivalent to the given reflect value. -// The reflect value must itself be a pointer to a struct. -func toStructPointer(v reflect.Value) structPointer { - return structPointer{v} -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p.v.IsNil() -} - -// Interface returns the struct pointer as an interface value. -func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { - return p.v.Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// field returns the given field in the struct as a reflect value. -func structPointer_field(p structPointer, f field) reflect.Value { - // Special case: an extension map entry with a value of type T - // passes a *T to the struct-handling code with a zero field, - // expecting that it will be treated as equivalent to *struct{ X T }, - // which has the same memory layout. We have to handle that case - // specially, because reflect will panic if we call FieldByIndex on a - // non-struct. - if f == nil { - return p.v.Elem() - } - - return p.v.Elem().FieldByIndex(f) -} - -// ifield returns the given field in the struct as an interface value. -func structPointer_ifield(p structPointer, f field) interface{} { - return structPointer_field(p, f).Addr().Interface() -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return structPointer_ifield(p, f).(*[]byte) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return structPointer_ifield(p, f).(*[][]byte) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return structPointer_ifield(p, f).(**bool) -} - -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return structPointer_ifield(p, f).(*bool) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return structPointer_ifield(p, f).(*[]bool) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return structPointer_ifield(p, f).(**string) -} - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return structPointer_ifield(p, f).(*string) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return structPointer_ifield(p, f).(*[]string) -} - -// Extensions returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return structPointer_ifield(p, f).(*XXX_InternalExtensions) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return structPointer_ifield(p, f).(*map[int32]Extension) -} - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return structPointer_field(p, f).Addr() -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - structPointer_field(p, f).Set(q.v) -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return structPointer{structPointer_field(p, f)} -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { - return structPointerSlice{structPointer_field(p, f)} -} - -// A structPointerSlice represents the address of a slice of pointers to structs -// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. -type structPointerSlice struct { - v reflect.Value -} - -func (p structPointerSlice) Len() int { return p.v.Len() } -func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } -func (p structPointerSlice) Append(q structPointer) { - p.v.Set(reflect.Append(p.v, q.v)) -} - -var ( - int32Type = reflect.TypeOf(int32(0)) - uint32Type = reflect.TypeOf(uint32(0)) - float32Type = reflect.TypeOf(float32(0)) - int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float64Type = reflect.TypeOf(float64(0)) -) - -// A word32 represents a field of type *int32, *uint32, *float32, or *enum. -// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. -type word32 struct { - v reflect.Value -} - -// IsNil reports whether p is nil. -func word32_IsNil(p word32) bool { - return p.v.IsNil() -} - -// Set sets p to point at a newly allocated word with bits set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - t := p.v.Type().Elem() - switch t { - case int32Type: - if len(o.int32s) == 0 { - o.int32s = make([]int32, uint32PoolSize) - } - o.int32s[0] = int32(x) - p.v.Set(reflect.ValueOf(&o.int32s[0])) - o.int32s = o.int32s[1:] - return - case uint32Type: - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - p.v.Set(reflect.ValueOf(&o.uint32s[0])) - o.uint32s = o.uint32s[1:] - return - case float32Type: - if len(o.float32s) == 0 { - o.float32s = make([]float32, uint32PoolSize) - } - o.float32s[0] = math.Float32frombits(x) - p.v.Set(reflect.ValueOf(&o.float32s[0])) - o.float32s = o.float32s[1:] - return - } - - // must be enum - p.v.Set(reflect.New(t)) - p.v.Elem().SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32_Get(p word32) uint32 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32{structPointer_field(p, f)} -} - -// A word32Val represents a field of type int32, uint32, float32, or enum. -// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. -type word32Val struct { - v reflect.Value -} - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - switch p.v.Type() { - case int32Type: - p.v.SetInt(int64(x)) - return - case uint32Type: - p.v.SetUint(uint64(x)) - return - case float32Type: - p.v.SetFloat(float64(math.Float32frombits(x))) - return - } - - // must be enum - p.v.SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32Val_Get(p word32Val) uint32 { - elem := p.v - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val{structPointer_field(p, f)} -} - -// A word32Slice is a slice of 32-bit values. -// That is, v.Type() is []int32, []uint32, []float32, or []enum. -type word32Slice struct { - v reflect.Value -} - -func (p word32Slice) Append(x uint32) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int32: - elem.SetInt(int64(int32(x))) - case reflect.Uint32: - elem.SetUint(uint64(x)) - case reflect.Float32: - elem.SetFloat(float64(math.Float32frombits(x))) - } -} - -func (p word32Slice) Len() int { - return p.v.Len() -} - -func (p word32Slice) Index(i int) uint32 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) word32Slice { - return word32Slice{structPointer_field(p, f)} -} - -// word64 is like word32 but for 64-bit values. -type word64 struct { - v reflect.Value -} - -func word64_Set(p word64, o *Buffer, x uint64) { - t := p.v.Type().Elem() - switch t { - case int64Type: - if len(o.int64s) == 0 { - o.int64s = make([]int64, uint64PoolSize) - } - o.int64s[0] = int64(x) - p.v.Set(reflect.ValueOf(&o.int64s[0])) - o.int64s = o.int64s[1:] - return - case uint64Type: - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - p.v.Set(reflect.ValueOf(&o.uint64s[0])) - o.uint64s = o.uint64s[1:] - return - case float64Type: - if len(o.float64s) == 0 { - o.float64s = make([]float64, uint64PoolSize) - } - o.float64s[0] = math.Float64frombits(x) - p.v.Set(reflect.ValueOf(&o.float64s[0])) - o.float64s = o.float64s[1:] - return - } - panic("unreachable") -} - -func word64_IsNil(p word64) bool { - return p.v.IsNil() -} - -func word64_Get(p word64) uint64 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64{structPointer_field(p, f)} -} - -// word64Val is like word32Val but for 64-bit values. -type word64Val struct { - v reflect.Value -} - -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - switch p.v.Type() { - case int64Type: - p.v.SetInt(int64(x)) - return - case uint64Type: - p.v.SetUint(x) - return - case float64Type: - p.v.SetFloat(math.Float64frombits(x)) - return - } - panic("unreachable") -} - -func word64Val_Get(p word64Val) uint64 { - elem := p.v - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val{structPointer_field(p, f)} -} - -type word64Slice struct { - v reflect.Value -} - -func (p word64Slice) Append(x uint64) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int64: - elem.SetInt(int64(int64(x))) - case reflect.Uint64: - elem.SetUint(uint64(x)) - case reflect.Float64: - elem.SetFloat(float64(math.Float64frombits(x))) - } -} - -func (p word64Slice) Len() int { - return p.v.Len() -} - -func (p word64Slice) Index(i int) uint64 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return uint64(elem.Uint()) - case reflect.Float64: - return math.Float64bits(float64(elem.Float())) - } - panic("unreachable") -} - -func structPointer_Word64Slice(p structPointer, f field) word64Slice { - return word64Slice{structPointer_field(p, f)} -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index 6b5567d..0000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,270 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 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. - -// +build !appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -// NOTE: These type_Foo functions would more idiomatically be methods, -// but Go does not allow methods on pointer types, and we must preserve -// some pointer type for the garbage collector. We use these -// funcs with clunky names as our poor approximation to methods. -// -// An alternative would be -// type structPointer struct { p unsafe.Pointer } -// but that does not registerize as well. - -// A structPointer is a pointer to a struct. -type structPointer unsafe.Pointer - -// toStructPointer returns a structPointer equivalent to the given reflect value. -func toStructPointer(v reflect.Value) structPointer { - return structPointer(unsafe.Pointer(v.Pointer())) -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p == nil -} - -// Interface returns the struct pointer, assumed to have element type t, -// as an interface value. -func structPointer_Interface(p structPointer, t reflect.Type) interface{} { - return reflect.NewAt(t, unsafe.Pointer(p)).Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != ^field(0) -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { - return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). -type structPointerSlice []structPointer - -func (v *structPointerSlice) Len() int { return len(*v) } -func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } -func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } - -// A word32 is the address of a "pointer to 32-bit value" field. -type word32 **uint32 - -// IsNil reports whether *v is nil. -func word32_IsNil(p word32) bool { - return *p == nil -} - -// Set sets *v to point at a newly allocated word set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = &o.uint32s[0] - o.uint32s = o.uint32s[1:] -} - -// Get gets the value pointed at by *v. -func word32_Get(p word32) uint32 { - return **p -} - -// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Val is the address of a 32-bit value field. -type word32Val *uint32 - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - *p = x -} - -// Get gets the value pointed at by p. -func word32Val_Get(p word32Val) uint32 { - return *p -} - -// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Slice is a slice of 32-bit values. -type word32Slice []uint32 - -func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } -func (v *word32Slice) Len() int { return len(*v) } -func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } - -// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) *word32Slice { - return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// word64 is like word32 but for 64-bit values. -type word64 **uint64 - -func word64_Set(p word64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = &o.uint64s[0] - o.uint64s = o.uint64s[1:] -} - -func word64_IsNil(p word64) bool { - return *p == nil -} - -func word64_Get(p word64) uint64 { - return **p -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Val is like word32Val but for 64-bit values. -type word64Val *uint64 - -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - *p = x -} - -func word64Val_Get(p word64Val) uint64 { - return *p -} - -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Slice is like word32Slice but for 64-bit values. -type word64Slice []uint64 - -func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } -func (v *word64Slice) Len() int { return len(*v) } -func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } - -func structPointer_Word64Slice(p structPointer, f field) *word64Slice { - return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index ec2289c..0000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,872 +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. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "log" - "os" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -const startSize = 10 // initial slice/string sizes - -// Encoders are defined in encode.go -// An encoder outputs the full representation of a field, including its -// tag and encoder type. -type encoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueEncoder encodes a single integer in a particular encoding. -type valueEncoder func(o *Buffer, x uint64) error - -// Sizers are defined in encode.go -// A sizer returns the encoded size of a field, including its tag and encoder -// type. -type sizer func(prop *Properties, base structPointer) int - -// A valueSizer returns the encoded size of a single integer in a particular -// encoding. -type valueSizer func(x uint64) int - -// Decoders are defined in decode.go -// A decoder creates a value from its wire representation. -// Unrecognized subelements are saved in unrec. -type decoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueDecoder decodes a single integer in a particular encoding. -type valueDecoder func(o *Buffer) (x uint64, err error) - -// A oneofMarshaler does the marshaling for all oneof fields in a message. -type oneofMarshaler func(Message, *Buffer) error - -// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. -type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) - -// A oneofSizer does the sizing for all oneof fields in a message. -type oneofSizer func(Message) int - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - unrecField field // field id of the XXX_unrecognized []byte field - extendable bool // is this an extendable proto - - oneofMarshaler oneofMarshaler - oneofUnmarshaler oneofUnmarshaler - oneofSizer oneofSizer - stype reflect.Type - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the original name of a field. - OneofTypes map[string]*OneofProperties -} - -// OneofProperties represents information about a specific field in a oneof. -type OneofProperties struct { - Type reflect.Type // pointer to generated struct type for this oneof field - Field int // struct field number of the containing oneof in the message - Prop *Properties -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - JSONName string // name to use for JSON; determined by protoc - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field; set for []byte only - oneof bool // whether this is a oneof field - - Default string // default value - HasDefault bool // whether an explicit default was provided - def_uint64 uint64 - - enc encoder - valEnc valueEncoder // set for bool and numeric types only - field field - tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) - tagbuf [8]byte - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - isMarshaler bool - isUnmarshaler bool - - mtype reflect.Type // set for map types only - mkeyprop *Properties // set for map types only - mvalprop *Properties // set for map types only - - size sizer - valSize valueSizer // set for bool and numeric types only - - dec decoder - valDec valueDecoder // set for bool and numeric types only - - // If this is a packable field, this will be the decoder for the packed version of the field. - packedDec decoder -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s = "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != p.OrigName { - s += ",json=" + p.JSONName - } - if p.proto3 { - s += ",proto3" - } - if p.oneof { - s += ",oneof" - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeVarint - p.valDec = (*Buffer).DecodeVarint - p.valSize = sizeVarint - case "fixed32": - p.WireType = WireFixed32 - p.valEnc = (*Buffer).EncodeFixed32 - p.valDec = (*Buffer).DecodeFixed32 - p.valSize = sizeFixed32 - case "fixed64": - p.WireType = WireFixed64 - p.valEnc = (*Buffer).EncodeFixed64 - p.valDec = (*Buffer).DecodeFixed64 - p.valSize = sizeFixed64 - case "zigzag32": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag32 - p.valDec = (*Buffer).DecodeZigzag32 - p.valSize = sizeZigzag32 - case "zigzag64": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag64 - p.valDec = (*Buffer).DecodeZigzag64 - p.valSize = sizeZigzag64 - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "json="): - p.JSONName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case f == "proto3": - p.proto3 = true - case f == "oneof": - p.oneof = true - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break - } - } - } -} - -func logNoSliceEnc(t1, t2 reflect.Type) { - fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// Initialize the fields for encoding and decoding. -func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - p.enc = nil - p.dec = nil - p.size = nil - - switch t1 := typ; t1.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) - - // proto3 scalar types - - case reflect.Bool: - p.enc = (*Buffer).enc_proto3_bool - p.dec = (*Buffer).dec_proto3_bool - p.size = size_proto3_bool - case reflect.Int32: - p.enc = (*Buffer).enc_proto3_int32 - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_proto3_uint32 - p.dec = (*Buffer).dec_proto3_int32 // can reuse - p.size = size_proto3_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_proto3_int64 - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.String: - p.enc = (*Buffer).enc_proto3_string - p.dec = (*Buffer).dec_proto3_string - p.size = size_proto3_string - - case reflect.Ptr: - switch t2 := t1.Elem(); t2.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) - break - case reflect.Bool: - p.enc = (*Buffer).enc_bool - p.dec = (*Buffer).dec_bool - p.size = size_bool - case reflect.Int32: - p.enc = (*Buffer).enc_int32 - p.dec = (*Buffer).dec_int32 - p.size = size_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_uint32 - p.dec = (*Buffer).dec_int32 // can reuse - p.size = size_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_int64 - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_int32 - p.size = size_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_int64 // can just treat them as bits - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.String: - p.enc = (*Buffer).enc_string - p.dec = (*Buffer).dec_string - p.size = size_string - case reflect.Struct: - p.stype = t1.Elem() - p.isMarshaler = isMarshaler(t1) - p.isUnmarshaler = isUnmarshaler(t1) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_struct_message - p.dec = (*Buffer).dec_struct_message - p.size = size_struct_message - } else { - p.enc = (*Buffer).enc_struct_group - p.dec = (*Buffer).dec_struct_group - p.size = size_struct_group - } - } - - case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - default: - logNoSliceEnc(t1, t2) - break - case reflect.Bool: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_bool - p.size = size_slice_packed_bool - } else { - p.enc = (*Buffer).enc_slice_bool - p.size = size_slice_bool - } - p.dec = (*Buffer).dec_slice_bool - p.packedDec = (*Buffer).dec_slice_packed_bool - case reflect.Int32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int32 - p.size = size_slice_packed_int32 - } else { - p.enc = (*Buffer).enc_slice_int32 - p.size = size_slice_int32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Uint32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Int64, reflect.Uint64: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - case reflect.Uint8: - p.dec = (*Buffer).dec_slice_byte - if p.proto3 { - p.enc = (*Buffer).enc_proto3_slice_byte - p.size = size_proto3_slice_byte - } else { - p.enc = (*Buffer).enc_slice_byte - p.size = size_slice_byte - } - case reflect.Float32, reflect.Float64: - switch t2.Bits() { - case 32: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case 64: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - default: - logNoSliceEnc(t1, t2) - break - } - case reflect.String: - p.enc = (*Buffer).enc_slice_string - p.dec = (*Buffer).dec_slice_string - p.size = size_slice_string - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) - break - case reflect.Struct: - p.stype = t2.Elem() - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_slice_struct_message - p.dec = (*Buffer).dec_slice_struct_message - p.size = size_slice_struct_message - } else { - p.enc = (*Buffer).enc_slice_struct_group - p.dec = (*Buffer).dec_slice_struct_group - p.size = size_slice_struct_group - } - } - case reflect.Slice: - switch t2.Elem().Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) - break - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_slice_byte - p.dec = (*Buffer).dec_slice_slice_byte - p.size = size_slice_slice_byte - } - } - - case reflect.Map: - p.enc = (*Buffer).enc_new_map - p.dec = (*Buffer).dec_new_map - p.size = size_new_map - - p.mtype = t1 - p.mkeyprop = &Properties{} - p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.mvalprop = &Properties{} - vtype := p.mtype.Elem() - if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { - // The value type is not a message (*T) or bytes ([]byte), - // so we need encoders for the pointer to this type. - vtype = reflect.PtrTo(vtype) - } - p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - - // precalculate tag code - wire := p.WireType - if p.Packed { - wire = WireBytes - } - x := uint32(p.Tag)<<3 | uint32(wire) - i := 0 - for i = 0; x > 127; i++ { - p.tagbuf[i] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - p.tagbuf[i] = uint8(x) - p.tagcode = p.tagbuf[0 : i+1] - - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() -) - -// isMarshaler reports whether type t implements Marshaler. -func isMarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isMarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isMarshaler") - } - return t.Implements(marshalerType) -} - -// isUnmarshaler reports whether type t implements Unmarshaler. -func isUnmarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isUnmarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isUnmarshaler") - } - return t.Implements(unmarshalerType) -} - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if f != nil { - p.field = toField(f) - } - if tag == "" { - return - } - p.Parse(tag) - p.setEncAndDec(typ, f, lockGetProp) -} - -var ( - propertiesMu sync.RWMutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - - // Most calls to GetProperties in a long-running program will be - // retrieving details for types we have seen before. - propertiesMu.RLock() - sprop, ok := propertiesMap[t] - propertiesMu.RUnlock() - if ok { - if collectStats { - stats.Chit++ - } - return sprop - } - - propertiesMu.Lock() - sprop = getPropertiesLocked(t) - propertiesMu.Unlock() - return sprop -} - -// getPropertiesLocked requires that propertiesMu is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - if collectStats { - stats.Chit++ - } - return prop - } - if collectStats { - stats.Cmiss++ - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || - reflect.PtrTo(t).Implements(extendableProtoV1Type) - prop.unrecField = invalidField - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - if f.Name == "XXX_InternalExtensions" { // special case - p.enc = (*Buffer).enc_exts - p.dec = nil // not needed - p.size = size_exts - } else if f.Name == "XXX_extensions" { // special case - p.enc = (*Buffer).enc_map - p.dec = nil // not needed - p.size = size_map - } else if f.Name == "XXX_unrecognized" { // special case - prop.unrecField = toField(&f) - } - oneof := f.Tag.Get("protobuf_oneof") // special case - if oneof != "" { - // Oneof fields don't use the traditional protobuf tag. - p.OrigName = oneof - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { - fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { - var oots []interface{} - prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() - prop.stype = t - - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue - } - if !oop.Type.AssignableTo(f.Type) { - continue - } - oop.Field = i - break - } - prop.OneofTypes[oop.Prop.OrigName] = oop - } - } - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// Return the Properties object for the x[0]'th field of the structure. -func propByIndex(t reflect.Type, x []int) *Properties { - if len(x) != 1 { - fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) - return nil - } - prop := GetProperties(t) - return prop.Prop[x[0]] -} - -// Get the address and type of a pointer to a struct from an interface. -func getbase(pb Message) (t reflect.Type, b structPointer, err error) { - if pb == nil { - err = ErrNil - return - } - // get the reflect type of the pointer to the struct. - t = reflect.TypeOf(pb) - // get the address of the struct. - value := reflect.ValueOf(pb) - b = toStructPointer(value) - return -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap -} - -// EnumValueMap returns the mapping from names to integers of the -// enum type enumType, or a nil if not found. -func EnumValueMap(enumType string) map[string]int32 { - return enumValueMaps[enumType] -} - -// A registry of all linked message types. -// The string is a fully-qualified proto name ("pkg.Message"). -var ( - protoTypes = make(map[string]reflect.Type) - revProtoTypes = make(map[reflect.Type]string) -) - -// RegisterType is called from generated code and maps from the fully qualified -// proto name to the type (pointer to struct) of the protocol buffer. -func RegisterType(x Message, name string) { - if _, ok := protoTypes[name]; ok { - // TODO: Some day, make this a panic. - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoTypes[name] = t - revProtoTypes[t] = name -} - -// MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { - type xname interface { - XXX_MessageName() string - } - if m, ok := x.(xname); ok { - return m.XXX_MessageName() - } - return revProtoTypes[reflect.TypeOf(x)] -} - -// MessageType returns the message type (pointer to struct) for a named message. -func MessageType(name string) reflect.Type { return protoTypes[name] } - -// A registry of all linked proto files. -var ( - protoFiles = make(map[string][]byte) // file name => fileDescriptor -) - -// RegisterFile is called from generated code and maps from the -// full file name of a .proto file to its compressed FileDescriptorProto. -func RegisterFile(filename string, fileDescriptor []byte) { - protoFiles[filename] = fileDescriptor -} - -// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. -func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go deleted file mode 100644 index 965876b..0000000 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ /dev/null @@ -1,854 +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. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "errors" - "fmt" - "io" - "log" - "math" - "reflect" - "sort" - "strings" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - gtNewline = []byte(">\n") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Print("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -// raw is the interface satisfied by RawMessage. -type raw interface { - Bytes() []byte -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// isAny reports whether sv is a google.protobuf.Any message -func isAny(sv reflect.Value) bool { - type wkt interface { - XXX_WellKnownType() string - } - t, ok := sv.Addr().Interface().(wkt) - return ok && t.XXX_WellKnownType() == "Any" -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { - turl := sv.FieldByName("TypeUrl") - val := sv.FieldByName("Value") - if !turl.IsValid() || !val.IsValid() { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - b, ok := val.Interface().([]byte) - if !ok { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - parts := strings.Split(turl.String(), "/") - mt := MessageType(parts[len(parts)-1]) - if mt == nil { - return false, nil - } - m := reflect.New(mt.Elem()) - if err := Unmarshal(b, m.Interface().(Message)); err != nil { - return false, nil - } - w.Write([]byte("[")) - u := turl.String() - if requiresQuotes(u) { - writeString(w, u) - } else { - w.Write([]byte(u)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.ind++ - } - if err := tm.writeStruct(w, m.Elem()); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.ind-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { - if tm.ExpandAny && isAny(sv) { - if canExpand, err := tm.writeProto3Any(w, sv); canExpand { - return err - } - } - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if err := tm.writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Map { - // Map fields are rendered as a repeated struct with key/value fields. - keys := fv.MapKeys() - sort.Sort(mapKeys(keys)) - for _, key := range keys { - val := fv.MapIndex(key) - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - // open struct - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - // key - if _, err := w.WriteString("key:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, key, props.mkeyprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - // nil values aren't legal, but we can avoid panicking because of them. - if val.Kind() != reflect.Ptr || !val.IsNil() { - // value - if _, err := w.WriteString("value:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, val, props.mvalprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - // close struct - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { - // empty bytes field - continue - } - if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { - // proto3 non-repeated scalar field; skip if zero value - if isProto3Zero(fv) { - continue - } - } - - if fv.Kind() == reflect.Interface { - // Check if it is a oneof. - if st.Field(i).Tag.Get("protobuf_oneof") != "" { - // fv is nil, or holds a pointer to generated struct. - // That generated struct has exactly one field, - // which has a protobuf struct tag. - if fv.IsNil() { - continue - } - inner := fv.Elem().Elem() // interface -> *T -> T - tag := inner.Type().Field(0).Tag.Get("protobuf") - props = new(Properties) // Overwrite the outer props var, but not its pointee. - props.Parse(tag) - // Write the value in the oneof, not the oneof itself. - fv = inner.Field(0) - - // Special case to cope with malformed messages gracefully: - // If the value in the oneof is a nil pointer, don't panic - // in writeAny. - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Use errors.New so writeAny won't render quotes. - msg := errors.New("/* nil */") - fv = reflect.ValueOf(&msg).Elem() - } - } - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if b, ok := fv.Interface().(raw); ok { - if err := writeRaw(w, b.Bytes()); err != nil { - return err - } - continue - } - - // Enums have a String method, so writeAny will work fine. - if err := tm.writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv.Addr() - if _, ok := extendable(pv.Interface()); ok { - if err := tm.writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -// writeRaw writes an uninterpreted raw message. -func writeRaw(w *textWriter, b []byte) error { - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if err := writeUnknownStruct(w, b); err != nil { - return err - } - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - return nil -} - -// writeAny writes an arbitrary field. -func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Bytes())); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if etm, ok := v.Interface().(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else if err := tm.writeStruct(w, v); err != nil { - return err - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, err := fmt.Fprintf(w, "/* %v */\n", err) - return err - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, err := w.Write(endBraceNewline); err != nil { - return err - } - continue - } - if _, err := fmt.Fprint(w, tag); err != nil { - return err - } - if wire != WireStartGroup { - if err := w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err := w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err = w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - ep, _ := extendable(pv.Interface()) - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - m, mu := ep.extensionsRead() - if m == nil { - return nil - } - mu.Lock() - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - mu.Unlock() - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(ep, desc) - if err != nil { - return fmt.Errorf("failed getting extension: %v", err) - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := tm.writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line). - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes a given protocol buffer in text format. -// The only errors returned are from w. -func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: tm.Compact, - } - - if etm, ok := pb.(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := tm.writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// Text is the same as Marshal, but returns the string directly. -func (tm *TextMarshaler) Text(pb Message) string { - var buf bytes.Buffer - tm.Marshal(&buf, pb) - return buf.String() -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// TODO: consider removing some of the Marshal functions below. - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go deleted file mode 100644 index 5e14513..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ /dev/null @@ -1,895 +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. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" -) - -// Error string emitted when deserializing Any and fields are already set -const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") - errBadHex = errors.New("proto: bad hexadecimal") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - base := 8 - ss := s[:2] - s = s[2:] - if r == 'x' || r == 'X' { - base = 16 - } else { - ss = string(r) + ss - } - i, err := strconv.ParseUint(ss, base, 8) - if err != nil { - return "", "", err - } - return string([]byte{byte(i)}), s, nil - case 'u', 'U': - n := 4 - if r == 'U' { - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) - } - - bs := make([]byte, n/2) - for i := 0; i < n; i += 2 { - a, ok1 := unhex(s[i]) - b, ok2 := unhex(s[i+1]) - if !ok1 || !ok2 { - return "", "", errBadHex - } - bs[i/2] = a<<4 | b - } - s = s[n:] - return string(bs), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Adapted from src/pkg/strconv/quote.go. -func unhex(b byte) (v byte, ok bool) { - switch { - case '0' <= b && b <= '9': - return b - '0', true - case 'a' <= b && b <= 'f': - return b - 'a' + 10, true - case 'A' <= b && b <= 'F': - return b - 'A' + 10, true - } - return 0, false -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } else if typ.Kind() == reflect.String { - // The proto3 exception is for a string field, - // which requires a colon. - break - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - sprops := GetProperties(st) - reqCount := sprops.reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension or an Any. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - extName, err := p.consumeExtName() - if err != nil { - return err - } - - if s := strings.LastIndex(extName, "/"); s >= 0 { - // If it contains a slash, it's an Any type URL. - messageName := extName[s+1:] - mt := MessageType(messageName) - if mt == nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) - } - tok = p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - v := reflect.New(mt.Elem()) - if pe := p.readStruct(v.Elem(), terminator); pe != nil { - return pe - } - b, err := Marshal(v.Interface().(Message)) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", messageName, err) - } - if fieldSet["type_url"] { - return p.errorf(anyRepeatedlyUnpacked, "type_url") - } - if fieldSet["value"] { - return p.errorf(anyRepeatedlyUnpacked, "value") - } - sv.FieldByName("TypeUrl").SetString(extName) - sv.FieldByName("Value").SetBytes(b) - fieldSet["type_url"] = true - fieldSet["value"] = true - continue - } - - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == extName { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", extName) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(Message) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := tok.value - var dst reflect.Value - fi, props, ok := structFieldByName(sprops, name) - if ok { - dst = sv.Field(fi) - } else if oop, ok := sprops.OneofTypes[name]; ok { - // It is a oneof. - props = oop.Prop - nv := reflect.New(oop.Type.Elem()) - dst = nv.Elem().Field(0) - field := sv.Field(oop.Field) - if !field.IsNil() { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) - } - field.Set(nv) - } - if !dst.IsValid() { - return p.errorf("unknown field name %q in %v", name, st) - } - - if dst.Kind() == reflect.Map { - // Consume any colon. - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Construct the map if it doesn't already exist. - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - key := reflect.New(dst.Type().Key()).Elem() - val := reflect.New(dst.Type().Elem()).Elem() - - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. See b/28924776 for a time - // this went wrong. - - tok := p.next() - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.mkeyprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - case "value": - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.mvalprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - default: - p.back() - return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - - dst.SetMapIndex(key, val) - continue - } - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - if props.Required { - reqCount-- - } - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -// consumeExtName consumes extension name or expanded Any type URL and the -// following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in readStruct to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - err := p.readAny(fv.Index(fv.Len()-1), props) - if err != nil { - return err - } - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return nil - } - // One value of the repeated field. - p.back() - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - return p.readAny(fv.Index(fv.Len()-1), props) - case reflect.Bool: - // true/1/t/True or false/f/0/False. - switch tok.value { - case "true", "1", "t", "True": - fv.SetBool(true) - return nil - case "false", "0", "f", "False": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(x) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - err := um.UnmarshalText([]byte(s)) - return err - } - pb.Reset() - v := reflect.ValueOf(pb) - if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { - return pe - } - return nil -} diff --git a/vendor/github.com/nyaruka/phonenumbers/LICENSE b/vendor/github.com/nyaruka/phonenumbers/LICENSE deleted file mode 100644 index ad3808c..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Trey Tacon, Nyaruka - -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/nyaruka/phonenumbers/README.md b/vendor/github.com/nyaruka/phonenumbers/README.md deleted file mode 100644 index eb25f7f..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/README.md +++ /dev/null @@ -1,37 +0,0 @@ -phonenumbers [![Build Status](https://travis-ci.org/nyaruka/phonenumbers.svg?branch=master)](https://travis-ci.org/nyaruka/phonenumbers) -============== - -golang port of Google's libphonenumber, forked from [libphonenumber from ttacon](https://github.com/ttacon/libphonenumber) - -This will ultimately be a rewrite of ttacon's library, but for now mostly cleans up a few things, fixes some bugs and adds the `buildmetadata` cmd to allow for rebuilding the metadata protocol buffers, country code to region maps and timezone prefix maps. - -This library is used daily in production for parsing and validation of numbers across the world, so is well maintained. - -Usage -======== - -```go -// parse our phone number -num, err := phonenumbers.Parse("6502530000", "US") - -// format it using national format -formattedNum := phonenumbers.Format(num, gophone.NATIONAL) -``` - -Rebuilding Metadata and Maps -=============================== - -The `buildmetadata` command will fetch the latest XML file from the official Google repo and rebuild the go source files containing all -the territory metadata, timezone and region maps. It will rebuild the following files: - -`metadata_bin.go` - contains the protocol buffer definitions for all the various formats across countries etc.. - -`countrycode_to_region.go` - contains a map built from the metadata to ease looking up possible regions for a country code - -`prefix_to_timezone.go` - contains a map built from the timezone file within the Google repo mapping number prefixes to possible timezones - -```bash -% go get github.com/nyaruka/phonenumbers -% go install github.com/nyaruka/phonenumbers/cmd/buildmetadata -% $GOPATH/bin/buildmetadata -``` diff --git a/vendor/github.com/nyaruka/phonenumbers/builder.go b/vendor/github.com/nyaruka/phonenumbers/builder.go deleted file mode 100644 index 74dd7fa..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/builder.go +++ /dev/null @@ -1,744 +0,0 @@ -package phonenumbers - -import ( - "encoding/xml" - "fmt" - "math" - "regexp" - "strconv" - "strings" -) - -// ---------------------------------------------------------------------------- -// Golang port of: -// https://github.com/googlei18n/libphonenumber/blob/master/tools/java/common/src/com/google/i18n/phonenumbers/BuildMetadataFromXml.java -// ---------------------------------------------------------------------------- - -func sp(value string) *string { - if value == "" { - return nil - } - return &value -} - -func bp(value bool) *bool { - return &value -} - -func ip(value int32) *int32 { - return &value -} - -func BuildPhoneMetadataCollection(inputXML []byte, liteBuild bool, specialBuild bool) (*PhoneMetadataCollection, error) { - metadata := &PhoneNumberMetadataE{} - err := xml.Unmarshal(inputXML, metadata) - if err != nil { - panic(fmt.Sprintf("Error unmarshalling XML: %s", err)) - } - isShortNumberMetadata := false - isAlternateFormatsMetadata := false - return buildPhoneMetadataFromElement(metadata, liteBuild, specialBuild, isShortNumberMetadata, isAlternateFormatsMetadata) -} - -func buildPhoneMetadataFromElement(document *PhoneNumberMetadataE, liteBuild bool, specialBuild bool, isShortNumberMetadata bool, isAlternateFormatsMetadata bool) (*PhoneMetadataCollection, error) { - collection := PhoneMetadataCollection{} - numOfTerritories := len(document.Territories) - for i := 0; i < numOfTerritories; i++ { - territoryElement := document.Territories[i] - regionCode := territoryElement.ID - - metadata := loadCountryMetadata(regionCode, &territoryElement, isShortNumberMetadata, isAlternateFormatsMetadata) - collection.Metadata = append(collection.Metadata, metadata) - } - return &collection, nil -} - -// Build a mapping from a country calling code to the region codes which denote the country/region -// represented by that country code. In the case of multiple countries sharing a calling code, -// such as the NANPA countries, the one indicated with "isMainCountryForCode" in the metadata -// should be first. -func BuildCountryCodeToRegionMap(metadataCollection *PhoneMetadataCollection) map[int32][]string { - countryCodeToRegionCodeMap := make(map[int32][]string) - for _, metadata := range metadataCollection.Metadata { - regionCode := metadata.GetId() - countryCode := metadata.GetCountryCode() - _, present := countryCodeToRegionCodeMap[countryCode] - if present { - phoneList := countryCodeToRegionCodeMap[countryCode] - if metadata.GetMainCountryForCode() { - phoneList = append([]string{regionCode}, phoneList...) - } else { - phoneList = append(phoneList, regionCode) - } - countryCodeToRegionCodeMap[countryCode] = phoneList - } else { - // For most countries, there will be only one region code for the country calling code. - phoneList := []string{} - if regionCode != "" { // For alternate formats, there are no region codes at all. - phoneList = append(phoneList, regionCode) - } - countryCodeToRegionCodeMap[countryCode] = phoneList - } - } - return countryCodeToRegionCodeMap -} - -func validateRE(re string, removeWhitespace bool) string { - // Removes all the whitespace and newline from the regexp. Not Ming pattern compile options to - // make it work across programming languages. - if removeWhitespace { - re = string(regexp.MustCompile(`\s`).ReplaceAllLiteralString(re, "")) - } - _, err := regexp.Compile(re) - if err != nil { - panic(err) - } - return re -} - -func loadTerritoryTagMetadata(regionCode string, territory *TerritoryE, nationalPrefix string) *PhoneMetadata { - metadata := &PhoneMetadata{} - metadata.Id = sp(regionCode) - - if territory.CountryCode != 0 { - metadata.CountryCode = ip(territory.CountryCode) - } - if territory.LeadingDigits != "" { - metadata.LeadingDigits = sp(validateRE(territory.LeadingDigits, false)) - } - if territory.InternationalPrefix != "" { - metadata.InternationalPrefix = sp(validateRE(territory.InternationalPrefix, false)) - } - if territory.PreferredInternationalPrefix != "" { - metadata.PreferredInternationalPrefix = sp(territory.PreferredInternationalPrefix) - } - if territory.NationalPrefixForParsing != "" { - metadata.NationalPrefixForParsing = sp(validateRE(territory.NationalPrefixForParsing, true)) - if territory.NationalPrefixTransformRule != "" { - metadata.NationalPrefixTransformRule = sp(validateRE(territory.NationalPrefixTransformRule, false)) - } - } - if nationalPrefix != "" { - metadata.NationalPrefix = sp(nationalPrefix) - if metadata.NationalPrefixForParsing == nil { - metadata.NationalPrefixForParsing = sp(nationalPrefix) - } - } - if territory.PreferredExtnPrefix != "" { - metadata.PreferredExtnPrefix = sp(territory.PreferredExtnPrefix) - } - if territory.MainCountryForCode { - metadata.MainCountryForCode = bp(true) - } - if territory.MobileNumberPortableRegion { - metadata.MobileNumberPortableRegion = bp(true) - } - return metadata -} - -func setLeadingDigitsPatterns(numberFormatElement *NumberFormatE, format *NumberFormat) { - if len(numberFormatElement.LeadingDigits) > 0 { - for i := 0; i < len(numberFormatElement.LeadingDigits); i++ { - format.LeadingDigitsPattern = append(format.LeadingDigitsPattern, validateRE(numberFormatElement.LeadingDigits[i], true)) - } - } -} - -/** - * Extracts the pattern for international format. If there is no intlFormat, default to using the - * national format. If the intlFormat is set to "NA" the intlFormat should be ignored. - * - * @throws RuntimeException if multiple intlFormats have been encountered. - * @return whether an international number format is defined. - */ -func loadInternationalFormat(metadata *PhoneMetadata, numberFormatElement *NumberFormatE, nationalFormat *NumberFormat) bool { - intlFormat := &NumberFormat{} - intlFormatPattern := numberFormatElement.InternationalFormat - hasExplicitIntlFormatDefined := false - - if len(intlFormatPattern) > 1 { - panic("Invalid number of intlFormat patterns for country: " + metadata.GetId()) - - } else if len(intlFormatPattern) == 0 { - // Default to use the same as the national pattern if none is defined. - intlFormat.merge(nationalFormat) - } else { - intlFormat.Pattern = sp(numberFormatElement.Pattern) - setLeadingDigitsPatterns(numberFormatElement, intlFormat) - intlFormatPatternValue := intlFormatPattern[0] - if intlFormatPatternValue != "NA" { - intlFormat.Format = sp(intlFormatPatternValue) - } - hasExplicitIntlFormatDefined = true - } - - if intlFormat.Format != nil { - metadata.IntlNumberFormat = append(metadata.IntlNumberFormat, intlFormat) - } - return hasExplicitIntlFormatDefined -} - -/** - * Extracts the pattern for the national format. - * - * @throws RuntimeException if multiple or no formats have been encountered. - */ -// @VisibleForTesting -func loadNationalFormat(metadata *PhoneMetadata, numberFormatElement *NumberFormatE, format *NumberFormat) { - setLeadingDigitsPatterns(numberFormatElement, format) - format.Pattern = sp(validateRE(numberFormatElement.Pattern, false)) - format.Format = sp(numberFormatElement.Format) -} - -func getDomesticCarrierCodeFormattingRule(carrierCodeFormattingRule string, nationalPrefix string) string { - // Replace $FG with the first group ($1) and $NP with the national prefix. - carrierCodeFormattingRule = strings.Replace(carrierCodeFormattingRule, "$FG", "$1", 1) - carrierCodeFormattingRule = strings.Replace(carrierCodeFormattingRule, "$NP", nationalPrefix, 1) - return carrierCodeFormattingRule -} - -func getNationalPrefixFormattingRule(nationalPrefixFormattingRule string, nationalPrefix string) string { - // Replace $NP with national prefix and $FG with the first group ($1). - nationalPrefixFormattingRule = strings.Replace(nationalPrefixFormattingRule, "$NP", nationalPrefix, 1) - nationalPrefixFormattingRule = strings.Replace(nationalPrefixFormattingRule, "$FG", "$1", 1) - return nationalPrefixFormattingRule -} - -/** - * Extracts the available formats from the provided DOM element. If it does not contain any - * nationalPrefixFormattingRule, the one passed-in is retained; similarly for - * nationalPrefixOptionalWhenFormatting. The nationalPrefix, nationalPrefixFormattingRule and - * nationalPrefixOptionalWhenFormatting values are provided from the parent (territory) element. - */ -// @VisibleForTesting -func loadAvailableFormats(metadata *PhoneMetadata, element *TerritoryE, nationalPrefix string, - nationalPrefixFormattingRule string, nationalPrefixOptionalWhenFormatting bool) { - carrierCodeFormattingRule := "" - if element.CarrierCodeFormattingRule != "" { - carrierCodeFormattingRule = validateRE(getDomesticCarrierCodeFormattingRule(element.CarrierCodeFormattingRule, nationalPrefix), false) - } - numberFormatElements := element.AvailableFormats - hasExplicitIntlFormatDefined := false - - if len(numberFormatElements) > 0 { - for i := 0; i < len(numberFormatElements); i++ { - numberFormatElement := numberFormatElements[i] - format := NumberFormat{} - - if numberFormatElement.NationalPrefixFormattingRule != "" { - format.NationalPrefixFormattingRule = sp(getNationalPrefixFormattingRule(numberFormatElement.NationalPrefixFormattingRule, nationalPrefix)) - } else { - format.NationalPrefixFormattingRule = sp(nationalPrefixFormattingRule) - } - - if numberFormatElement.NationalPrefixOptionalWhenFormatting != nil { - format.NationalPrefixOptionalWhenFormatting = numberFormatElement.NationalPrefixOptionalWhenFormatting - } else if nationalPrefixOptionalWhenFormatting { - format.NationalPrefixOptionalWhenFormatting = bp(nationalPrefixOptionalWhenFormatting) - } - - if numberFormatElement.CarrierCodeFormattingRule != "" { - format.DomesticCarrierCodeFormattingRule = sp(validateRE(getDomesticCarrierCodeFormattingRule(numberFormatElement.CarrierCodeFormattingRule, nationalPrefix), false)) - } else if carrierCodeFormattingRule != "" { - format.DomesticCarrierCodeFormattingRule = sp(carrierCodeFormattingRule) - } - loadNationalFormat(metadata, &numberFormatElement, &format) - metadata.NumberFormat = append(metadata.NumberFormat, &format) - - if loadInternationalFormat(metadata, &numberFormatElement, &format) { - hasExplicitIntlFormatDefined = true - } - } - // Only a small number of regions need to specify the intlFormats in the xml. For the majority - // of countries the intlNumberFormat metadata is an exact copy of the national NumberFormat - // metadata. To minimize the size of the metadata file, we only keep intlNumberFormats that - // actually differ in some way to the national formats. - if !hasExplicitIntlFormatDefined { - metadata.IntlNumberFormat = nil - } - } -} - -/** - * Checks if the possible lengths provided as a sorted set are equal to the possible lengths - * stored already in the description pattern. Note that possibleLengths may be empty but must not - * be null, and the PhoneNumberDesc passed in should also not be null. - */ -func arePossibleLengthsEqual(possibleLengths map[int32]bool, desc *PhoneNumberDesc) bool { - if len(possibleLengths) != len(desc.PossibleLength) { - return false - } - - // check whether the same elements exist - for _, val := range desc.PossibleLength { - _, exists := possibleLengths[val] - if !exists { - return false - } - } - return true -} - -/** - * Parses a possible length string into a set of the integers that are covered. - * - * @param possibleLengthString a string specifying the possible lengths of phone numbers. Follows - * this syntax: ranges or elements are separated by commas, and ranges are specified in - * [min-max] notation, inclusive. For example, [3-5],7,9,[11-14] should be parsed to - * 3,4,5,7,9,11,12,13,14. - */ -func parsePossibleLengthStringToSet(possibleLengthString string) map[int32]bool { - if possibleLengthString == "" { - panic("Empty possibleLength string found.") - } - lengths := strings.Split(possibleLengthString, ",") - lengthSet := make(map[int32]bool) - - for i := 0; i < len(lengths); i++ { - lengthSubstring := lengths[i] - if lengthSubstring == "" { - panic("Leading, trailing or adjacent commas in possible length string %s, these should only separate numbers or ranges.") - } else if lengthSubstring[0] == '[' { - if lengthSubstring[len(lengthSubstring)-1] != ']' { - panic(fmt.Sprintf("Missing end of range character in possible length string %s.", possibleLengthString)) - } - // Strip the leading and trailing [], and split on the -. - minMax := strings.Split(lengthSubstring[1:len(lengthSubstring)-1], "-") - if len(minMax) != 2 { - panic(fmt.Sprintf("Ranges must have exactly one - character: missing for %s.", possibleLengthString)) - } - min, _ := strconv.Atoi(minMax[0]) - max, _ := strconv.Atoi(minMax[1]) - - // We don't even accept [6-7] since we prefer the shorter 6,7 variant; for a range to be in - // use the hyphen needs to replace at least one digit. - if max-min < 2 { - panic(fmt.Sprintf("The first number in a range should be two or more digits lower than the second. Culprit possibleLength string: %s", possibleLengthString)) - } - - for j := min; j <= max; j++ { - lengthSet[int32(j)] = true - } - } else { - length, _ := strconv.Atoi(lengthSubstring) - lengthSet[int32(length)] = true - } - } - return lengthSet -} - -/** - * Reads the possible lengths present in the metadata and splits them into two sets: one for - * full-length numbers, one for local numbers. - * - * @param data one or more phone number descriptions, represented as XML nodes - * @param lengths a set to which to add possible lengths of full phone numbers - * @param localOnlyLengths a set to which to add possible lengths of phone numbers only diallable - * locally (e.g. within a province) - */ -func populatePossibleLengthSets(data []*PhoneNumberDescE, lengths map[int32]bool, localOnlyLengths map[int32]bool) { - for i := 0; i < len(data); i++ { - desc := data[i] - if desc == nil || desc.PossibleLengths == nil { - continue - } - - element := desc.PossibleLengths - nationalLengths := element.National - - // We don't add to the phone metadata yet, since we want to sort length elements found under - // different nodes first, make sure there are no duplicates between them and that the - // localOnly lengths don't overlap with the others. - thisElementLengths := parsePossibleLengthStringToSet(nationalLengths) - if element.LocalOnly != "" { - thisElementLocalOnlyLengths := parsePossibleLengthStringToSet(element.LocalOnly) - - // intersect our two maps - intersection := make(map[int32]bool) - for k := range thisElementLengths { - if thisElementLocalOnlyLengths[k] { - intersection[k] = true - } - } - - if len(intersection) != 0 { - panic(fmt.Sprintf("Possible length(s) found specified as a normal and local-only length: %v", intersection)) - } - - // We check again when we set these lengths on the metadata itself in setPossibleLengths - // that the elements in localOnly are not also in lengths. For e.g. the generalDesc, it - // might have a local-only length for one type that is a normal length for another type. We - // don't consider this an error, but we do want to remove the local-only lengths. - for k := range thisElementLocalOnlyLengths { - localOnlyLengths[k] = true - } - } - // It is okay if at this time we have duplicates, because the same length might be possible - // for e.g. fixed-line and for mobile numbers, and this method operates potentially on - // multiple phoneNumberDesc XML elements. - for k := range thisElementLengths { - lengths[k] = true - } - } -} - -/** - * Processes a phone number description element from the XML file and returns it as a - * PhoneNumberDesc. If the description element is a fixed line or mobile number, the parent - * description will be used to fill in the whole element if necessary, or any components that are - * missing. For all other types, the parent description will only be used to fill in missing - * components if the type has a partial definition. For example, if no "tollFree" element exists, - * we assume there are no toll free numbers for that locale, and return a phone number description - * with "NA" for both the national and possible number patterns. Note that the parent description - * must therefore already be processed before this method is called on any child elements. - * - * @param parentDesc a generic phone number description that will be used to fill in missing - * parts of the description, or null if this is the root node. This must be processed before - * this is run on any child elements. - * @param countryElement the XML element representing all the country information - * @param numberType the name of the number type, corresponding to the appropriate tag in the XML - * file with information about that type - * @return complete description of that phone number type - */ -// @VisibleForTesting -func processPhoneNumberDescElement(parentDesc *PhoneNumberDesc, element *PhoneNumberDescE) *PhoneNumberDesc { - numberDesc := PhoneNumberDesc{} - if element == nil { - numberDesc.NationalNumberPattern = sp("NA") - numberDesc.PossibleNumberPattern = sp("NA") - // -1 will never match a possible phone number length, so is safe to use to ensure this never - // matches. We don't leave it empty, since for compression reasons, we use the empty list to - // mean that the generalDesc possible lengths apply. - //numberDesc.PossibleLength = append(numberDesc.PossibleLength, -1) [golang doesnt use possible length numbers] - return &numberDesc - } - if parentDesc != nil { - // New way of handling possible number lengths. We don't do this for the general - // description, since these tags won't be present; instead we will calculate its values - // based on the values for all the other number type descriptions (see - // setPossibleLengthsGeneralDesc). - lengths := make(map[int32]bool) - localOnlyLengths := make(map[int32]bool) - populatePossibleLengthSets([]*PhoneNumberDescE{element}, lengths, localOnlyLengths) - setPossibleLengths(lengths, localOnlyLengths, parentDesc, &numberDesc) - } - - validPattern := element.NationalNumberPattern - if validPattern != "" { - numberDesc.NationalNumberPattern = sp(validateRE(validPattern, true)) - } - - exampleNumber := element.ExampleNumber - if exampleNumber != "" { - numberDesc.ExampleNumber = sp(exampleNumber) - } - - return &numberDesc -} - -/** - * Sets the possible length fields in the metadata from the sets of data passed in. Checks that - * the length is covered by the "parent" phone number description element if one is present, and - * if the lengths are exactly the same as this, they are not filled in for efficiency reasons. - * - * @param parentDesc the "general description" element or null if desc is the generalDesc itself - * @param desc the PhoneNumberDesc object that we are going to set lengths for - */ -func setPossibleLengths(lengths map[int32]bool, localOnlyLengths map[int32]bool, parentDesc *PhoneNumberDesc, desc *PhoneNumberDesc) { - // We clear these fields since the metadata tends to inherit from the parent element for other - // fields (via a mergeFrom). - desc.PossibleLength = nil - desc.PossibleLengthLocalOnly = nil - - // Only add the lengths to this sub-type if they aren't exactly the same as the possible - // lengths in the general desc (for metadata size reasons). - // if parentDesc == nil || !arePossibleLengthsEqual(lengths, parentDesc) { [TODO: nicp: golang doesn't optimize?] - for length := range lengths { - if parentDesc == nil || parentDesc.hasPossibleLength(length) { - desc.PossibleLength = append(desc.PossibleLength, length) - } else { - // We shouldn't have possible lengths defined in a child element that are not covered by - // the general description. We check this here even though the general description is - // derived from child elements because it is only derived from a subset, and we need to - // ensure *all* child elements have a valid possible length. - panic(fmt.Sprintf("Out-of-range possible length found (%d), parent lengths %v.", length, parentDesc.PossibleLength)) - } - } - //} - // We check that the local-only length isn't also a normal possible length (only relevant for - // the general-desc, since within elements such as fixed-line we would throw an exception if we - // saw this) before adding it to the collection of possible local-only lengths. - for length := range localOnlyLengths { - if !lengths[length] { - // We check it is covered by either of the possible length sets of the parent - // PhoneNumberDesc, because for example 7 might be a valid localOnly length for mobile, but - // a valid national length for fixedLine, so the generalDesc would have the 7 removed from - // localOnly. - if parentDesc == nil || parentDesc.hasPossibleLength(length) || parentDesc.hasPossibleLengthLocalOnly(length) { - desc.PossibleLength = append(desc.PossibleLength, length) - } else { - panic(fmt.Sprintf("Out-of-range local-only possible length found (%d), parent length %v.", length, parentDesc.PossibleLengthLocalOnly)) - } - } - } - - // generate our possible pattern from our min and max - if len(desc.PossibleLength) > 0 { - min := int32(math.MaxInt32) - max := int32(math.MinInt32) - for _, l := range desc.PossibleLength { - if l < min { - min = l - } - if l > max { - max = l - } - } - if min == max { - desc.PossibleNumberPattern = sp(fmt.Sprintf("\\d{%d}", min)) - } else { - desc.PossibleNumberPattern = sp(fmt.Sprintf("\\d{%d,%d}", min, max)) - } - } -} - -/** - * Sets possible lengths in the general description, derived from certain child elements. - */ -func setPossibleLengthsGeneralDesc(generalDesc *PhoneNumberDesc, metadataId string, data *TerritoryE, isShortNumberMetadata bool) { - lengths := make(map[int32]bool) - localOnlyLengths := make(map[int32]bool) - - // The general description node should *always* be present if metadata for other types is - // present, aside from in some unit tests. - // (However, for e.g. formatting metadata in PhoneNumberAlternateFormats, no PhoneNumberDesc - // elements are present). - generalDescNode := data.GeneralDesc - populatePossibleLengthSets([]*PhoneNumberDescE{generalDescNode}, lengths, localOnlyLengths) - - if len(lengths) != 0 || len(localOnlyLengths) != 0 { - // We shouldn't have anything specified at the "general desc" level: we are going to - // calculate this ourselves from child elements. - panic(fmt.Sprintf("Found possible lengths specified at general desc: this should be derived from child elements. Affected country: %s", metadataId)) - } - - if !isShortNumberMetadata { - // Make a copy here since we want to remove some nodes, but we don't want to do that on our actual data. - // We remove no-international dialing - trimmedDescs := []*PhoneNumberDescE{data.GeneralDesc, data.AreaCodeOptional, data.FixedLine, data.Mobile, data.Pager, - data.TollFree, data.PremiumRate, data.SharedCost, data.PersonalNumber, data.VOIP, data.UAN, data.VoiceMail, data.StandardRate, - data.ShortCode, data.Emergency, data.CarrierSpecific} - populatePossibleLengthSets(trimmedDescs, lengths, localOnlyLengths) - } else { - populatePossibleLengthSets([]*PhoneNumberDescE{data.ShortCode}, lengths, localOnlyLengths) - if len(localOnlyLengths) > 0 { - panic(fmt.Errorf("Found local-only lengths in short-number metadata")) - } - } - setPossibleLengths(lengths, localOnlyLengths, nil, generalDesc) -} - -func loadCountryMetadata(regionCode string, element *TerritoryE, isShortNumberMetadata bool, isAlternateFormatsMetadata bool) *PhoneMetadata { - nationalPrefix := element.NationalPrefix - metadata := loadTerritoryTagMetadata(regionCode, element, nationalPrefix) - nationalPrefixFormattingRule := getNationalPrefixFormattingRule(element.NationalPrefixFormattingRule, nationalPrefix) - loadAvailableFormats(metadata, element, nationalPrefix, nationalPrefixFormattingRule, element.NationalPrefixOptionalWhenFormatting) - - if !isAlternateFormatsMetadata { - // The alternate formats metadata does not need most of the patterns to be set. - setRelevantDescPatterns(metadata, element, isShortNumberMetadata) - } - return metadata -} - -func setRelevantDescPatterns(metadata *PhoneMetadata, element *TerritoryE, isShortNumberMetadata bool) { - generalDesc := processPhoneNumberDescElement(nil, element.GeneralDesc) - - // Calculate the possible lengths for the general description. This will be based on the - // possible lengths of the child elements. - setPossibleLengthsGeneralDesc(generalDesc, metadata.GetId(), element, isShortNumberMetadata) - metadata.GeneralDesc = generalDesc - - if !isShortNumberMetadata { - // Set fields used by regular length phone numbers. - metadata.FixedLine = processPhoneNumberDescElement(generalDesc, element.FixedLine) - metadata.Mobile = processPhoneNumberDescElement(generalDesc, element.Mobile) - metadata.SharedCost = processPhoneNumberDescElement(generalDesc, element.SharedCost) - metadata.Voip = processPhoneNumberDescElement(generalDesc, element.VOIP) - metadata.PersonalNumber = processPhoneNumberDescElement(generalDesc, element.PersonalNumber) - metadata.Pager = processPhoneNumberDescElement(generalDesc, element.Pager) - metadata.Uan = processPhoneNumberDescElement(generalDesc, element.UAN) - metadata.Voicemail = processPhoneNumberDescElement(generalDesc, element.VoiceMail) - metadata.NoInternationalDialling = processPhoneNumberDescElement(generalDesc, element.NoInternationalDialing) - - mobileAndFixedAreSame := *metadata.Mobile.NationalNumberPattern == *metadata.FixedLine.NationalNumberPattern - if metadata.GetSameMobileAndFixedLinePattern() != mobileAndFixedAreSame { - metadata.SameMobileAndFixedLinePattern = bp(mobileAndFixedAreSame) - } - - metadata.TollFree = processPhoneNumberDescElement(generalDesc, element.TollFree) - metadata.PremiumRate = processPhoneNumberDescElement(generalDesc, element.PremiumRate) - } else { - // Set fields used by short numbers. - metadata.StandardRate = processPhoneNumberDescElement(generalDesc, element.StandardRate) - metadata.ShortCode = processPhoneNumberDescElement(generalDesc, element.ShortCode) - metadata.CarrierSpecific = processPhoneNumberDescElement(generalDesc, element.CarrierSpecific) - metadata.Emergency = processPhoneNumberDescElement(generalDesc, element.Emergency) - metadata.TollFree = processPhoneNumberDescElement(generalDesc, element.TollFree) - metadata.PremiumRate = processPhoneNumberDescElement(generalDesc, element.PremiumRate) - } -} - -// -type PhoneNumberMetadataE struct { - // - Territories []TerritoryE `xml:"territories>territory"` -} - -// -type TerritoryE struct { - // - ID string `xml:"id,attr"` - - // - MainCountryForCode bool `xml:"mainCountryForCode,attr"` - - // - LeadingDigits string `xml:"leadingDigits,attr"` - - // - CountryCode int32 `xml:"countryCode,attr"` - - // - NationalPrefix string `xml:"nationalPrefix,attr"` - - // - InternationalPrefix string `xml:"internationalPrefix,attr"` - - // - PreferredInternationalPrefix string `xml:"preferredInternationalPrefix,attr"` - - // - NationalPrefixFormattingRule string `xml:"nationalPrefixFormattingRule,attr"` - - // - MobileNumberPortableRegion bool `xml:"mobileNumberPortableRegion,attr"` - - // - NationalPrefixForParsing string `xml:"nationalPrefixForParsing,attr"` - - // - NationalPrefixTransformRule string `xml:"nationalPrefixTransformRule,attr"` - - // - PreferredExtnPrefix string `xml:"PreferredExtnPrefix"` - - // - NationalPrefixOptionalWhenFormatting bool `xml:"nationalPrefixOptionalWhenFormatting,attr"` - - // - CarrierCodeFormattingRule string `xml:"carrierCodeFormattingRule,attr"` - - // - // - References []string `xml:"references>sourceUrl"` - - // - AvailableFormats []NumberFormatE `xml:"availableFormats>numberFormat"` - - // - GeneralDesc *PhoneNumberDescE `xml:"generalDesc"` - - // - NoInternationalDialing *PhoneNumberDescE `xml:"noInternationalDialing"` - - // - AreaCodeOptional *PhoneNumberDescE `xml:"areaCodeOptional"` - - // - FixedLine *PhoneNumberDescE `xml:"fixedLine"` - - // - Mobile *PhoneNumberDescE `xml:"mobile"` - - // - Pager *PhoneNumberDescE `xml:"pager"` - - // - TollFree *PhoneNumberDescE `xml:"tollFree"` - - // - PremiumRate *PhoneNumberDescE `xml:"premiumRate"` - - // - SharedCost *PhoneNumberDescE `xml:"sharedCost"` - - // - PersonalNumber *PhoneNumberDescE `xml:"personalNumber"` - - // - VOIP *PhoneNumberDescE `xml:"voip"` - - // - UAN *PhoneNumberDescE `xml:"uan"` - - // - VoiceMail *PhoneNumberDescE `xml:"voicemail"` - - // - StandardRate *PhoneNumberDescE `xml:"standardRate"` - - // - ShortCode *PhoneNumberDescE `xml:"shortCode"` - - // - Emergency *PhoneNumberDescE `xml:"Emergency"` - - // - CarrierSpecific *PhoneNumberDescE `xml:"carrierSpecific"` -} - -// -type NumberFormatE struct { - // - LeadingDigits []string `xml:"leadingDigits"` - - // - Format string `xml:"format"` - - // - InternationalFormat []string `xml:"intlFormat"` - - // - NationalPrefixFormattingRule string `xml:"nationalPrefixFormattingRule,attr"` - - // - NationalPrefixOptionalWhenFormatting *bool `xml:"nationalPrefixOptionalWhenFormatting,attr"` - - // - CarrierCodeFormattingRule string `xml:"carrierCodeFormattingRule,attr"` - - // - Pattern string `xml:"pattern,attr" validate:"required"` -} - -type PossibleLengthE struct { - // - National string `xml:"national,attr"` - - // - LocalOnly string `xml:"localOnly,attr"` -} - -type PhoneNumberDescE struct { - // - NationalNumberPattern string `xml:"nationalNumberPattern"` - - // - PossibleLengths *PossibleLengthE `xml:"possibleLengths"` - - // - ExampleNumber string `xml:"exampleNumber"` -} diff --git a/vendor/github.com/nyaruka/phonenumbers/countrycode_to_region.go b/vendor/github.com/nyaruka/phonenumbers/countrycode_to_region.go deleted file mode 100644 index 1e75f32..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/countrycode_to_region.go +++ /dev/null @@ -1,246 +0,0 @@ -package phonenumbers - -// CountryCodeToRegion maps a country code to a list of possible regions -var CountryCodeToRegion = map[int][]string{ - 1: []string{ - "US", "AG", "AI", "AS", "BB", "BM", "BS", "CA", "DM", "DO", - "GD", "GU", "JM", "KN", "KY", "LC", "MP", "MS", "PR", "SX", - "TC", "TT", "VC", "VG", "VI", - }, - 7: []string{ - "RU", "KZ", - }, - 20: []string{"EG"}, - 27: []string{"ZA"}, - 30: []string{"GR"}, - 31: []string{"NL"}, - 32: []string{"BE"}, - 33: []string{"FR"}, - 34: []string{"ES"}, - 36: []string{"HU"}, - 39: []string{ - "IT", "VA", - }, - 40: []string{"RO"}, - 41: []string{"CH"}, - 43: []string{"AT"}, - 44: []string{ - "GB", "GG", "IM", "JE", - }, - 45: []string{"DK"}, - 46: []string{"SE"}, - 47: []string{ - "NO", "SJ", - }, - 48: []string{"PL"}, - 49: []string{"DE"}, - 51: []string{"PE"}, - 52: []string{"MX"}, - 53: []string{"CU"}, - 54: []string{"AR"}, - 55: []string{"BR"}, - 56: []string{"CL"}, - 57: []string{"CO"}, - 58: []string{"VE"}, - 60: []string{"MY"}, - 61: []string{ - "AU", "CC", "CX", - }, - 62: []string{"ID"}, - 63: []string{"PH"}, - 64: []string{"NZ"}, - 65: []string{"SG"}, - 66: []string{"TH"}, - 81: []string{"JP"}, - 82: []string{"KR"}, - 84: []string{"VN"}, - 86: []string{"CN"}, - 90: []string{"TR"}, - 91: []string{"IN"}, - 92: []string{"PK"}, - 93: []string{"AF"}, - 94: []string{"LK"}, - 95: []string{"MM"}, - 98: []string{"IR"}, - 211: []string{"SS"}, - 212: []string{ - "MA", "EH", - }, - 213: []string{"DZ"}, - 216: []string{"TN"}, - 218: []string{"LY"}, - 220: []string{"GM"}, - 221: []string{"SN"}, - 222: []string{"MR"}, - 223: []string{"ML"}, - 224: []string{"GN"}, - 225: []string{"CI"}, - 226: []string{"BF"}, - 227: []string{"NE"}, - 228: []string{"TG"}, - 229: []string{"BJ"}, - 230: []string{"MU"}, - 231: []string{"LR"}, - 232: []string{"SL"}, - 233: []string{"GH"}, - 234: []string{"NG"}, - 235: []string{"TD"}, - 236: []string{"CF"}, - 237: []string{"CM"}, - 238: []string{"CV"}, - 239: []string{"ST"}, - 240: []string{"GQ"}, - 241: []string{"GA"}, - 242: []string{"CG"}, - 243: []string{"CD"}, - 244: []string{"AO"}, - 245: []string{"GW"}, - 246: []string{"IO"}, - 247: []string{"AC"}, - 248: []string{"SC"}, - 249: []string{"SD"}, - 250: []string{"RW"}, - 251: []string{"ET"}, - 252: []string{"SO"}, - 253: []string{"DJ"}, - 254: []string{"KE"}, - 255: []string{"TZ"}, - 256: []string{"UG"}, - 257: []string{"BI"}, - 258: []string{"MZ"}, - 260: []string{"ZM"}, - 261: []string{"MG"}, - 262: []string{ - "RE", "YT", - }, - 263: []string{"ZW"}, - 264: []string{"NA"}, - 265: []string{"MW"}, - 266: []string{"LS"}, - 267: []string{"BW"}, - 268: []string{"SZ"}, - 269: []string{"KM"}, - 290: []string{ - "SH", "TA", - }, - 291: []string{"ER"}, - 297: []string{"AW"}, - 298: []string{"FO"}, - 299: []string{"GL"}, - 350: []string{"GI"}, - 351: []string{"PT"}, - 352: []string{"LU"}, - 353: []string{"IE"}, - 354: []string{"IS"}, - 355: []string{"AL"}, - 356: []string{"MT"}, - 357: []string{"CY"}, - 358: []string{ - "FI", "AX", - }, - 359: []string{"BG"}, - 370: []string{"LT"}, - 371: []string{"LV"}, - 372: []string{"EE"}, - 373: []string{"MD"}, - 374: []string{"AM"}, - 375: []string{"BY"}, - 376: []string{"AD"}, - 377: []string{"MC"}, - 378: []string{"SM"}, - 380: []string{"UA"}, - 381: []string{"RS"}, - 382: []string{"ME"}, - 385: []string{"HR"}, - 386: []string{"SI"}, - 387: []string{"BA"}, - 389: []string{"MK"}, - 420: []string{"CZ"}, - 421: []string{"SK"}, - 423: []string{"LI"}, - 500: []string{"FK"}, - 501: []string{"BZ"}, - 502: []string{"GT"}, - 503: []string{"SV"}, - 504: []string{"HN"}, - 505: []string{"NI"}, - 506: []string{"CR"}, - 507: []string{"PA"}, - 508: []string{"PM"}, - 509: []string{"HT"}, - 590: []string{ - "GP", "BL", "MF", - }, - 591: []string{"BO"}, - 592: []string{"GY"}, - 593: []string{"EC"}, - 594: []string{"GF"}, - 595: []string{"PY"}, - 596: []string{"MQ"}, - 597: []string{"SR"}, - 598: []string{"UY"}, - 599: []string{ - "CW", "BQ", - }, - 670: []string{"TL"}, - 672: []string{"NF"}, - 673: []string{"BN"}, - 674: []string{"NR"}, - 675: []string{"PG"}, - 676: []string{"TO"}, - 677: []string{"SB"}, - 678: []string{"VU"}, - 679: []string{"FJ"}, - 680: []string{"PW"}, - 681: []string{"WF"}, - 682: []string{"CK"}, - 683: []string{"NU"}, - 685: []string{"WS"}, - 686: []string{"KI"}, - 687: []string{"NC"}, - 688: []string{"TV"}, - 689: []string{"PF"}, - 690: []string{"TK"}, - 691: []string{"FM"}, - 692: []string{"MH"}, - 800: []string{"001"}, - 808: []string{"001"}, - 850: []string{"KP"}, - 852: []string{"HK"}, - 853: []string{"MO"}, - 855: []string{"KH"}, - 856: []string{"LA"}, - 870: []string{"001"}, - 878: []string{"001"}, - 880: []string{"BD"}, - 881: []string{"001"}, - 882: []string{"001"}, - 883: []string{"001"}, - 886: []string{"TW"}, - 888: []string{"001"}, - 960: []string{"MV"}, - 961: []string{"LB"}, - 962: []string{"JO"}, - 963: []string{"SY"}, - 964: []string{"IQ"}, - 965: []string{"KW"}, - 966: []string{"SA"}, - 967: []string{"YE"}, - 968: []string{"OM"}, - 970: []string{"PS"}, - 971: []string{"AE"}, - 972: []string{"IL"}, - 973: []string{"BH"}, - 974: []string{"QA"}, - 975: []string{"BT"}, - 976: []string{"MN"}, - 977: []string{"NP"}, - 979: []string{"001"}, - 992: []string{"TJ"}, - 993: []string{"TM"}, - 994: []string{"AZ"}, - 995: []string{"GE"}, - 996: []string{"KG"}, - 998: []string{"UZ"}, - -} diff --git a/vendor/github.com/nyaruka/phonenumbers/insertablebuffer.go b/vendor/github.com/nyaruka/phonenumbers/insertablebuffer.go deleted file mode 100644 index 90a2e8d..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/insertablebuffer.go +++ /dev/null @@ -1,472 +0,0 @@ -// This file was originally entirely copied from bytes/buffer.go -// in the go standard library, and was then modified from there. - -// 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 phonenumbers - -// Simple byte buffer for marshaling data. - -import ( - "bytes" - "errors" - "io" - "unicode/utf8" -) - -// A Buffer is a variable-sized buffer of bytes with Read and Write methods. -// The zero value for Buffer is an empty buffer ready to use. -type Builder struct { - buf []byte // contents are the bytes buf[off : len(buf)] - off int // read at &buf[off], write at &buf[len(buf)] - runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune - bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation. - lastRead readOp // last read operation, so that Unread* can work correctly. -} - -// The readOp constants describe the last action performed on -// the buffer, so that UnreadRune and UnreadByte can -// check for invalid usage. -type readOp int - -const ( - opInvalid readOp = iota // Non-read operation. - opReadRune // Read rune. - opRead // Any other read operation. -) - -// Bytes returns a slice of the contents of the unread portion of the buffer; -// len(b.Bytes()) == b.Len(). If the caller changes the contents of the -// returned slice, the contents of the buffer will change provided there -// are no intervening method calls on the Buffer. -func (b *Builder) Bytes() []byte { return b.buf[b.off:] } - -// String returns the contents of the unread portion of the buffer -// as a string. If the Buffer is a nil pointer, it returns "". -func (b *Builder) String() string { - if b == nil { - // Special case, useful in debugging. - return "" - } - return string(b.buf[b.off:]) -} - -// Len returns the number of bytes of the unread portion of the buffer; -// b.Len() == len(b.Bytes()). -func (b *Builder) Len() int { return len(b.buf) - b.off } - -// Truncate discards all but the first n unread bytes from the buffer. -// It panics if n is negative or greater than the length of the buffer. -func (b *Builder) Truncate(n int) { - b.lastRead = opInvalid - switch { - case n < 0 || n > b.Len(): - // Originall this was a panic, but I hate panicing (hehe), - // so instead let's just ignore this issue. - // panic("bytes.Buffer: truncation out of range") - return - case n == 0: - // Reuse buffer space. - b.off = 0 - } - b.buf = b.buf[0 : b.off+n] -} - -// Reset resets the buffer so it has no content. -// b.Reset() is the same as b.Truncate(0). -func (b *Builder) Reset() { b.Truncate(0) } - -// grow grows the buffer to guarantee space for n more bytes. -// It returns the index where bytes should be written. -// If the buffer can't grow it will panic with ErrTooLarge. -func (b *Builder) grow(n int) int { - m := b.Len() - // If buffer is empty, reset to recover space. - if m == 0 && b.off != 0 { - b.Truncate(0) - } - if len(b.buf)+n > cap(b.buf) { - var buf []byte - if b.buf == nil && n <= len(b.bootstrap) { - buf = b.bootstrap[0:] - } else if m+n <= cap(b.buf)/2 { - // We can slide things down instead of allocating a new - // slice. We only need m+n <= cap(b.buf) to slide, but - // we instead let capacity get twice as large so we - // don't spend all our time copying. - copy(b.buf[:], b.buf[b.off:]) - buf = b.buf[:m] - } else { - // not enough space anywhere - buf = makeSlice(2*cap(b.buf) + n) - copy(buf, b.buf[b.off:]) - } - b.buf = buf - b.off = 0 - } - b.buf = b.buf[0 : b.off+m+n] - return b.off + m -} - -// Grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After Grow(n), at least n bytes can be written to the -// buffer without another allocation. -// If n is negative, Grow will panic. -// If the buffer can't grow it will panic with ErrTooLarge. -func (b *Builder) Grow(n int) { - if n < 0 { - panic("bytes.Buffer.Grow: negative count") - } - m := b.grow(n) - b.buf = b.buf[0:m] -} - -// Write appends the contents of p to the buffer, growing the buffer as -// needed. The return value n is the length of p; err is always nil. If the -// buffer becomes too large, Write will panic with ErrTooLarge. -func (b *Builder) Write(p []byte) (n int, err error) { - b.lastRead = opInvalid - m := b.grow(len(p)) - return copy(b.buf[m:], p), nil -} - -// WriteString appends the contents of s to the buffer, growing the buffer as -// needed. The return value n is the length of s; err is always nil. If the -// buffer becomes too large, WriteString will panic with ErrTooLarge. -func (b *Builder) WriteString(s string) (n int, err error) { - b.lastRead = opInvalid - m := b.grow(len(s)) - return copy(b.buf[m:], s), nil -} - -// ReadFrom reads data from r until EOF and appends it to the buffer, growing -// the buffer as needed. The return value n is the number of bytes read. Any -// error except io.EOF encountered during the read is also returned. If the -// buffer becomes too large, ReadFrom will panic with ErrTooLarge. -func (b *Builder) ReadFrom(r io.Reader) (n int64, err error) { - b.lastRead = opInvalid - // If buffer is empty, reset to recover space. - if b.off >= len(b.buf) { - b.Truncate(0) - } - for { - if free := cap(b.buf) - len(b.buf); free < bytes.MinRead { - // not enough space at end - newBuf := b.buf - if b.off+free < bytes.MinRead { - // not enough space using beginning of buffer; - // double buffer capacity - newBuf = makeSlice(2*cap(b.buf) + bytes.MinRead) - } - copy(newBuf, b.buf[b.off:]) - b.buf = newBuf[:len(b.buf)-b.off] - b.off = 0 - } - m, e := r.Read(b.buf[len(b.buf):cap(b.buf)]) - b.buf = b.buf[0 : len(b.buf)+m] - n += int64(m) - if e == io.EOF { - break - } - if e != nil { - return n, e - } - } - return n, nil // err is EOF, so return nil explicitly -} - -// makeSlice allocates a slice of size n. If the allocation fails, it panics -// with ErrTooLarge. -func makeSlice(n int) []byte { - // If the make fails, give a known error. - defer func() { - if recover() != nil { - panic(bytes.ErrTooLarge) - } - }() - return make([]byte, n) -} - -// WriteTo writes data to w until the buffer is drained or an error occurs. -// The return value n is the number of bytes written; it always fits into an -// int, but it is int64 to match the io.WriterTo interface. Any error -// encountered during the write is also returned. -func (b *Builder) WriteTo(w io.Writer) (n int64, err error) { - b.lastRead = opInvalid - if b.off < len(b.buf) { - nBytes := b.Len() - m, e := w.Write(b.buf[b.off:]) - if m > nBytes { - panic("bytes.Buffer.WriteTo: invalid Write count") - } - b.off += m - n = int64(m) - if e != nil { - return n, e - } - // all bytes should have been written, by definition of - // Write method in io.Writer - if m != nBytes { - return n, io.ErrShortWrite - } - } - // Buffer is now empty; reset. - b.Truncate(0) - return -} - -// WriteByte appends the byte c to the buffer, growing the buffer as needed. -// The returned error is always nil, but is included to match bufio.Writer's -// WriteByte. If the buffer becomes too large, WriteByte will panic with -// ErrTooLarge. -func (b *Builder) WriteByte(c byte) error { - b.lastRead = opInvalid - m := b.grow(1) - b.buf[m] = c - return nil -} - -// WriteRune appends the UTF-8 encoding of Unicode code point r to the -// buffer, returning its length and an error, which is always nil but is -// included to match bufio.Writer's WriteRune. The buffer is grown as needed; -// if it becomes too large, WriteRune will panic with ErrTooLarge. -func (b *Builder) WriteRune(r rune) (n int, err error) { - if r < utf8.RuneSelf { - b.WriteByte(byte(r)) - return 1, nil - } - n = utf8.EncodeRune(b.runeBytes[0:], r) - b.Write(b.runeBytes[0:n]) - return n, nil -} - -// Read reads the next len(p) bytes from the buffer or until the buffer -// is drained. The return value n is the number of bytes read. If the -// buffer has no data to return, err is io.EOF (unless len(p) is zero); -// otherwise it is nil. -func (b *Builder) Read(p []byte) (n int, err error) { - b.lastRead = opInvalid - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - if len(p) == 0 { - return - } - return 0, io.EOF - } - n = copy(p, b.buf[b.off:]) - b.off += n - if n > 0 { - b.lastRead = opRead - } - return -} - -// Next returns a slice containing the next n bytes from the buffer, -// advancing the buffer as if the bytes had been returned by Read. -// If there are fewer than n bytes in the buffer, Next returns the entire buffer. -// The slice is only valid until the next call to a read or write method. -func (b *Builder) Next(n int) []byte { - b.lastRead = opInvalid - m := b.Len() - if n > m { - n = m - } - data := b.buf[b.off : b.off+n] - b.off += n - if n > 0 { - b.lastRead = opRead - } - return data -} - -// ReadByte reads and returns the next byte from the buffer. -// If no byte is available, it returns error io.EOF. -func (b *Builder) ReadByte() (c byte, err error) { - b.lastRead = opInvalid - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - return 0, io.EOF - } - c = b.buf[b.off] - b.off++ - b.lastRead = opRead - return c, nil -} - -// ReadRune reads and returns the next UTF-8-encoded -// Unicode code point from the buffer. -// If no bytes are available, the error returned is io.EOF. -// If the bytes are an erroneous UTF-8 encoding, it -// consumes one byte and returns U+FFFD, 1. -func (b *Builder) ReadRune() (r rune, size int, err error) { - b.lastRead = opInvalid - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - return 0, 0, io.EOF - } - b.lastRead = opReadRune - c := b.buf[b.off] - if c < utf8.RuneSelf { - b.off++ - return rune(c), 1, nil - } - r, n := utf8.DecodeRune(b.buf[b.off:]) - b.off += n - return r, n, nil -} - -// UnreadRune unreads the last rune returned by ReadRune. -// If the most recent read or write operation on the buffer was -// not a ReadRune, UnreadRune returns an error. (In this regard -// it is stricter than UnreadByte, which will unread the last byte -// from any read operation.) -func (b *Builder) UnreadRune() error { - if b.lastRead != opReadRune { - return errors.New("bytes.Buffer: UnreadRune: previous operation was not ReadRune") - } - b.lastRead = opInvalid - if b.off > 0 { - _, n := utf8.DecodeLastRune(b.buf[0:b.off]) - b.off -= n - } - return nil -} - -// UnreadByte unreads the last byte returned by the most recent -// read operation. If write has happened since the last read, UnreadByte -// returns an error. -func (b *Builder) UnreadByte() error { - if b.lastRead != opReadRune && b.lastRead != opRead { - return errors.New("bytes.Buffer: UnreadByte: previous operation was not a read") - } - b.lastRead = opInvalid - if b.off > 0 { - b.off-- - } - return nil -} - -// ReadBytes reads until the first occurrence of delim in the input, -// returning a slice containing the data up to and including the delimiter. -// If ReadBytes encounters an error before finding a delimiter, -// it returns the data read before the error and the error itself (often io.EOF). -// ReadBytes returns err != nil if and only if the returned data does not end in -// delim. -func (b *Builder) ReadBytes(delim byte) (line []byte, err error) { - slice, err := b.readSlice(delim) - // return a copy of slice. The buffer's backing array may - // be overwritten by later calls. - line = append(line, slice...) - return -} - -// readSlice is like ReadBytes but returns a reference to internal buffer data. -func (b *Builder) readSlice(delim byte) (line []byte, err error) { - i := bytes.IndexByte(b.buf[b.off:], delim) - end := b.off + i + 1 - if i < 0 { - end = len(b.buf) - err = io.EOF - } - line = b.buf[b.off:end] - b.off = end - b.lastRead = opRead - return line, err -} - -// ReadString reads until the first occurrence of delim in the input, -// returning a string containing the data up to and including the delimiter. -// If ReadString encounters an error before finding a delimiter, -// it returns the data read before the error and the error itself (often io.EOF). -// ReadString returns err != nil if and only if the returned data does not end -// in delim. -func (b *Builder) ReadString(delim byte) (line string, err error) { - slice, err := b.readSlice(delim) - return string(slice), err -} - -// NewBuilder creates and initializes a new Buffer using buf as its initial -// contents. It is intended to prepare a Buffer to read existing data. It -// can also be used to size the internal buffer for writing. To do that, -// buf should have the desired capacity but a length of zero. -// -// In most cases, new(Buffer) (or just declaring a Buffer variable) is -// sufficient to initialize a Buffer. -func NewBuilder(buf []byte) *Builder { return &Builder{buf: buf} } - -// NewBuilderString creates and initializes a new Buffer using string s as its -// initial contents. It is intended to prepare a buffer to read an existing -// string. -// -// In most cases, new(Buffer) (or just declaring a Buffer variable) is -// sufficient to initialize a Buffer. -func NewBuilderString(s string) *Builder { - return &Builder{buf: []byte(s)} -} - -// The whole reason we needed to copy this file was so we had access to the underlying slice - -var ErrInvalidIndex = errors.New("insertablebuffer.Buf: invalid index") -var ErrFailedToGrow = errors.New("insertablebuffer.Buf: failed to grow buffer enough") - -// Insert inserts the buffer at the desired position, growing the buffer -// as necessary. If i is less than zero, or greater than len(p), an error -// is returned. -func (b *Builder) Insert(i int, p []byte) (n int, err error) { - b.lastRead = opInvalid - if i < 0 || i > len(b.buf) { - return -1, ErrInvalidIndex - } - - m := b.grow(len(p)) - if len(b.buf)-m != len(p) { - return -1, ErrFailedToGrow - } - copy(b.buf[i+len(p):], b.buf[i:len(b.buf)-len(p)]) - return copy(b.buf[i:i+len(p)], p), nil -} - -// InsertString inserts the string at the desired position, growing the buffer -// as necessary. If i is less than zero, or greater than len(p), an error -// is returned. -func (b *Builder) InsertString(i int, p string) (n int, err error) { - b.lastRead = opInvalid - if i < 0 || i > len(b.buf) { - return -1, ErrInvalidIndex - } - - m := b.grow(len(p)) - if len(b.buf)-m != len(p) { - return -1, ErrFailedToGrow - } - copy(b.buf[i+len(p):], b.buf[i:len(b.buf)-len(p)]) - return copy(b.buf[i:i+len(p)], p), nil -} - -// ByteAt returns the byte at the given index. It returns -// ErrInvalidIndex if the given index is outside the buffer's -// length. There is no RuneAt currently, for I'm unsure -// what the desired behaviour should be (read rune by rune -// until we get to the ith rune, read the rune starting at i). -func (b *Builder) ByteAt(i int) (byte, error) { - if i < 0 || i > len(b.buf) { - return 0, ErrInvalidIndex - } - - return b.buf[i], nil -} - -func (b *Builder) ResetWith(buf []byte) (n int, err error) { - b.Truncate(0) - return b.Write(buf) -} - -func (b *Builder) ResetWithString(s string) (n int, err error) { - b.Truncate(0) - return b.WriteString(s) -} diff --git a/vendor/github.com/nyaruka/phonenumbers/matcher.go b/vendor/github.com/nyaruka/phonenumbers/matcher.go deleted file mode 100644 index 0f55c2f..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/matcher.go +++ /dev/null @@ -1,210 +0,0 @@ -package phonenumbers - -import ( - "strconv" - "strings" - "unicode" -) - -type PhoneNumberMatcher struct { -} - -func NewPhoneNumberMatcher(seq string) *PhoneNumberMatcher { - // TODO(ttacon): to be implemented - return nil -} - -func ContainsOnlyValidXChars(number *PhoneNumber, candidate string) bool { - // The characters 'x' and 'X' can be (1) a carrier code, in which - // case they always precede the national significant number or (2) - // an extension sign, in which case they always precede the extension - // number. We assume a carrier code is more than 1 digit, so the first - // case has to have more than 1 consecutive 'x' or 'X', whereas the - // second case can only have exactly 1 'x' or 'X'. We ignore the - // character if it appears as the last character of the string. - for index := 0; index < len(candidate)-1; index++ { - var charAtIndex = candidate[index] - if charAtIndex == 'x' || charAtIndex == 'X' { - var charAtNextIndex = candidate[index+1] - if charAtNextIndex == 'x' || charAtNextIndex == 'X' { - // This is the carrier code case, in which the 'X's - // always precede the national significant number. - index++ - if isNumberMatchWithOneNumber(number, candidate[index:]) != NSN_MATCH { - return false - } - // This is the extension sign case, in which the 'x' - // or 'X' should always precede the extension number. - } else if NormalizeDigitsOnly(candidate[index:]) != number.GetExtension() { - return false - } - } - } - return true -} - -func IsNationalPrefixPresentIfRequired(number *PhoneNumber) bool { - // First, check how we deduced the country code. If it was written - // in international format, then the national prefix is not required. - if number.GetCountryCodeSource() != PhoneNumber_FROM_DEFAULT_COUNTRY { - return true - } - var phoneNumberRegion = GetRegionCodeForCountryCode(int(number.GetCountryCode())) - var metadata = getMetadataForRegion(phoneNumberRegion) - if metadata == nil { - return true - } - // Check if a national prefix should be present when formatting this number. - var nationalNumber = GetNationalSignificantNumber(number) - var formatRule = chooseFormattingPatternForNumber( - metadata.GetNumberFormat(), nationalNumber) - // To do this, we check that a national prefix formatting rule was - // present and that it wasn't just the first-group symbol ($1) with - // punctuation. - if (formatRule != nil) && len(formatRule.GetNationalPrefixFormattingRule()) > 0 { - if formatRule.GetNationalPrefixOptionalWhenFormatting() { - // The national-prefix is optional in these cases, so we - // don't need to check if it was present. - return true - } - if formattingRuleHasFirstGroupOnly( - formatRule.GetNationalPrefixFormattingRule()) { - // National Prefix not needed for this number. - return true - } - // Normalize the remainder. - var rawInputCopy = NormalizeDigitsOnly(number.GetRawInput()) - var rawInput = NewBuilderString(rawInputCopy) - // Check if we found a national prefix and/or carrier code at - // the start of the raw input, and return the result. - return maybeStripNationalPrefixAndCarrierCode( - rawInput, metadata, NewBuilder(nil)) - } - return true -} - -func ContainsMoreThanOneSlashInNationalNumber( - number *PhoneNumber, - candidate string) bool { - var firstSlash = strings.Index(candidate, "/") - if firstSlash < 0 { - // No slashes, this is okay. - return false - } - // Now look for a second one. - var secondSlash = strings.Index(candidate[firstSlash+1:], "/") - if secondSlash < 0 { - // Only one slash, this is okay. - return false - } - - // If the first slash is after the country calling code, this is permitted. - var candidateHasCountryCode = (number.GetCountryCodeSource() == PhoneNumber_FROM_NUMBER_WITH_PLUS_SIGN || - number.GetCountryCodeSource() == PhoneNumber_FROM_NUMBER_WITHOUT_PLUS_SIGN) - cc := strconv.Itoa(int(number.GetCountryCode())) - if candidateHasCountryCode && - NormalizeDigitsOnly(candidate[0:firstSlash]) == cc { - // Any more slashes and this is illegal. - return strings.Contains(candidate[secondSlash+1:], "/") - } - return true -} - -func CheckNumberGroupingIsValid( - number *PhoneNumber, - candidate string, - fn func(*PhoneNumber, string, []string) bool) bool { - // TODO(ttacon): to be implemented - return false -} - -func AllNumberGroupsRemainGrouped( - number *PhoneNumber, - normalizedCandidate string, - formattedNumberGroups []string) bool { - - var fromIndex = 0 - if number.GetCountryCodeSource() != PhoneNumber_FROM_DEFAULT_COUNTRY { - // First skip the country code if the normalized candidate contained it. - var cc = strconv.Itoa(int(number.GetCountryCode())) - fromIndex = strings.Index(normalizedCandidate, cc) + len(cc) - } - // Check each group of consecutive digits are not broken into - // separate groupings in the normalizedCandidate string. - for i := 0; i < len(formattedNumberGroups); i++ { - // Fails if the substring of normalizedCandidate starting - // from fromIndex doesn't contain the consecutive digits - // in formattedNumberGroups[i]. - fromIndex = strings.Index( - normalizedCandidate[fromIndex+1:], formattedNumberGroups[i]) - if fromIndex < 0 { - return false - } - // Moves fromIndex forward. - fromIndex += len(formattedNumberGroups[i]) - if i == 0 && fromIndex < len(normalizedCandidate) { - // We are at the position right after the NDC. We get - // the region used for formatting information based on - // the country code in the phone number, rather than the - // number itself, as we do not need to distinguish between - // different countries with the same country calling code - // and this is faster. - var region = GetRegionCodeForCountryCode(int(number.GetCountryCode())) - if GetNddPrefixForRegion(region, true) != "" && - unicode.IsDigit(rune(normalizedCandidate[fromIndex])) { - // This means there is no formatting symbol after the - // NDC. In this case, we only accept the number if there - // is no formatting symbol at all in the number, except - // for extensions. This is only important for countries - // with national prefixes. - var nationalSignificantNumber = GetNationalSignificantNumber(number) - return strings.HasPrefix( - normalizedCandidate[fromIndex-len(formattedNumberGroups[i]):], - nationalSignificantNumber) - } - } - } - - // The check here makes sure that we haven't mistakenly already - // used the extension to match the last group of the subscriber - // number. Note the extension cannot have formatting in-between digits. - return strings.Contains(normalizedCandidate[fromIndex:], number.GetExtension()) -} - -func AllNumberGroupsAreExactlyPresent( - number *PhoneNumber, - normalizedCandidate string, - formattedNumberGroups []string) bool { - - var candidateGroups = NON_DIGITS_PATTERN.FindAllString(normalizedCandidate, -1) - // Set this to the last group, skipping it if the number has an extension. - var candidateNumberGroupIndex = len(candidateGroups) - 2 - if number.GetExtension() != "" { - candidateNumberGroupIndex = len(candidateGroups) - 1 - } - - // First we check if the national significant number is formatted - // as a block. We use contains and not equals, since the national - // significant number may be present with a prefix such as a national - // number prefix, or the country code itself. - if len(candidateGroups) == 1 || strings.Contains( - candidateGroups[candidateNumberGroupIndex], - GetNationalSignificantNumber(number)) { - return true - } - // Starting from the end, go through in reverse, excluding the first - // group, and check the candidate and number groups are the same. - for formattedNumberGroupIndex := len(formattedNumberGroups) - 1; formattedNumberGroupIndex > 0 && candidateNumberGroupIndex >= 0; formattedNumberGroupIndex-- { - if candidateGroups[candidateNumberGroupIndex] != - formattedNumberGroups[formattedNumberGroupIndex] { - return false - } - candidateNumberGroupIndex-- - } - // Now check the first group. There may be a national prefix at - // the start, so we only check that the candidate group ends with - // the formatted number group. - return (candidateNumberGroupIndex >= 0 && - strings.HasSuffix(candidateGroups[candidateNumberGroupIndex], - formattedNumberGroups[0])) -} diff --git a/vendor/github.com/nyaruka/phonenumbers/metadata_bin.go b/vendor/github.com/nyaruka/phonenumbers/metadata_bin.go deleted file mode 100644 index 6e04304..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/metadata_bin.go +++ /dev/null @@ -1,3219 +0,0 @@ -package phonenumbers - -var MetaData = []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xec, 0xfd, 0x09, 0xb0, - 0x65, 0x59, 0x76, 0x16, 0x06, 0xc7, 0x7d, 0x43, 0xbe, 0xcc, 0x93, 0x43, 0x55, 0xed, - 0xaa, 0xcc, 0xaa, 0xbc, 0x39, 0xbf, 0xcc, 0xca, 0xba, 0x27, 0xfb, 0xdd, 0xaa, 0x3d, - 0x0f, 0xd5, 0xc3, 0x53, 0xcd, 0x55, 0x59, 0xdd, 0xd5, 0xb7, 0xab, 0xbb, 0x25, 0x75, - 0x9e, 0xba, 0xe2, 0x47, 0x54, 0x30, 0xfd, 0x8c, 0x32, 0x0e, 0x1c, 0xdd, 0xfb, 0x11, - 0x48, 0xb2, 0x09, 0x42, 0x16, 0x81, 0x2c, 0x1b, 0x04, 0xe9, 0xc0, 0x81, 0x1e, 0x84, - 0x64, 0xb5, 0x30, 0x83, 0x31, 0xc8, 0x21, 0xb0, 0xc0, 0x8c, 0xb6, 0x80, 0x96, 0xc1, - 0x28, 0x24, 0x8c, 0xcd, 0xd0, 0xa2, 0x91, 0x99, 0xec, 0x06, 0xa4, 0x86, 0x00, 0x44, - 0x38, 0xf6, 0x5a, 0x6b, 0xef, 0x33, 0xdc, 0x7b, 0xdf, 0x90, 0xd5, 0xd5, 0xa2, 0xa4, - 0x52, 0x84, 0xba, 0xf2, 0xdd, 0xb3, 0xcf, 0x39, 0xfb, 0xec, 0x61, 0xed, 0x35, 0x7c, - 0xeb, 0x5b, 0xd5, 0x4f, 0x8e, 0xaa, 0x1b, 0xec, 0x42, 0xa3, 0xed, 0xfc, 0xad, 0xb7, - 0x3f, 0xa7, 0xf7, 0x62, 0xc3, 0x85, 0xf1, 0x21, 0xfd, 0x61, 0xf6, 0xc6, 0x5b, 0xe9, - 0x3f, 0x3b, 0x76, 0x8f, 0x5d, 0x61, 0x67, 0x6d, 0x23, 0xa7, 0xda, 0xba, 0x74, 0x45, - 0xed, 0x8d, 0x37, 0xa1, 0x81, 0xdc, 0xb4, 0xd2, 0xfb, 0x30, 0xbe, 0xc0, 0x4e, 0x68, - 0xb8, 0xbd, 0xfc, 0xae, 0xb9, 0x90, 0x6a, 0xfb, 0x24, 0x5b, 0x7b, 0xe3, 0xb9, 0xf1, - 0xda, 0x1b, 0xcf, 0xdd, 0x29, 0xff, 0x92, 0xe5, 0x5f, 0xcf, 0x96, 0x7f, 0x3d, 0x5f, - 0xfe, 0x75, 0x77, 0xed, 0xb9, 0x17, 0x66, 0xff, 0x6a, 0x74, 0x6f, 0x8d, 0xf3, 0xcf, - 0x8f, 0xca, 0xaf, 0x7f, 0xae, 0xfd, 0xe7, 0x8f, 0x8e, 0xae, 0xb0, 0x33, 0xbd, 0x3e, - 0xa6, 0x37, 0xda, 0x3d, 0x79, 0xc2, 0x68, 0xc9, 0x85, 0xf8, 0x62, 0xdb, 0xb4, 0xfa, - 0xd6, 0xf5, 0x6a, 0x9b, 0x3d, 0xde, 0x08, 0xf8, 0x34, 0xb3, 0xe3, 0xf7, 0x62, 0xa3, - 0xdc, 0xb4, 0xfb, 0x6d, 0x76, 0x27, 0xec, 0xb1, 0x31, 0x3b, 0xd5, 0x38, 0x3f, 0x78, - 0x9a, 0x13, 0x52, 0x69, 0x33, 0x96, 0xec, 0xda, 0x64, 0xf7, 0x59, 0xf5, 0xd6, 0xdb, - 0xd1, 0x4e, 0x76, 0x9f, 0x6d, 0xf8, 0xd4, 0xcf, 0x63, 0xe0, 0x6f, 0xbd, 0xfd, 0x39, - 0xb9, 0x57, 0xd7, 0xf8, 0xc5, 0xf9, 0x39, 0xf2, 0x84, 0x82, 0x7b, 0xb6, 0xaf, 0xb1, - 0x33, 0xc2, 0xf3, 0x86, 0xcb, 0x79, 0x3b, 0x24, 0x7e, 0x4f, 0x9e, 0x14, 0x9e, 0xa7, - 0x41, 0xd1, 0x77, 0xd2, 0x0b, 0xc5, 0xb0, 0xfb, 0x01, 0x6e, 0x3e, 0x74, 0x74, 0x5e, - 0x9c, 0xfd, 0xeb, 0xb5, 0x34, 0x3a, 0xf7, 0x47, 0x4f, 0x55, 0xe7, 0x26, 0x30, 0x17, - 0x35, 0xfd, 0x87, 0x6d, 0xde, 0x12, 0xd7, 0x6f, 0xc9, 0xf1, 0xb9, 0x46, 0xc0, 0x67, - 0x46, 0x0b, 0xfd, 0xbd, 0x3f, 0x7a, 0x12, 0x5b, 0x6a, 0x6c, 0xa9, 0xdb, 0x96, 0xeb, - 0xc2, 0xf3, 0xf1, 0x16, 0x75, 0xf6, 0xfe, 0xe8, 0x76, 0x75, 0xbe, 0xff, 0xc4, 0xfc, - 0xe0, 0x93, 0xd0, 0xfc, 0xfa, 0x2d, 0x35, 0x5e, 0xb7, 0x61, 0xe5, 0xc4, 0x94, 0x7f, - 0x76, 0xe7, 0xe0, 0x3b, 0x36, 0xaa, 0x5b, 0xec, 0x89, 0x46, 0x4e, 0x1d, 0x7c, 0xb0, - 0x4b, 0xb3, 0xe0, 0x39, 0x8c, 0xe0, 0x4e, 0xd8, 0x1b, 0x9f, 0x84, 0x99, 0x11, 0x72, - 0x8f, 0x3d, 0xc5, 0x18, 0x2e, 0xb0, 0x30, 0x6f, 0xe4, 0x14, 0xa6, 0xc3, 0xe2, 0xe0, - 0xa6, 0x7b, 0xe4, 0x49, 0x99, 0x86, 0xc7, 0x3a, 0x3f, 0xde, 0x66, 0xe7, 0x4c, 0xc3, - 0xa5, 0x9e, 0x5a, 0x68, 0xe4, 0x70, 0x08, 0xc3, 0x9e, 0x3c, 0x65, 0x60, 0x78, 0x8d, - 0x75, 0xdb, 0x77, 0xd8, 0xa3, 0x1a, 0x5e, 0x62, 0x97, 0xbf, 0x4d, 0x9e, 0xa2, 0xb9, - 0x30, 0xf6, 0xce, 0x75, 0x76, 0x26, 0xf0, 0x3c, 0x5d, 0xa6, 0x7d, 0x5a, 0xe0, 0x1c, - 0x9f, 0x26, 0xaf, 0xb3, 0x33, 0x2e, 0xb5, 0x30, 0x83, 0x16, 0x8e, 0xd3, 0x43, 0x56, - 0xcc, 0xd5, 0x4b, 0xb3, 0xbf, 0xb2, 0x95, 0xe6, 0xea, 0x9b, 0x47, 0xfc, 0xb3, 0x23, - 0x7e, 0x7f, 0xe4, 0xab, 0x27, 0x26, 0xf9, 0x1b, 0xbb, 0x43, 0xac, 0x7b, 0x43, 0x7c, - 0xb6, 0x37, 0x0c, 0xdb, 0xeb, 0xfc, 0x96, 0x48, 0x93, 0xfd, 0xe8, 0xc4, 0xbc, 0xf5, - 0xf6, 0xea, 0xbb, 0x46, 0x86, 0x5a, 0x4e, 0xab, 0xc7, 0x26, 0x8d, 0x76, 0x61, 0xce, - 0x79, 0x6a, 0x06, 0x4d, 0x4d, 0xaf, 0xe9, 0x16, 0x5d, 0xde, 0x5e, 0x4b, 0xed, 0x6f, - 0x57, 0x8f, 0x4c, 0x1a, 0xeb, 0xa9, 0x39, 0x8c, 0x53, 0x59, 0x1f, 0x27, 0xf0, 0x42, - 0x6a, 0xb8, 0x6a, 0xd2, 0xaf, 0xb3, 0x33, 0x96, 0xf3, 0x46, 0x0e, 0xc7, 0xc6, 0x72, - 0x2e, 0x61, 0x6c, 0xba, 0x8b, 0xe1, 0x07, 0xd6, 0xaa, 0xf3, 0xac, 0x4a, 0x8b, 0x61, - 0x0e, 0x7b, 0x82, 0xa6, 0x37, 0xec, 0xb1, 0x8f, 0xb0, 0x49, 0xda, 0x5f, 0xd2, 0xcc, - 0x71, 0x8f, 0x35, 0x4a, 0xa7, 0x7f, 0x69, 0x5c, 0xc4, 0x66, 0x5e, 0x37, 0x12, 0x37, - 0xae, 0x6d, 0x6f, 0x92, 0xa7, 0x68, 0x49, 0x04, 0x3e, 0xe6, 0xec, 0xb2, 0x83, 0x0d, - 0x2a, 0x34, 0xb4, 0x8b, 0xb2, 0xf1, 0x61, 0x1e, 0x15, 0xaf, 0xf1, 0x9e, 0x76, 0xca, - 0xf2, 0x12, 0x79, 0x10, 0xd1, 0xf4, 0xf2, 0x6c, 0xde, 0x9d, 0xcf, 0x67, 0xaa, 0xc7, - 0x27, 0xf4, 0x31, 0xab, 0x27, 0x66, 0x13, 0x5a, 0xc0, 0xe4, 0x1c, 0x6b, 0xe3, 0xfc, - 0xad, 0xf5, 0xea, 0x71, 0x76, 0xba, 0x91, 0x24, 0xe8, 0x68, 0xf5, 0xba, 0x1d, 0xc1, - 0xf7, 0xd8, 0x07, 0xd9, 0x4d, 0x69, 0xfd, 0x64, 0xf7, 0x59, 0x3d, 0xd9, 0x7d, 0x36, - 0x0d, 0x90, 0xf2, 0xf3, 0xe8, 0x75, 0x1d, 0x4d, 0xfa, 0x43, 0xce, 0x49, 0x32, 0x95, - 0x1b, 0x64, 0x25, 0xad, 0xd7, 0x16, 0xbe, 0x7d, 0xfc, 0x49, 0xf6, 0x41, 0xba, 0xd9, - 0xea, 0x98, 0x06, 0x4d, 0x34, 0x2a, 0x49, 0x0b, 0xf9, 0xd6, 0xdb, 0x51, 0x35, 0x52, - 0xdb, 0x79, 0x4c, 0x17, 0x1a, 0x3e, 0xb5, 0x69, 0x08, 0x7d, 0xc3, 0x65, 0xda, 0x6a, - 0xf5, 0x8a, 0x87, 0xea, 0xf4, 0xd0, 0xed, 0xc0, 0x6e, 0xa6, 0x47, 0x72, 0x1e, 0x95, - 0x8a, 0x5a, 0x47, 0x63, 0xa2, 0xb5, 0xd1, 0xb9, 0xe8, 0x7d, 0x77, 0xea, 0x4e, 0xbc, - 0xf5, 0xf6, 0xe7, 0xe0, 0x56, 0x9f, 0x97, 0x87, 0xbd, 0x73, 0x93, 0x9d, 0x4d, 0xfb, - 0x6f, 0x49, 0xa3, 0x50, 0x1a, 0x75, 0x66, 0x26, 0xb0, 0x9b, 0x06, 0xdf, 0x24, 0x25, - 0xbd, 0xec, 0xc0, 0x37, 0x99, 0xbc, 0x8d, 0xfd, 0xf3, 0xb7, 0xd9, 0xb9, 0xd4, 0x65, - 0xdf, 0x70, 0x31, 0x5f, 0xfa, 0x31, 0x1e, 0x46, 0xe8, 0xee, 0xda, 0x73, 0xaf, 0xcc, - 0x46, 0xf7, 0xd6, 0xb9, 0x10, 0xdf, 0x3c, 0x12, 0x9f, 0x1d, 0x89, 0xcf, 0x8f, 0xe8, - 0x4e, 0xde, 0xd8, 0xb0, 0xfc, 0x4e, 0x6e, 0xd3, 0x9d, 0x3f, 0x3c, 0x5a, 0x97, 0xd6, - 0x1f, 0x3e, 0xb7, 0xbf, 0xfd, 0x80, 0xb9, 0xe5, 0xec, 0x09, 0x69, 0x35, 0x4e, 0xac, - 0x90, 0xf3, 0x18, 0xd2, 0xd9, 0xb4, 0x6c, 0xec, 0xb5, 0xb6, 0x78, 0x46, 0xbd, 0xc6, - 0x84, 0xb4, 0xe9, 0x06, 0xa9, 0x4c, 0xd4, 0xce, 0xc6, 0x34, 0x3e, 0xaa, 0xb1, 0x53, - 0x98, 0x3d, 0x31, 0xd5, 0xf3, 0x1a, 0xe6, 0x59, 0x86, 0xe8, 0xe4, 0xd2, 0x69, 0xd4, - 0x52, 0x99, 0xf7, 0xce, 0x34, 0x76, 0x77, 0xe4, 0x6b, 0x83, 0x89, 0x2a, 0xd7, 0x60, - 0x2a, 0xf4, 0xe1, 0x53, 0xf1, 0x93, 0x1b, 0xd5, 0x94, 0x6d, 0x37, 0x72, 0x6a, 0x1c, - 0x9e, 0x26, 0xd1, 0x82, 0x68, 0x8a, 0x1e, 0xce, 0x0a, 0xb7, 0x17, 0x43, 0x57, 0x15, - 0x0a, 0x7b, 0xec, 0x9b, 0xd8, 0x6b, 0x20, 0xaa, 0x94, 0xf1, 0xf3, 0xf4, 0x0f, 0x61, - 0xa1, 0xb7, 0xd0, 0xe9, 0x98, 0x1e, 0x34, 0xa7, 0xfe, 0xd7, 0x51, 0x43, 0xc3, 0xa9, - 0x49, 0xa7, 0x31, 0xfd, 0x08, 0x8f, 0xef, 0x2b, 0x0f, 0xa6, 0x7f, 0xbe, 0x3d, 0xc3, - 0x2e, 0x81, 0xae, 0x91, 0x76, 0x1f, 0x3e, 0xd4, 0x35, 0x72, 0x6a, 0xe7, 0x03, 0x49, - 0x66, 0x2d, 0x0d, 0xea, 0xf6, 0x98, 0x9d, 0xc4, 0x33, 0x8e, 0x74, 0x0d, 0xb7, 0x27, - 0xb7, 0xb2, 0xaa, 0x71, 0x15, 0x67, 0x45, 0xe0, 0x80, 0xca, 0x8e, 0xba, 0x01, 0x0d, - 0xe4, 0x55, 0x76, 0xd6, 0x73, 0xbf, 0xe4, 0xba, 0xe7, 0x5e, 0x48, 0xf5, 0xec, 0x75, - 0x76, 0xd6, 0xb5, 0xb3, 0xda, 0x51, 0x66, 0x1c, 0x4d, 0x6a, 0x6f, 0x36, 0x3e, 0x3a, - 0xfb, 0xa9, 0xb5, 0xae, 0x80, 0xbc, 0x53, 0x3d, 0x32, 0xd1, 0xab, 0x45, 0xe3, 0x09, - 0x9d, 0x84, 0x4c, 0xf7, 0x88, 0xb3, 0x07, 0x1e, 0x71, 0x96, 0x5a, 0x3e, 0x8b, 0x7a, - 0x8a, 0x3c, 0x40, 0x4f, 0x61, 0x38, 0x3f, 0x30, 0x1d, 0x51, 0x37, 0x69, 0x02, 0xe8, - 0xe6, 0x50, 0x3d, 0xdc, 0xbd, 0x6b, 0xc7, 0xb4, 0xc7, 0xdd, 0xc5, 0x74, 0xd3, 0x1c, - 0x27, 0x34, 0x36, 0x0e, 0x85, 0x1f, 0xfc, 0x75, 0x6c, 0xf1, 0xfd, 0x5b, 0xd7, 0x46, - 0xd5, 0x5f, 0xdc, 0x80, 0xd3, 0x8e, 0xc6, 0xd6, 0xb5, 0x93, 0xcd, 0x7e, 0x19, 0x7b, - 0x03, 0xe4, 0x6e, 0x92, 0xd5, 0xe9, 0xac, 0x4a, 0x9b, 0x13, 0x4e, 0xfd, 0x79, 0x54, - 0x8d, 0x48, 0xe7, 0x9f, 0x4e, 0x53, 0x1e, 0xe6, 0xd1, 0xc0, 0xe9, 0x11, 0x2d, 0x3c, - 0x05, 0x76, 0xb3, 0x9b, 0xd7, 0xa9, 0x91, 0x9c, 0xcb, 0xa8, 0xdd, 0x5b, 0x6f, 0xd7, - 0xdd, 0xd5, 0x09, 0x5a, 0x26, 0x9d, 0x70, 0x63, 0xc5, 0xae, 0x27, 0x21, 0xdf, 0x08, - 0xa5, 0xd3, 0x83, 0x0c, 0x6e, 0xae, 0x18, 0xe0, 0x51, 0x9d, 0xc5, 0x04, 0xb3, 0xe9, - 0x68, 0x2d, 0x5d, 0xca, 0x6b, 0xc9, 0xb4, 0x17, 0xb3, 0xaa, 0x74, 0xe7, 0x5a, 0xd2, - 0x94, 0xd2, 0x88, 0xcc, 0xfb, 0x0d, 0x02, 0x35, 0x90, 0xd7, 0xd8, 0x19, 0xcf, 0x41, - 0xe2, 0x0c, 0x9f, 0x20, 0x86, 0x7a, 0x92, 0x62, 0xd7, 0x2d, 0x87, 0xef, 0xe6, 0x0e, - 0xce, 0x7b, 0x38, 0x46, 0xd3, 0x80, 0xa7, 0xd3, 0xbe, 0xbf, 0xd6, 0x2c, 0x97, 0x8e, - 0x04, 0xf3, 0xc7, 0x66, 0x5f, 0xe9, 0xad, 0xb0, 0x5b, 0xa8, 0xda, 0xd2, 0x52, 0xb0, - 0xed, 0x5c, 0x6e, 0x88, 0xa8, 0xdd, 0xf6, 0xe6, 0x84, 0xdf, 0x12, 0xf5, 0xfd, 0x91, - 0x59, 0xd5, 0xec, 0xf1, 0x3c, 0x3e, 0x8d, 0x49, 0xe3, 0x5c, 0xc6, 0x87, 0x16, 0xcb, - 0xad, 0x9e, 0x8e, 0xdd, 0x59, 0x2a, 0x1b, 0x8d, 0x54, 0xf3, 0xf2, 0xf8, 0x69, 0x4f, - 0x71, 0x96, 0xcb, 0x16, 0xe4, 0x86, 0x8f, 0x81, 0x6f, 0x6f, 0xf0, 0xeb, 0xc7, 0x5f, - 0x47, 0x5f, 0x19, 0x55, 0x8c, 0x9d, 0x6a, 0x64, 0x20, 0xa5, 0x09, 0x25, 0x00, 0x13, - 0xec, 0x8a, 0x7c, 0xeb, 0x6d, 0x90, 0x30, 0x28, 0x81, 0x62, 0x12, 0x42, 0x96, 0x26, - 0xb7, 0xa3, 0x8a, 0x49, 0x49, 0x92, 0x62, 0x9c, 0x54, 0xdd, 0x34, 0x3d, 0x61, 0xa0, - 0x38, 0x07, 0xa9, 0x68, 0xfe, 0x1f, 0x44, 0x2b, 0xfa, 0xf8, 0xec, 0x67, 0x46, 0x68, - 0x92, 0xdc, 0x38, 0xd4, 0x80, 0x38, 0x96, 0x0a, 0xf4, 0x03, 0x37, 0xaa, 0xa7, 0xd8, - 0x25, 0x21, 0x50, 0x20, 0x37, 0x52, 0xa1, 0xc6, 0x1f, 0x50, 0x26, 0x0b, 0x8e, 0xa7, - 0x98, 0xdd, 0x11, 0x62, 0x8f, 0x7d, 0xdb, 0x06, 0xfb, 0x47, 0xeb, 0xb9, 0x69, 0x5a, - 0x57, 0xf4, 0xff, 0x0d, 0x17, 0x0a, 0xf5, 0x41, 0xa1, 0x92, 0x0d, 0x12, 0x75, 0x23, - 0xa6, 0x16, 0x36, 0x96, 0x36, 0xb8, 0xb3, 0xa4, 0x4e, 0x3b, 0xce, 0xc1, 0xba, 0x4d, - 0x5b, 0x4c, 0xa5, 0xeb, 0xa1, 0x11, 0xd2, 0xc2, 0x5e, 0x83, 0x9d, 0x9a, 0x0c, 0xdf, - 0x28, 0x1b, 0x0e, 0xd7, 0x54, 0x6a, 0x93, 0x16, 0xad, 0x06, 0x09, 0x8d, 0x4f, 0x83, - 0x1f, 0x38, 0xd8, 0xc7, 0x28, 0xf8, 0x5d, 0x03, 0x8d, 0x42, 0xfa, 0xdb, 0x52, 0x4f, - 0xc0, 0xca, 0x8e, 0xb2, 0x49, 0xd6, 0x4b, 0xba, 0x4b, 0x98, 0xa9, 0x9f, 0xd7, 0xd1, - 0xf3, 0xb7, 0xde, 0x8e, 0x01, 0xdb, 0x48, 0xed, 0x40, 0x2b, 0x00, 0x49, 0x80, 0x8f, - 0x56, 0xa0, 0x06, 0x83, 0x7c, 0xa8, 0xb1, 0x43, 0x0a, 0x76, 0x4e, 0xfa, 0x1c, 0x0b, - 0x9b, 0x46, 0x9a, 0xa4, 0x24, 0xe0, 0x79, 0x03, 0xa6, 0x6c, 0xe4, 0xf0, 0x28, 0x10, - 0x64, 0x62, 0xaa, 0x92, 0x76, 0x9e, 0x64, 0x8a, 0x46, 0x61, 0xc2, 0xe1, 0x58, 0x49, - 0x9f, 0xa8, 0x2c, 0xdc, 0x68, 0xe0, 0x20, 0x53, 0x9e, 0x46, 0x4a, 0x6a, 0x83, 0x03, - 0x15, 0xe8, 0xc5, 0x38, 0x3c, 0x76, 0x5e, 0xa7, 0x3f, 0xd3, 0xee, 0x8e, 0xa8, 0x6d, - 0x6b, 0xd0, 0x87, 0xa2, 0x68, 0x84, 0xb1, 0x1e, 0x06, 0x48, 0x80, 0x2e, 0xa9, 0x1a, - 0x91, 0x1e, 0x61, 0x1a, 0x41, 0x63, 0x0b, 0xe7, 0x2b, 0xec, 0x6e, 0xe8, 0x54, 0x1d, - 0x3d, 0x8d, 0x88, 0x71, 0xf9, 0xa5, 0xb0, 0x01, 0x35, 0x0d, 0xbf, 0x85, 0x5e, 0xbb, - 0xdc, 0x4d, 0x9d, 0x3e, 0xdc, 0x3a, 0x8e, 0xf2, 0xce, 0x96, 0x89, 0x4f, 0x9a, 0x81, - 0x10, 0xd9, 0x0c, 0x18, 0xff, 0xa1, 0x11, 0xfb, 0xee, 0x91, 0x75, 0x06, 0x0f, 0xf2, - 0x34, 0xa0, 0x42, 0xe4, 0xb3, 0xcb, 0xb5, 0xcb, 0x02, 0xd6, 0x44, 0x54, 0x30, 0x5b, - 0x51, 0x87, 0x34, 0x20, 0x30, 0x35, 0xd1, 0xf3, 0xf4, 0x36, 0xed, 0xa0, 0x87, 0x30, - 0xce, 0x36, 0xf5, 0x08, 0x8e, 0x92, 0xf4, 0x31, 0x49, 0xcd, 0x86, 0x01, 0x48, 0xea, - 0xb1, 0xa5, 0xf3, 0x01, 0x3e, 0xa1, 0xee, 0x28, 0x2d, 0x11, 0xa4, 0x57, 0xfe, 0xdb, - 0xec, 0xd5, 0xed, 0x32, 0x95, 0xa7, 0x43, 0xdb, 0xdd, 0xed, 0xab, 0x59, 0xd8, 0xba, - 0xbe, 0x4a, 0x45, 0x2d, 0xee, 0xdc, 0x62, 0xe7, 0x2c, 0x6f, 0xb8, 0x36, 0x2e, 0x6f, - 0xd8, 0xd2, 0xca, 0x96, 0x56, 0x87, 0x6e, 0xcf, 0x37, 0x67, 0x36, 0x4b, 0xcc, 0x1f, - 0xda, 0xe0, 0xbb, 0x93, 0xdd, 0x67, 0x27, 0x42, 0xc4, 0xbc, 0x3f, 0xb8, 0xdc, 0x8d, - 0x4d, 0x1a, 0x8e, 0x77, 0xb4, 0x41, 0xd2, 0x53, 0x8e, 0xbc, 0x49, 0xe0, 0xae, 0xbc, - 0x43, 0xd2, 0xe0, 0xc5, 0xd0, 0xee, 0x10, 0x3b, 0x2f, 0xdb, 0x43, 0x37, 0x76, 0xea, - 0xe7, 0xbb, 0xdd, 0x6d, 0x02, 0x73, 0x9a, 0x4e, 0x18, 0x95, 0xd6, 0x75, 0x31, 0x5a, - 0x04, 0x36, 0xe7, 0x32, 0xad, 0xc2, 0x5d, 0x78, 0x51, 0xbb, 0x65, 0xa2, 0x93, 0xbb, - 0x69, 0x8b, 0xa8, 0xf9, 0xee, 0xe2, 0xee, 0xe9, 0xef, 0x1d, 0x9e, 0xd7, 0x67, 0x04, - 0xd5, 0x5b, 0x35, 0x06, 0x3a, 0x90, 0x37, 0x8e, 0x69, 0xc0, 0xe9, 0xb0, 0x5b, 0x76, - 0x90, 0x4b, 0x63, 0x30, 0x87, 0x87, 0xbb, 0x30, 0xdf, 0x85, 0xb3, 0x43, 0xd9, 0x69, - 0xde, 0x51, 0xa2, 0xec, 0x25, 0x95, 0x5a, 0xc0, 0x93, 0xc4, 0x54, 0xdb, 0x85, 0x6d, - 0x95, 0x9e, 0x30, 0x35, 0xf3, 0xdd, 0x3a, 0xaf, 0x2e, 0x18, 0x8c, 0xb4, 0xc0, 0xda, - 0x9d, 0x25, 0x4c, 0xd9, 0x56, 0x1a, 0x26, 0x6c, 0x71, 0x73, 0xa5, 0xce, 0x94, 0x9d, - 0x35, 0x2f, 0x7b, 0x4a, 0xe1, 0x27, 0xee, 0x96, 0xcd, 0x95, 0xbe, 0x03, 0x3f, 0xa3, - 0x6c, 0x32, 0xd7, 0x28, 0x1c, 0x6c, 0x4f, 0xdf, 0x9c, 0x77, 0x5d, 0xbd, 0x2b, 0x4c, - 0xbd, 0xfb, 0x6d, 0xa3, 0xf5, 0x90, 0xce, 0x43, 0x5e, 0x5d, 0x04, 0x67, 0xc1, 0x82, - 0xf6, 0x45, 0x9a, 0xda, 0xf4, 0x96, 0x9c, 0xa6, 0xc3, 0x2e, 0xb5, 0xa1, 0x23, 0x74, - 0xbb, 0x77, 0xf4, 0x92, 0xf3, 0x69, 0x7a, 0x4b, 0x82, 0x61, 0x1c, 0xe6, 0xe8, 0x84, - 0xd8, 0xee, 0x9d, 0xb3, 0x07, 0x37, 0xd2, 0x07, 0x36, 0x7a, 0xba, 0x3a, 0x3f, 0x09, - 0xf5, 0x44, 0x88, 0x7a, 0xd0, 0xf6, 0xf4, 0x2d, 0x79, 0x5d, 0x98, 0xe9, 0x2d, 0x35, - 0xbd, 0xa5, 0xc7, 0xeb, 0x41, 0x08, 0xea, 0xdf, 0x0f, 0x6e, 0x54, 0x4f, 0xa4, 0x3b, - 0x16, 0xce, 0xad, 0x85, 0x9b, 0xce, 0x87, 0xa2, 0xa7, 0x81, 0x6f, 0x01, 0xe4, 0x7b, - 0x3d, 0xfe, 0x4c, 0x38, 0x5c, 0xae, 0x2c, 0x15, 0x2b, 0xd3, 0x9e, 0x58, 0x59, 0x22, - 0x52, 0xc6, 0x7f, 0x7a, 0x14, 0x3a, 0x47, 0x19, 0xcf, 0xd2, 0x35, 0x4d, 0x3f, 0xed, - 0xbb, 0xf2, 0x13, 0x6e, 0xaa, 0xd0, 0xdd, 0x47, 0x49, 0xbb, 0x36, 0x20, 0x6b, 0xf1, - 0x6c, 0x49, 0xfb, 0x45, 0x83, 0x65, 0x8f, 0xf7, 0xf8, 0x46, 0xe8, 0x72, 0xa0, 0x58, - 0x3c, 0x3c, 0x70, 0xd9, 0xc3, 0xf6, 0x6b, 0x8c, 0x9f, 0xeb, 0xbc, 0x90, 0x15, 0xee, - 0x0c, 0xf2, 0x08, 0x68, 0x38, 0x09, 0x4a, 0x8f, 0xf3, 0x82, 0x53, 0x3a, 0x36, 0xa9, - 0xe7, 0x8d, 0x36, 0x69, 0xe5, 0x8c, 0xff, 0xca, 0xcf, 0x4f, 0xf7, 0x93, 0xd6, 0x1b, - 0x4d, 0xc3, 0x85, 0xa6, 0x73, 0x24, 0x3d, 0xe4, 0x1d, 0x7f, 0x0d, 0x2d, 0x17, 0x55, - 0x56, 0x8b, 0xee, 0x69, 0x7b, 0x0b, 0xab, 0x65, 0x33, 0x80, 0x8a, 0x88, 0x77, 0xd5, - 0x15, 0x5b, 0xb2, 0x24, 0x51, 0x2b, 0x4a, 0x1b, 0x66, 0x8d, 0x96, 0x23, 0x1f, 0xdd, - 0x1f, 0x7d, 0xeb, 0xc6, 0x32, 0x2d, 0xaa, 0xdf, 0xfe, 0x53, 0xef, 0xc6, 0x7a, 0x1b, - 0xff, 0xd0, 0xe8, 0x3d, 0xba, 0xd4, 0xc6, 0x7f, 0xe9, 0x6b, 0xdf, 0xf3, 0x77, 0x65, - 0x95, 0x95, 0x45, 0xf0, 0x34, 0xae, 0x81, 0xc5, 0x35, 0xd6, 0xae, 0x81, 0x8d, 0xb2, - 0xbe, 0xd2, 0x0d, 0x57, 0xaa, 0xad, 0xac, 0x6c, 0xaf, 0xdd, 0x12, 0xe3, 0x0a, 0x8d, - 0xcb, 0x98, 0xe4, 0xdc, 0xda, 0x2d, 0xb1, 0x7f, 0x7c, 0xc9, 0xbd, 0x3f, 0xaa, 0x57, - 0x8b, 0x52, 0xd2, 0xe6, 0xb3, 0x28, 0xdd, 0x1f, 0x7d, 0xdf, 0xc1, 0x52, 0xb4, 0xd3, - 0xfe, 0x7d, 0x29, 0xfa, 0x8b, 0x59, 0x8a, 0xee, 0x8f, 0x9e, 0x3e, 0x50, 0x80, 0x76, - 0x16, 0x0a, 0x0a, 0xd0, 0xfd, 0x63, 0xc8, 0xce, 0xfd, 0xf7, 0x65, 0xe7, 0xfb, 0xb2, - 0x73, 0xff, 0xb8, 0xb2, 0x73, 0x95, 0x4b, 0x22, 0x59, 0x67, 0x62, 0xc1, 0x3a, 0xcb, - 0xee, 0x35, 0x37, 0x70, 0xd2, 0x7c, 0x27, 0xba, 0xf4, 0x8d, 0x5d, 0xe2, 0xd2, 0xff, - 0x10, 0xbb, 0x65, 0xbd, 0x4e, 0x03, 0x57, 0x7c, 0xdd, 0x5d, 0x77, 0x5c, 0x58, 0xe2, - 0xde, 0x4f, 0xed, 0xd1, 0x6d, 0x33, 0x7e, 0x8e, 0xd5, 0xd6, 0x6b, 0x9a, 0xa2, 0x64, - 0x95, 0x25, 0x7b, 0xc0, 0x49, 0xf4, 0xe9, 0x2b, 0x30, 0x05, 0x1c, 0x5f, 0xe2, 0xd6, - 0xb7, 0x5e, 0x3b, 0xa5, 0xde, 0x9b, 0x6e, 0xfd, 0x4f, 0x1e, 0xe0, 0xd6, 0xb7, 0xfe, - 0x08, 0x6e, 0xfd, 0x7f, 0x75, 0xb2, 0xba, 0xc8, 0xce, 0x66, 0xdf, 0xab, 0xda, 0x11, - 0x12, 0xc7, 0x46, 0xed, 0x08, 0xb5, 0xc7, 0xfe, 0x97, 0x35, 0xf6, 0x47, 0xd6, 0x44, - 0xbe, 0x90, 0xfd, 0x02, 0xc5, 0x80, 0x45, 0xc3, 0xd5, 0x34, 0x52, 0x91, 0x01, 0x9c, - 0x6c, 0x36, 0xb2, 0x80, 0x3d, 0x1a, 0x5a, 0x60, 0x0f, 0x26, 0x41, 0x61, 0x7c, 0xf1, - 0x11, 0xc1, 0xc5, 0x64, 0xe9, 0x81, 0xc5, 0xa6, 0xd1, 0xa3, 0x98, 0x44, 0x86, 0xf3, - 0xb4, 0xcc, 0xe1, 0x66, 0x05, 0xd1, 0x34, 0xd8, 0x0d, 0x92, 0xee, 0x31, 0xd1, 0xaa, - 0xf4, 0x74, 0x65, 0xa1, 0x05, 0x18, 0xde, 0xb4, 0x13, 0x64, 0xcc, 0x8d, 0x1a, 0xe8, - 0x8d, 0x4e, 0xc2, 0x09, 0x1e, 0x0b, 0x46, 0x5d, 0xb4, 0x8d, 0x4a, 0x6d, 0xd3, 0xe2, - 0x12, 0x0a, 0xda, 0x6a, 0x6c, 0x35, 0x55, 0x06, 0xbf, 0x02, 0xd6, 0x8b, 0xa5, 0xf5, - 0x52, 0x1e, 0x26, 0xc9, 0x8e, 0xd4, 0x0e, 0x1a, 0x59, 0xec, 0x62, 0xf9, 0x4c, 0x30, - 0xf0, 0x61, 0x5b, 0xe1, 0x28, 0xf1, 0xce, 0xf0, 0xc9, 0x4a, 0xb4, 0x81, 0xd7, 0x8f, - 0xb0, 0xa7, 0x2c, 0xac, 0x4b, 0x9e, 0x4c, 0x49, 0x04, 0x1d, 0x90, 0xc4, 0x40, 0xa8, - 0x05, 0x2c, 0xcc, 0xf2, 0x00, 0x07, 0x0f, 0x38, 0x65, 0x31, 0x6c, 0x68, 0xec, 0xf6, - 0x36, 0x3b, 0x8d, 0x3e, 0x10, 0x5b, 0xda, 0x04, 0x6c, 0xd3, 0x46, 0xe8, 0x39, 0xbb, - 0x18, 0x48, 0x16, 0x81, 0xc8, 0xa6, 0x1d, 0xb3, 0x70, 0x47, 0xf6, 0x43, 0x5b, 0xe9, - 0xd9, 0x8d, 0xb4, 0xe0, 0xd3, 0xf6, 0x8d, 0xe4, 0x05, 0x04, 0xef, 0xf2, 0x5b, 0x6f, - 0xef, 0xc2, 0x17, 0x99, 0x8c, 0x06, 0xf0, 0xf4, 0xae, 0xbc, 0xad, 0x3b, 0x3e, 0x94, - 0x6d, 0x76, 0xda, 0xf9, 0xa5, 0x3d, 0x73, 0x9e, 0x5a, 0xdf, 0x5d, 0x7b, 0xee, 0x53, - 0xb3, 0x0f, 0x74, 0xfd, 0xd1, 0x17, 0xab, 0x6a, 0x22, 0x84, 0xed, 0x68, 0x62, 0xeb, - 0x42, 0x58, 0x34, 0x4d, 0xaf, 0x56, 0x67, 0x27, 0x82, 0xa2, 0x0e, 0x42, 0xb6, 0xbe, - 0xe4, 0x91, 0xe8, 0x78, 0x9b, 0x4b, 0x90, 0xbf, 0x1b, 0x98, 0x38, 0x61, 0x1a, 0xee, - 0x8a, 0x53, 0x3a, 0xc9, 0xb7, 0x01, 0x16, 0x40, 0xed, 0x0c, 0x22, 0x2b, 0x2b, 0x6f, - 0xc8, 0x47, 0xe8, 0x8e, 0x3b, 0xe0, 0x86, 0x4f, 0x57, 0x8f, 0xf4, 0x1e, 0x2e, 0x78, - 0xdb, 0x97, 0xb4, 0x6e, 0x95, 0x88, 0xba, 0xb6, 0xd1, 0x88, 0xd8, 0x9f, 0x7b, 0x88, - 0x39, 0xe2, 0x42, 0x6b, 0xa4, 0x9f, 0xf3, 0xa8, 0x64, 0x1d, 0x1b, 0x5f, 0x9e, 0xfb, - 0x1f, 0x63, 0xec, 0x45, 0xe7, 0xe7, 0x76, 0xa0, 0x06, 0x9f, 0x96, 0x65, 0x17, 0x19, - 0x0a, 0x08, 0xc0, 0x2e, 0x69, 0xa4, 0xc2, 0x15, 0x0a, 0x2e, 0x24, 0x9b, 0x8f, 0x10, - 0x72, 0x4e, 0xe2, 0xea, 0xce, 0x6f, 0xd4, 0xf3, 0xb2, 0x9f, 0xd2, 0xe6, 0x0b, 0xf3, - 0xfa, 0xc0, 0xb8, 0xcd, 0xcb, 0x4c, 0xa5, 0x2d, 0x46, 0x1e, 0xa5, 0x30, 0x8f, 0xc2, - 0xd5, 0x80, 0x80, 0x10, 0x7c, 0x0f, 0xc2, 0x3f, 0xf8, 0xed, 0x62, 0xaf, 0x8e, 0x4e, - 0xf6, 0x17, 0x82, 0x81, 0x85, 0xb0, 0x09, 0x80, 0x93, 0xc1, 0x41, 0xf0, 0x23, 0x27, - 0xab, 0x1b, 0xec, 0xbc, 0x80, 0x31, 0x0e, 0x7b, 0x10, 0x10, 0x44, 0x70, 0x91, 0x2f, - 0xb7, 0xf2, 0x3d, 0xf6, 0x43, 0x23, 0xf6, 0xfb, 0x47, 0xe0, 0x14, 0xa2, 0x68, 0x63, - 0x1a, 0x47, 0x91, 0xba, 0x82, 0x0b, 0x9d, 0x8e, 0x61, 0xa9, 0x1d, 0xba, 0x82, 0x25, - 0x7e, 0x2d, 0x60, 0x23, 0x4a, 0x30, 0x88, 0x83, 0x47, 0x56, 0xc0, 0xb0, 0x59, 0x08, - 0x3e, 0x2a, 0xf4, 0xf3, 0xf2, 0x29, 0x9c, 0xbb, 0xe0, 0x3f, 0x43, 0x54, 0x17, 0x3a, - 0x97, 0x49, 0x00, 0xab, 0x3d, 0xb8, 0x29, 0x9d, 0xde, 0x2e, 0x07, 0xfe, 0x70, 0xdf, - 0x1a, 0xdc, 0xb2, 0xb8, 0xeb, 0x31, 0xaa, 0xe4, 0x11, 0x69, 0x91, 0xb7, 0xfc, 0xf8, - 0xd7, 0xb2, 0xcf, 0x88, 0xb4, 0x06, 0xcc, 0x5b, 0x6f, 0x47, 0x27, 0x30, 0xd4, 0x80, - 0x47, 0x3b, 0x9f, 0xe6, 0xd7, 0x83, 0xfa, 0x04, 0xdd, 0x95, 0x06, 0x9d, 0x5d, 0x16, - 0x9d, 0x4c, 0xe8, 0x36, 0x03, 0x01, 0x9a, 0x9d, 0xbb, 0x5c, 0xb8, 0x7e, 0x3c, 0x2a, - 0xbd, 0x4e, 0xe7, 0xd7, 0x6d, 0xef, 0xb0, 0xc7, 0x84, 0x87, 0x41, 0xc1, 0x8e, 0x4b, - 0xea, 0x5a, 0xe7, 0xa0, 0x13, 0xad, 0xa4, 0x90, 0x6c, 0x2c, 0xb2, 0xa8, 0x90, 0xe0, - 0x6b, 0x6f, 0x00, 0x6c, 0x83, 0x01, 0x11, 0xda, 0xf0, 0x70, 0x4f, 0x2b, 0x2b, 0x0c, - 0xbb, 0x22, 0x40, 0xd5, 0xa1, 0x37, 0x68, 0x83, 0xc0, 0x13, 0x14, 0x5d, 0xaa, 0xef, - 0x6b, 0x56, 0xf9, 0xb6, 0x67, 0x2f, 0xb3, 0x93, 0x86, 0x20, 0x46, 0x1d, 0x00, 0x12, - 0x5d, 0x7d, 0x3e, 0x5d, 0x35, 0xc3, 0xab, 0xa6, 0x15, 0x1b, 0x9f, 0x9e, 0x7d, 0xf8, - 0x1e, 0x60, 0x2f, 0x34, 0x2e, 0x7a, 0x0d, 0xda, 0x8c, 0x6e, 0x84, 0x4b, 0x1a, 0x9d, - 0x9d, 0x27, 0x65, 0x47, 0x43, 0x40, 0xaa, 0xe6, 0x5c, 0x88, 0x3a, 0x72, 0x9e, 0x5a, - 0x81, 0x42, 0x84, 0xb2, 0xe6, 0x3b, 0x46, 0x1b, 0xe9, 0xca, 0xfd, 0x91, 0xa8, 0x2e, - 0x4c, 0x70, 0x97, 0x2c, 0xd7, 0x91, 0x61, 0x7b, 0x63, 0x83, 0x12, 0xb0, 0x7a, 0xe6, - 0x70, 0xa4, 0xd7, 0x96, 0xd0, 0x31, 0x9d, 0x00, 0xb4, 0x75, 0xaf, 0x25, 0xe1, 0x65, - 0x3b, 0xc2, 0x86, 0xf6, 0xed, 0x9a, 0xb0, 0xc5, 0xc7, 0xf1, 0x58, 0x69, 0x41, 0xaa, - 0xd7, 0x40, 0x2a, 0xb5, 0x6d, 0x77, 0xab, 0x4b, 0x13, 0xd1, 0x28, 0x1f, 0x16, 0xed, - 0xd1, 0x61, 0x2f, 0xa0, 0x15, 0x1f, 0x9f, 0x85, 0x15, 0xab, 0x92, 0x50, 0x09, 0x35, - 0x84, 0x9a, 0xce, 0x4e, 0x84, 0xe7, 0xf5, 0x44, 0xf6, 0xc1, 0x6f, 0x00, 0x69, 0xdb, - 0x10, 0x9e, 0x4b, 0x12, 0xb8, 0xa1, 0x95, 0x94, 0x45, 0x9c, 0x8a, 0x90, 0xd4, 0xa6, - 0xfb, 0xa3, 0xed, 0xea, 0x61, 0x68, 0x30, 0xf0, 0x4e, 0xa6, 0x36, 0x5b, 0x22, 0xc0, - 0xd2, 0xb9, 0x3f, 0x7a, 0x2a, 0xd9, 0x1f, 0xaa, 0xab, 0x4b, 0xca, 0x41, 0x17, 0x15, - 0x6c, 0xc8, 0xcf, 0x8f, 0xae, 0xb0, 0x53, 0x28, 0xfa, 0x77, 0x5c, 0x8b, 0x17, 0x90, - 0x5b, 0x02, 0x71, 0x1a, 0x7f, 0x74, 0x34, 0x3a, 0x52, 0xb8, 0xef, 0xa7, 0xd7, 0xaa, - 0xc7, 0x00, 0x1c, 0x52, 0xb4, 0x25, 0x0c, 0xea, 0xb3, 0xdb, 0xec, 0xb1, 0x24, 0xaf, - 0x24, 0x44, 0x7c, 0x72, 0x10, 0xb7, 0x13, 0xf3, 0x37, 0xb8, 0x49, 0xc7, 0xbf, 0x9c, - 0x7d, 0x0a, 0xd0, 0x1e, 0x3c, 0x9d, 0xeb, 0x88, 0x39, 0x80, 0xed, 0xa9, 0xe6, 0xa0, - 0x95, 0x69, 0xf4, 0x0c, 0xe0, 0x25, 0x12, 0x9d, 0x0a, 0x63, 0x3a, 0x0d, 0x4f, 0xba, - 0x44, 0x00, 0xec, 0x89, 0x36, 0xa0, 0x02, 0x4c, 0x5b, 0xe4, 0x4f, 0x79, 0x0f, 0x02, - 0x89, 0x0e, 0xc4, 0x1d, 0x8c, 0xd9, 0xc9, 0x30, 0xbc, 0x46, 0x5b, 0x6e, 0x69, 0xc0, - 0x62, 0x9b, 0x3d, 0x2c, 0x3d, 0xca, 0x12, 0xc3, 0xc5, 0xe0, 0x7d, 0x18, 0x3d, 0xbe, - 0xbb, 0xf6, 0xdc, 0x37, 0xcc, 0x7e, 0x80, 0xc0, 0x8f, 0x8f, 0x2f, 0x73, 0x18, 0x5f, - 0xbf, 0x25, 0x8f, 0x15, 0x5f, 0xfc, 0x63, 0x9b, 0xd5, 0xab, 0xec, 0x43, 0x8d, 0x00, - 0xec, 0x9a, 0x4d, 0xd2, 0x5a, 0x66, 0xb1, 0xad, 0x68, 0xf6, 0xa2, 0xce, 0x72, 0x06, - 0x2c, 0x20, 0x42, 0x9e, 0x01, 0x38, 0xc4, 0xed, 0xb4, 0x12, 0x5d, 0xec, 0xb1, 0x5b, - 0xec, 0x9c, 0xf0, 0x70, 0xfe, 0xc0, 0x33, 0x7a, 0x38, 0x35, 0xe1, 0x49, 0x9e, 0x8d, - 0x03, 0xdb, 0xd6, 0x19, 0x48, 0x0a, 0x2f, 0xf5, 0x18, 0xcc, 0x0c, 0x7b, 0x75, 0x44, - 0x79, 0x91, 0x9f, 0xea, 0x21, 0x5e, 0xd4, 0x91, 0x84, 0xd7, 0x59, 0x45, 0xa1, 0xf9, - 0xfc, 0x70, 0x14, 0xcd, 0xad, 0xf4, 0xbb, 0xc9, 0xce, 0xa6, 0x4e, 0x2e, 0x6b, 0x54, - 0xe2, 0x45, 0x87, 0x86, 0x8b, 0xbe, 0x71, 0xf6, 0x0f, 0xd7, 0xee, 0xdd, 0xe1, 0x3c, - 0x06, 0x3a, 0x33, 0x34, 0xe0, 0x10, 0x20, 0x96, 0x96, 0x34, 0x7a, 0xd3, 0x98, 0x40, - 0x81, 0x72, 0x1e, 0xe6, 0x75, 0x9d, 0xa5, 0xd1, 0x01, 0x88, 0xdd, 0x1f, 0x59, 0x63, - 0xdf, 0xbf, 0x26, 0xb2, 0x10, 0x4f, 0x63, 0x13, 0x73, 0x1c, 0x24, 0x83, 0x6c, 0x4c, - 0xd6, 0x49, 0x40, 0x5d, 0x1b, 0x34, 0x55, 0x9a, 0x0e, 0x32, 0x68, 0x8a, 0xfa, 0x1c, - 0x1c, 0x75, 0x9f, 0xd3, 0x3b, 0x26, 0x35, 0xd0, 0x04, 0x4f, 0xd9, 0xb1, 0x7b, 0xa8, - 0x36, 0xa3, 0x24, 0xa7, 0x3b, 0x6a, 0x3a, 0xfd, 0x10, 0x75, 0x88, 0xcf, 0x44, 0xc9, - 0x23, 0xd2, 0x0d, 0x35, 0x22, 0x7c, 0x76, 0xfc, 0x1e, 0x99, 0xbc, 0xf9, 0xb0, 0x49, - 0x2f, 0x03, 0x75, 0xa4, 0xd3, 0x4f, 0xbb, 0xf0, 0xf0, 0x3a, 0x6a, 0x8d, 0xbf, 0x04, - 0x55, 0x5e, 0x08, 0xd0, 0x86, 0xa4, 0xa8, 0xd0, 0x4c, 0x00, 0xea, 0x27, 0x5d, 0x00, - 0x99, 0x8f, 0xd1, 0x48, 0x85, 0x27, 0xbf, 0xc1, 0xc3, 0x9e, 0x1a, 0xd6, 0xad, 0x8e, - 0x00, 0x50, 0x8e, 0x05, 0x08, 0xe5, 0x7f, 0xdb, 0x03, 0x95, 0x74, 0x21, 0x94, 0xbf, - 0x8e, 0x7d, 0x23, 0x9c, 0x25, 0xd2, 0xd3, 0x19, 0x8f, 0xe1, 0xbd, 0x28, 0x20, 0xa4, - 0x24, 0x31, 0xde, 0xa4, 0x14, 0x08, 0x75, 0x19, 0x6d, 0x52, 0x16, 0x6a, 0x3c, 0xfa, - 0x95, 0x35, 0x38, 0x40, 0x34, 0x25, 0x11, 0x35, 0xba, 0x24, 0x61, 0x3a, 0x30, 0x25, - 0x5a, 0xca, 0x19, 0x2a, 0x30, 0x7e, 0x8e, 0x4d, 0xc1, 0xae, 0x37, 0x46, 0x47, 0x00, - 0x9a, 0x70, 0x0d, 0x67, 0xbe, 0x30, 0xf3, 0x68, 0x39, 0x09, 0x13, 0xdc, 0xa3, 0xed, - 0x7e, 0x86, 0xc3, 0xbd, 0x60, 0x30, 0x2f, 0xb1, 0x2d, 0xef, 0xfb, 0x50, 0x04, 0x9f, - 0xb7, 0xca, 0x9d, 0x6b, 0xec, 0x74, 0x32, 0x31, 0xe9, 0x58, 0xee, 0xc1, 0x72, 0x11, - 0xbb, 0x74, 0xd8, 0x4a, 0xbe, 0x37, 0xfb, 0x62, 0x0f, 0x7e, 0xfb, 0xf1, 0xea, 0xf2, - 0x22, 0x6c, 0xa8, 0x23, 0xd2, 0x8b, 0xf7, 0xe9, 0xfa, 0x2d, 0x3d, 0xbe, 0x04, 0x03, - 0x49, 0x8b, 0x6d, 0xaa, 0xec, 0x1c, 0xc7, 0xad, 0x4e, 0x83, 0x55, 0x8e, 0x51, 0x77, - 0x9c, 0x27, 0x6e, 0x82, 0x30, 0x2d, 0x61, 0x84, 0xcb, 0x4b, 0x6f, 0x59, 0x7a, 0xe7, - 0x28, 0x3c, 0x10, 0xfe, 0xe8, 0x67, 0xd7, 0xab, 0xc7, 0xd9, 0x99, 0x86, 0x56, 0x17, - 0x88, 0xab, 0x82, 0x79, 0x7f, 0x8a, 0x31, 0x90, 0xfb, 0x08, 0x0c, 0x08, 0x75, 0x8b, - 0xac, 0xb5, 0x80, 0x22, 0x52, 0x19, 0x45, 0xf4, 0x22, 0x7b, 0xc6, 0xd2, 0xa6, 0x50, - 0xa9, 0x29, 0xaf, 0x11, 0x50, 0x00, 0xca, 0x95, 0x46, 0x00, 0x57, 0x74, 0x22, 0x59, - 0xb9, 0xf3, 0x0e, 0x16, 0x09, 0xa4, 0xce, 0x49, 0x4b, 0xc1, 0xee, 0xed, 0x2b, 0xac, - 0xf2, 0x0d, 0xf7, 0xf3, 0x3e, 0xea, 0x28, 0x9b, 0x51, 0x00, 0x2c, 0x02, 0x49, 0x33, - 0x68, 0x10, 0xb2, 0xd0, 0x82, 0xfb, 0x71, 0x3b, 0x75, 0xef, 0x97, 0x0b, 0x46, 0x5b, - 0x67, 0xfe, 0x9f, 0x7f, 0x6e, 0xf6, 0xed, 0xeb, 0xdd, 0xf9, 0x9f, 0x1e, 0x0c, 0x1b, - 0x9b, 0x02, 0x58, 0x57, 0x4d, 0x8b, 0xca, 0x63, 0x0f, 0x87, 0x99, 0x9d, 0xb3, 0x34, - 0x18, 0xb1, 0x0b, 0x31, 0xf3, 0xbd, 0x65, 0x21, 0x17, 0x50, 0x41, 0xbd, 0xc9, 0x3d, - 0x61, 0x93, 0xbe, 0x7c, 0x30, 0xc2, 0xec, 0x2a, 0x3b, 0xed, 0x38, 0x6a, 0xf7, 0x5d, - 0x58, 0x95, 0xe3, 0x08, 0x1a, 0x1c, 0xcc, 0xfb, 0xff, 0xb5, 0xb1, 0x1a, 0x5d, 0xfa, - 0x9d, 0x23, 0xf6, 0x9b, 0x24, 0xba, 0xa2, 0x30, 0x08, 0x0e, 0xf6, 0x3e, 0xd8, 0x0b, - 0x11, 0x55, 0x51, 0x8e, 0xc1, 0x77, 0x59, 0xcc, 0x0e, 0x94, 0xa8, 0x92, 0x47, 0xd2, - 0x12, 0x8c, 0x06, 0x0f, 0x81, 0x22, 0xaf, 0x03, 0x34, 0xf4, 0xe4, 0x8d, 0x72, 0xd1, - 0x38, 0x14, 0xb7, 0x02, 0xf0, 0xd7, 0x56, 0x2d, 0xc3, 0x9b, 0xea, 0x6c, 0xfd, 0x8f, - 0x7f, 0x09, 0x7b, 0xa5, 0xed, 0x4d, 0x93, 0x57, 0x55, 0x36, 0x4c, 0xc0, 0xc4, 0x49, - 0xea, 0x7b, 0xd4, 0xc9, 0xda, 0xb0, 0x81, 0x40, 0x5a, 0x84, 0xaa, 0x04, 0x8b, 0x7e, - 0xc5, 0x0b, 0x24, 0xea, 0xda, 0xef, 0xc4, 0xf3, 0xb5, 0xc3, 0x1e, 0x0b, 0x84, 0xce, - 0x88, 0xe9, 0x10, 0x74, 0x76, 0xe1, 0x45, 0x5f, 0x6d, 0x17, 0xd8, 0x36, 0x4b, 0x7d, - 0x57, 0xa2, 0x35, 0x57, 0xda, 0x2f, 0x52, 0x82, 0xc0, 0xc9, 0xcf, 0x3f, 0x7f, 0x10, - 0xe6, 0x55, 0xdb, 0xde, 0xca, 0x79, 0x85, 0x3d, 0x43, 0x03, 0x1c, 0x64, 0x54, 0xd6, - 0xd1, 0x24, 0x3b, 0x04, 0xe9, 0x70, 0x01, 0x0e, 0x5b, 0xeb, 0xea, 0xe8, 0x94, 0x5d, - 0x3e, 0x53, 0x28, 0x09, 0xba, 0x47, 0xd0, 0x8f, 0x3d, 0x5c, 0x3d, 0x0d, 0x90, 0x59, - 0x47, 0xc7, 0x56, 0xd8, 0x8b, 0x02, 0x71, 0x59, 0xbe, 0x3d, 0x65, 0x7d, 0xc7, 0x70, - 0x62, 0x3f, 0x7d, 0x9a, 0xfd, 0xf5, 0xd3, 0x30, 0xc7, 0xda, 0xd0, 0xe9, 0xe4, 0x32, - 0x02, 0x92, 0x40, 0x23, 0x53, 0x89, 0xe1, 0x20, 0x3e, 0x95, 0x00, 0x42, 0x49, 0x7d, - 0x33, 0x88, 0xf4, 0xb0, 0xe8, 0xac, 0x77, 0xc9, 0x56, 0xf4, 0xf3, 0x18, 0x04, 0x82, - 0x1c, 0x78, 0x23, 0xa4, 0x01, 0x67, 0x75, 0x98, 0xa3, 0xcb, 0x4a, 0xa6, 0xd3, 0x07, - 0xbe, 0x4d, 0x0b, 0x42, 0x37, 0xa0, 0x3b, 0xcb, 0x20, 0x76, 0x12, 0x92, 0x77, 0x6a, - 0x02, 0x91, 0x80, 0x16, 0x2c, 0xd0, 0xd6, 0x93, 0x0d, 0xf8, 0xec, 0x54, 0x43, 0xf8, - 0x08, 0x43, 0x38, 0x29, 0x91, 0x3a, 0xe7, 0x00, 0x7b, 0xe1, 0x1b, 0x2e, 0xe0, 0x7c, - 0xa4, 0x05, 0x87, 0xee, 0x0a, 0xb9, 0x0b, 0x6d, 0xf1, 0x1c, 0xe5, 0x05, 0x73, 0x26, - 0x0d, 0x0e, 0x4e, 0xda, 0x33, 0x1e, 0x35, 0x0d, 0x49, 0xea, 0x05, 0x9c, 0xc3, 0xe9, - 0x0a, 0x2c, 0xf6, 0xdd, 0x1a, 0x35, 0x1e, 0x81, 0x4f, 0x90, 0x45, 0x6d, 0x88, 0x28, - 0x9b, 0xe1, 0xc6, 0xa4, 0x84, 0x66, 0xec, 0x4a, 0xb7, 0xa1, 0xcc, 0x1b, 0x26, 0xbf, - 0x80, 0xf6, 0x70, 0xdb, 0x44, 0xe6, 0x27, 0x80, 0x31, 0x69, 0x08, 0x7a, 0x8c, 0xda, - 0x1c, 0xb5, 0x0a, 0x35, 0x68, 0xb6, 0xf4, 0xa7, 0x5f, 0xbc, 0x3f, 0x29, 0x08, 0xe9, - 0x15, 0xd9, 0x2b, 0x80, 0x48, 0x99, 0xf2, 0xa9, 0xf0, 0x99, 0xae, 0x8e, 0x4a, 0xe1, - 0xd3, 0x61, 0x29, 0x90, 0xf6, 0xd1, 0xeb, 0x6c, 0xfa, 0x9c, 0xdd, 0x3c, 0x20, 0x59, - 0x9b, 0xa6, 0x6e, 0xb7, 0x5f, 0x86, 0xfa, 0x95, 0xdc, 0xab, 0x77, 0xe9, 0xec, 0x85, - 0x05, 0x03, 0xe0, 0xbf, 0x69, 0xe8, 0x8c, 0xa4, 0xa4, 0xb7, 0x61, 0x50, 0x81, 0xe2, - 0x9a, 0xf4, 0xa6, 0x29, 0x1e, 0x24, 0xa9, 0xe3, 0x75, 0x34, 0x94, 0x9b, 0x22, 0xf7, - 0xfa, 0xdf, 0x4d, 0x07, 0x9a, 0xa9, 0x09, 0x7b, 0xd4, 0x7b, 0x86, 0xea, 0x74, 0x83, - 0x52, 0xe3, 0x60, 0x18, 0x71, 0x04, 0xa3, 0x4b, 0x86, 0x93, 0xc1, 0x27, 0xec, 0xa6, - 0xb1, 0x89, 0x8d, 0x29, 0x9f, 0x43, 0x08, 0xef, 0xe8, 0xeb, 0x3a, 0xba, 0xce, 0xb0, - 0x76, 0xde, 0x80, 0x43, 0x15, 0x8d, 0xa6, 0x7e, 0x85, 0xfe, 0x65, 0x12, 0x6e, 0xd0, - 0x44, 0x95, 0x41, 0xc2, 0x61, 0x05, 0xd1, 0x22, 0x1b, 0xae, 0x74, 0x36, 0x9e, 0x63, - 0xe7, 0x8b, 0xba, 0x53, 0xd7, 0xfb, 0x04, 0x43, 0x6b, 0x74, 0xc9, 0x2a, 0x52, 0x6e, - 0xde, 0x6d, 0x6a, 0x6c, 0x28, 0x4d, 0xbb, 0xab, 0xa9, 0xc9, 0x83, 0xda, 0x1f, 0x46, - 0x5b, 0xa6, 0x64, 0x30, 0x8a, 0xd8, 0x75, 0x99, 0x75, 0xde, 0x28, 0x75, 0xdd, 0x59, - 0x62, 0x51, 0x5a, 0xfa, 0x33, 0xe0, 0x93, 0xe8, 0xf3, 0xb2, 0xae, 0xd1, 0x9f, 0xa5, - 0xcf, 0xe1, 0x1e, 0xc8, 0xab, 0x25, 0xe3, 0xa5, 0xcb, 0x20, 0xc1, 0x67, 0x94, 0x3f, - 0x5d, 0x0d, 0xf6, 0x59, 0xde, 0x70, 0x22, 0xca, 0x06, 0xdc, 0xdc, 0xf4, 0x42, 0x5d, - 0x7e, 0xcb, 0xbf, 0x64, 0xac, 0x96, 0x76, 0xf9, 0x97, 0xfe, 0xb7, 0x94, 0xe3, 0x12, - 0x37, 0x74, 0x77, 0x18, 0x10, 0x0d, 0x09, 0x4b, 0x2d, 0x2d, 0xa6, 0xd2, 0xc7, 0x3a, - 0xba, 0x6e, 0x0f, 0xbb, 0xdb, 0xaa, 0xfd, 0x99, 0x4e, 0xca, 0xf6, 0xf7, 0x3c, 0xc2, - 0x75, 0x2b, 0x22, 0x51, 0x87, 0x4f, 0x5f, 0xe7, 0xc3, 0x1c, 0x84, 0x9a, 0x9c, 0xc3, - 0xb3, 0x4b, 0xef, 0x25, 0x6d, 0x38, 0x45, 0xae, 0x31, 0x78, 0x19, 0x22, 0xbf, 0x25, - 0xe1, 0x9a, 0x65, 0x5a, 0x23, 0xbb, 0x75, 0x52, 0xd3, 0x39, 0x82, 0xc7, 0xf1, 0x77, - 0x11, 0x25, 0xf8, 0x3c, 0xeb, 0x8e, 0x93, 0x50, 0x99, 0xb9, 0x88, 0x64, 0xf9, 0xcd, - 0x65, 0xf4, 0xa2, 0x7e, 0xeb, 0xed, 0x08, 0x03, 0x94, 0xde, 0x29, 0xea, 0xce, 0x6c, - 0xb5, 0xa9, 0x8f, 0x27, 0xa5, 0x13, 0xa0, 0xeb, 0x8d, 0x5f, 0x67, 0x06, 0x3d, 0x5a, - 0xa8, 0x76, 0x46, 0x88, 0x51, 0x25, 0xa9, 0xad, 0x75, 0x4d, 0xee, 0xbf, 0x34, 0x9c, - 0xe9, 0xd4, 0xc1, 0x3f, 0xe1, 0x63, 0xbb, 0x21, 0xb6, 0x62, 0x2c, 0xfb, 0xed, 0x1b, - 0xec, 0xb4, 0xe7, 0x0d, 0x57, 0x43, 0xf4, 0x63, 0x07, 0x23, 0x79, 0x30, 0x4c, 0x59, - 0xb1, 0x2b, 0x01, 0x96, 0x54, 0xa3, 0x43, 0x11, 0xf6, 0xb6, 0xb1, 0xc5, 0xe1, 0xd8, - 0x46, 0xb3, 0x2c, 0xd7, 0xd9, 0x3b, 0xf7, 0xfc, 0x8b, 0xb3, 0x2f, 0x9f, 0xe8, 0x6a, - 0x8e, 0x57, 0xaa, 0x33, 0x13, 0x09, 0xea, 0x5b, 0xd2, 0xa2, 0x0b, 0xee, 0x6c, 0x24, - 0x4b, 0xea, 0xc2, 0xc3, 0xdd, 0x50, 0xe3, 0x8e, 0x6d, 0xdb, 0x6c, 0x35, 0x80, 0xaa, - 0xcc, 0x2e, 0xfe, 0x1f, 0x1a, 0x0d, 0x5c, 0xe0, 0x9d, 0xa6, 0xbf, 0x7b, 0x24, 0xd0, - 0x00, 0x05, 0xa7, 0xb1, 0x4f, 0xc6, 0x86, 0xa6, 0x3f, 0x93, 0xc5, 0xa6, 0x92, 0x02, - 0x98, 0xa4, 0x11, 0xe4, 0x85, 0x98, 0x8c, 0xda, 0xe5, 0xe8, 0x60, 0x06, 0x8b, 0xce, - 0xcc, 0x33, 0x90, 0x52, 0x81, 0x0b, 0x56, 0xc6, 0x46, 0x5a, 0x6a, 0x4c, 0xce, 0x57, - 0x49, 0xe1, 0x53, 0xa9, 0xe6, 0xf4, 0xbc, 0xb4, 0x3e, 0xb2, 0x89, 0x2c, 0xf3, 0x8f, - 0x06, 0x9f, 0xc8, 0x85, 0x9d, 0xd7, 0x25, 0xb1, 0xb0, 0x9f, 0x38, 0xe1, 0xda, 0x9e, - 0x9f, 0xc5, 0x8f, 0x44, 0x2f, 0xb5, 0x3f, 0x7e, 0xae, 0xdb, 0x57, 0x36, 0xc0, 0x52, - 0x11, 0x03, 0x4b, 0x25, 0x19, 0x11, 0xec, 0x9b, 0xd9, 0xc7, 0x49, 0x53, 0xc8, 0x2e, - 0x6e, 0x84, 0x91, 0x6a, 0xe8, 0x29, 0xe8, 0x85, 0x10, 0x71, 0x22, 0x1c, 0xa3, 0xc0, - 0x24, 0x09, 0x70, 0x2d, 0xa7, 0x93, 0xb6, 0xce, 0x49, 0xa0, 0x39, 0xa9, 0xb4, 0xa3, - 0x3f, 0x17, 0x9f, 0xb6, 0x61, 0x37, 0x28, 0x93, 0x4e, 0x60, 0xd4, 0x0c, 0xbd, 0xff, - 0x10, 0xac, 0x5b, 0xf4, 0x4d, 0xe7, 0x1c, 0xc2, 0x83, 0x93, 0x25, 0x9e, 0x66, 0x97, - 0x26, 0xbb, 0xcf, 0x26, 0xb5, 0x1d, 0xb2, 0xa6, 0x63, 0xe0, 0xa4, 0xcc, 0x0e, 0x73, - 0x27, 0x8e, 0xe6, 0x97, 0x79, 0xfe, 0xa5, 0xd9, 0xf5, 0x7e, 0x2e, 0xe9, 0x31, 0x0c, - 0xc8, 0x13, 0xba, 0xb1, 0xad, 0x79, 0xf2, 0x75, 0xd5, 0xc5, 0x49, 0x3f, 0x7c, 0xb4, - 0xea, 0xbe, 0x47, 0x60, 0x8c, 0x71, 0xa4, 0x71, 0x38, 0xe9, 0x11, 0x9f, 0x38, 0xc0, - 0xc2, 0x59, 0x78, 0xca, 0xb5, 0x46, 0x24, 0x0b, 0x29, 0xa9, 0x6f, 0x7e, 0x9e, 0x35, - 0x37, 0x42, 0xa6, 0x97, 0x20, 0xcd, 0xfd, 0x91, 0x38, 0x3c, 0x89, 0xe2, 0xd4, 0x64, - 0xf7, 0x59, 0x0f, 0x0e, 0xe0, 0x03, 0xd7, 0xd8, 0x98, 0x6d, 0x39, 0x3f, 0x48, 0x70, - 0x21, 0xa1, 0x32, 0x30, 0x95, 0xfe, 0x4a, 0xf1, 0xb5, 0xba, 0x4e, 0x4a, 0x84, 0xdf, - 0x63, 0xbf, 0x81, 0xcd, 0xb3, 0x23, 0x4a, 0x07, 0x08, 0x05, 0x27, 0xb9, 0x61, 0x2c, - 0x46, 0x2c, 0x30, 0xcc, 0xa5, 0x41, 0xc8, 0x1a, 0x4c, 0xd3, 0xd1, 0x88, 0x5a, 0xcf, - 0x1f, 0xea, 0xb2, 0xdd, 0x94, 0x8d, 0x26, 0x9e, 0x2e, 0x4e, 0x5d, 0xcf, 0x99, 0x0a, - 0x69, 0x5f, 0x5c, 0x43, 0xe6, 0xf7, 0xf8, 0x0e, 0x7b, 0x1c, 0x62, 0x69, 0xc2, 0x64, - 0x90, 0x74, 0x01, 0xbb, 0xb7, 0xf6, 0xde, 0x83, 0x67, 0x69, 0x3c, 0xff, 0xf2, 0xec, - 0x8b, 0x94, 0xa5, 0xf1, 0x81, 0x63, 0x4c, 0xde, 0xb1, 0xb6, 0xf1, 0x17, 0x4e, 0x54, - 0xb7, 0xd9, 0x25, 0x50, 0x4b, 0x5d, 0xf1, 0x98, 0x35, 0xa4, 0xa8, 0xd8, 0xbc, 0xab, - 0x75, 0xda, 0xd5, 0xff, 0x09, 0x7b, 0x5b, 0xe6, 0x16, 0x30, 0x4a, 0x16, 0xfd, 0x4e, - 0x25, 0xcd, 0x09, 0x11, 0xe6, 0x53, 0x72, 0x2a, 0xec, 0x58, 0x68, 0x46, 0x08, 0x12, - 0x3d, 0x75, 0x6d, 0x82, 0x04, 0xea, 0x17, 0xed, 0x8a, 0xc2, 0x00, 0x16, 0xf9, 0x06, - 0xe9, 0x85, 0x7e, 0x4f, 0x6e, 0xe5, 0x1c, 0x98, 0xd7, 0x59, 0x92, 0x90, 0x9e, 0xa2, - 0xd3, 0x20, 0xf7, 0x7c, 0xfa, 0x2f, 0x1c, 0x0a, 0x24, 0x2d, 0x20, 0xc6, 0xd9, 0x70, - 0x07, 0xe8, 0x93, 0x5e, 0x8e, 0x15, 0xfa, 0x35, 0xb4, 0x3f, 0x8a, 0x04, 0x18, 0xb3, - 0xad, 0xc0, 0x57, 0x38, 0x34, 0xda, 0xd9, 0xba, 0xc4, 0x4e, 0xba, 0xe1, 0x23, 0x1c, - 0x3d, 0xa2, 0x37, 0x81, 0xaf, 0xcc, 0x7e, 0xba, 0x97, 0xfa, 0xb4, 0x53, 0x9d, 0xc7, - 0x43, 0xe9, 0x60, 0xdf, 0x91, 0xec, 0xa4, 0xd7, 0xc9, 0x83, 0x62, 0xc6, 0xa5, 0xe5, - 0x33, 0x2b, 0x7c, 0xeb, 0xe3, 0x47, 0xb4, 0xca, 0xd0, 0x07, 0xc7, 0xbb, 0x69, 0x52, - 0x61, 0x59, 0x38, 0xa9, 0x1f, 0x25, 0x59, 0x79, 0xef, 0xd3, 0x87, 0x6f, 0xfb, 0x13, - 0x49, 0x81, 0xe0, 0x7c, 0xe9, 0x0d, 0x4b, 0xdd, 0x32, 0x27, 0x02, 0x4c, 0x27, 0xdd, - 0xf0, 0xb1, 0xea, 0xf1, 0x25, 0x5e, 0xba, 0x9d, 0xfe, 0x2d, 0x37, 0xc1, 0xfb, 0x00, - 0xd9, 0x1e, 0xd8, 0xc9, 0x25, 0x4b, 0xb1, 0x7c, 0xed, 0x92, 0xe7, 0x0d, 0x47, 0xf3, - 0x21, 0xed, 0x23, 0x2e, 0xb2, 0x24, 0x31, 0xfc, 0x83, 0x65, 0x10, 0xfe, 0xad, 0xf5, - 0xea, 0x7c, 0x3a, 0x17, 0xb3, 0xed, 0xd3, 0xca, 0xa7, 0x6f, 0x1d, 0xb1, 0x5f, 0x97, - 0x8e, 0x45, 0x82, 0x00, 0x19, 0x8b, 0xe6, 0x2a, 0x88, 0x1f, 0x58, 0xb0, 0x88, 0x08, - 0x41, 0xee, 0x8b, 0x68, 0x38, 0x47, 0xcd, 0x1a, 0x77, 0x8d, 0x24, 0x98, 0x16, 0x82, - 0xdc, 0x60, 0xa8, 0x60, 0xf5, 0xa3, 0xa6, 0x8e, 0x9e, 0x7e, 0xe7, 0xeb, 0xf4, 0xa4, - 0x4e, 0xaa, 0x6a, 0x39, 0x35, 0x69, 0x75, 0x8e, 0xbf, 0x85, 0xfd, 0x12, 0x32, 0x95, - 0xc0, 0x9b, 0xef, 0xb2, 0xeb, 0x58, 0xa8, 0x29, 0x81, 0xe3, 0xa6, 0x9a, 0x62, 0xbb, - 0xf0, 0x76, 0x55, 0x1c, 0x31, 0x36, 0xf5, 0x8b, 0x54, 0x15, 0x4b, 0xc9, 0x4e, 0x18, - 0xf2, 0x76, 0x18, 0xd4, 0x1e, 0xbe, 0x53, 0x51, 0xfc, 0x62, 0x7b, 0xcc, 0xb6, 0x3c, - 0x5f, 0xe1, 0x45, 0x9c, 0xb0, 0xf3, 0x69, 0x33, 0x3b, 0x10, 0xd1, 0xda, 0x90, 0xc6, - 0xbf, 0x6c, 0xf7, 0xa5, 0xa7, 0xe8, 0xc1, 0x53, 0xf4, 0x81, 0xbe, 0xc4, 0x57, 0x67, - 0x7f, 0x6d, 0xab, 0x17, 0x79, 0x5a, 0x20, 0xd3, 0x38, 0xee, 0xdc, 0xfe, 0xeb, 0x51, - 0xf5, 0x28, 0xab, 0x1a, 0x69, 0x07, 0x27, 0xcf, 0x98, 0x6d, 0x49, 0xd9, 0xef, 0x9b, - 0x94, 0x12, 0x47, 0x1c, 0x75, 0x0a, 0x19, 0xd2, 0x00, 0x7a, 0xca, 0x3f, 0xd1, 0x4b, - 0xb2, 0x39, 0x83, 0x81, 0x90, 0xe3, 0x03, 0x9d, 0x13, 0xaf, 0xcd, 0xbe, 0x75, 0xed, - 0x5d, 0x3e, 0x27, 0x7e, 0x84, 0x4e, 0x5d, 0xc2, 0xca, 0xb5, 0xdf, 0x2e, 0xd9, 0xb5, - 0x12, 0xb4, 0xe0, 0x0a, 0xfc, 0x42, 0x98, 0x3d, 0x63, 0xfd, 0x50, 0x6f, 0x92, 0x5c, - 0x8a, 0xce, 0xb9, 0x69, 0xc9, 0xbb, 0x83, 0xcb, 0x68, 0x61, 0xde, 0x31, 0x90, 0x72, - 0xe4, 0xf1, 0xb8, 0xc6, 0xce, 0x78, 0xe3, 0x1a, 0xe3, 0x07, 0x49, 0xcf, 0xde, 0x38, - 0x43, 0x4e, 0xb8, 0xbb, 0xb3, 0x2f, 0xd1, 0x71, 0xaa, 0x8e, 0xa3, 0x0b, 0x9d, 0xc0, - 0xaf, 0x3e, 0x40, 0x73, 0xf1, 0x62, 0xb0, 0x30, 0xc5, 0x82, 0xe6, 0x52, 0x7d, 0x09, - 0x33, 0x42, 0xc1, 0xfb, 0xd3, 0xc9, 0x08, 0x7d, 0x86, 0x5d, 0x32, 0x01, 0x93, 0x6a, - 0x09, 0x80, 0x91, 0xb6, 0xba, 0x77, 0x83, 0xf8, 0x8b, 0x09, 0x94, 0x4f, 0x0b, 0xa9, - 0xe6, 0x81, 0x10, 0x27, 0xa6, 0x7b, 0x7e, 0xf6, 0x6f, 0xb0, 0x81, 0x88, 0x4e, 0x1e, - 0x68, 0x41, 0x7d, 0x74, 0xf6, 0x85, 0x8d, 0xf6, 0xdc, 0x3a, 0xd6, 0x42, 0xf9, 0x3d, - 0x08, 0xaa, 0xd4, 0xcb, 0x3c, 0xd9, 0xdf, 0xc0, 0x76, 0xb5, 0x16, 0x25, 0x8b, 0x2d, - 0x4a, 0x15, 0xad, 0x48, 0xe6, 0xb9, 0xc3, 0xb8, 0x76, 0xf1, 0x57, 0x80, 0x1a, 0xa6, - 0x93, 0x0c, 0xe2, 0xd1, 0x87, 0x3a, 0x7a, 0xf4, 0x44, 0xf4, 0x3d, 0x9d, 0xba, 0xc4, - 0x59, 0xc7, 0x92, 0x8d, 0xf1, 0xc1, 0x0d, 0xa0, 0x73, 0x30, 0x18, 0xd6, 0xc3, 0x90, - 0xb4, 0xf7, 0x28, 0xf7, 0x8e, 0xdd, 0xcc, 0x3f, 0x2f, 0x00, 0xcb, 0xe7, 0x3f, 0x76, - 0x80, 0x0f, 0x59, 0x6b, 0x71, 0xf8, 0xd4, 0x7c, 0xe7, 0x1a, 0x1c, 0x4d, 0x05, 0xdd, - 0xd4, 0xc2, 0x14, 0x1c, 0x7b, 0x32, 0x27, 0xde, 0x66, 0x2a, 0x16, 0x4e, 0x7a, 0x9c, - 0xde, 0x8b, 0xd9, 0x4f, 0x63, 0xdb, 0xf8, 0x7e, 0x1e, 0xf8, 0xa7, 0xd8, 0x79, 0x29, - 0x29, 0x32, 0x9b, 0x5a, 0x0e, 0x1e, 0x2c, 0xb7, 0xdc, 0x3b, 0x50, 0x7f, 0xdf, 0x98, - 0x7d, 0xef, 0x66, 0xe6, 0x4d, 0x3a, 0x3f, 0x69, 0xfb, 0xbd, 0x04, 0xf9, 0x41, 0x17, - 0x8f, 0x07, 0x25, 0xd8, 0xa8, 0xae, 0xb2, 0x47, 0x1b, 0xa9, 0x74, 0x96, 0xe7, 0xe0, - 0x83, 0xea, 0xc6, 0x67, 0xbf, 0x38, 0x62, 0x7f, 0x75, 0xd4, 0x7a, 0x92, 0x8a, 0xe3, - 0x49, 0x24, 0xfb, 0x1e, 0x7c, 0xa2, 0x01, 0x41, 0xd6, 0x96, 0x70, 0x9f, 0xf0, 0x8b, - 0xd2, 0x94, 0xd2, 0x07, 0x0e, 0xab, 0xa8, 0x42, 0xb4, 0x32, 0x43, 0xaa, 0x5b, 0x7f, - 0x16, 0x65, 0x01, 0x97, 0xb6, 0x26, 0x6a, 0x09, 0x9e, 0x4f, 0x37, 0x8f, 0xde, 0x26, - 0xdb, 0xcd, 0x10, 0xb0, 0x83, 0xe2, 0x3a, 0xe9, 0x59, 0xba, 0x91, 0x1a, 0xa1, 0x75, - 0x94, 0x2c, 0x49, 0xca, 0x03, 0x59, 0x36, 0xad, 0xef, 0x0b, 0xba, 0xa8, 0x51, 0x5a, - 0x03, 0x85, 0x48, 0x2f, 0x2a, 0x8c, 0x27, 0x14, 0x69, 0xd7, 0x97, 0xd9, 0xa9, 0x66, - 0x70, 0xa2, 0xc9, 0x93, 0x2e, 0xc7, 0x7b, 0xaf, 0x02, 0x84, 0x41, 0xb8, 0xbe, 0x78, - 0x81, 0x9f, 0x00, 0x35, 0x72, 0xf4, 0xe9, 0xfc, 0xf8, 0xec, 0xc7, 0x36, 0xee, 0x9d, - 0xe4, 0x7c, 0x22, 0xde, 0x7a, 0xbb, 0xde, 0x4d, 0xa2, 0x65, 0x8b, 0xfe, 0x8d, 0xc4, - 0x58, 0xf0, 0x85, 0xe8, 0xb1, 0x69, 0x67, 0x76, 0x13, 0x4c, 0xd8, 0x3b, 0x5b, 0xfc, - 0xd6, 0x0b, 0x2f, 0x5c, 0x4f, 0x9a, 0xdc, 0xf5, 0xea, 0xf4, 0xa4, 0x74, 0x17, 0xe1, - 0x9a, 0x1b, 0xe9, 0xef, 0x4e, 0x93, 0x69, 0xf5, 0xe8, 0xc4, 0x67, 0x6e, 0xa4, 0x65, - 0xd0, 0xaa, 0x75, 0xcf, 0x79, 0x69, 0x7f, 0xac, 0x35, 0xf3, 0xfb, 0xd7, 0x40, 0x03, - 0x50, 0x80, 0xf1, 0xeb, 0x6c, 0xa0, 0x17, 0x19, 0xb8, 0x3d, 0x85, 0x07, 0x2f, 0x4d, - 0x04, 0x59, 0x64, 0xf1, 0xdf, 0x8e, 0x93, 0x92, 0x06, 0xb8, 0xf7, 0x68, 0x78, 0x5d, - 0x50, 0x6a, 0xed, 0x26, 0x81, 0x23, 0x6a, 0x7c, 0x8f, 0xbd, 0x0a, 0x4f, 0x01, 0x63, - 0x07, 0x33, 0x45, 0x01, 0xaf, 0x8c, 0xc9, 0xae, 0xc2, 0xa6, 0x7f, 0x83, 0xc6, 0x55, - 0x90, 0xb5, 0x10, 0xb1, 0x8f, 0x68, 0x0c, 0x71, 0x03, 0x84, 0x23, 0x83, 0x67, 0x2b, - 0xf4, 0xcd, 0x3d, 0xd0, 0x06, 0xfc, 0xc4, 0xec, 0x27, 0x36, 0x0e, 0xa2, 0x75, 0x5b, - 0x3a, 0x44, 0x7f, 0xea, 0x54, 0xf5, 0x0a, 0xfb, 0x60, 0x07, 0x2c, 0x82, 0x50, 0x9c, - 0x0c, 0x57, 0x28, 0x78, 0x1c, 0x74, 0xc5, 0x4e, 0x89, 0x10, 0x0c, 0x00, 0x1d, 0xe0, - 0xa9, 0xab, 0x5b, 0x28, 0x0d, 0xfb, 0x7a, 0xf6, 0x11, 0x50, 0x55, 0xd1, 0x81, 0x06, - 0xda, 0x3d, 0xa4, 0xe7, 0x3a, 0x8f, 0xac, 0x1b, 0x38, 0xa2, 0x8d, 0x48, 0x02, 0x0a, - 0xc0, 0xd8, 0x53, 0x93, 0xac, 0xf8, 0xec, 0xae, 0x75, 0x7d, 0xfc, 0x60, 0x9b, 0x74, - 0xfe, 0x59, 0xf6, 0x4b, 0xd1, 0x5b, 0x3c, 0x7c, 0x6a, 0x3d, 0xd9, 0x7d, 0xd6, 0x41, - 0xfe, 0x7f, 0x49, 0x3f, 0x2f, 0xef, 0x49, 0xa7, 0x53, 0x86, 0xb0, 0x0e, 0xdf, 0x08, - 0x5a, 0x31, 0x51, 0x07, 0xec, 0xd6, 0xbd, 0x57, 0x8b, 0x3d, 0x79, 0x5a, 0x88, 0x60, - 0xf3, 0x86, 0xba, 0x91, 0x31, 0x41, 0x76, 0xc7, 0x15, 0x88, 0x32, 0xef, 0x81, 0x82, - 0xa6, 0xec, 0x42, 0x7a, 0x31, 0xe7, 0xb1, 0x31, 0x01, 0xb0, 0x41, 0xbb, 0x9d, 0x1c, - 0x7a, 0x6a, 0x5e, 0x60, 0x8d, 0xf2, 0x83, 0xec, 0x49, 0x6c, 0x0e, 0xd4, 0x12, 0x39, - 0x2a, 0xa0, 0x09, 0x14, 0x13, 0x65, 0x2f, 0xd3, 0x00, 0x07, 0xe3, 0xa4, 0xe6, 0xe8, - 0x3b, 0x5d, 0x31, 0xf3, 0x6f, 0xce, 0xdc, 0xbd, 0xdb, 0x9c, 0x23, 0x38, 0x25, 0xe9, - 0x73, 0x92, 0x22, 0x73, 0x4a, 0x50, 0x2a, 0x73, 0xd2, 0x64, 0x4c, 0x0c, 0x01, 0xc0, - 0x44, 0x8a, 0x43, 0x8a, 0xfa, 0x61, 0x4d, 0x27, 0x70, 0xc2, 0x01, 0x3c, 0xb7, 0xde, - 0xfd, 0xb6, 0xd1, 0xda, 0x2d, 0x99, 0x54, 0xb1, 0x15, 0x19, 0xc2, 0x55, 0xfa, 0x7e, - 0x0d, 0x24, 0x6f, 0xe3, 0x73, 0xf8, 0x6f, 0xf0, 0xac, 0x4a, 0x0e, 0xe4, 0x20, 0xe3, - 0x49, 0xa3, 0x92, 0x8e, 0x51, 0x38, 0xd0, 0x96, 0xf2, 0xcf, 0x9c, 0xcc, 0x8d, 0xc8, - 0x0e, 0x1c, 0x57, 0xa7, 0x5a, 0xa4, 0x76, 0x92, 0x1d, 0xa7, 0x44, 0x23, 0x24, 0x64, - 0x80, 0x24, 0x2b, 0x75, 0x45, 0x57, 0xce, 0xc3, 0x29, 0x3d, 0x70, 0x59, 0xd4, 0xf7, - 0x47, 0x77, 0xf0, 0x06, 0xb3, 0x70, 0xc3, 0x23, 0x61, 0xb1, 0xf1, 0x6e, 0x0f, 0x9a, - 0xb0, 0x34, 0x2d, 0x0a, 0x31, 0x42, 0x68, 0x69, 0x6f, 0x4c, 0x6e, 0x89, 0xfa, 0x4e, - 0xc5, 0xaf, 0x27, 0x29, 0x35, 0x01, 0xe8, 0xca, 0xd7, 0xf5, 0x9e, 0x60, 0x96, 0x3d, - 0xe1, 0x74, 0xfb, 0x84, 0xb0, 0xf8, 0x88, 0xfd, 0x07, 0x1a, 0xed, 0xfd, 0x07, 0x1c, - 0xed, 0xfd, 0x77, 0xfc, 0xc9, 0xfb, 0xef, 0xfc, 0x93, 0x8f, 0x6b, 0xe2, 0xed, 0x6f, - 0xae, 0x06, 0x62, 0x7c, 0xef, 0x88, 0xfd, 0xf6, 0x91, 0xd4, 0x39, 0xd8, 0xc8, 0x25, - 0x84, 0x38, 0x49, 0x26, 0xe8, 0xc2, 0x43, 0x60, 0x80, 0x86, 0x0d, 0xf2, 0xf3, 0x35, - 0x11, 0x68, 0x68, 0xf2, 0xc5, 0x62, 0x42, 0x96, 0x15, 0xd1, 0x70, 0x89, 0xd6, 0x3d, - 0x12, 0x34, 0x40, 0xca, 0x08, 0x04, 0xcc, 0x93, 0xf1, 0xc4, 0xa3, 0x4b, 0x27, 0x5a, - 0xf4, 0x10, 0x84, 0x09, 0x49, 0xbd, 0x22, 0x8f, 0x99, 0x4c, 0x2a, 0xe3, 0xb2, 0x98, - 0x7f, 0x91, 0x6c, 0x3f, 0x3c, 0x62, 0xdf, 0xdb, 0xe9, 0xa3, 0x01, 0xca, 0x04, 0x87, - 0x5e, 0x50, 0x93, 0xd9, 0xad, 0x54, 0xe9, 0xb3, 0x40, 0xcc, 0x18, 0x78, 0xf1, 0x90, - 0x28, 0x03, 0xb2, 0x49, 0x92, 0x6a, 0x22, 0x08, 0x44, 0x42, 0xe6, 0x5c, 0xda, 0xd1, - 0x49, 0x4b, 0x6e, 0xd9, 0x10, 0x4c, 0x74, 0xae, 0x8e, 0x36, 0xe9, 0x38, 0x16, 0x13, - 0x55, 0x1c, 0xa0, 0x4a, 0x3a, 0xde, 0x62, 0x41, 0xe1, 0x23, 0x88, 0xc2, 0xf9, 0x30, - 0x0f, 0x2b, 0x3a, 0x6f, 0xc0, 0x9f, 0xba, 0x0d, 0xc8, 0x07, 0xa9, 0x08, 0x84, 0x1a, - 0x8f, 0xa2, 0x9e, 0x77, 0x1e, 0xf4, 0xf3, 0xae, 0xa0, 0x7f, 0x72, 0x36, 0xba, 0xb7, - 0xc1, 0x85, 0xd8, 0x45, 0x0d, 0xfd, 0x3b, 0x46, 0x49, 0x5b, 0x1f, 0x62, 0x3d, 0x64, - 0x6f, 0x19, 0xd6, 0xec, 0x51, 0xa9, 0xa5, 0x94, 0xa6, 0x45, 0xf2, 0xa5, 0xc3, 0xbb, - 0xbc, 0x09, 0x2f, 0x0e, 0x52, 0x16, 0xaa, 0xbf, 0xbd, 0x46, 0xb1, 0x17, 0x02, 0xa4, - 0xba, 0x16, 0x06, 0xc6, 0xee, 0x82, 0xaf, 0x54, 0x22, 0x2a, 0x02, 0x28, 0x19, 0x29, - 0xa7, 0x29, 0x2d, 0xd5, 0x96, 0x5f, 0x03, 0x49, 0x03, 0x7d, 0x89, 0xb7, 0x14, 0x72, - 0xd5, 0xae, 0x76, 0x7f, 0x8b, 0x3d, 0x82, 0x89, 0x0a, 0x6e, 0x9e, 0xe6, 0xba, 0x6f, - 0xe4, 0x8a, 0x77, 0xa2, 0xda, 0x7f, 0x6a, 0xf6, 0x63, 0xe4, 0x9b, 0x11, 0xc7, 0x31, - 0xc5, 0x37, 0x44, 0x74, 0xee, 0xfe, 0x88, 0xa3, 0x39, 0xe0, 0xe7, 0xab, 0xdd, 0x89, - 0x67, 0x1b, 0x49, 0x9b, 0x30, 0x7d, 0xe8, 0xb1, 0x14, 0x98, 0x9f, 0x5d, 0xaf, 0x9e, - 0x60, 0x67, 0x0b, 0x56, 0xa6, 0x0c, 0x6f, 0xd2, 0x4e, 0xd8, 0xff, 0x90, 0xf6, 0x17, - 0x59, 0x04, 0x90, 0xb4, 0xe1, 0x91, 0xee, 0x52, 0xc2, 0x16, 0xe7, 0xa8, 0xaa, 0x29, - 0x8a, 0x7e, 0xd1, 0xde, 0x32, 0x04, 0xdc, 0x86, 0x28, 0x03, 0x05, 0x21, 0x6c, 0xc3, - 0x15, 0x91, 0x91, 0x40, 0x56, 0x1a, 0x50, 0x68, 0x11, 0x0b, 0x20, 0x57, 0x1e, 0x05, - 0x8a, 0x26, 0x87, 0xd1, 0x54, 0x67, 0x9e, 0x2b, 0x3e, 0xd5, 0x21, 0x83, 0xb8, 0xe8, - 0x98, 0x35, 0x8d, 0xd0, 0xe8, 0xba, 0xb3, 0x6e, 0x01, 0xf7, 0x2d, 0x11, 0xb8, 0x39, - 0x9e, 0xb2, 0xb1, 0x43, 0xa7, 0x9f, 0xcd, 0x1d, 0x01, 0x98, 0xf8, 0xc0, 0x87, 0x2d, - 0x16, 0xa6, 0xf4, 0x22, 0x39, 0xc4, 0x4d, 0x17, 0x13, 0xbe, 0x9a, 0xf6, 0x76, 0x9b, - 0x3d, 0xe4, 0x42, 0x23, 0xe4, 0xbc, 0xe5, 0x6b, 0x6c, 0x3d, 0x5c, 0x05, 0x0d, 0xf5, - 0x0d, 0xb3, 0xff, 0x9c, 0xfc, 0x55, 0x57, 0x57, 0xf9, 0xad, 0x37, 0xc1, 0xb6, 0xb9, - 0x3f, 0xda, 0xae, 0x1e, 0x9d, 0xb8, 0x41, 0xe2, 0x54, 0xdf, 0x05, 0xee, 0xee, 0x8f, - 0x9e, 0xa8, 0x4e, 0x4f, 0x02, 0xcf, 0x47, 0x44, 0x49, 0x73, 0x38, 0x26, 0xed, 0xed, - 0x5f, 0x38, 0x55, 0xbd, 0xc1, 0x9e, 0xcf, 0x54, 0x68, 0x94, 0xe0, 0x33, 0x40, 0x16, - 0x53, 0x58, 0x1b, 0xc2, 0xf2, 0x22, 0x9d, 0x8e, 0x59, 0x53, 0x44, 0x44, 0x72, 0xe8, - 0x66, 0x1b, 0x89, 0x3d, 0xf6, 0x3f, 0x8d, 0xd8, 0xf7, 0x8d, 0xc8, 0x41, 0x6b, 0x72, - 0xaa, 0xd4, 0x3c, 0x12, 0x1f, 0x13, 0xf1, 0xc9, 0x50, 0xcc, 0x04, 0x5d, 0xab, 0x32, - 0xf3, 0x3e, 0xe1, 0x6f, 0xe4, 0xce, 0x45, 0xa0, 0x08, 0x62, 0x17, 0x2c, 0xf9, 0x5e, - 0x3b, 0x92, 0x3b, 0x2d, 0x09, 0xd9, 0xbb, 0x9b, 0x4f, 0xf3, 0x3a, 0x6c, 0x64, 0xbe, - 0x41, 0x12, 0x55, 0x10, 0xcf, 0xcc, 0x38, 0x5c, 0x41, 0x70, 0xab, 0xee, 0x93, 0x25, - 0xca, 0x53, 0xc2, 0x48, 0x6d, 0x78, 0x10, 0x62, 0xfc, 0x2c, 0xbb, 0x5d, 0x92, 0x58, - 0x8d, 0xc5, 0x08, 0x2d, 0xbe, 0x4e, 0x01, 0xb2, 0x54, 0xf7, 0xe2, 0x5d, 0x90, 0x74, - 0x14, 0x74, 0x10, 0x22, 0x08, 0xb1, 0xed, 0xd8, 0x35, 0x3a, 0x09, 0xd4, 0xbc, 0x33, - 0x50, 0xc4, 0xed, 0xab, 0xb2, 0xf2, 0x8b, 0x1c, 0x4b, 0x55, 0xa6, 0x9b, 0xb3, 0xee, - 0xce, 0x6d, 0xf6, 0x70, 0x32, 0x80, 0x04, 0x8f, 0x81, 0xcb, 0x21, 0xd2, 0x20, 0x64, - 0xf1, 0xbd, 0x9c, 0x44, 0xe9, 0x32, 0x3b, 0x29, 0x75, 0x18, 0x74, 0x09, 0xa3, 0x75, - 0x80, 0x12, 0xf8, 0xcc, 0xec, 0x5f, 0xad, 0xdd, 0x5b, 0xf7, 0x82, 0x7f, 0xf3, 0xc8, - 0x7f, 0x76, 0xc3, 0xef, 0xf2, 0xdd, 0xef, 0x18, 0x6d, 0xf8, 0xdf, 0x22, 0xf8, 0xfd, - 0xd1, 0x6f, 0x3a, 0x12, 0x30, 0x98, 0x98, 0x42, 0x2e, 0x08, 0x07, 0x33, 0xe0, 0xc1, - 0x76, 0x40, 0xfa, 0x21, 0xa5, 0xe7, 0xe3, 0x89, 0x70, 0x14, 0xaa, 0x37, 0x1e, 0xc1, - 0x0b, 0x12, 0xc3, 0x8f, 0x70, 0x86, 0x77, 0x5a, 0x6e, 0x6f, 0xfa, 0xeb, 0xa0, 0x91, - 0xfe, 0xf1, 0xd1, 0x91, 0xa2, 0xc2, 0xf4, 0x5e, 0x2e, 0x28, 0xa1, 0x18, 0x44, 0x39, - 0x42, 0xe5, 0x50, 0xab, 0x90, 0xa4, 0xab, 0x23, 0x19, 0x13, 0xf2, 0x17, 0xd9, 0x79, - 0x3d, 0xfe, 0x58, 0xe7, 0x8e, 0x34, 0x97, 0x69, 0x25, 0x64, 0x35, 0x45, 0xe9, 0x4e, - 0xf2, 0x1f, 0x1e, 0x0b, 0xc0, 0x42, 0x5d, 0xaf, 0x7c, 0x5c, 0xe9, 0xf6, 0x7f, 0x3f, - 0x5a, 0x96, 0xb1, 0xdd, 0x47, 0xe6, 0x0a, 0x7c, 0xb5, 0xb0, 0x90, 0x4e, 0x96, 0x2d, - 0x26, 0x17, 0x4a, 0x6f, 0x15, 0x58, 0x0b, 0xe0, 0x23, 0x81, 0xcb, 0xf5, 0xf8, 0xd3, - 0xdd, 0x5b, 0xc8, 0xf8, 0x4a, 0xf6, 0x34, 0x26, 0xcf, 0xe6, 0x70, 0x47, 0x53, 0xe2, - 0x0e, 0x08, 0x7c, 0x0d, 0xc0, 0xb8, 0x58, 0xaf, 0x7c, 0x6c, 0xe9, 0xb5, 0xae, 0x2e, - 0x4e, 0x9a, 0x65, 0x19, 0x4c, 0x7d, 0x3d, 0x76, 0x0b, 0xe8, 0x66, 0x63, 0xd8, 0xde, - 0xf0, 0xe0, 0x50, 0xb8, 0x53, 0x3d, 0x36, 0xf1, 0x72, 0x90, 0x8d, 0xd9, 0x4f, 0x93, - 0xf2, 0x32, 0x37, 0xbe, 0x5e, 0x9d, 0x29, 0xde, 0x87, 0x6e, 0x92, 0x93, 0xe7, 0x3c, - 0x37, 0xd9, 0xa9, 0xce, 0x0f, 0x1d, 0x14, 0xc3, 0xbc, 0xab, 0xb6, 0xf9, 0x71, 0x35, - 0xd8, 0xbf, 0xb3, 0x56, 0x5d, 0x05, 0x5e, 0x6e, 0x72, 0xc5, 0x45, 0xde, 0x21, 0xde, - 0x73, 0x20, 0x96, 0x5e, 0x62, 0xaa, 0x85, 0x3d, 0x82, 0x74, 0xb0, 0x35, 0xe2, 0x95, - 0xe6, 0xf4, 0x83, 0xeb, 0x5c, 0x93, 0x0b, 0x87, 0x0a, 0x65, 0xb9, 0x5f, 0x67, 0xe7, - 0x2c, 0xca, 0x21, 0x37, 0xef, 0x1f, 0x11, 0x94, 0x07, 0xbf, 0x7d, 0x9d, 0x9d, 0xe2, - 0x7d, 0xba, 0xb4, 0x64, 0x0d, 0x73, 0xb2, 0x74, 0x85, 0x54, 0xc7, 0x50, 0x19, 0xee, - 0xcd, 0x7e, 0x76, 0xfd, 0x80, 0x43, 0x23, 0x93, 0x4a, 0xf9, 0x79, 0xd2, 0x0f, 0x2e, - 0x4c, 0x78, 0x5d, 0x86, 0x58, 0xf7, 0x60, 0xdc, 0xd3, 0xb2, 0x99, 0xd6, 0xb9, 0xe7, - 0xe3, 0x8d, 0xd4, 0x9b, 0x63, 0x9d, 0x13, 0xbf, 0x7b, 0xb3, 0xba, 0x00, 0x8c, 0xd8, - 0x8b, 0x16, 0xc2, 0x9f, 0x1f, 0xb1, 0xcf, 0x67, 0xed, 0x80, 0x6b, 0x40, 0xbe, 0xd8, - 0xd8, 0x68, 0x3f, 0x0f, 0xd1, 0x70, 0x4a, 0x55, 0xb1, 0x51, 0xab, 0x68, 0x49, 0x17, - 0xe7, 0x2a, 0x8a, 0x06, 0x61, 0xac, 0x82, 0xbc, 0x43, 0x08, 0x17, 0xb4, 0x51, 0x00, - 0xfe, 0x49, 0xfb, 0xe8, 0x42, 0xf4, 0x8d, 0xc8, 0x27, 0x04, 0x87, 0x9c, 0x0d, 0xa1, - 0x40, 0x55, 0x0d, 0x51, 0xbb, 0x1c, 0x4c, 0x37, 0x69, 0x4b, 0x78, 0xe0, 0x7e, 0x2e, - 0x8c, 0x62, 0x76, 0xee, 0xa2, 0x08, 0x51, 0x9a, 0xe8, 0x54, 0x1d, 0x03, 0x70, 0x7e, - 0xaf, 0xd0, 0x9e, 0x25, 0xcf, 0x46, 0xc4, 0xf8, 0x17, 0xc4, 0x57, 0xbc, 0xe7, 0xfc, - 0xfb, 0x2f, 0x3c, 0xd7, 0xf3, 0xef, 0x7f, 0xd7, 0x68, 0x25, 0xcb, 0xc5, 0xaa, 0x9d, - 0xff, 0xd3, 0xeb, 0x48, 0xa0, 0xa0, 0x8d, 0x9f, 0x77, 0x13, 0xe6, 0x11, 0xcf, 0x7d, - 0x9d, 0x55, 0x3e, 0x08, 0x2b, 0x5b, 0x3f, 0x30, 0xe5, 0xa2, 0xa5, 0x1f, 0x61, 0x3f, - 0xff, 0x66, 0xf6, 0xcb, 0x56, 0xa6, 0x09, 0xcb, 0xac, 0x75, 0x10, 0x56, 0xfb, 0x48, - 0x09, 0xc3, 0x46, 0xbf, 0x1b, 0x09, 0xc3, 0xb7, 0xd8, 0x39, 0x11, 0x4a, 0xb6, 0x70, - 0x6f, 0x64, 0x3b, 0x29, 0xc2, 0x1f, 0x60, 0x8f, 0xb6, 0x29, 0xc2, 0x72, 0xaf, 0xde, - 0x6d, 0x0d, 0xcf, 0xaf, 0x72, 0x62, 0xf0, 0x0b, 0x2f, 0xcc, 0x3e, 0x7c, 0x4f, 0x1d, - 0x2d, 0x31, 0xb8, 0xde, 0x5d, 0x95, 0x14, 0x7c, 0x3c, 0x55, 0x75, 0xbd, 0x9a, 0xb0, - 0x2b, 0x19, 0x7d, 0x0a, 0x09, 0x77, 0xfd, 0xdc, 0xc4, 0x6e, 0x10, 0x83, 0xb3, 0xcb, - 0x82, 0xe2, 0x17, 0x0e, 0x72, 0xe0, 0xec, 0x5e, 0x1d, 0xdb, 0x7b, 0xdb, 0x44, 0xb1, - 0xad, 0x9c, 0xf1, 0xf8, 0x61, 0xf6, 0x94, 0xa7, 0x69, 0xd7, 0x26, 0x43, 0x96, 0x3d, - 0x2d, 0x88, 0x3c, 0x9b, 0x2d, 0x3f, 0x32, 0x66, 0x99, 0x85, 0x20, 0x1e, 0x9c, 0xa6, - 0xff, 0x85, 0x17, 0x67, 0xff, 0x72, 0xd4, 0xa7, 0xa1, 0x5e, 0x92, 0xc8, 0x33, 0x4c, - 0x4d, 0xce, 0xe8, 0x17, 0xb7, 0xea, 0x58, 0xef, 0x9b, 0x0a, 0xa7, 0x7d, 0xfe, 0xa2, - 0x18, 0xe8, 0xce, 0xfe, 0x6b, 0x96, 0x22, 0x59, 0xd6, 0xbc, 0xa7, 0xc6, 0x37, 0x7b, - 0xb4, 0x88, 0xa6, 0x6b, 0xac, 0x88, 0xcc, 0x89, 0x7d, 0xac, 0x69, 0xfc, 0xad, 0x18, - 0x4d, 0x90, 0xce, 0xf7, 0x63, 0xea, 0x57, 0x58, 0x25, 0x17, 0x53, 0xa7, 0x24, 0x25, - 0x25, 0x8f, 0xaf, 0xb1, 0x33, 0x69, 0x97, 0x19, 0x37, 0x1f, 0x62, 0xcd, 0x70, 0x4d, - 0x76, 0x26, 0xe0, 0x32, 0x3b, 0xe5, 0x5d, 0xce, 0x82, 0x29, 0xe1, 0x69, 0xe7, 0xec, - 0xca, 0xac, 0xde, 0xee, 0xa4, 0xbc, 0x3c, 0xfb, 0xa7, 0xef, 0x36, 0xfe, 0xec, 0x9f, - 0xe2, 0x10, 0x70, 0xe9, 0xfb, 0x71, 0xf1, 0x9b, 0xec, 0x21, 0x29, 0x93, 0x89, 0xdb, - 0x2f, 0x1a, 0xb3, 0xc0, 0x8d, 0xcc, 0x61, 0x33, 0xcd, 0xfb, 0x09, 0x89, 0xdc, 0x2e, - 0x2e, 0xc5, 0x1d, 0xf6, 0x44, 0x11, 0x31, 0x72, 0x2f, 0x0a, 0x01, 0xb6, 0xf8, 0x62, - 0x54, 0xeb, 0x48, 0xc8, 0xce, 0x17, 0x5e, 0x99, 0xfd, 0x0b, 0x1a, 0x19, 0x7e, 0x1c, - 0x50, 0xe7, 0xba, 0xe7, 0x02, 0xa3, 0x99, 0x87, 0xac, 0xed, 0x0d, 0xac, 0xee, 0x72, - 0xb3, 0x62, 0x93, 0x83, 0xd4, 0xce, 0xf5, 0xe3, 0xea, 0x2e, 0x3f, 0xb9, 0x51, 0x5d, - 0x63, 0x8f, 0xe6, 0x43, 0x29, 0xd9, 0xb8, 0x96, 0xb7, 0x4a, 0x4c, 0x80, 0xaa, 0x2e, - 0xaf, 0xa0, 0x76, 0xd8, 0x08, 0x09, 0x20, 0x58, 0x85, 0x2e, 0x4a, 0x20, 0x9e, 0x01, - 0x3f, 0x12, 0x02, 0x97, 0x00, 0x90, 0x9e, 0xe4, 0x80, 0xa8, 0xfb, 0x83, 0xdf, 0xd2, - 0x4e, 0x5c, 0x63, 0xa7, 0x5d, 0x63, 0xa6, 0x43, 0xe6, 0xea, 0x8c, 0xeb, 0x74, 0xdb, - 0x97, 0x33, 0x14, 0xcf, 0x2e, 0x99, 0x03, 0x2c, 0xf2, 0x92, 0xa9, 0xcb, 0x6d, 0x2f, - 0x9b, 0x94, 0x66, 0xe9, 0x06, 0x3b, 0xeb, 0xc1, 0x9e, 0xf5, 0x83, 0x26, 0x5e, 0x77, - 0x24, 0xbb, 0xef, 0x02, 0x4b, 0xe1, 0x6a, 0xee, 0x41, 0x6f, 0x4a, 0x5f, 0x9d, 0xd5, - 0x5d, 0x01, 0xb4, 0x5b, 0x5d, 0x9d, 0xe4, 0xa2, 0x00, 0x07, 0x19, 0x84, 0x34, 0xb3, - 0xa7, 0x91, 0xf4, 0x3d, 0x49, 0xa1, 0x8c, 0x1b, 0x37, 0x47, 0x93, 0x4a, 0xa7, 0x3c, - 0x24, 0x13, 0xc6, 0xc0, 0x0b, 0xd1, 0xc2, 0xcd, 0xa5, 0xe8, 0xba, 0xc1, 0xeb, 0xcf, - 0x75, 0x5e, 0x7f, 0xfd, 0x96, 0x19, 0xaf, 0x7b, 0x9b, 0x21, 0xb6, 0x37, 0xd8, 0x59, - 0xb7, 0x74, 0x5c, 0x5c, 0x1e, 0x97, 0x41, 0xaa, 0x62, 0x65, 0xe8, 0x00, 0xe9, 0x56, - 0xe6, 0xf1, 0x85, 0x35, 0xeb, 0x3a, 0x3b, 0x59, 0xd6, 0x09, 0x9c, 0xb5, 0x72, 0x4f, - 0x9e, 0xf1, 0x96, 0x97, 0x80, 0x1a, 0xa4, 0x30, 0x22, 0x42, 0x88, 0x97, 0x90, 0x5e, - 0x96, 0x66, 0xbf, 0x9a, 0x7d, 0x43, 0x4b, 0x56, 0x26, 0x15, 0x7a, 0x85, 0x81, 0x18, - 0x09, 0x3c, 0xd1, 0x1c, 0xe9, 0x71, 0x39, 0x58, 0x6a, 0x99, 0xc0, 0xcc, 0x42, 0x2b, - 0x44, 0x8f, 0x4f, 0xf5, 0x1c, 0xa2, 0x9c, 0xa6, 0xe1, 0xc8, 0x55, 0x44, 0xf4, 0x06, - 0x5d, 0x64, 0x51, 0x3e, 0xb9, 0x9e, 0x67, 0xcf, 0xb4, 0xde, 0x67, 0x8d, 0xf0, 0x54, - 0x4d, 0x75, 0x95, 0x04, 0x24, 0x78, 0x01, 0x46, 0xa1, 0x59, 0x82, 0xc0, 0x7a, 0x27, - 0x55, 0x66, 0x5e, 0x78, 0x6d, 0xf6, 0xf7, 0xdf, 0x6d, 0x49, 0xf9, 0xf7, 0x09, 0x7c, - 0x36, 0xed, 0x22, 0x9c, 0xcc, 0x1e, 0xfb, 0x00, 0x02, 0xcc, 0x10, 0x26, 0xa8, 0x88, - 0x90, 0x9b, 0x08, 0xf9, 0x3b, 0x45, 0xbf, 0x50, 0xc5, 0x1b, 0xb3, 0x0a, 0xc8, 0x82, - 0xdf, 0xea, 0x15, 0xfe, 0x72, 0x0f, 0x1a, 0x21, 0x7e, 0xe1, 0xf5, 0xd9, 0xe7, 0x37, - 0x7b, 0x18, 0xbb, 0xce, 0x11, 0xfa, 0x00, 0xec, 0x0e, 0xbf, 0xef, 0x74, 0x65, 0x58, - 0x2d, 0xa4, 0xa2, 0x1c, 0x4e, 0xf0, 0x56, 0x93, 0xac, 0xc2, 0x28, 0x32, 0xd2, 0x1f, - 0xfb, 0x4e, 0x74, 0x17, 0x4d, 0xda, 0x5f, 0xcf, 0x3e, 0x03, 0xc6, 0x7f, 0x20, 0x05, - 0x37, 0x92, 0xba, 0xa3, 0x24, 0x78, 0xd6, 0xc9, 0x40, 0xad, 0x31, 0xa0, 0x0b, 0x15, - 0x26, 0x92, 0x4a, 0xd6, 0xba, 0x50, 0xf1, 0xa9, 0x49, 0xae, 0x29, 0x60, 0x66, 0x0e, - 0x25, 0x8d, 0xa0, 0xa7, 0xe4, 0xc8, 0xb2, 0xd2, 0xde, 0xf5, 0x17, 0xa2, 0x76, 0xde, - 0xc6, 0x8d, 0x6b, 0xc6, 0xb2, 0xb0, 0x8c, 0x65, 0x84, 0xb2, 0xd8, 0x16, 0x3d, 0xc9, - 0xd9, 0xce, 0xdf, 0x4d, 0x56, 0x59, 0xb4, 0xbf, 0x77, 0xfc, 0xde, 0xf8, 0x54, 0x89, - 0xbf, 0x76, 0xd9, 0xc8, 0x3b, 0x53, 0x7b, 0x89, 0x6d, 0x01, 0x33, 0x42, 0x47, 0x0c, - 0x14, 0x94, 0xd5, 0xdd, 0xb5, 0x17, 0x3e, 0x3a, 0xf3, 0xf7, 0xc0, 0x7a, 0x23, 0x02, - 0x23, 0xcc, 0xef, 0x90, 0x60, 0x15, 0xe4, 0xa8, 0x78, 0xfa, 0xa6, 0x00, 0x0e, 0x66, - 0x0c, 0x61, 0x71, 0x91, 0xb6, 0x2b, 0xc7, 0x28, 0x71, 0x9c, 0x1c, 0xf7, 0xc6, 0xef, - 0x1a, 0x8d, 0x92, 0x24, 0x3d, 0xf8, 0x18, 0xdc, 0x94, 0xc0, 0x0d, 0x88, 0xc1, 0xbf, - 0x93, 0x6d, 0xc0, 0xf4, 0xb5, 0xc3, 0x0f, 0xda, 0x0b, 0x85, 0xa2, 0x0d, 0x26, 0x26, - 0x4f, 0xc7, 0xe2, 0xb3, 0x9e, 0xac, 0x1e, 0xe9, 0x73, 0x60, 0x0e, 0x90, 0xd8, 0xa1, - 0x60, 0xb6, 0xd9, 0x44, 0x1f, 0x50, 0x40, 0x65, 0x4d, 0x6b, 0x6a, 0xc9, 0xab, 0x27, - 0xba, 0x55, 0xbc, 0x56, 0xd1, 0x82, 0xb5, 0xf5, 0xbc, 0xee, 0x8f, 0x64, 0x35, 0x9e, - 0xd8, 0x7e, 0xfb, 0x55, 0x39, 0xea, 0xeb, 0x36, 0xdf, 0xf4, 0x4c, 0xf5, 0xd8, 0x24, - 0x2d, 0x98, 0xd5, 0x7d, 0x5a, 0x17, 0x52, 0x8d, 0x37, 0x52, 0x1b, 0xbc, 0x63, 0x67, - 0x59, 0x5c, 0x1b, 0x9c, 0x58, 0x52, 0x84, 0xc5, 0xa1, 0xa1, 0xa0, 0xba, 0x2e, 0x41, - 0xf5, 0x4d, 0x8c, 0xe7, 0x02, 0x89, 0xed, 0x83, 0xcd, 0xdd, 0xfe, 0x57, 0x71, 0xee, - 0xf6, 0x8f, 0x38, 0x77, 0xfb, 0x47, 0x9e, 0xbb, 0xfd, 0xe3, 0xcf, 0xdd, 0xfe, 0x83, - 0xcc, 0xdd, 0xfe, 0xb1, 0xe7, 0x6e, 0xff, 0x78, 0x73, 0x77, 0x5c, 0x0f, 0xc3, 0x8f, - 0xaf, 0x61, 0x68, 0x8c, 0xaa, 0x7a, 0xf4, 0xb3, 0xbe, 0x6a, 0x76, 0x5e, 0xb6, 0x7c, - 0x99, 0x99, 0xab, 0xc4, 0x2e, 0x53, 0xdc, 0xaf, 0xb1, 0xd3, 0x76, 0x89, 0x66, 0x68, - 0x0b, 0xea, 0x6c, 0x4c, 0x2c, 0x23, 0x5d, 0x50, 0x2d, 0x81, 0xc6, 0x8f, 0x71, 0x3a, - 0x7d, 0x6c, 0xf6, 0xcf, 0xe8, 0x54, 0x7e, 0xb6, 0xda, 0x9e, 0x80, 0x03, 0xfb, 0xc0, - 0xb3, 0x79, 0xa8, 0x52, 0x6d, 0xa4, 0x5b, 0xee, 0x8f, 0xf4, 0x71, 0x42, 0x94, 0x5b, - 0x90, 0x77, 0xe4, 0xfd, 0xb1, 0xce, 0xbd, 0x2f, 0x5f, 0x49, 0xe7, 0x1e, 0xc4, 0x7c, - 0x72, 0x48, 0x04, 0x70, 0x03, 0x2a, 0x13, 0xd9, 0x00, 0xd3, 0x51, 0xc8, 0xee, 0x90, - 0x4e, 0x09, 0xc6, 0x7f, 0xb2, 0xc1, 0xfe, 0xc6, 0x86, 0x04, 0xa9, 0x4a, 0x9e, 0x8e, - 0x18, 0x0c, 0x2d, 0xc5, 0x98, 0x8f, 0xcd, 0x12, 0xae, 0xc2, 0xcc, 0x43, 0x20, 0x12, - 0xa0, 0x94, 0x01, 0xf2, 0xc7, 0x63, 0x96, 0x8e, 0x99, 0x0b, 0x50, 0xf7, 0x55, 0x8e, - 0x45, 0x0a, 0x80, 0x82, 0x2a, 0xb4, 0x02, 0xe4, 0x3c, 0x1a, 0x81, 0x98, 0x27, 0x8a, - 0x04, 0x65, 0x87, 0xbc, 0x12, 0xd1, 0x34, 0x54, 0x79, 0x22, 0xe9, 0x68, 0x39, 0xdb, - 0xbf, 0x31, 0x6e, 0x2e, 0x62, 0xf0, 0x75, 0xbd, 0xba, 0x7f, 0x74, 0x44, 0x12, 0x8f, - 0x05, 0x74, 0xcd, 0x44, 0x1d, 0x20, 0x4b, 0xd0, 0x51, 0x1d, 0x3b, 0x88, 0x3a, 0x15, - 0x06, 0xce, 0x02, 0x2a, 0x80, 0xbe, 0x83, 0x8f, 0x9f, 0xaa, 0x2e, 0x81, 0x9e, 0x07, - 0xb5, 0x58, 0x10, 0xc2, 0x00, 0x6b, 0xb0, 0x04, 0x55, 0xd1, 0x6f, 0xa5, 0x80, 0x2c, - 0x80, 0xb2, 0x5a, 0x01, 0xcc, 0x80, 0x3e, 0x2b, 0x4f, 0xa5, 0x44, 0x48, 0xe3, 0xa8, - 0x4b, 0xf8, 0xc1, 0x60, 0xf5, 0x15, 0x85, 0xdd, 0x90, 0x19, 0x8a, 0x21, 0x62, 0x23, - 0x5c, 0xae, 0x0c, 0x03, 0xae, 0x4f, 0x0c, 0xab, 0xe8, 0xcc, 0x47, 0xc0, 0x89, 0x2d, - 0xdb, 0xe2, 0x76, 0x89, 0x81, 0x72, 0x67, 0x31, 0xac, 0xe8, 0x7c, 0x14, 0x90, 0x20, - 0x0f, 0x85, 0x22, 0xb0, 0xe6, 0x43, 0x9b, 0x4d, 0xd5, 0x3a, 0xd1, 0xa0, 0xd8, 0x4b, - 0x09, 0x11, 0x96, 0x52, 0x1a, 0xf0, 0x64, 0x41, 0x59, 0x93, 0x8d, 0xc2, 0x3c, 0x8e, - 0x52, 0x63, 0x22, 0x69, 0x7f, 0xab, 0x87, 0xdc, 0xed, 0xd5, 0x11, 0x4c, 0x61, 0x48, - 0x4a, 0xe0, 0xa8, 0x87, 0xe4, 0x4c, 0x3f, 0xd1, 0x01, 0x68, 0x60, 0xd9, 0xcd, 0xaa, - 0xd0, 0xe7, 0xfa, 0xf1, 0xaf, 0x67, 0xdf, 0x98, 0x39, 0xdd, 0x88, 0x57, 0xa0, 0xc9, - 0x59, 0xea, 0x2d, 0x01, 0x11, 0x81, 0x50, 0x29, 0xa5, 0xde, 0x11, 0x1b, 0x0f, 0x69, - 0x9d, 0x72, 0x0f, 0x50, 0x46, 0xa0, 0xeb, 0x87, 0x50, 0x12, 0x93, 0x6d, 0x27, 0x3c, - 0x20, 0x54, 0xb1, 0x2b, 0xb6, 0x27, 0xec, 0x21, 0xf8, 0x8e, 0x7a, 0xb7, 0x84, 0x11, - 0xb2, 0x12, 0x23, 0xfb, 0x49, 0xc5, 0x57, 0xd9, 0x69, 0x61, 0x89, 0xaf, 0xa6, 0x9b, - 0x2f, 0x6a, 0xd1, 0x8c, 0x91, 0x3f, 0xb5, 0xc6, 0x7e, 0x74, 0x4d, 0x67, 0x72, 0x90, - 0x60, 0xb2, 0x52, 0xd4, 0x6e, 0x8d, 0xce, 0xce, 0x68, 0x84, 0xc1, 0x74, 0x35, 0x58, - 0x8a, 0xbd, 0xd5, 0x57, 0x66, 0x5d, 0xe0, 0xd0, 0x9b, 0x79, 0xae, 0xb9, 0x83, 0x0b, - 0xaf, 0xb3, 0xe8, 0x1a, 0xa1, 0x0c, 0x35, 0x56, 0x2e, 0xaf, 0xbd, 0xbc, 0xe6, 0xb0, - 0x6e, 0xcd, 0x51, 0x57, 0x1a, 0x96, 0x93, 0xe9, 0xac, 0x35, 0xd1, 0x5d, 0x6c, 0x70, - 0x97, 0xf5, 0x79, 0x71, 0x0d, 0x17, 0x56, 0x01, 0xc5, 0xe3, 0x4d, 0xdd, 0x45, 0xe5, - 0x8f, 0xb9, 0xa8, 0x82, 0xa5, 0x85, 0xd4, 0x06, 0xb9, 0x65, 0xa5, 0x97, 0xa9, 0x92, - 0x5d, 0x39, 0xfc, 0xc6, 0xec, 0xeb, 0xef, 0x5d, 0x06, 0xd5, 0xaf, 0x11, 0x32, 0xd3, - 0x59, 0x3a, 0x9a, 0xfd, 0x7a, 0x17, 0x8d, 0xee, 0x4b, 0x2b, 0x1b, 0x44, 0xa4, 0x2a, - 0x4b, 0xea, 0xcf, 0xc3, 0x13, 0xcf, 0x97, 0x22, 0xc0, 0x4f, 0x7a, 0xde, 0x48, 0x9b, - 0xc9, 0x9a, 0xee, 0x9c, 0x40, 0x6c, 0x2f, 0x1f, 0xdd, 0x1f, 0xdd, 0xa9, 0x2e, 0x4c, - 0x1a, 0x3d, 0x3c, 0xaa, 0x87, 0x07, 0x35, 0x34, 0x48, 0x56, 0x0c, 0xa8, 0x32, 0x40, - 0xeb, 0x05, 0xaa, 0xcc, 0x09, 0xc1, 0x79, 0x0c, 0xe6, 0xfe, 0xe8, 0x57, 0xf4, 0xf2, - 0xc5, 0xcd, 0x4e, 0xa7, 0x20, 0xd9, 0x39, 0x5a, 0x42, 0x6f, 0xbd, 0x5d, 0x37, 0x22, - 0xcc, 0xc7, 0x17, 0xda, 0xbf, 0xf1, 0x5f, 0xa1, 0x31, 0x76, 0x5e, 0x8f, 0x1f, 0x1f, - 0xfc, 0x9e, 0x2f, 0xf4, 0xba, 0x7c, 0x7f, 0xf4, 0xc9, 0x5e, 0xd2, 0x76, 0xef, 0x4d, - 0x9b, 0x20, 0xeb, 0x20, 0x77, 0x3b, 0x8d, 0xd2, 0x5b, 0x6f, 0xc3, 0xfb, 0xce, 0x97, - 0x3f, 0xbb, 0xaf, 0x1b, 0x3c, 0xf5, 0x3a, 0x3d, 0x75, 0x67, 0xb1, 0xa4, 0x30, 0xd6, - 0x62, 0xb9, 0x3f, 0x52, 0xd5, 0x63, 0x13, 0xd9, 0x67, 0x6d, 0x87, 0x97, 0x77, 0x14, - 0x20, 0x29, 0x16, 0xc6, 0xf7, 0x73, 0x69, 0x7c, 0xc1, 0x59, 0xb9, 0x5a, 0xc3, 0x7a, - 0x48, 0xf0, 0x8c, 0xb3, 0x05, 0xc1, 0xb6, 0xf8, 0xc3, 0x6d, 0x81, 0xf4, 0x6b, 0xb0, - 0xf6, 0xfc, 0x10, 0x3d, 0x59, 0xe7, 0x76, 0x0b, 0x6f, 0xff, 0xa9, 0xb5, 0x83, 0xd9, - 0xe3, 0xd3, 0xdb, 0xff, 0xe8, 0xda, 0x92, 0xe3, 0xe5, 0x68, 0x87, 0x0b, 0xec, 0xef, - 0x72, 0xb0, 0x80, 0x68, 0x7e, 0xf7, 0x8f, 0x15, 0xe0, 0xe5, 0x5d, 0x7e, 0xac, 0xd0, - 0x61, 0xb2, 0x7c, 0x9f, 0xab, 0x65, 0xc7, 0xc7, 0xf4, 0x68, 0xc7, 0x47, 0x7f, 0x9f, - 0x2f, 0x0c, 0xf3, 0x7f, 0x33, 0xea, 0x0d, 0xf3, 0xd2, 0x49, 0xfe, 0x35, 0x47, 0xd4, - 0x29, 0x8e, 0xa2, 0x51, 0x34, 0x2a, 0xcc, 0xfb, 0x4a, 0xc5, 0x40, 0xa3, 0x58, 0xe8, - 0xe1, 0x07, 0x7b, 0x78, 0x84, 0xe5, 0xaa, 0xb2, 0xe7, 0x6e, 0xbc, 0xe1, 0xb9, 0xf3, - 0xab, 0xee, 0x3e, 0xe8, 0xf3, 0x1e, 0x16, 0x44, 0x59, 0x82, 0x75, 0xba, 0x6d, 0xdd, - 0xee, 0x2d, 0x55, 0x9d, 0x9f, 0x08, 0xee, 0x0f, 0x92, 0x30, 0xeb, 0x82, 0xfb, 0xf1, - 0x46, 0x6a, 0x34, 0xde, 0x84, 0xa6, 0xf7, 0x47, 0x57, 0x7b, 0xfb, 0xbc, 0xb0, 0x54, - 0x80, 0xae, 0x1e, 0x0c, 0xdf, 0x7f, 0x10, 0x71, 0xb7, 0x7f, 0x1c, 0x71, 0xb7, 0xff, - 0x35, 0x13, 0x6a, 0xfb, 0xef, 0x8a, 0x50, 0xdb, 0x7f, 0x20, 0x89, 0xb5, 0xff, 0xf3, - 0x2a, 0xb1, 0xf6, 0xdf, 0x97, 0x58, 0x5f, 0x0b, 0x89, 0xb5, 0xff, 0x1f, 0xbc, 0xc4, - 0xda, 0x7f, 0x47, 0x12, 0x6b, 0xff, 0x1d, 0x49, 0xac, 0xfd, 0x07, 0x92, 0x58, 0xfb, - 0x87, 0x49, 0xac, 0x63, 0x99, 0xbc, 0xdf, 0x77, 0xa2, 0x7a, 0x0a, 0x3c, 0xd7, 0x04, - 0xaa, 0xe4, 0x3b, 0x6a, 0x2f, 0x36, 0x32, 0xa3, 0x52, 0x7b, 0xce, 0xdd, 0xdb, 0xec, - 0x11, 0xaa, 0x68, 0xb8, 0x50, 0x52, 0xbe, 0xc7, 0x09, 0xe3, 0xd8, 0x0d, 0x8a, 0x1f, - 0xa4, 0xc5, 0x2a, 0x28, 0x8f, 0x51, 0x21, 0xc5, 0xe9, 0x7c, 0x08, 0x25, 0x54, 0x32, - 0x43, 0x0e, 0xb7, 0xaf, 0xb3, 0x53, 0x62, 0x11, 0xa7, 0x24, 0x3a, 0xe6, 0xc5, 0x94, - 0x5d, 0x10, 0x6d, 0x41, 0x03, 0x9d, 0x0b, 0x7c, 0xf7, 0x9a, 0x87, 0x23, 0x17, 0x78, - 0x7c, 0xe1, 0xe3, 0xb3, 0x70, 0xef, 0x22, 0xe4, 0xd7, 0xe0, 0x9a, 0xd3, 0x73, 0x1d, - 0x8d, 0xad, 0x63, 0x03, 0xd9, 0x44, 0x49, 0x1d, 0x3e, 0xcf, 0x27, 0x0d, 0x32, 0xf4, - 0x6b, 0xe4, 0x5e, 0x32, 0xb6, 0xae, 0x77, 0xef, 0x8f, 0x7e, 0x4d, 0x75, 0x3a, 0xfb, - 0xd3, 0x3a, 0x69, 0x72, 0xd7, 0x10, 0x1c, 0x0a, 0x54, 0x8b, 0x0d, 0x55, 0x0a, 0xe5, - 0xc0, 0xf7, 0x88, 0x43, 0x3a, 0xbe, 0xbd, 0xd8, 0x20, 0x7d, 0x4d, 0x88, 0x48, 0x0b, - 0x99, 0xdb, 0x91, 0x83, 0xa8, 0xcd, 0xa5, 0xbb, 0xd9, 0xc3, 0x5a, 0x75, 0xde, 0x38, - 0x52, 0x9d, 0x56, 0x1f, 0xad, 0x1e, 0xc9, 0x65, 0x12, 0xda, 0x86, 0x6d, 0x85, 0x2a, - 0x20, 0x02, 0x07, 0xa1, 0xc2, 0xf5, 0xbc, 0x1e, 0x5f, 0xc4, 0x3f, 0x73, 0x65, 0xc8, - 0x76, 0x40, 0x6b, 0xf2, 0xae, 0x7d, 0x4d, 0xbf, 0x71, 0xff, 0x48, 0xdf, 0xb8, 0x3f, - 0x7a, 0x65, 0xc5, 0x37, 0x66, 0xc0, 0xf9, 0x51, 0xbf, 0xf1, 0xb8, 0x3e, 0xb7, 0xff, - 0x74, 0x03, 0x50, 0x3d, 0x52, 0xe7, 0x6c, 0xba, 0xd0, 0x49, 0xe4, 0x62, 0x1f, 0x66, - 0x77, 0x08, 0xc7, 0xa7, 0x0b, 0xa7, 0x21, 0xd4, 0x24, 0xc0, 0x74, 0xf2, 0x1e, 0xb9, - 0x4a, 0x97, 0x9d, 0x80, 0x1c, 0x71, 0x73, 0x76, 0xd7, 0x74, 0x93, 0x09, 0xa7, 0x8a, - 0x30, 0xe1, 0xc4, 0x49, 0x85, 0x58, 0x68, 0xb5, 0x17, 0x0d, 0xe7, 0x79, 0x0f, 0x29, - 0xb0, 0x99, 0xb1, 0xf1, 0x22, 0xdd, 0x12, 0xb8, 0xea, 0x72, 0x69, 0xe2, 0xc3, 0xaa, - 0xa5, 0x6e, 0x63, 0x88, 0xd7, 0x2c, 0xd4, 0x4a, 0x3d, 0x64, 0x2b, 0x09, 0x76, 0x55, - 0x0a, 0x0e, 0xbc, 0x13, 0x18, 0x7c, 0xc1, 0xa0, 0x45, 0x34, 0xa2, 0x4b, 0x60, 0xee, - 0x31, 0xcf, 0x8d, 0x50, 0xe7, 0x2f, 0xbc, 0x39, 0xfb, 0x37, 0x00, 0x20, 0xfc, 0xec, - 0xcd, 0x49, 0x5b, 0x70, 0x00, 0x2a, 0xad, 0x08, 0xf0, 0x5a, 0x49, 0x4e, 0xb0, 0xad, - 0x10, 0xea, 0x7a, 0x45, 0x36, 0xd8, 0x75, 0x60, 0xce, 0x42, 0x00, 0x35, 0x7e, 0x7a, - 0xab, 0x05, 0xf2, 0x03, 0xce, 0xf5, 0x69, 0xe6, 0xaa, 0xf5, 0x61, 0xce, 0xf3, 0x2d, - 0xc7, 0x92, 0x97, 0x3f, 0x47, 0xae, 0x57, 0x2a, 0x7a, 0x6f, 0x72, 0x56, 0x82, 0xde, - 0xf1, 0x7b, 0xec, 0xff, 0xcf, 0xbe, 0x5e, 0x96, 0x1a, 0xde, 0x3b, 0x76, 0xaf, 0x10, - 0x06, 0xda, 0x3d, 0xaa, 0x30, 0x41, 0x44, 0xdb, 0xc4, 0xc6, 0x63, 0x4a, 0x43, 0x64, - 0xf1, 0x81, 0x76, 0xce, 0xb7, 0xed, 0x5c, 0x37, 0xf1, 0x01, 0xc8, 0x78, 0x4a, 0x46, - 0xf0, 0xf8, 0x22, 0x3b, 0x61, 0xfa, 0xc9, 0xc2, 0xe6, 0x9d, 0x84, 0x4e, 0x3f, 0x3d, - 0x33, 0xf7, 0xd6, 0x85, 0x08, 0x39, 0xf0, 0x7e, 0xbd, 0x3a, 0x9b, 0x37, 0xbf, 0xdd, - 0xe9, 0x6e, 0xc6, 0xb6, 0x34, 0xf8, 0x0a, 0xee, 0xb6, 0x36, 0x5f, 0xb8, 0xb4, 0xbc, - 0xbc, 0x54, 0x92, 0x8c, 0xcc, 0xf1, 0xb1, 0x3a, 0xbf, 0x93, 0xb0, 0x3a, 0x66, 0xc0, - 0xf0, 0xff, 0x1a, 0x73, 0x92, 0xb2, 0x31, 0x1c, 0x72, 0xa1, 0x7a, 0xa4, 0xa4, 0xa1, - 0x82, 0x3f, 0x16, 0xeb, 0x3d, 0x23, 0xfd, 0x2e, 0x70, 0xd3, 0x98, 0x61, 0x11, 0x00, - 0x49, 0xb4, 0x18, 0x37, 0xc0, 0xd9, 0x15, 0xde, 0x7a, 0x3b, 0x9a, 0x50, 0x0f, 0x72, - 0x2e, 0xc2, 0xf1, 0xd8, 0x30, 0xba, 0x03, 0xfc, 0xf5, 0xb3, 0xff, 0x67, 0x74, 0x6f, - 0xb4, 0x50, 0xea, 0x7b, 0x59, 0x61, 0x84, 0x63, 0x8d, 0xc8, 0x77, 0xad, 0x57, 0x63, - 0xf6, 0x10, 0x50, 0xbd, 0x2f, 0xcb, 0x94, 0xf9, 0x04, 0xfb, 0x08, 0x10, 0xd4, 0xe9, - 0xec, 0xf7, 0x33, 0x9c, 0x80, 0xc5, 0x92, 0xf2, 0x65, 0x88, 0x67, 0xcb, 0x36, 0x80, - 0x20, 0x06, 0xc0, 0x24, 0xf2, 0xdb, 0x0c, 0xa4, 0x55, 0xd0, 0x94, 0x1f, 0xfd, 0x12, - 0x93, 0x81, 0x32, 0x29, 0x08, 0x9d, 0x82, 0xa0, 0x44, 0x91, 0xb3, 0x27, 0x04, 0xfa, - 0x1f, 0xe9, 0xb7, 0xe1, 0x63, 0xcc, 0x01, 0xa9, 0xd0, 0x57, 0xd9, 0x19, 0xcb, 0x09, - 0xe7, 0xd8, 0x9d, 0x1b, 0x0a, 0x93, 0xae, 0x18, 0xda, 0x6f, 0xa0, 0x04, 0xe9, 0xfb, - 0xa3, 0x6b, 0xab, 0x12, 0x59, 0x4e, 0x60, 0x50, 0x3e, 0xad, 0xeb, 0x47, 0xfa, 0xd5, - 0x16, 0x87, 0x41, 0xa8, 0xcf, 0x8f, 0x2e, 0xb1, 0x93, 0xc1, 0x98, 0x01, 0xd9, 0x9c, - 0x41, 0x20, 0xc6, 0x51, 0x4a, 0x51, 0x1c, 0x0d, 0x01, 0xaa, 0x97, 0x21, 0x40, 0xf5, - 0xfb, 0x08, 0xd0, 0x77, 0x80, 0x00, 0xfd, 0xc6, 0xaf, 0x39, 0x02, 0xf4, 0x47, 0x89, - 0xcb, 0xc3, 0xb8, 0x21, 0xcd, 0xd4, 0x55, 0x76, 0x5a, 0x76, 0xd0, 0x9d, 0xed, 0x91, - 0x5f, 0x50, 0x59, 0x67, 0x42, 0xa3, 0x73, 0x72, 0x5b, 0x67, 0xa1, 0xd9, 0x83, 0x09, - 0xd2, 0xb0, 0x48, 0xc8, 0x55, 0x76, 0x3a, 0x8d, 0x7c, 0x98, 0x0f, 0x29, 0x11, 0x29, - 0x29, 0xec, 0x1a, 0x3b, 0xe3, 0x79, 0x66, 0x85, 0xec, 0x3d, 0x00, 0x95, 0xed, 0x23, - 0x73, 0xa7, 0xbd, 0xf0, 0x99, 0xd9, 0x97, 0xd6, 0x96, 0x41, 0x4b, 0xec, 0xa1, 0xd0, - 0x92, 0x1b, 0xec, 0x5c, 0x5a, 0xc3, 0x7c, 0x31, 0x67, 0xd1, 0xb9, 0xa5, 0x94, 0x82, - 0x5f, 0xda, 0xa8, 0xae, 0xb3, 0xc7, 0x32, 0xb4, 0x26, 0x43, 0x68, 0x93, 0xe9, 0xd1, - 0x81, 0xc5, 0x7d, 0x98, 0xd5, 0x12, 0xaf, 0xa2, 0x3d, 0x2c, 0xf3, 0x3e, 0x00, 0x6a, - 0x41, 0x04, 0x31, 0x14, 0x00, 0xc7, 0x22, 0x18, 0x2e, 0x40, 0x92, 0xbe, 0xe5, 0x98, - 0x68, 0x8b, 0x60, 0x77, 0x84, 0x85, 0x48, 0xf4, 0xb4, 0xd7, 0x83, 0xcd, 0x61, 0x73, - 0x46, 0xd4, 0x21, 0x30, 0xb9, 0x9a, 0x9d, 0x27, 0x6d, 0x06, 0xd2, 0xd8, 0xa3, 0xb3, - 0xf5, 0x2a, 0xbc, 0xdc, 0x35, 0x76, 0xda, 0x03, 0x8c, 0x6f, 0x50, 0xbf, 0x21, 0xdb, - 0x41, 0xcf, 0x5e, 0x03, 0xd2, 0x7a, 0x4c, 0xdd, 0xeb, 0xc2, 0xc6, 0xca, 0x46, 0xb8, - 0xc6, 0x4e, 0x87, 0xb4, 0xaa, 0x07, 0xbd, 0x09, 0xa2, 0xdd, 0x0b, 0xf7, 0x66, 0x7f, - 0x90, 0xf2, 0x34, 0x6c, 0x35, 0xce, 0x10, 0xba, 0x83, 0x19, 0xf9, 0x31, 0xeb, 0x38, - 0x20, 0x44, 0x0b, 0x12, 0xf1, 0x2f, 0x4d, 0x82, 0x5d, 0xc8, 0xfa, 0x5b, 0x1a, 0x2b, - 0x5f, 0x0b, 0x36, 0xa9, 0x5e, 0xe3, 0x49, 0x38, 0x5a, 0xfb, 0xcd, 0x90, 0x54, 0x9e, - 0x55, 0x4b, 0x67, 0xc2, 0x1e, 0x0b, 0x59, 0xfe, 0x21, 0x1f, 0xc9, 0xe0, 0x43, 0x9d, - 0xcc, 0x2b, 0xe8, 0x69, 0x1c, 0x77, 0x85, 0x2c, 0xea, 0x36, 0x0b, 0xaa, 0xba, 0x5d, - 0x32, 0xf2, 0x74, 0x50, 0x3d, 0x88, 0xdc, 0x1f, 0x78, 0xb4, 0xfa, 0xd5, 0xec, 0x9b, - 0x72, 0xd2, 0x35, 0x78, 0xe3, 0x85, 0x2e, 0x02, 0xd6, 0xd3, 0x2f, 0x32, 0x97, 0xfe, - 0x9a, 0x62, 0xdc, 0x06, 0x75, 0x36, 0xaa, 0x0d, 0x08, 0xb4, 0xe2, 0x85, 0xb4, 0x38, - 0x5a, 0x4a, 0x02, 0xde, 0xc5, 0x2a, 0x68, 0x9e, 0x5e, 0xaf, 0x76, 0x84, 0xd9, 0x63, - 0x3f, 0xb1, 0xc6, 0xfe, 0xec, 0x9a, 0xcc, 0xa5, 0xcf, 0x10, 0x5a, 0xf7, 0x16, 0x15, - 0x04, 0x04, 0xb8, 0x52, 0x00, 0x6e, 0x1f, 0xaa, 0xc3, 0x22, 0x14, 0xe9, 0x87, 0xbc, - 0x74, 0xa3, 0x2d, 0x8d, 0xf3, 0x0e, 0x3b, 0x85, 0xd9, 0x20, 0x38, 0xcd, 0xa8, 0x14, - 0x01, 0x2d, 0xb3, 0x9f, 0x93, 0xba, 0x04, 0xf6, 0xbf, 0xc4, 0x0a, 0x6e, 0x85, 0x79, - 0x08, 0xea, 0xb8, 0xe5, 0xea, 0x2d, 0xf8, 0x09, 0x21, 0x77, 0xad, 0x2e, 0x3b, 0xc8, - 0xf7, 0x18, 0xb0, 0xa0, 0xee, 0x1d, 0x79, 0xe3, 0x24, 0x19, 0x40, 0xc8, 0xd3, 0x43, - 0xdd, 0xc1, 0x06, 0xb8, 0x61, 0x6c, 0x99, 0x04, 0x8e, 0x8c, 0xdc, 0xf8, 0x9d, 0x79, - 0xc9, 0x6a, 0x20, 0xaa, 0x68, 0xc7, 0xb3, 0x57, 0x61, 0xe3, 0x8e, 0xa0, 0x2a, 0x7a, - 0xb9, 0xe6, 0x93, 0xdf, 0x43, 0xef, 0x58, 0xc6, 0x45, 0x80, 0x0a, 0x9d, 0xce, 0xd7, - 0xba, 0x0b, 0xbb, 0x3a, 0x2d, 0x4c, 0x1b, 0xdc, 0x7c, 0x2a, 0xd7, 0x51, 0x74, 0x50, - 0xeb, 0x32, 0x37, 0x33, 0x7b, 0xf2, 0x6c, 0x6b, 0x23, 0xf9, 0xc0, 0xef, 0xec, 0xb2, - 0xdb, 0x42, 0xb9, 0x26, 0x63, 0x01, 0xf6, 0x62, 0xe0, 0x9c, 0xe2, 0x8b, 0xf9, 0x07, - 0x54, 0x70, 0x7b, 0x08, 0xaf, 0x8e, 0x0d, 0xf5, 0x61, 0xf6, 0x94, 0xa0, 0x28, 0xbb, - 0xa3, 0x1c, 0x60, 0x60, 0xd8, 0x45, 0x2d, 0x24, 0x7a, 0x9e, 0x83, 0x79, 0x75, 0x3e, - 0x71, 0xf5, 0x9e, 0x3c, 0x29, 0x08, 0x71, 0xf1, 0xec, 0xb5, 0x2c, 0xb3, 0x7d, 0xc7, - 0xdd, 0xe1, 0xda, 0x2e, 0x76, 0xe5, 0xf6, 0x8b, 0x2f, 0xcd, 0x44, 0x17, 0x47, 0x7b, - 0x3b, 0x99, 0xcd, 0xad, 0x00, 0xe8, 0x39, 0x8d, 0x36, 0x21, 0xb5, 0x9c, 0xe0, 0x50, - 0x93, 0xea, 0xe1, 0x89, 0x30, 0xed, 0xce, 0xed, 0x28, 0xf5, 0x27, 0x85, 0x01, 0xe9, - 0x96, 0x9b, 0xde, 0xa8, 0x1e, 0x9a, 0x88, 0xa5, 0x16, 0xfb, 0x9a, 0x30, 0x85, 0x11, - 0xf3, 0x91, 0x2e, 0xc4, 0x06, 0x3e, 0xae, 0xf8, 0xb6, 0x55, 0xc3, 0xe5, 0x3c, 0x6a, - 0x1e, 0x1b, 0xeb, 0xe7, 0x19, 0xb9, 0xf5, 0xd9, 0x61, 0x05, 0xc5, 0xce, 0x1d, 0x9f, - 0x91, 0xd9, 0x11, 0x49, 0x7e, 0x48, 0xac, 0xcf, 0x23, 0x30, 0xe7, 0x49, 0x03, 0x27, - 0x73, 0x98, 0x0b, 0x4a, 0xb9, 0x85, 0xed, 0x0d, 0x15, 0x08, 0x34, 0xd4, 0xd6, 0xa9, - 0x23, 0xd4, 0x91, 0x81, 0x75, 0x2a, 0x70, 0xf1, 0x59, 0x5c, 0xb5, 0x22, 0x33, 0xe9, - 0xfe, 0xb1, 0x0d, 0x7c, 0x7b, 0xce, 0xa7, 0xec, 0xbd, 0xfd, 0x8d, 0x06, 0xf3, 0x1c, - 0xe9, 0xe1, 0x36, 0x6d, 0x12, 0x72, 0xcf, 0x46, 0x8d, 0xbc, 0x12, 0xa0, 0x77, 0x11, - 0x6d, 0xb1, 0x47, 0xdf, 0xad, 0x4f, 0xef, 0x75, 0x4b, 0x88, 0x4b, 0xc6, 0x7f, 0x66, - 0xbd, 0xf3, 0x40, 0x95, 0x69, 0x28, 0xa8, 0x90, 0xaa, 0xa4, 0x42, 0x13, 0x50, 0xef, - 0xaf, 0xd0, 0xde, 0x48, 0x74, 0x0f, 0xe7, 0x53, 0xcf, 0x93, 0x69, 0x03, 0xf4, 0x44, - 0x6d, 0x65, 0x54, 0xa0, 0x7d, 0xc1, 0xb0, 0x37, 0xb8, 0x67, 0x33, 0xc4, 0x31, 0xdf, - 0xad, 0xe8, 0x1e, 0x05, 0xd5, 0x81, 0x51, 0x28, 0x08, 0x9d, 0x29, 0x63, 0xb0, 0x98, - 0x04, 0xde, 0xdd, 0xe8, 0x90, 0xdf, 0x6a, 0x11, 0x80, 0xee, 0x1a, 0x2a, 0xf6, 0x0c, - 0x8f, 0xf1, 0x25, 0x91, 0x0c, 0x9e, 0x09, 0xd6, 0xaf, 0xcf, 0xfd, 0x9e, 0xda, 0x5c, - 0x28, 0x15, 0x51, 0x61, 0xb9, 0xe7, 0x44, 0x0e, 0x5a, 0x7a, 0x91, 0x7d, 0xb7, 0xc5, - 0x78, 0x2b, 0x3d, 0xd7, 0x88, 0x27, 0xa3, 0x94, 0xd5, 0x69, 0x21, 0xe9, 0x02, 0xcf, - 0xb0, 0xc6, 0x5a, 0xb1, 0xf9, 0xf9, 0x54, 0x83, 0x31, 0x35, 0xa4, 0xe1, 0x17, 0xca, - 0xb6, 0xbe, 0x6b, 0xa9, 0xd1, 0x39, 0x2e, 0x20, 0x25, 0xb8, 0x3b, 0x3a, 0x38, 0x6d, - 0x36, 0x7b, 0xc0, 0xa1, 0x3e, 0xb3, 0xc7, 0x5a, 0xb1, 0x01, 0xdf, 0x52, 0xaf, 0x98, - 0xc1, 0x92, 0x90, 0xc2, 0x26, 0xaa, 0x5d, 0x34, 0xa2, 0x57, 0xf4, 0x73, 0xa4, 0xa8, - 0xd5, 0x76, 0xf5, 0x50, 0x49, 0x85, 0x74, 0xbd, 0x2a, 0xa6, 0x90, 0x64, 0x8a, 0x8d, - 0x3e, 0xda, 0xb5, 0x0d, 0xc9, 0xac, 0x86, 0xa7, 0x75, 0x8e, 0x69, 0x81, 0xe5, 0x62, - 0x3c, 0xaf, 0x93, 0x00, 0x1a, 0x3f, 0xd6, 0xff, 0x3b, 0x7d, 0x58, 0xe1, 0x6f, 0x7d, - 0xb2, 0x62, 0xdd, 0x5d, 0x6f, 0x7a, 0xcb, 0x79, 0x5d, 0x78, 0x51, 0x30, 0x90, 0x0f, - 0x4f, 0x84, 0x5f, 0xba, 0xe9, 0xd7, 0x85, 0x37, 0xe3, 0x0d, 0xe1, 0x0d, 0x1f, 0x6f, - 0xa6, 0xff, 0xcd, 0x3d, 0xbd, 0x9d, 0x6f, 0x91, 0x0b, 0xbb, 0xff, 0x84, 0xf0, 0x4d, - 0x2b, 0x25, 0x6e, 0x43, 0xb9, 0x41, 0xfa, 0x9a, 0x8e, 0xd4, 0x39, 0x25, 0x3c, 0xb8, - 0x51, 0x4a, 0x67, 0xeb, 0xea, 0xd1, 0x89, 0xeb, 0xe7, 0x8a, 0x0e, 0x5c, 0xe1, 0xae, - 0xbc, 0xfd, 0x5a, 0x75, 0x66, 0x22, 0x94, 0x5f, 0x00, 0xd7, 0x09, 0xe5, 0x4b, 0x32, - 0xd2, 0x78, 0x22, 0x88, 0x52, 0xd5, 0xf7, 0x00, 0x67, 0xbe, 0xf7, 0xd0, 0xaa, 0x6d, - 0x54, 0x0a, 0x4c, 0x5d, 0x4c, 0x77, 0x4a, 0x57, 0x92, 0x0e, 0xe4, 0x32, 0x4f, 0xe3, - 0x16, 0xb5, 0x29, 0xd4, 0xb6, 0x17, 0x27, 0x82, 0xb8, 0xa7, 0x27, 0x43, 0x41, 0x3b, - 0xf0, 0x4f, 0x66, 0x4a, 0xb2, 0x5c, 0x64, 0x55, 0xb2, 0xcb, 0xc2, 0x12, 0x71, 0x9c, - 0xc0, 0x8a, 0x79, 0xb9, 0xca, 0x5a, 0x39, 0x0c, 0x34, 0x1d, 0x06, 0x54, 0x00, 0xa8, - 0xa7, 0x2e, 0x29, 0x36, 0x16, 0xb9, 0x4e, 0x02, 0xcc, 0x71, 0x6c, 0x53, 0x4b, 0x0a, - 0x8f, 0x97, 0x06, 0x57, 0x7a, 0x31, 0xa6, 0xbe, 0x38, 0xfa, 0xbd, 0x23, 0xf6, 0x5b, - 0x32, 0x23, 0x02, 0x42, 0xd7, 0x8d, 0x49, 0xc7, 0x65, 0x08, 0xe9, 0x1c, 0x53, 0xaa, - 0xe5, 0xde, 0x6a, 0x78, 0xba, 0xc3, 0xcf, 0x39, 0x8f, 0x42, 0xc0, 0xef, 0x9e, 0xaa, - 0x56, 0x70, 0xa1, 0xa2, 0x34, 0x26, 0xaa, 0x00, 0xae, 0x12, 0x3c, 0x71, 0x91, 0xc2, - 0xd0, 0xcc, 0x85, 0x8a, 0xa0, 0xbc, 0x11, 0xf3, 0x86, 0x52, 0xe0, 0xdc, 0x6a, 0x5b, - 0xd2, 0x39, 0x29, 0xa1, 0x22, 0xec, 0x19, 0xe1, 0x5c, 0xc9, 0x5d, 0x4b, 0x5a, 0xda, - 0xbf, 0x40, 0xa6, 0x4e, 0x39, 0x20, 0x79, 0xad, 0xd9, 0x05, 0x4a, 0x8a, 0x47, 0xa9, - 0xa0, 0xcd, 0x02, 0xbf, 0xa9, 0x50, 0x96, 0x73, 0xae, 0xc6, 0x63, 0xb6, 0xe5, 0xdc, - 0xd0, 0xf2, 0xf0, 0x4a, 0x70, 0x2e, 0x1e, 0xc4, 0x83, 0xf3, 0xe2, 0xdd, 0xd9, 0xcf, - 0xbd, 0xdb, 0xd9, 0x05, 0x7f, 0x91, 0xdc, 0x5b, 0x43, 0x6b, 0xd2, 0xb2, 0x9b, 0xd9, - 0xa9, 0x8e, 0x35, 0x2c, 0xa5, 0x9d, 0x12, 0x0d, 0x04, 0x30, 0x1c, 0x0f, 0x0c, 0x2c, - 0x95, 0x1d, 0xcb, 0xc7, 0xbc, 0x4f, 0x66, 0x9a, 0xf4, 0x83, 0xc8, 0x82, 0x8f, 0x46, - 0xce, 0xbd, 0x7c, 0x08, 0x5f, 0x9f, 0x4d, 0xd3, 0x08, 0x02, 0x9c, 0xfc, 0xdd, 0x1a, - 0xc4, 0xb4, 0x78, 0x7e, 0x90, 0x6a, 0xca, 0xbb, 0x25, 0xd9, 0xe1, 0x9f, 0x64, 0x1f, - 0x74, 0xd6, 0x65, 0x42, 0x0d, 0x13, 0xad, 0xcd, 0x07, 0x27, 0x86, 0x07, 0x48, 0x99, - 0xac, 0xa3, 0xe1, 0xc8, 0x19, 0x05, 0xac, 0xdb, 0x6a, 0x49, 0xa9, 0x79, 0x67, 0x9d, - 0x26, 0x7e, 0xe1, 0xd7, 0x98, 0x68, 0x1f, 0x0a, 0x64, 0x96, 0x3e, 0xcc, 0x4d, 0x74, - 0xc8, 0x5c, 0x1f, 0x95, 0xa0, 0xc2, 0x48, 0xa2, 0x30, 0xb3, 0x2f, 0x3c, 0x4a, 0x4a, - 0xf3, 0x9e, 0x64, 0x44, 0x7d, 0xf1, 0x20, 0x46, 0x54, 0x67, 0xdd, 0xe1, 0xab, 0xfe, - 0x8f, 0x60, 0x2a, 0xff, 0x32, 0xb2, 0xaf, 0x2f, 0xaf, 0xb1, 0x9f, 0x58, 0xc3, 0x2c, - 0x58, 0x3d, 0x0f, 0x6d, 0xa7, 0x22, 0xb8, 0x20, 0xa9, 0xc6, 0xa0, 0xc1, 0x52, 0xad, - 0x14, 0xf1, 0x06, 0x42, 0x0a, 0xcc, 0x5d, 0x90, 0xc8, 0xa3, 0x81, 0x1a, 0x5b, 0xc1, - 0x45, 0x46, 0x4d, 0xfc, 0xdd, 0x54, 0x52, 0x4b, 0x96, 0x30, 0x8b, 0x24, 0x6a, 0x7b, - 0xe0, 0xab, 0xc8, 0x80, 0x42, 0xaa, 0x6c, 0x51, 0x17, 0xbe, 0x47, 0xaa, 0x30, 0x9d, - 0x4d, 0x30, 0x54, 0x65, 0x3c, 0x91, 0xc0, 0x64, 0xb4, 0xa9, 0x28, 0x85, 0xd8, 0x72, - 0x4d, 0x0d, 0x84, 0xf9, 0x11, 0x44, 0x01, 0xb5, 0x46, 0x41, 0xd4, 0x45, 0x0d, 0xe6, - 0x88, 0x41, 0xbc, 0xdb, 0x05, 0xaa, 0x05, 0xe9, 0x4b, 0x49, 0x78, 0x64, 0x50, 0xc2, - 0xd0, 0x2b, 0x44, 0xdb, 0x32, 0x5e, 0x10, 0x3d, 0xb8, 0x99, 0x57, 0x46, 0xdb, 0xec, - 0x08, 0x04, 0x85, 0x86, 0x63, 0x16, 0x07, 0xf4, 0xa1, 0x94, 0x8c, 0x96, 0xad, 0x63, - 0xb7, 0xee, 0xb3, 0x76, 0x85, 0xec, 0x22, 0xa9, 0xd9, 0x23, 0x1e, 0x4a, 0xd8, 0x84, - 0x55, 0x04, 0x5f, 0xe1, 0xbd, 0x9a, 0xdc, 0xff, 0xe2, 0xc7, 0x57, 0x2f, 0xd5, 0x2d, - 0xfa, 0xe8, 0x23, 0xc9, 0x97, 0xff, 0x6e, 0xa3, 0xba, 0x01, 0xec, 0x90, 0xa8, 0x14, - 0x13, 0x88, 0x7e, 0x90, 0x36, 0xc4, 0x5e, 0x61, 0xb2, 0xa0, 0xb7, 0x39, 0x61, 0x15, - 0x4a, 0x68, 0x82, 0x0b, 0x5c, 0x35, 0x54, 0x38, 0x21, 0x58, 0x28, 0xa7, 0xdc, 0x2b, - 0x96, 0x50, 0xbc, 0x56, 0x2f, 0x40, 0x3e, 0x1d, 0x95, 0xca, 0x20, 0xf6, 0x79, 0x3c, - 0x9d, 0x61, 0xe1, 0x9a, 0xc2, 0x6b, 0x35, 0xb5, 0x43, 0x57, 0x89, 0x31, 0x47, 0x4b, - 0xf3, 0xbc, 0xc9, 0x1e, 0xf2, 0xbc, 0x51, 0xe0, 0x0f, 0x15, 0xfd, 0x4c, 0x5f, 0xcf, - 0x29, 0x07, 0x51, 0x5e, 0x47, 0xb7, 0xa2, 0x5c, 0x6c, 0x41, 0xbe, 0xab, 0x1e, 0x13, - 0xf8, 0xe9, 0xe0, 0x29, 0xea, 0xd5, 0x75, 0xdd, 0xe4, 0xa8, 0xe4, 0xdd, 0xb5, 0x17, - 0xef, 0xcd, 0x7e, 0xbc, 0x97, 0x6d, 0x1e, 0xaa, 0xab, 0x13, 0x8a, 0x9f, 0x1d, 0x05, - 0xe3, 0xbf, 0x09, 0x6d, 0x49, 0xff, 0xfa, 0x50, 0x75, 0x63, 0xd2, 0x14, 0x74, 0xf3, - 0xd1, 0x6e, 0x37, 0x6d, 0x55, 0x51, 0xb1, 0xe8, 0xba, 0xfa, 0x2a, 0xd6, 0x14, 0xad, - 0x7e, 0xf7, 0x66, 0xf5, 0x14, 0xbb, 0x24, 0x32, 0x37, 0x55, 0x1c, 0x30, 0xae, 0xfa, - 0x2e, 0xcc, 0xe2, 0x16, 0x7b, 0x08, 0x0e, 0x6c, 0x3a, 0xb5, 0xfb, 0x20, 0x8b, 0x12, - 0x32, 0xfe, 0x8d, 0x6c, 0x1e, 0x50, 0x71, 0x53, 0x01, 0x04, 0x59, 0x83, 0x2c, 0x65, - 0x18, 0x6f, 0xf6, 0x79, 0x39, 0x16, 0xd9, 0x26, 0xda, 0x7a, 0xf5, 0x24, 0x35, 0xb5, - 0xcb, 0x25, 0x6b, 0x51, 0xd0, 0xf1, 0x3a, 0x2a, 0xde, 0x0f, 0x52, 0xf7, 0x09, 0x05, - 0x9e, 0x64, 0xa7, 0x45, 0x87, 0x33, 0xb5, 0xe7, 0x4f, 0x39, 0x72, 0x5d, 0xa9, 0xeb, - 0xc8, 0xe9, 0x36, 0xf7, 0x61, 0x10, 0x22, 0x96, 0x3e, 0x50, 0x88, 0xf8, 0xa5, 0x17, - 0x66, 0x7f, 0x7d, 0xa3, 0xbb, 0x2e, 0x5c, 0x9b, 0xbc, 0xb4, 0x10, 0xb4, 0x99, 0xde, - 0x52, 0xe3, 0x87, 0x1b, 0xa9, 0x01, 0x60, 0x6d, 0x2c, 0x96, 0x38, 0x2a, 0x81, 0xc7, - 0xfa, 0xf0, 0xf4, 0xa5, 0x92, 0x32, 0x26, 0xaa, 0x0b, 0x13, 0xe1, 0x0f, 0x4e, 0x25, - 0x2a, 0x35, 0xd2, 0x29, 0xcd, 0x87, 0xaf, 0xea, 0xd9, 0x74, 0x45, 0xcf, 0xf6, 0x8f, - 0xd1, 0xa5, 0xfd, 0x07, 0xe8, 0xd2, 0x71, 0x15, 0xa5, 0xff, 0x7d, 0xb3, 0xba, 0xc9, - 0x1e, 0xcf, 0xee, 0xc7, 0x34, 0xaf, 0x71, 0x40, 0x8b, 0x8b, 0xe7, 0xb0, 0x07, 0x0a, - 0x32, 0xd5, 0x48, 0xf4, 0x0f, 0xe8, 0x46, 0x01, 0x51, 0x25, 0x85, 0x54, 0xa1, 0xac, - 0xf5, 0x20, 0x56, 0x4a, 0x3a, 0xe8, 0xf8, 0x57, 0x41, 0x4d, 0x75, 0x43, 0xa5, 0xd7, - 0x4d, 0x96, 0x77, 0xa6, 0x50, 0x1b, 0x65, 0xac, 0x04, 0xf9, 0x5e, 0x81, 0x20, 0x13, - 0xf2, 0x36, 0x20, 0x12, 0x1e, 0xad, 0xa6, 0xda, 0x63, 0x86, 0x68, 0x08, 0x3a, 0x15, - 0xd4, 0x70, 0x4f, 0x14, 0x09, 0x27, 0xd9, 0x65, 0xcf, 0x3b, 0xe1, 0x2b, 0x01, 0xe5, - 0x0f, 0xa7, 0xe5, 0x96, 0xf6, 0x10, 0x6b, 0x4b, 0xcd, 0x4c, 0xd8, 0x63, 0xc9, 0xf2, - 0xca, 0x19, 0x1a, 0x9c, 0x0f, 0x19, 0xba, 0x97, 0x14, 0x5f, 0xbf, 0xc6, 0xce, 0xb8, - 0x12, 0xa5, 0x3c, 0x24, 0x80, 0xf2, 0xd2, 0x4b, 0xb3, 0x9f, 0xa1, 0x00, 0xca, 0xf7, - 0x8c, 0xaa, 0xc7, 0x26, 0x58, 0xef, 0x6b, 0x29, 0x9a, 0x74, 0xda, 0x28, 0xdb, 0x8e, - 0xad, 0xc9, 0xf1, 0xbe, 0x32, 0x18, 0x11, 0x4a, 0xcb, 0xd7, 0x34, 0xe2, 0xe3, 0xd7, - 0x96, 0x34, 0x97, 0xf3, 0x76, 0x28, 0x7b, 0x03, 0x89, 0xa5, 0xe3, 0x70, 0x24, 0xcb, - 0x40, 0xe6, 0x47, 0xdd, 0x1f, 0x6d, 0x57, 0x6c, 0xe2, 0x0e, 0xa0, 0xea, 0x5e, 0x73, - 0x60, 0xf5, 0x3c, 0x36, 0xf1, 0x7c, 0xb0, 0x1a, 0x17, 0x88, 0x10, 0xc6, 0x1b, 0xa9, - 0xcd, 0xfd, 0xd1, 0xeb, 0xd5, 0xf9, 0x49, 0x43, 0x11, 0xd0, 0xde, 0xd2, 0xa5, 0xaf, - 0x65, 0x9a, 0x47, 0x93, 0xc9, 0x45, 0x71, 0x65, 0x8c, 0x1f, 0xef, 0xfc, 0x56, 0x1c, - 0x2d, 0x66, 0x7e, 0x6c, 0xb0, 0xce, 0x3f, 0xd9, 0xa8, 0x14, 0x7b, 0x0a, 0x7d, 0xc9, - 0x01, 0xf1, 0x6c, 0x54, 0xf0, 0x01, 0x6a, 0x87, 0xbb, 0x62, 0x60, 0xfb, 0x9d, 0x9e, - 0xb6, 0xf9, 0xe3, 0x23, 0xf6, 0x23, 0xa3, 0x52, 0x1c, 0x06, 0xce, 0x2e, 0x22, 0xc8, - 0x56, 0xc0, 0x29, 0x0d, 0x78, 0x52, 0xac, 0x42, 0x4a, 0x85, 0x0b, 0x33, 0x8d, 0x7c, - 0x8e, 0x22, 0x19, 0xe7, 0xb1, 0x10, 0x9c, 0xd5, 0x35, 0xdd, 0xcc, 0x11, 0x0b, 0x95, - 0x83, 0x19, 0x58, 0xd4, 0x05, 0xba, 0xe4, 0xc3, 0x5c, 0xa5, 0x7d, 0x91, 0x8b, 0x32, - 0x82, 0x43, 0x4a, 0x12, 0x5a, 0xd3, 0x75, 0x78, 0x41, 0x91, 0x7f, 0x3e, 0xd9, 0xc2, - 0x51, 0x01, 0x87, 0x9c, 0xc1, 0x32, 0xe4, 0x58, 0x33, 0x8b, 0x1a, 0x75, 0x08, 0x04, - 0x29, 0x4b, 0x3a, 0x7b, 0xae, 0xc7, 0xdb, 0xec, 0x8c, 0x68, 0x38, 0x01, 0x4e, 0x7c, - 0x37, 0x4e, 0x5b, 0xc4, 0xf6, 0xa1, 0x20, 0xa1, 0xab, 0xec, 0x64, 0x58, 0xb8, 0x7e, - 0x74, 0xac, 0xdd, 0x4b, 0xaf, 0xcc, 0x1e, 0xeb, 0xca, 0xf4, 0x1b, 0x2d, 0xbe, 0xa4, - 0xe7, 0x8c, 0xde, 0x80, 0x3c, 0x54, 0x94, 0xc8, 0x1f, 0xee, 0x01, 0x4c, 0x7a, 0x30, - 0x94, 0x2b, 0x30, 0x45, 0xc0, 0xa7, 0x8a, 0x9a, 0x3c, 0xf0, 0xac, 0x7a, 0xaa, 0xa4, - 0xd7, 0x2f, 0x43, 0x7d, 0x10, 0xc4, 0xf7, 0x1c, 0x90, 0x03, 0x1a, 0xbc, 0x97, 0x1f, - 0x5c, 0x1c, 0x6d, 0xd5, 0x6a, 0xfb, 0x61, 0x34, 0xda, 0x4b, 0x04, 0x22, 0x93, 0xa7, - 0x5c, 0x67, 0x67, 0x8c, 0xf4, 0xcd, 0x02, 0x73, 0x8a, 0x91, 0x54, 0xaa, 0x7d, 0xfc, - 0x1a, 0x94, 0x7c, 0x24, 0xe3, 0x23, 0x17, 0xce, 0x4b, 0x3a, 0xbd, 0x6b, 0x09, 0x01, - 0xb9, 0x43, 0xde, 0x05, 0xe0, 0xfa, 0x58, 0x88, 0x4e, 0x9a, 0xb6, 0xa2, 0x1e, 0x5a, - 0xec, 0xae, 0xa7, 0x95, 0xd1, 0xdc, 0xa5, 0x8b, 0x61, 0x70, 0x31, 0x1c, 0x34, 0x71, - 0x37, 0xd8, 0x59, 0x13, 0xa4, 0xee, 0xd3, 0x87, 0x62, 0x05, 0x14, 0xe2, 0x32, 0xbd, - 0xbb, 0xf6, 0xd2, 0xab, 0xb3, 0xbf, 0x39, 0x5a, 0x5a, 0x9e, 0xe4, 0x87, 0x47, 0x5b, - 0xf4, 0xe1, 0x87, 0x6b, 0x46, 0xdf, 0xbd, 0x86, 0x55, 0xf9, 0x4b, 0xc9, 0x8a, 0xcc, - 0x7f, 0xcb, 0x3e, 0xcc, 0x6a, 0x4c, 0x53, 0x07, 0x66, 0x70, 0x00, 0x86, 0x25, 0xf1, - 0x60, 0xd2, 0x48, 0x68, 0x9b, 0xab, 0x62, 0xf8, 0xfe, 0x5d, 0x72, 0xcb, 0x2b, 0xc7, - 0x95, 0x95, 0xe3, 0x27, 0xd9, 0xa3, 0x02, 0xe1, 0x3e, 0xd8, 0xd0, 0x7d, 0xd5, 0x2a, - 0x62, 0xbc, 0xf4, 0xe6, 0xec, 0x0f, 0xf4, 0xea, 0x89, 0xdd, 0x5c, 0xd0, 0x02, 0x7a, - 0x62, 0xf1, 0xf8, 0xea, 0xe2, 0x7f, 0xb9, 0xb9, 0x7c, 0x45, 0xfd, 0x83, 0x11, 0xfb, - 0xb1, 0x91, 0xa7, 0x98, 0x13, 0x46, 0xef, 0x64, 0x8e, 0xde, 0x11, 0xaf, 0x41, 0x6b, - 0x50, 0x74, 0x42, 0x53, 0xc0, 0xe1, 0x40, 0x0d, 0xa9, 0x4e, 0x5b, 0x06, 0x07, 0xd8, - 0x62, 0xfc, 0xe6, 0x4b, 0x81, 0xf8, 0x56, 0x33, 0xc6, 0x04, 0x87, 0x8f, 0xe8, 0xe2, - 0xa6, 0x1e, 0xf1, 0xdf, 0x48, 0x09, 0xd2, 0x6a, 0x99, 0x75, 0x6c, 0xd1, 0x06, 0x35, - 0xad, 0x5c, 0x91, 0xc1, 0x92, 0x72, 0x2f, 0x5b, 0xe0, 0x54, 0xac, 0x43, 0x74, 0xad, - 0xd0, 0x36, 0xfe, 0x9d, 0xe3, 0x7a, 0x1f, 0x63, 0x01, 0x2b, 0x73, 0xa4, 0xee, 0x80, - 0xe3, 0x9f, 0xf2, 0x09, 0xa1, 0x6f, 0x36, 0x70, 0x8b, 0x80, 0x52, 0xc1, 0xeb, 0xe8, - 0x54, 0x20, 0x60, 0x09, 0x76, 0xa4, 0xdd, 0x1a, 0x05, 0xd5, 0x72, 0x8d, 0x9d, 0xc6, - 0xdd, 0x7d, 0x00, 0xc5, 0x4d, 0xb2, 0x7d, 0xac, 0x1b, 0xf2, 0xd7, 0x70, 0xd5, 0x86, - 0xec, 0x03, 0xef, 0x73, 0x41, 0x61, 0x4c, 0x3f, 0xdb, 0x3d, 0x97, 0xd8, 0x96, 0x1b, - 0x6c, 0xbf, 0x5c, 0x73, 0xd0, 0xf5, 0xd6, 0xce, 0x27, 0x67, 0xdb, 0xa8, 0x0d, 0x40, - 0x86, 0x48, 0xcb, 0xe5, 0xbe, 0xbc, 0x1a, 0x1b, 0x36, 0xb8, 0x3f, 0x7a, 0x0e, 0xad, - 0x9b, 0x70, 0x74, 0xeb, 0xe6, 0x21, 0xac, 0xcb, 0x4d, 0xa1, 0xdc, 0xd5, 0x35, 0x59, - 0x2e, 0xb1, 0x2d, 0x23, 0x06, 0x94, 0x33, 0xa2, 0x50, 0xce, 0xf4, 0xe4, 0xdc, 0xf7, - 0x6c, 0x55, 0x17, 0xd8, 0xe9, 0x74, 0x22, 0xe7, 0x65, 0x59, 0xc8, 0xcd, 0x7e, 0x60, - 0x93, 0x7d, 0xf7, 0x26, 0xa0, 0xf8, 0x73, 0x1d, 0xb4, 0x1c, 0x9b, 0xc3, 0x63, 0x8d, - 0x12, 0x17, 0x0c, 0x98, 0x5c, 0xd1, 0x37, 0x18, 0x16, 0x03, 0xeb, 0x58, 0x45, 0x85, - 0x35, 0x1b, 0x0c, 0x59, 0x30, 0x58, 0x4f, 0xc9, 0x03, 0x78, 0x06, 0x5d, 0x37, 0xe8, - 0x99, 0x53, 0xb9, 0xd2, 0xb9, 0x6e, 0x84, 0x2c, 0x94, 0xcc, 0x50, 0xa5, 0x89, 0x32, - 0x30, 0x2c, 0xd8, 0xd7, 0x72, 0xaa, 0x89, 0x08, 0x1e, 0x2b, 0x4f, 0xc2, 0xab, 0x4c, - 0x5b, 0xfa, 0x03, 0xe8, 0xd3, 0xb1, 0x6e, 0x3f, 0x94, 0x68, 0xf1, 0x51, 0xe2, 0x9d, - 0x21, 0xea, 0xcc, 0xd2, 0x9d, 0xd3, 0x2c, 0xd2, 0xa7, 0x02, 0x09, 0x06, 0x3c, 0xa5, - 0x2e, 0xe5, 0xa1, 0x05, 0xed, 0x01, 0x89, 0x15, 0x7a, 0x32, 0x0f, 0x2f, 0x85, 0x9e, - 0xac, 0xcd, 0x99, 0x21, 0x86, 0xda, 0x52, 0x9c, 0x4f, 0x51, 0x01, 0xd6, 0xdc, 0xd0, - 0x18, 0x88, 0xbb, 0x41, 0x7b, 0x85, 0xd1, 0x43, 0xf4, 0xf3, 0x40, 0x8c, 0xcc, 0xf3, - 0x5c, 0xae, 0x06, 0x9f, 0xc2, 0x31, 0x9c, 0x88, 0x2f, 0xc5, 0xc7, 0x71, 0x81, 0x9e, - 0xc6, 0xf4, 0x48, 0xae, 0xe1, 0x81, 0x70, 0xc9, 0x5a, 0xa8, 0xb9, 0xee, 0x72, 0xad, - 0x4d, 0xa4, 0x22, 0xa6, 0xcb, 0x01, 0xaf, 0xa7, 0xe1, 0x71, 0x8e, 0x32, 0x4a, 0x91, - 0x0d, 0x1b, 0x78, 0x03, 0x90, 0xcf, 0x15, 0x3e, 0x0a, 0xc7, 0x21, 0x75, 0x17, 0x0b, - 0xd3, 0x41, 0x7f, 0xa7, 0xe8, 0xe1, 0xb2, 0x3c, 0x7a, 0x4f, 0x41, 0x39, 0xd7, 0x1f, - 0x12, 0xf8, 0xaf, 0x2a, 0x3c, 0x38, 0x78, 0x3b, 0xde, 0x0d, 0x37, 0x53, 0x1d, 0x75, - 0x70, 0x97, 0x4a, 0x07, 0xbd, 0x32, 0xf3, 0x98, 0x3a, 0x60, 0xa3, 0x73, 0x35, 0xd6, - 0x5c, 0xa1, 0x54, 0x15, 0x81, 0xbc, 0xda, 0xb2, 0xe3, 0x41, 0x51, 0xc4, 0xec, 0xaf, - 0xc1, 0x89, 0x82, 0xdf, 0xc5, 0x71, 0x10, 0x4d, 0xfa, 0xa4, 0x5c, 0x70, 0x5d, 0x77, - 0x95, 0x21, 0x21, 0xb0, 0xcc, 0xb2, 0x19, 0x3f, 0xcd, 0xc6, 0x21, 0x57, 0xde, 0x43, - 0x81, 0x04, 0x2b, 0x6f, 0x08, 0x31, 0x11, 0xef, 0x00, 0x4d, 0xfb, 0xd2, 0xa7, 0x66, - 0xff, 0xb6, 0xe7, 0xd9, 0x10, 0xd5, 0x13, 0x93, 0xbc, 0x71, 0x0e, 0x4a, 0x08, 0x83, - 0x26, 0xc7, 0x3f, 0x2f, 0x7e, 0xa2, 0xaa, 0x3e, 0xc1, 0x5e, 0x6a, 0x88, 0xa3, 0x2b, - 0xa9, 0xbc, 0xb2, 0xe8, 0xbe, 0xca, 0x64, 0x0c, 0x22, 0xc2, 0xb3, 0xc1, 0xff, 0xe0, - 0x68, 0x5c, 0xf0, 0xf8, 0xcc, 0x74, 0x85, 0x7a, 0xc7, 0x77, 0x69, 0xb3, 0x5f, 0x67, - 0x46, 0x50, 0x79, 0xe2, 0x82, 0x40, 0x41, 0x24, 0x73, 0x12, 0x2d, 0xf9, 0x37, 0x28, - 0x44, 0x1a, 0xf2, 0x5f, 0x2a, 0x83, 0x4f, 0x89, 0xc3, 0x3a, 0x23, 0x6f, 0xc6, 0x4f, - 0xb3, 0xc7, 0x75, 0x39, 0x64, 0xd2, 0x0b, 0x01, 0xc8, 0x57, 0xde, 0x88, 0xfc, 0xd3, - 0x1d, 0x28, 0xe2, 0xf5, 0x5c, 0x9f, 0xc5, 0xec, 0xd8, 0x1e, 0x4a, 0xb2, 0xe3, 0xb1, - 0x3a, 0xdb, 0x58, 0x37, 0x5f, 0xd6, 0xc8, 0x1e, 0x95, 0x41, 0xee, 0xe5, 0xd7, 0x66, - 0xff, 0x70, 0xed, 0xde, 0x1d, 0xce, 0x63, 0xa0, 0x32, 0xce, 0x1a, 0xd6, 0x39, 0x26, - 0x24, 0xa9, 0xa4, 0x60, 0x82, 0x04, 0x00, 0xd2, 0xf7, 0xb4, 0x70, 0x33, 0x54, 0x90, - 0x48, 0xf3, 0x97, 0xd6, 0x75, 0x86, 0x82, 0x9f, 0x04, 0xcc, 0x99, 0xf3, 0x88, 0xc2, - 0x2e, 0x47, 0x2e, 0x2f, 0x56, 0xd5, 0x44, 0x08, 0x4b, 0xa2, 0x7e, 0xed, 0x96, 0x18, - 0xaf, 0x0b, 0x61, 0x91, 0xf0, 0xe5, 0x9b, 0x7a, 0xfa, 0xae, 0xda, 0x09, 0xed, 0xf3, - 0x3e, 0x22, 0x3a, 0xc1, 0x67, 0x55, 0xa8, 0xc6, 0xe9, 0x97, 0x50, 0x47, 0x95, 0xd9, - 0xb6, 0xa2, 0xe1, 0x74, 0xfc, 0x2a, 0x62, 0x17, 0x6f, 0x23, 0xd5, 0x97, 0xab, 0x53, - 0x13, 0x67, 0x3a, 0xef, 0x3e, 0xe1, 0xa0, 0xd2, 0x5d, 0x01, 0x74, 0x9c, 0xee, 0x90, - 0xc4, 0x94, 0x70, 0x2e, 0x4e, 0x6e, 0xa1, 0x6a, 0x2c, 0x7a, 0xbb, 0xe9, 0x76, 0xf0, - 0x2c, 0x2e, 0x0b, 0x5a, 0x2b, 0x25, 0xa4, 0xfb, 0xd8, 0x44, 0x2d, 0x22, 0xc2, 0xba, - 0x86, 0xa5, 0x6a, 0x7d, 0x1d, 0xc7, 0x1d, 0xcc, 0xfd, 0x03, 0x06, 0x73, 0xff, 0xdd, - 0x1e, 0xcc, 0xfd, 0x23, 0x8c, 0xd6, 0xfe, 0x71, 0x46, 0x6b, 0xff, 0x18, 0xa3, 0xd5, - 0x11, 0x0e, 0x43, 0x40, 0xf2, 0x8f, 0xac, 0xb1, 0xef, 0x5f, 0x13, 0xd9, 0x09, 0x82, - 0x1b, 0xb6, 0x2d, 0x02, 0x05, 0x9b, 0xd5, 0xc0, 0x05, 0x47, 0x7c, 0xf6, 0x83, 0xa6, - 0x8a, 0x84, 0x22, 0x36, 0x95, 0xb9, 0xe2, 0x39, 0x11, 0x0b, 0x45, 0x24, 0x2f, 0x28, - 0x09, 0x0a, 0x06, 0x61, 0x61, 0x0a, 0x18, 0x2d, 0x0c, 0x3c, 0x93, 0xe2, 0x12, 0xae, - 0x95, 0x17, 0x39, 0x96, 0x6d, 0x93, 0x66, 0x08, 0x4e, 0x6e, 0x00, 0xa3, 0xa9, 0x45, - 0x5e, 0xff, 0xa2, 0x70, 0xc2, 0xcb, 0xed, 0xc2, 0xc3, 0x6b, 0xe0, 0xba, 0x4f, 0xbf, - 0x04, 0x55, 0x5e, 0x68, 0x11, 0x84, 0x25, 0x4b, 0x32, 0x85, 0x25, 0x76, 0x0d, 0x47, - 0x21, 0x71, 0x87, 0x96, 0xba, 0xdf, 0xcb, 0x33, 0x98, 0x53, 0x5f, 0xb3, 0xac, 0xe3, - 0x7b, 0xf2, 0xa4, 0x20, 0x55, 0x6e, 0xa0, 0xf3, 0xfc, 0xbd, 0x4c, 0xe3, 0x9d, 0x95, - 0xe5, 0x45, 0x1a, 0xef, 0x67, 0xd8, 0x15, 0xcc, 0xe8, 0x44, 0x9d, 0x01, 0x2a, 0x62, - 0x47, 0xdf, 0x98, 0x5e, 0x5d, 0x87, 0xae, 0x47, 0x0c, 0x7d, 0x69, 0x04, 0x30, 0x88, - 0xda, 0x60, 0xb8, 0xc7, 0x82, 0x62, 0xc4, 0x11, 0x8e, 0x32, 0xb8, 0x93, 0x54, 0xc9, - 0x43, 0x88, 0xbc, 0x0f, 0x77, 0xbe, 0x76, 0x25, 0xdf, 0xdd, 0xd9, 0xf7, 0x6f, 0xde, - 0x3b, 0x85, 0xe5, 0x85, 0x8c, 0xac, 0x49, 0xa4, 0x1d, 0x58, 0x09, 0x22, 0xcc, 0xef, - 0x8f, 0x6e, 0x1d, 0x9e, 0x2e, 0x79, 0xcc, 0x52, 0x95, 0x7f, 0x32, 0x33, 0xea, 0xb9, - 0x3e, 0xa3, 0xde, 0x25, 0x76, 0x3a, 0xe9, 0x72, 0x6e, 0xc0, 0x92, 0x07, 0x27, 0xca, - 0xf8, 0x62, 0x29, 0xe2, 0xd9, 0xb9, 0x64, 0x1e, 0x34, 0x39, 0xe3, 0xe5, 0xd7, 0x67, - 0x3f, 0xb3, 0x7e, 0xec, 0x12, 0x6b, 0xff, 0x16, 0x11, 0x0a, 0x6a, 0x90, 0x8a, 0xc2, - 0xd9, 0x55, 0xf0, 0x93, 0xba, 0x79, 0x41, 0x60, 0xa7, 0x05, 0x9b, 0xc1, 0xe0, 0xbd, - 0x05, 0x81, 0xc1, 0xe3, 0xd5, 0x77, 0x0c, 0x19, 0xdd, 0x95, 0x79, 0xe0, 0x6a, 0xa2, - 0x2f, 0x7f, 0x6c, 0xf6, 0xc7, 0xfb, 0x24, 0x81, 0x0b, 0x93, 0x7c, 0xac, 0xaf, 0xff, - 0xbb, 0x3d, 0xa8, 0x02, 0xf5, 0xd1, 0xee, 0xb1, 0x3b, 0xec, 0x62, 0xd2, 0xeb, 0x78, - 0x92, 0xac, 0x9a, 0x50, 0x07, 0xa1, 0x9b, 0x6b, 0x63, 0xf7, 0xe4, 0x09, 0xfa, 0xf0, - 0xa7, 0x30, 0x86, 0x26, 0x5d, 0xae, 0xe8, 0xd6, 0x2b, 0xa0, 0x0a, 0x0d, 0x31, 0xe1, - 0xe6, 0x1a, 0x3b, 0xe7, 0x79, 0x0b, 0xb3, 0x57, 0x6d, 0x03, 0x0f, 0xc1, 0xc2, 0x3b, - 0x9a, 0xdd, 0x0c, 0x04, 0xc6, 0xd4, 0x66, 0xde, 0x00, 0x82, 0x19, 0x60, 0x74, 0xf0, - 0x0f, 0xc4, 0x9c, 0xc8, 0xf6, 0x2e, 0x34, 0xdc, 0x96, 0x0e, 0xd9, 0x2d, 0xf6, 0x28, - 0x42, 0x74, 0xa6, 0x00, 0x04, 0xf3, 0x83, 0x0e, 0x59, 0xf2, 0x7e, 0xbc, 0xfc, 0xf1, - 0xd9, 0xe7, 0xc1, 0x09, 0xf0, 0xd9, 0x47, 0x27, 0x28, 0x6e, 0x45, 0x4c, 0x42, 0x88, - 0x43, 0x76, 0xc1, 0xfd, 0xd1, 0xf9, 0x6a, 0x2b, 0x23, 0xa9, 0xd6, 0xda, 0x94, 0xe1, - 0x63, 0x8d, 0xf0, 0x57, 0x36, 0x60, 0x84, 0xc5, 0xd0, 0x0b, 0x70, 0x15, 0x7e, 0x34, - 0xbd, 0x1f, 0xe5, 0xa9, 0x02, 0x54, 0x1d, 0x3f, 0x85, 0x5f, 0x00, 0xfe, 0xc6, 0x25, - 0x60, 0x78, 0xdb, 0xd1, 0xb1, 0x92, 0xdd, 0xcb, 0x7b, 0x65, 0x45, 0xfb, 0x8e, 0xa3, - 0x9b, 0xec, 0x21, 0x0f, 0x60, 0x91, 0x02, 0x7a, 0xed, 0x3a, 0x90, 0x48, 0xc7, 0x52, - 0x58, 0x62, 0x04, 0x3c, 0x69, 0x98, 0x99, 0x0f, 0xd5, 0xb4, 0xbd, 0x8e, 0x81, 0x0f, - 0xb4, 0xea, 0x62, 0xe3, 0x77, 0x06, 0x7c, 0xcc, 0x4e, 0x84, 0xfe, 0xa7, 0x64, 0xd7, - 0x94, 0xbf, 0xbb, 0xf6, 0xf2, 0x9b, 0xb3, 0x1b, 0x5d, 0x45, 0xfa, 0x85, 0xea, 0xd6, - 0x04, 0x83, 0xe4, 0xcb, 0x8d, 0xe0, 0xc9, 0x0a, 0x0e, 0xb1, 0x13, 0x78, 0x13, 0xe9, - 0x25, 0xd7, 0x09, 0xb9, 0xba, 0x40, 0x93, 0x39, 0x5e, 0x13, 0x02, 0x75, 0x31, 0x53, - 0x5d, 0x99, 0xf8, 0x23, 0x5b, 0xdb, 0x23, 0xbf, 0xbd, 0xc1, 0x21, 0x3f, 0xf5, 0xab, - 0xd1, 0xc1, 0xfd, 0x07, 0x7c, 0xfb, 0xaa, 0xd5, 0x85, 0xf3, 0x6c, 0x17, 0xa7, 0x30, - 0x33, 0x34, 0x0f, 0x0e, 0xbd, 0x3f, 0xb8, 0x56, 0x31, 0xb6, 0xc5, 0x77, 0xbb, 0xb4, - 0x9b, 0x58, 0x5f, 0x9b, 0x8b, 0x21, 0x5b, 0x2b, 0x12, 0x53, 0x8e, 0x6f, 0xb0, 0x33, - 0x7c, 0x77, 0x69, 0xc4, 0x92, 0x5b, 0xf4, 0xa2, 0x3c, 0x88, 0xcc, 0x7a, 0xe5, 0xb9, - 0xd9, 0x3f, 0x27, 0xc8, 0x95, 0xae, 0x2e, 0x2e, 0x16, 0xec, 0x5f, 0x11, 0xd7, 0x95, - 0x6d, 0xc5, 0xf9, 0xa7, 0x8f, 0x43, 0x1a, 0x77, 0xcc, 0x83, 0xeb, 0x77, 0x9d, 0xaf, - 0x1e, 0x63, 0x27, 0x7b, 0x6c, 0x70, 0x80, 0xd6, 0x64, 0x5f, 0xaa, 0xd8, 0x5f, 0xad, - 0x64, 0x46, 0x8b, 0x38, 0xa2, 0x8a, 0xa2, 0x6a, 0x52, 0x22, 0x17, 0xa3, 0xb3, 0x39, - 0x77, 0x5a, 0xe6, 0x60, 0xbe, 0x28, 0xa1, 0x07, 0x82, 0x85, 0x68, 0x3b, 0xcf, 0x21, - 0x1b, 0x3e, 0x45, 0xe8, 0x16, 0xf0, 0xe6, 0x52, 0xfd, 0x29, 0x29, 0xc8, 0xfb, 0x20, - 0xb2, 0x0b, 0x30, 0x59, 0xe9, 0x22, 0x57, 0x03, 0x8a, 0xa2, 0x43, 0xf8, 0xab, 0x91, - 0x9c, 0x42, 0x4d, 0x89, 0xab, 0x8d, 0xa8, 0x1b, 0xd0, 0x98, 0x6f, 0xb0, 0xe4, 0x08, - 0xe1, 0x5d, 0xa6, 0x44, 0x58, 0x91, 0xa1, 0x2e, 0x49, 0x25, 0xcd, 0x69, 0x0b, 0xb1, - 0x91, 0x26, 0x37, 0x55, 0xc8, 0x63, 0x17, 0xa0, 0xa3, 0xd8, 0x2b, 0xca, 0x3c, 0x83, - 0x8c, 0x04, 0x44, 0xbd, 0x60, 0x45, 0x60, 0x4a, 0x69, 0x20, 0xd6, 0x0b, 0xf4, 0x45, - 0x66, 0x0e, 0xbc, 0x26, 0xe3, 0x68, 0xb8, 0x44, 0x27, 0x03, 0x7d, 0x8c, 0xc5, 0x24, - 0x84, 0xd0, 0x42, 0x94, 0xa9, 0xd6, 0x92, 0xcc, 0x9f, 0xa3, 0x50, 0x6f, 0xa2, 0x72, - 0x4a, 0xb9, 0x9a, 0x0e, 0x7c, 0x05, 0xc1, 0x21, 0x14, 0xf9, 0x92, 0x80, 0x05, 0x8e, - 0x0a, 0x7c, 0xb9, 0x42, 0xa7, 0xc1, 0x41, 0xdd, 0xf2, 0xc4, 0x81, 0x4a, 0x20, 0x1e, - 0xcc, 0x87, 0x10, 0x2a, 0x57, 0xe6, 0x43, 0x47, 0x4d, 0xf6, 0x9b, 0x60, 0x7a, 0x11, - 0x3c, 0x9b, 0x72, 0x65, 0x24, 0x15, 0x86, 0x75, 0x79, 0xa0, 0x6d, 0x2e, 0xb5, 0xa7, - 0x80, 0x0f, 0x8c, 0xd0, 0x1e, 0x2a, 0x63, 0x73, 0xa8, 0x6c, 0x5f, 0x7e, 0x45, 0xaf, - 0x97, 0xf8, 0x59, 0x7d, 0x8a, 0xba, 0x26, 0x7f, 0x74, 0x46, 0x14, 0xd1, 0xb0, 0xe3, - 0x63, 0x4b, 0xed, 0x55, 0x49, 0xfc, 0xca, 0x38, 0x86, 0xc8, 0xbb, 0xc7, 0x73, 0x7a, - 0xbe, 0x34, 0x36, 0x14, 0x28, 0x74, 0xba, 0xdb, 0x67, 0x06, 0x15, 0x4b, 0x68, 0xed, - 0x92, 0x4e, 0x98, 0x87, 0x11, 0x27, 0x16, 0x6a, 0x63, 0xb9, 0xb6, 0xcc, 0x0f, 0xbc, - 0x0d, 0xeb, 0xdc, 0x82, 0x63, 0xaf, 0x1e, 0xae, 0xb4, 0xc9, 0xee, 0xb3, 0xda, 0x66, - 0xbf, 0x1c, 0xc6, 0x5e, 0xa3, 0xd1, 0x86, 0x70, 0x4d, 0xce, 0xb6, 0x1c, 0xc9, 0x58, - 0xe8, 0x50, 0x4c, 0x33, 0x46, 0x3b, 0xa7, 0xa4, 0x6a, 0xf4, 0xe1, 0x99, 0x52, 0xbc, - 0x19, 0x6b, 0x21, 0x96, 0x65, 0xe9, 0x9b, 0x74, 0xc2, 0xd7, 0xe4, 0x1a, 0xb3, 0xca, - 0x63, 0xe4, 0xcd, 0x6a, 0x87, 0x94, 0x8f, 0xa9, 0x07, 0x8e, 0xa0, 0x60, 0x16, 0x80, - 0xff, 0x54, 0x4b, 0x09, 0x56, 0xa0, 0xc6, 0x92, 0x5e, 0x51, 0x62, 0xb1, 0x77, 0xb8, - 0x23, 0x2d, 0x6f, 0x4b, 0x9d, 0x57, 0x1c, 0x28, 0x0c, 0x91, 0x3d, 0x04, 0x73, 0xc4, - 0xb0, 0xc4, 0x5d, 0x14, 0x9a, 0xd3, 0x8c, 0x18, 0x99, 0xbe, 0x4d, 0x48, 0x95, 0x1d, - 0x59, 0x52, 0x13, 0xbd, 0xb0, 0xc3, 0xa5, 0x57, 0x47, 0xe9, 0xd2, 0x0a, 0x84, 0xaf, - 0xb5, 0x0d, 0xc7, 0x19, 0xf7, 0xb6, 0xa6, 0xf7, 0x10, 0xd6, 0x37, 0x3a, 0x4c, 0x00, - 0xac, 0xa3, 0x0c, 0x50, 0xd8, 0x6b, 0x1e, 0x95, 0xa1, 0x6c, 0x5c, 0x0d, 0xc3, 0xa1, - 0xa3, 0x15, 0x75, 0x34, 0x01, 0x93, 0x5c, 0x60, 0xc0, 0xa0, 0x08, 0xa0, 0xae, 0x63, - 0x30, 0xd9, 0x89, 0x09, 0x2d, 0x2d, 0x56, 0xf2, 0x2f, 0x4b, 0x0a, 0x3c, 0x7f, 0x3a, - 0x0d, 0xb5, 0xe1, 0x34, 0xb0, 0x0a, 0x8c, 0x5d, 0xeb, 0xe7, 0x32, 0xba, 0xd4, 0x15, - 0x18, 0x5d, 0x87, 0x5a, 0x74, 0x54, 0x0e, 0xeb, 0x53, 0xa5, 0xa1, 0xf4, 0x14, 0x54, - 0xf3, 0xf9, 0xb3, 0x0c, 0xf8, 0x3e, 0x73, 0x5c, 0x80, 0xe3, 0xab, 0xc0, 0x91, 0x6b, - 0xea, 0x68, 0x24, 0x88, 0x07, 0xe3, 0x15, 0xfa, 0x10, 0xe9, 0x52, 0x28, 0x7e, 0x5b, - 0x2f, 0xd2, 0x77, 0x83, 0x1f, 0x57, 0x11, 0x8d, 0x7d, 0xea, 0xbe, 0x15, 0x35, 0xd1, - 0x18, 0x08, 0x67, 0xbd, 0x2f, 0xd9, 0x12, 0x04, 0x08, 0xb0, 0xc1, 0x39, 0x42, 0x0f, - 0xa9, 0x8e, 0x6c, 0x95, 0x95, 0x68, 0x93, 0xf9, 0x7e, 0x6e, 0xc4, 0xfe, 0xe1, 0xc8, - 0x65, 0xe7, 0x00, 0x51, 0x21, 0x12, 0xb8, 0xc5, 0x96, 0xd0, 0x03, 0x05, 0xd2, 0x73, - 0x11, 0xee, 0x22, 0x02, 0xb2, 0x58, 0x41, 0x69, 0xd3, 0x2d, 0xb9, 0x0e, 0x3b, 0xae, - 0xa6, 0x34, 0x69, 0x5e, 0x88, 0x19, 0x72, 0x82, 0x53, 0xcc, 0x0c, 0xa1, 0x72, 0x2f, - 0x6f, 0x32, 0xac, 0xfc, 0x4c, 0xef, 0xc8, 0x05, 0x73, 0xc8, 0x54, 0x26, 0x7e, 0x75, - 0x64, 0x54, 0x89, 0xd9, 0xcd, 0x54, 0xba, 0x87, 0xf1, 0x7a, 0x7a, 0x88, 0x00, 0xe6, - 0x9f, 0x3a, 0xaa, 0xf6, 0x61, 0x64, 0x0a, 0x96, 0x90, 0xab, 0x2b, 0x3c, 0x7f, 0xdb, - 0x96, 0x5d, 0xf5, 0x79, 0x46, 0x84, 0x10, 0x22, 0xe6, 0x28, 0x29, 0xb8, 0xf5, 0xdc, - 0x10, 0xe1, 0x57, 0xb4, 0xba, 0x67, 0xd9, 0xad, 0xc9, 0xee, 0xb3, 0xb4, 0x86, 0xa9, - 0x47, 0x62, 0x4e, 0x54, 0x9d, 0x9a, 0x42, 0x33, 0xfd, 0x30, 0x6f, 0x1e, 0x73, 0xf9, - 0x41, 0x84, 0xfc, 0x41, 0x7a, 0xb2, 0xb6, 0x1a, 0x11, 0x16, 0x14, 0x64, 0xaa, 0x23, - 0xc5, 0x40, 0xfa, 0x2f, 0xd6, 0xd9, 0x09, 0xf8, 0xec, 0x15, 0x8a, 0x92, 0x74, 0x43, - 0xd0, 0xae, 0xcd, 0x5f, 0xba, 0xc2, 0xb6, 0x8c, 0x1d, 0x5c, 0x36, 0xb6, 0x55, 0x06, - 0x5f, 0x79, 0x7e, 0xb6, 0xd3, 0x55, 0x06, 0x9f, 0xaf, 0x1e, 0x9a, 0xb8, 0xa5, 0x59, - 0x0b, 0x0f, 0xd3, 0xaa, 0x20, 0xce, 0x1d, 0x59, 0x8f, 0x1f, 0x19, 0xfc, 0xa2, 0xeb, - 0x52, 0x1f, 0xe0, 0xc0, 0xea, 0xb8, 0x00, 0xda, 0x97, 0xd1, 0x34, 0x18, 0x6b, 0xe7, - 0x76, 0x5e, 0xea, 0x03, 0x1c, 0x1a, 0x5c, 0x7e, 0xbc, 0x9d, 0x5b, 0x11, 0x45, 0x1d, - 0x15, 0xd6, 0xa0, 0xcb, 0x4f, 0xf8, 0xce, 0x11, 0xba, 0xa8, 0x32, 0x49, 0xf0, 0x4e, - 0xa7, 0x96, 0xc9, 0x05, 0xd0, 0x03, 0x3c, 0x04, 0xb8, 0x91, 0x91, 0xdb, 0xc6, 0xa0, - 0xeb, 0xf1, 0xb6, 0x20, 0xd0, 0x97, 0x8f, 0x36, 0xd4, 0x8e, 0xc4, 0x4f, 0x54, 0xa1, - 0x8e, 0xce, 0xfa, 0x18, 0xb4, 0xad, 0xb1, 0x3a, 0x9d, 0xf2, 0x4e, 0xd1, 0x55, 0x19, - 0x55, 0x80, 0x00, 0x39, 0x70, 0xbc, 0xda, 0xe0, 0x52, 0xd3, 0x1a, 0xcb, 0xe2, 0x06, - 0x6d, 0x5d, 0x5d, 0x32, 0x54, 0x1e, 0xe9, 0xe6, 0x73, 0xf5, 0xd8, 0xc1, 0x46, 0xa2, - 0xc4, 0xe4, 0xcf, 0x74, 0x2b, 0x7a, 0x75, 0x73, 0x58, 0x00, 0xf9, 0x21, 0xc6, 0x9b, - 0xe9, 0x7f, 0xc5, 0xf8, 0x04, 0xfc, 0x47, 0x8c, 0xb7, 0xf0, 0xbf, 0xa2, 0xe4, 0x49, - 0x9c, 0x9b, 0x78, 0x6d, 0xea, 0x89, 0xb6, 0xf5, 0x44, 0xbf, 0xf5, 0x76, 0x1f, 0x3e, - 0xa2, 0xcd, 0x78, 0xc3, 0x6b, 0xa3, 0xc7, 0x9b, 0xe9, 0x7f, 0xed, 0xf8, 0x04, 0xfc, - 0x27, 0x53, 0x75, 0x7f, 0xb0, 0xba, 0xd0, 0xd5, 0x8a, 0x97, 0x8e, 0x39, 0x83, 0xd5, - 0x99, 0xb3, 0x03, 0x80, 0x49, 0xa5, 0xe3, 0x8c, 0xf4, 0xfc, 0x20, 0xff, 0xfb, 0x9a, - 0xef, 0xe6, 0x97, 0xe4, 0xaf, 0xb4, 0x4b, 0x32, 0x75, 0x3e, 0x3f, 0xfa, 0x04, 0xfb, - 0xa0, 0xb3, 0x99, 0xbe, 0x04, 0x34, 0x2b, 0x63, 0x09, 0xd6, 0x09, 0xfa, 0x9a, 0x26, - 0x5d, 0x0a, 0x30, 0x3a, 0xce, 0x45, 0x2f, 0x62, 0x68, 0x54, 0x09, 0x33, 0xb4, 0xcb, - 0xdf, 0xe6, 0x62, 0x10, 0x43, 0x4f, 0x5e, 0x0d, 0x66, 0x9c, 0x4a, 0x3a, 0x0a, 0x84, - 0x8a, 0xea, 0xe1, 0xce, 0x28, 0x39, 0x8c, 0x03, 0xf5, 0xfd, 0x9f, 0x21, 0xf8, 0x5d, - 0x2f, 0xc3, 0x53, 0xff, 0x67, 0x23, 0xf6, 0x6b, 0xb5, 0xcb, 0x75, 0xe7, 0x14, 0x02, - 0x8c, 0x6c, 0xc8, 0x71, 0x36, 0xa0, 0x4e, 0x25, 0x3c, 0x7c, 0x5a, 0xeb, 0x3e, 0x2a, - 0x08, 0x3b, 0x82, 0xaa, 0xa1, 0x03, 0x46, 0xf0, 0xe0, 0x94, 0xf3, 0xd1, 0xa9, 0x64, - 0xdf, 0x45, 0xab, 0xa0, 0xe6, 0x18, 0x9c, 0x1f, 0x3e, 0x7a, 0x5d, 0x47, 0xe0, 0xdb, - 0x51, 0x7e, 0x11, 0xe4, 0xae, 0x9d, 0x92, 0x16, 0x8c, 0xbb, 0xf1, 0x37, 0xb2, 0xaf, - 0xc3, 0x6e, 0x64, 0xf0, 0x8c, 0x43, 0x38, 0x34, 0xa9, 0xa9, 0xe0, 0x4b, 0x33, 0x3e, - 0xd7, 0x3e, 0xc6, 0xf0, 0x9f, 0x42, 0xdc, 0x33, 0x17, 0x4b, 0x9f, 0xac, 0xc9, 0xcc, - 0x78, 0xaf, 0x61, 0x92, 0x5f, 0x79, 0xf1, 0x00, 0xf8, 0xbc, 0x76, 0xea, 0x70, 0x3b, - 0xe4, 0xdf, 0xac, 0x43, 0x1d, 0x62, 0xa5, 0xa9, 0x22, 0x83, 0xcf, 0x70, 0x88, 0xb0, - 0xc7, 0x7e, 0x25, 0x7b, 0x93, 0x02, 0x88, 0x0d, 0xe5, 0xfb, 0xea, 0xac, 0x2b, 0x3a, - 0xd2, 0x1f, 0x74, 0xc1, 0x28, 0x4b, 0x4a, 0xbf, 0x23, 0xe3, 0x80, 0x14, 0xaf, 0xa4, - 0x0c, 0x64, 0x26, 0xb8, 0xba, 0x8b, 0xb6, 0x48, 0x26, 0xa4, 0x2a, 0x80, 0xd4, 0x17, - 0x19, 0x37, 0x2d, 0x89, 0x56, 0xd6, 0xbb, 0x60, 0xa1, 0xa4, 0xa3, 0xd0, 0x15, 0xa6, - 0x28, 0xb3, 0xc8, 0x40, 0x61, 0xf2, 0x5a, 0x3e, 0x04, 0xa4, 0x7c, 0xb0, 0xe1, 0x78, - 0x99, 0x9d, 0x74, 0xdc, 0x0e, 0x73, 0xe6, 0x6d, 0x86, 0x1b, 0xbf, 0xf2, 0xd2, 0xec, - 0xa7, 0xb6, 0xfa, 0xb0, 0xd2, 0x63, 0xd4, 0x0c, 0xda, 0x6c, 0x94, 0xee, 0xc4, 0x35, - 0x96, 0xc8, 0xfe, 0x61, 0x41, 0xdc, 0xbe, 0x05, 0x7a, 0xb4, 0xb7, 0x8c, 0xcc, 0x71, - 0xc1, 0x47, 0x7f, 0x71, 0x0d, 0x9c, 0x90, 0xc6, 0xf6, 0x7d, 0x44, 0x9f, 0x62, 0x5f, - 0x67, 0x82, 0x2e, 0xa4, 0xca, 0x60, 0xa5, 0x90, 0xf1, 0x50, 0x54, 0x7d, 0x32, 0x49, - 0x5c, 0x36, 0xfb, 0x14, 0x1a, 0x34, 0x7a, 0x58, 0x8f, 0xc9, 0x04, 0x8d, 0x6e, 0x9b, - 0xb1, 0x63, 0x37, 0x6d, 0xd0, 0xa4, 0xc1, 0x90, 0xc2, 0x92, 0x4d, 0xc1, 0x64, 0xb1, - 0x0e, 0x6e, 0xb4, 0x81, 0xd2, 0x63, 0x1e, 0xc8, 0xf6, 0x7f, 0x79, 0xf6, 0x37, 0x7a, - 0x28, 0xe0, 0xe3, 0x94, 0x78, 0x7a, 0x00, 0x62, 0xa1, 0x8d, 0xea, 0x12, 0xd0, 0xe8, - 0x18, 0xe7, 0x0b, 0xd7, 0x7b, 0x87, 0xb5, 0xe5, 0x29, 0xf6, 0x90, 0xd0, 0x5e, 0x34, - 0x39, 0xd1, 0xdc, 0xf4, 0x29, 0x4c, 0xb4, 0x17, 0x12, 0xbd, 0x6f, 0x8a, 0x5d, 0x49, - 0xb2, 0xd0, 0xf9, 0xb4, 0xa7, 0xbc, 0x0a, 0x49, 0xe7, 0x13, 0x02, 0x6a, 0x2e, 0x0e, - 0x35, 0x39, 0x97, 0x29, 0x1f, 0x1e, 0x58, 0x93, 0x0b, 0x90, 0xdf, 0xb5, 0x54, 0x93, - 0x83, 0xa3, 0xef, 0x3f, 0x54, 0x45, 0xee, 0x95, 0xae, 0x22, 0xf7, 0x6e, 0x1c, 0xa6, - 0xef, 0xfc, 0x24, 0xad, 0xfe, 0xe5, 0x7a, 0x75, 0x99, 0x3d, 0x42, 0xc5, 0x9c, 0xa1, - 0x48, 0x57, 0xbf, 0x0c, 0x0d, 0x96, 0x95, 0xce, 0x51, 0x2c, 0x40, 0x6c, 0xa6, 0x81, - 0xe7, 0xc9, 0x3e, 0xb0, 0x6e, 0x4e, 0x56, 0x97, 0x25, 0x63, 0x9c, 0x13, 0x78, 0x04, - 0x8f, 0xb6, 0xfc, 0x93, 0x6a, 0x6d, 0xb3, 0xfc, 0x53, 0x4e, 0x45, 0x53, 0xd9, 0xc3, - 0xd1, 0x5e, 0xa2, 0xc3, 0x10, 0x58, 0x9a, 0xe8, 0x27, 0x9f, 0x89, 0x9c, 0xda, 0x9f, - 0x60, 0x15, 0x48, 0x3f, 0xe7, 0xd1, 0xb5, 0xe6, 0x43, 0x0b, 0x84, 0x50, 0xf9, 0x10, - 0x1a, 0x7f, 0x88, 0x4d, 0xf0, 0x6e, 0xa5, 0x2d, 0x62, 0xad, 0xd1, 0x54, 0xd2, 0x48, - 0x97, 0x6e, 0x0b, 0x7b, 0x53, 0xb7, 0x78, 0x44, 0x5e, 0x02, 0xab, 0xf8, 0x69, 0x10, - 0x55, 0x7d, 0xf4, 0x5d, 0xfe, 0xea, 0xec, 0x1f, 0xf5, 0x90, 0x12, 0xd3, 0xc3, 0xe1, - 0xf1, 0x9b, 0x30, 0x27, 0x45, 0x53, 0xeb, 0xc6, 0x32, 0x3a, 0x1a, 0xf4, 0xc8, 0x3f, - 0x10, 0x98, 0xf3, 0x7b, 0x32, 0xc1, 0x98, 0xed, 0x67, 0x60, 0xbe, 0xc9, 0x76, 0x65, - 0xcb, 0x62, 0x14, 0x31, 0x8d, 0x97, 0xd8, 0xfe, 0x62, 0x40, 0x34, 0x78, 0x9e, 0x62, - 0x49, 0x23, 0x68, 0xe8, 0xe7, 0x4e, 0x0d, 0x28, 0xcc, 0xb2, 0xc4, 0x51, 0x1a, 0xdf, - 0x86, 0x75, 0x69, 0x1a, 0x84, 0xf5, 0x58, 0x39, 0xc8, 0xc6, 0x34, 0xef, 0x00, 0xa3, - 0xf8, 0xca, 0x6b, 0xb3, 0xbf, 0x43, 0xb0, 0xf3, 0xf1, 0xca, 0x11, 0x3a, 0x5e, 0xc0, - 0xe7, 0x0f, 0x23, 0xd7, 0x91, 0x20, 0xc3, 0xb4, 0x13, 0xf2, 0x09, 0xb0, 0x90, 0x44, - 0x40, 0xdd, 0x61, 0x8e, 0x00, 0x4d, 0x64, 0xe1, 0x17, 0x88, 0x65, 0x0a, 0x0b, 0x81, - 0x1d, 0x25, 0x05, 0xe7, 0x7c, 0x8c, 0xd1, 0x22, 0x70, 0x2a, 0x8a, 0xd6, 0x01, 0x35, - 0x0c, 0x02, 0x61, 0x19, 0xe3, 0x27, 0x08, 0xe2, 0xaa, 0xbb, 0xd1, 0x1f, 0xa0, 0x43, - 0x3a, 0x78, 0x58, 0x2e, 0xb1, 0x4a, 0x51, 0x10, 0xba, 0xdb, 0x01, 0x8f, 0x81, 0x9c, - 0x57, 0x3e, 0x3a, 0xfb, 0x41, 0x1a, 0xa9, 0x1b, 0xcb, 0xca, 0x50, 0x3e, 0x38, 0x33, - 0xdb, 0x9f, 0xe8, 0x45, 0xc8, 0xda, 0x00, 0xe1, 0xe7, 0xd8, 0xaf, 0xca, 0x8c, 0xa3, - 0xe8, 0xe0, 0x20, 0x0c, 0xb9, 0x00, 0xef, 0x21, 0xf8, 0x53, 0x2d, 0xf1, 0x45, 0xc2, - 0x8e, 0x34, 0x1a, 0xf7, 0x3c, 0xe0, 0x34, 0x31, 0xc3, 0x9c, 0x0a, 0x70, 0x73, 0x80, - 0xd8, 0x71, 0xe4, 0x7b, 0x30, 0x7e, 0x1e, 0xb5, 0xaf, 0xf1, 0xc8, 0x50, 0x7b, 0x9d, - 0x45, 0xe7, 0xf6, 0xe4, 0x96, 0xb1, 0x20, 0x7f, 0xc7, 0x57, 0xd9, 0x99, 0x46, 0x2a, - 0xeb, 0xfa, 0x7d, 0x92, 0x5b, 0x6a, 0xa1, 0x68, 0xe5, 0xd1, 0xd7, 0xda, 0xc7, 0x66, - 0xff, 0xe7, 0xe8, 0xab, 0x18, 0x59, 0xfc, 0x27, 0x6b, 0xa8, 0xcf, 0x22, 0x1e, 0xb3, - 0x5f, 0xdd, 0xe6, 0x75, 0xe6, 0x15, 0x27, 0x9b, 0x17, 0xd8, 0xfd, 0x34, 0x39, 0x9b, - 0x91, 0xfa, 0x09, 0xd6, 0x9e, 0x27, 0x37, 0xb9, 0x00, 0xfe, 0x06, 0xd7, 0x53, 0x4b, - 0x20, 0x3b, 0x9a, 0xcb, 0x1c, 0xb4, 0x38, 0x0b, 0xa9, 0xf8, 0x66, 0x58, 0xb9, 0xb2, - 0x25, 0x7d, 0x3a, 0xea, 0x70, 0x24, 0xdd, 0x53, 0xca, 0x81, 0xee, 0x99, 0x75, 0xe3, - 0xbb, 0x6b, 0xaf, 0xbc, 0x31, 0xfb, 0x7b, 0x34, 0x44, 0xc7, 0x8b, 0x48, 0xa8, 0xfb, - 0x23, 0x71, 0x1c, 0x05, 0x72, 0x23, 0x2d, 0x90, 0x63, 0x8d, 0xf6, 0x17, 0x96, 0x2b, - 0x90, 0xbf, 0x8c, 0x7d, 0xdc, 0x04, 0xf4, 0x7d, 0x01, 0xc6, 0x10, 0xac, 0x33, 0x3c, - 0x9c, 0x11, 0x7d, 0xa7, 0xd2, 0x19, 0x13, 0x33, 0xb0, 0xb0, 0x21, 0x77, 0x31, 0x86, - 0x39, 0x1c, 0x07, 0x05, 0x04, 0x64, 0x40, 0x7f, 0xeb, 0xa3, 0x3e, 0xc9, 0x29, 0xfe, - 0xfb, 0x0c, 0xbb, 0x64, 0xe9, 0x25, 0x88, 0xfa, 0xec, 0x70, 0x08, 0xf5, 0xf4, 0x48, - 0xe2, 0x3d, 0x7b, 0xa0, 0xd5, 0x39, 0x9b, 0x7d, 0xa1, 0xa7, 0x47, 0x3e, 0x53, 0x5d, - 0x98, 0xa4, 0xcf, 0x0d, 0x2b, 0xf2, 0x5d, 0xa6, 0x80, 0xc4, 0x83, 0x06, 0x87, 0x81, - 0x6d, 0x96, 0x0e, 0xe8, 0x97, 0x89, 0x13, 0x4e, 0x91, 0xfd, 0xdd, 0x8e, 0xe9, 0xcb, - 0x4c, 0x66, 0x38, 0xa7, 0x7a, 0xeb, 0x6d, 0x4a, 0xd5, 0x03, 0xb4, 0x65, 0x6a, 0xd8, - 0x20, 0x1b, 0x0b, 0x74, 0xa9, 0xa4, 0x78, 0x76, 0x46, 0x41, 0x29, 0xc5, 0x03, 0x85, - 0xcd, 0x1f, 0x05, 0xe8, 0xa4, 0x04, 0x48, 0xa5, 0x59, 0x59, 0xe0, 0x69, 0x7b, 0x9b, - 0x9d, 0x4b, 0x12, 0x73, 0x40, 0x04, 0xd7, 0xb7, 0xa9, 0xb6, 0xd9, 0xb9, 0xb0, 0xbc, - 0x4d, 0x38, 0x2a, 0x8a, 0xee, 0x95, 0x4f, 0xcc, 0xbe, 0x4c, 0xab, 0x7b, 0x72, 0xb8, - 0x65, 0x84, 0xc7, 0xf7, 0xfd, 0xd1, 0x95, 0x9e, 0xac, 0xb0, 0xdd, 0x14, 0x10, 0x1f, - 0x8e, 0xb7, 0x86, 0x7f, 0xd7, 0x89, 0xea, 0x3c, 0x3b, 0xdd, 0x48, 0x5b, 0xd2, 0xfd, - 0x49, 0xb7, 0x63, 0xdf, 0xbe, 0xce, 0xfe, 0xe9, 0x1a, 0x65, 0xe1, 0xe6, 0xdc, 0x47, - 0x99, 0x01, 0x51, 0x39, 0x0c, 0x41, 0x31, 0x01, 0x83, 0x71, 0x8b, 0xe2, 0xf7, 0x07, - 0x38, 0x69, 0x83, 0x20, 0xad, 0x9c, 0x45, 0x8e, 0x86, 0xb2, 0x80, 0x00, 0x01, 0x55, - 0x9d, 0x51, 0x99, 0x03, 0xdd, 0xe1, 0x63, 0x7c, 0x86, 0xfb, 0x06, 0x8a, 0x03, 0x77, - 0x2c, 0x6c, 0x78, 0x72, 0xa7, 0x94, 0xeb, 0x34, 0x13, 0xdc, 0xe4, 0x4a, 0x30, 0xdd, - 0x92, 0x4f, 0x8d, 0x84, 0x57, 0xeb, 0x02, 0x9f, 0xd6, 0x08, 0xaa, 0x36, 0x14, 0x35, - 0xb1, 0xd4, 0x0e, 0x49, 0x82, 0xba, 0x9f, 0x41, 0x51, 0x36, 0x0b, 0xf7, 0x23, 0xe7, - 0x8f, 0x2e, 0xac, 0xa7, 0x19, 0x17, 0x85, 0xdf, 0x81, 0x0f, 0xb7, 0xbd, 0x41, 0xa0, - 0xe8, 0x47, 0x3a, 0x56, 0x02, 0x41, 0x28, 0x08, 0x8d, 0xdb, 0xde, 0xd5, 0x28, 0x4d, - 0x9d, 0x0b, 0x78, 0x47, 0x3d, 0x54, 0xc6, 0x65, 0x8b, 0x48, 0xb8, 0xc2, 0xb6, 0x6c, - 0x18, 0x28, 0xdd, 0xb6, 0x44, 0xf9, 0x0f, 0x4d, 0x3d, 0xba, 0x81, 0xe8, 0xfb, 0x25, - 0xf4, 0xc4, 0x25, 0x89, 0xe5, 0x03, 0xec, 0x3c, 0x65, 0xd6, 0xdb, 0x79, 0x14, 0x32, - 0x4a, 0x33, 0x34, 0x7d, 0x4a, 0x8e, 0xf2, 0xa1, 0xd6, 0x4b, 0x77, 0x65, 0xbf, 0x39, - 0xbb, 0x9a, 0x17, 0xf6, 0x85, 0x09, 0x92, 0x91, 0xac, 0xf6, 0x13, 0x6f, 0x48, 0x11, - 0xdd, 0xc1, 0x0c, 0xc4, 0xc5, 0xa3, 0xdc, 0xa0, 0x57, 0xb8, 0x49, 0x32, 0xf2, 0xfe, - 0xe8, 0x76, 0xf5, 0xd0, 0x44, 0x2e, 0xdd, 0x0c, 0x67, 0xb0, 0x25, 0x7a, 0x91, 0x8f, - 0xab, 0xcc, 0xfe, 0xe5, 0xb5, 0xea, 0x06, 0x3b, 0x9f, 0xc3, 0xf2, 0x6e, 0x2f, 0x8a, - 0xa6, 0xe7, 0x13, 0x04, 0x72, 0x45, 0xb6, 0xcd, 0x1e, 0x6a, 0xa4, 0x75, 0xf3, 0x81, - 0xa6, 0x82, 0xe9, 0xc6, 0x65, 0x06, 0x2b, 0x88, 0xbb, 0xad, 0x60, 0x1c, 0xde, 0x66, - 0xa7, 0x85, 0xa7, 0x6c, 0x21, 0x3f, 0xe4, 0x6e, 0x17, 0x42, 0x4a, 0x29, 0xef, 0x5c, - 0x65, 0x5b, 0x90, 0xe2, 0x1e, 0x86, 0x64, 0xed, 0x78, 0xfd, 0x50, 0x21, 0xf3, 0xa9, - 0xd9, 0x57, 0x88, 0xd1, 0xf0, 0xea, 0x2a, 0x4e, 0x68, 0x0c, 0xfd, 0x1f, 0x0d, 0xa4, - 0x76, 0x4c, 0x2c, 0xce, 0x26, 0x12, 0x8a, 0xd8, 0x25, 0x3e, 0xd5, 0x7f, 0x3e, 0x62, - 0x3f, 0x39, 0xb2, 0x2e, 0x53, 0xbb, 0x71, 0x1e, 0x55, 0x32, 0x4e, 0xa3, 0x6e, 0x14, - 0xb8, 0x4c, 0x4d, 0xb4, 0x50, 0xf4, 0x0e, 0xe4, 0x80, 0xb1, 0x25, 0x63, 0x16, 0xc3, - 0xc3, 0x39, 0xbe, 0x8d, 0xcd, 0x20, 0xfe, 0xe6, 0x73, 0xb5, 0x87, 0x12, 0xe7, 0x45, - 0x8f, 0x1d, 0x04, 0x07, 0xa3, 0xf3, 0xd1, 0x37, 0xa6, 0x9b, 0x20, 0x16, 0xe6, 0x0e, - 0x9c, 0x3c, 0x58, 0x27, 0x1a, 0x44, 0x01, 0x90, 0xf8, 0x96, 0x52, 0x54, 0xf8, 0xa0, - 0x30, 0xf7, 0xd1, 0x36, 0x3a, 0x93, 0x47, 0xc8, 0x24, 0x5f, 0xa2, 0x6d, 0x90, 0xb4, - 0x4c, 0x20, 0x2d, 0x17, 0x14, 0xcf, 0x0a, 0x48, 0x91, 0xbe, 0xe0, 0x65, 0xb5, 0x2e, - 0x53, 0xb5, 0x8e, 0x7f, 0x11, 0x7e, 0xf3, 0x7b, 0xcf, 0xb3, 0xfc, 0xe9, 0x9e, 0x67, - 0xf9, 0xbb, 0x46, 0xa3, 0xbe, 0x73, 0xd9, 0x3a, 0x71, 0xf8, 0xc2, 0xff, 0x3f, 0xd6, - 0xaa, 0x09, 0x00, 0x5c, 0x33, 0x27, 0xa5, 0xc9, 0x34, 0xef, 0x35, 0x51, 0x17, 0xd4, - 0xad, 0x47, 0xe4, 0x32, 0x3b, 0xa9, 0xb5, 0x1a, 0xb0, 0x0b, 0x6b, 0x55, 0x38, 0x72, - 0x4c, 0xe6, 0x8d, 0x36, 0xe8, 0x5f, 0x00, 0x9b, 0xd9, 0x66, 0x0a, 0x47, 0x84, 0x6d, - 0x00, 0xa6, 0x22, 0xcd, 0xb3, 0x2b, 0x29, 0xad, 0x45, 0x21, 0xc9, 0x64, 0xbf, 0x47, - 0xd6, 0x03, 0x2f, 0xb2, 0x2d, 0xcd, 0xfb, 0x10, 0x4a, 0xf2, 0x10, 0xdd, 0x5d, 0x7b, - 0xe5, 0x1b, 0x66, 0x3f, 0x4b, 0x5a, 0xcb, 0xce, 0xe1, 0x5a, 0xcb, 0x29, 0xad, 0x63, - 0x68, 0x90, 0x18, 0xf5, 0xd2, 0x2a, 0x90, 0xec, 0x9a, 0x3e, 0x1e, 0x82, 0xe8, 0xef, - 0xae, 0x55, 0x17, 0x80, 0x0f, 0x41, 0xdb, 0xa1, 0x91, 0xf8, 0x59, 0xf6, 0x2b, 0x73, - 0xae, 0x11, 0xf2, 0x39, 0x97, 0xc0, 0x74, 0xd6, 0x1f, 0x4c, 0xd3, 0x83, 0xba, 0x48, - 0xc2, 0x12, 0xa0, 0x4b, 0x09, 0xa9, 0xa0, 0x55, 0x32, 0x15, 0x35, 0x65, 0x7e, 0xa3, - 0xea, 0x60, 0x2c, 0x8c, 0x2d, 0x9d, 0xd9, 0x43, 0x06, 0x74, 0x9c, 0xa8, 0x27, 0xd8, - 0x09, 0xdb, 0xb7, 0x0e, 0x2d, 0x9e, 0xb4, 0xdb, 0xdb, 0xec, 0xe1, 0xf4, 0x78, 0x1f, - 0xa2, 0x47, 0x77, 0x45, 0xf7, 0x6e, 0x4c, 0x29, 0xbd, 0x73, 0x89, 0x25, 0xcd, 0xd1, - 0xf7, 0xcd, 0xcf, 0xf4, 0xcb, 0x2a, 0xc4, 0x65, 0x77, 0xc9, 0x7e, 0x66, 0xf6, 0xbf, - 0x6d, 0xdc, 0x5b, 0xe7, 0x5c, 0x7c, 0x95, 0x6c, 0xc9, 0x7f, 0x7c, 0xa2, 0xe2, 0xec, - 0x56, 0xd2, 0x38, 0xcb, 0x19, 0x88, 0xae, 0xd1, 0xcc, 0x76, 0x10, 0x32, 0xb2, 0xa0, - 0x93, 0xf8, 0xf2, 0x1b, 0xd8, 0x3c, 0x93, 0x0b, 0x41, 0x7e, 0x51, 0x21, 0x70, 0xc9, - 0x80, 0x2d, 0xdd, 0xb2, 0x0a, 0x09, 0xe4, 0x81, 0xc4, 0xdf, 0x90, 0x3d, 0x2a, 0xa3, - 0xa0, 0xe0, 0x47, 0xe0, 0xdf, 0x09, 0x75, 0x34, 0x3e, 0x17, 0x6e, 0x58, 0x56, 0x30, - 0xfd, 0x7b, 0x46, 0xec, 0xdb, 0x47, 0x85, 0x53, 0x7d, 0x6a, 0xc2, 0xbc, 0x8b, 0x14, - 0x22, 0x52, 0x21, 0x08, 0xd8, 0xd8, 0x16, 0xbc, 0x44, 0x09, 0xf2, 0xda, 0x64, 0x94, - 0x01, 0x82, 0xb0, 0x4c, 0xc1, 0xeb, 0xb8, 0xd0, 0xa9, 0xdd, 0x83, 0xf1, 0x35, 0x64, - 0x63, 0x4d, 0xb6, 0x49, 0x49, 0x1b, 0x45, 0x8f, 0xc2, 0xa0, 0x67, 0x47, 0x64, 0x8d, - 0xb1, 0xec, 0x0a, 0x91, 0xa0, 0x16, 0x33, 0x26, 0xc3, 0xed, 0xc5, 0x8e, 0x6e, 0x11, - 0xf6, 0xe9, 0xac, 0x6f, 0x73, 0xc5, 0x7d, 0x67, 0x19, 0x78, 0xf6, 0x24, 0x82, 0x47, - 0x05, 0xf1, 0x67, 0xc2, 0x3a, 0x47, 0xa9, 0xce, 0x01, 0xfe, 0x3d, 0xe8, 0x59, 0xf6, - 0x99, 0x77, 0x97, 0xcd, 0xab, 0xaf, 0xcf, 0xfe, 0xe6, 0x89, 0x7b, 0x8f, 0x13, 0x1d, - 0x2b, 0x02, 0xe5, 0x00, 0xc9, 0xc3, 0xc3, 0xbc, 0xde, 0x25, 0x68, 0xbb, 0x59, 0xa5, - 0x35, 0x5c, 0xa6, 0xe5, 0x01, 0xba, 0xfe, 0x90, 0xe3, 0x31, 0x29, 0x13, 0x8f, 0x4e, - 0x86, 0x1c, 0x1c, 0x0b, 0xac, 0x07, 0xc9, 0xae, 0x1f, 0x4f, 0x02, 0xef, 0xd9, 0x94, - 0xab, 0xc8, 0x8f, 0xd7, 0x43, 0xba, 0xe1, 0x72, 0x75, 0xae, 0xbd, 0xa1, 0x1b, 0xfb, - 0x4f, 0x97, 0x3f, 0x3f, 0xfa, 0x26, 0xf6, 0x3a, 0x39, 0x79, 0xd0, 0xed, 0x4d, 0x28, - 0x12, 0x85, 0xc1, 0x1b, 0x97, 0x14, 0x75, 0xe2, 0xf5, 0xe4, 0xc9, 0x9e, 0x8a, 0xae, - 0x91, 0x00, 0xce, 0x6a, 0xf0, 0x80, 0x45, 0xd8, 0xd7, 0x34, 0x0c, 0x87, 0x2f, 0xd7, - 0x8f, 0xe8, 0x6d, 0x1d, 0xc7, 0x6e, 0x29, 0xde, 0xfd, 0x72, 0xdc, 0x2d, 0x69, 0x2e, - 0x80, 0x2f, 0x3d, 0x2c, 0x78, 0x50, 0x04, 0x78, 0x93, 0x06, 0xea, 0xe6, 0x17, 0xd6, - 0xc9, 0xf2, 0x5d, 0x60, 0x43, 0xff, 0x2f, 0xd6, 0xd8, 0xcf, 0x8d, 0x64, 0x0b, 0x47, - 0x14, 0x54, 0x46, 0x4a, 0xd9, 0x39, 0x55, 0xc6, 0x00, 0x26, 0x7b, 0x2c, 0xd9, 0x9a, - 0xcc, 0x0f, 0x00, 0x1f, 0x92, 0x0f, 0x91, 0x8b, 0x82, 0x95, 0x84, 0x93, 0x01, 0x4e, - 0x22, 0x07, 0x60, 0x46, 0x43, 0x5c, 0xa5, 0xd3, 0x8c, 0x02, 0x04, 0xd7, 0x84, 0xe9, - 0x95, 0x8d, 0xb2, 0x08, 0xbf, 0x33, 0x48, 0xc1, 0x60, 0x89, 0x44, 0x49, 0x53, 0xad, - 0x02, 0x8e, 0x51, 0x51, 0xe1, 0xa0, 0x62, 0x16, 0xe5, 0x8d, 0x02, 0xe1, 0xaa, 0xcb, - 0x5b, 0x24, 0x60, 0x69, 0x03, 0x07, 0x2e, 0x5f, 0x3d, 0x20, 0xd7, 0xe7, 0x2a, 0xb3, - 0x92, 0xba, 0x90, 0x8b, 0x05, 0xfb, 0x90, 0xad, 0xa2, 0x25, 0x65, 0x14, 0x4a, 0xc0, - 0xf4, 0x2a, 0x3b, 0xdd, 0x2c, 0x8c, 0x94, 0x3c, 0x19, 0xde, 0x41, 0xde, 0xe1, 0xab, - 0x6f, 0xcc, 0xfe, 0xf5, 0x7a, 0xcf, 0x13, 0xd7, 0x5f, 0xed, 0xd3, 0x63, 0x4a, 0xcf, - 0xaf, 0x6c, 0x56, 0x37, 0xd9, 0x13, 0x19, 0xee, 0x64, 0x76, 0x7c, 0xc9, 0xe6, 0xb1, - 0x3b, 0xdd, 0x28, 0xf3, 0xcb, 0x4c, 0x88, 0xc2, 0x16, 0x49, 0xf1, 0x8c, 0x62, 0xb3, - 0xf2, 0x0c, 0x21, 0x34, 0x85, 0x46, 0xaf, 0x94, 0xa8, 0xb0, 0x7d, 0x9e, 0xab, 0xbb, - 0x4c, 0x83, 0xb8, 0x02, 0xeb, 0x57, 0x50, 0x91, 0x8f, 0x52, 0xbd, 0x16, 0x9d, 0x96, - 0xd1, 0x08, 0x74, 0x71, 0x8a, 0x1d, 0x2c, 0x5a, 0x6b, 0x7a, 0x85, 0xfa, 0xb3, 0x48, - 0xdd, 0xbe, 0xc9, 0xce, 0xfa, 0x4c, 0xa2, 0xae, 0x77, 0x6c, 0x37, 0x04, 0xd2, 0xca, - 0x2f, 0xc5, 0xae, 0xdb, 0x12, 0x34, 0x23, 0xf2, 0x6b, 0x9d, 0x5f, 0xdb, 0xc9, 0x21, - 0x4d, 0x9f, 0x2b, 0x4f, 0x58, 0x31, 0x20, 0x82, 0xb9, 0xc2, 0x2a, 0x47, 0x24, 0x72, - 0x5d, 0x92, 0x49, 0xbd, 0x44, 0x42, 0xbd, 0x39, 0xfb, 0xd6, 0xf5, 0xae, 0x17, 0xea, - 0xc9, 0x52, 0xc7, 0x48, 0x2f, 0x0d, 0x1f, 0x8b, 0xc2, 0x4a, 0x74, 0x71, 0x42, 0x81, - 0xb9, 0x83, 0x58, 0x80, 0x36, 0xa1, 0x4d, 0x27, 0x3c, 0x3d, 0xcc, 0x23, 0xdb, 0x59, - 0xc1, 0x7a, 0xf4, 0x4c, 0xf5, 0xf8, 0x04, 0x23, 0x3d, 0x5d, 0xb7, 0xe2, 0xce, 0xc0, - 0x65, 0x03, 0x2d, 0xca, 0x1d, 0x4f, 0x4c, 0x3a, 0x44, 0xa7, 0x2b, 0x5e, 0xb0, 0xd1, - 0xe1, 0x94, 0x16, 0xd5, 0x13, 0x13, 0x9c, 0x8b, 0x83, 0x5e, 0x72, 0x02, 0x9b, 0x94, - 0xb7, 0x5c, 0xe8, 0xde, 0xb3, 0x3c, 0x3d, 0xbe, 0x73, 0xc7, 0xaa, 0x75, 0x7d, 0x9b, - 0x3d, 0x92, 0xf6, 0xad, 0x7c, 0xeb, 0xed, 0xdd, 0xe8, 0x64, 0x07, 0xbf, 0x80, 0x14, - 0x6b, 0x56, 0x2e, 0x45, 0xc0, 0xff, 0x49, 0xf2, 0xe1, 0x01, 0x9b, 0x71, 0x4f, 0x92, - 0x09, 0x76, 0x55, 0x12, 0x88, 0x95, 0xd2, 0xc4, 0x3d, 0xfa, 0x99, 0x17, 0x24, 0x6d, - 0xb2, 0x9d, 0x95, 0xe2, 0x7c, 0x7c, 0x99, 0x9d, 0x6a, 0x7a, 0x6c, 0xff, 0x20, 0x42, - 0x29, 0xa6, 0xbe, 0x7d, 0x91, 0x9d, 0xf0, 0xfd, 0x4b, 0x47, 0x8c, 0xa2, 0x79, 0x28, - 0x65, 0x10, 0x28, 0x28, 0x80, 0xc8, 0x59, 0x14, 0x40, 0xd9, 0xed, 0x3a, 0xe8, 0x50, - 0x28, 0x0c, 0x5b, 0xaf, 0x7e, 0x6a, 0xf6, 0x73, 0xeb, 0x07, 0xc4, 0x3c, 0xf4, 0x03, - 0xc7, 0x3c, 0xfe, 0x12, 0x62, 0x51, 0x44, 0xae, 0x92, 0xd5, 0x95, 0x12, 0xbf, 0x94, - 0x7d, 0xb4, 0x03, 0x35, 0xa1, 0x5c, 0x7d, 0xd7, 0x35, 0xf5, 0x08, 0x41, 0xdb, 0x60, - 0x19, 0xe5, 0x88, 0x00, 0xe2, 0x88, 0x3c, 0xc1, 0x53, 0x82, 0x93, 0xdb, 0x12, 0xf6, - 0x2d, 0x1b, 0xb3, 0x15, 0x20, 0x35, 0x3b, 0x8f, 0xe1, 0x24, 0x37, 0xe7, 0x54, 0x7e, - 0x66, 0x50, 0x09, 0xa2, 0xf0, 0xdd, 0x5c, 0x61, 0x15, 0xd4, 0xdf, 0x5c, 0xc1, 0x72, - 0x7a, 0x85, 0x55, 0xa1, 0x5f, 0x82, 0xe1, 0x50, 0xa2, 0xd3, 0x4b, 0x6c, 0x4b, 0x8a, - 0x61, 0xe1, 0x09, 0x7a, 0xdd, 0xdd, 0xb5, 0x57, 0x3f, 0x3d, 0xbb, 0x05, 0x02, 0x60, - 0x8d, 0xdb, 0xcf, 0xae, 0x71, 0x4b, 0x9c, 0xec, 0x07, 0x79, 0x28, 0xb0, 0x44, 0xda, - 0xfd, 0x11, 0xaf, 0x1e, 0x5f, 0xa2, 0x55, 0x2c, 0x91, 0x00, 0x81, 0xaa, 0xaa, 0x1d, - 0x40, 0xf6, 0xa0, 0x7c, 0xbf, 0x87, 0xca, 0x2f, 0x27, 0x7b, 0xf8, 0xa1, 0x33, 0xd5, - 0x84, 0x5d, 0x2e, 0xa5, 0x35, 0x33, 0xd4, 0x01, 0x83, 0xe0, 0x2d, 0x2d, 0x31, 0x96, - 0xbf, 0xff, 0x9b, 0xeb, 0xec, 0x4f, 0xaf, 0xcb, 0x4c, 0xfd, 0x40, 0x29, 0x9a, 0x6d, - 0xb6, 0xb7, 0x83, 0xc2, 0x65, 0x94, 0xd5, 0x86, 0xee, 0x2d, 0x48, 0x50, 0x87, 0x3c, - 0x70, 0x9d, 0x19, 0x80, 0x62, 0xd6, 0xb9, 0xd1, 0xad, 0xaa, 0x51, 0xf5, 0x25, 0x4f, - 0xac, 0xcd, 0xb0, 0x73, 0x64, 0xd1, 0x04, 0x57, 0x6c, 0xa4, 0xb0, 0x21, 0xb9, 0x54, - 0x89, 0x0e, 0x1c, 0x59, 0x1f, 0x90, 0x93, 0xb3, 0xd5, 0x99, 0x11, 0xe5, 0xad, 0x49, - 0xc7, 0x31, 0x48, 0x1f, 0xcf, 0x85, 0xc2, 0x93, 0x09, 0x75, 0x4e, 0x7c, 0x10, 0x6a, - 0xed, 0xe9, 0x59, 0x58, 0x16, 0x53, 0x11, 0x79, 0x3a, 0x91, 0x90, 0x2b, 0x4d, 0x1e, - 0xde, 0xa2, 0x5f, 0x74, 0xf2, 0x12, 0xa4, 0xa1, 0xce, 0x64, 0x6b, 0x20, 0xf3, 0xa9, - 0x1b, 0xaa, 0xec, 0x69, 0xa9, 0xff, 0xe0, 0xba, 0x0d, 0xbb, 0xf0, 0x05, 0x04, 0x87, - 0xb7, 0x39, 0x21, 0x23, 0xe7, 0x12, 0x48, 0x38, 0x02, 0xe7, 0x39, 0x4d, 0x39, 0x83, - 0xb7, 0x32, 0x1a, 0x9e, 0xdc, 0x28, 0x99, 0xde, 0x9c, 0xbe, 0x07, 0xab, 0x7a, 0xf2, - 0xa9, 0x46, 0x1a, 0x51, 0x81, 0x3d, 0xb2, 0x14, 0xf2, 0x4b, 0x1f, 0x90, 0x19, 0x2d, - 0x80, 0xfc, 0xbd, 0xa6, 0x63, 0xbd, 0xa3, 0xa7, 0xb7, 0xf9, 0x61, 0xe3, 0x6f, 0x5b, - 0x67, 0xff, 0x78, 0x2d, 0x5b, 0xa1, 0x58, 0x6e, 0x45, 0x13, 0x9b, 0x7e, 0xfe, 0x24, - 0x24, 0x1a, 0x4d, 0x6a, 0x90, 0xc9, 0x99, 0x22, 0xa9, 0x35, 0x24, 0xcc, 0x03, 0x37, - 0x7d, 0x4d, 0xe6, 0x6a, 0x80, 0xc1, 0x57, 0x36, 0x06, 0x91, 0xc7, 0x0d, 0x3c, 0x45, - 0xc0, 0x5e, 0x15, 0x6a, 0x98, 0x6b, 0x37, 0x0f, 0x31, 0xc3, 0xb9, 0x6d, 0xba, 0xa3, - 0x41, 0x1c, 0x3a, 0x0c, 0x3e, 0x16, 0x80, 0xd7, 0x7e, 0x4e, 0x60, 0x45, 0x11, 0x70, - 0xae, 0x65, 0xfa, 0x78, 0x08, 0x3d, 0x2b, 0x7a, 0x09, 0x11, 0x81, 0x24, 0xa3, 0xab, - 0x11, 0xe9, 0xcd, 0xb6, 0xfc, 0x08, 0x08, 0xc7, 0x3a, 0x3a, 0x1e, 0x6a, 0x74, 0xda, - 0x8b, 0x80, 0x9d, 0xc1, 0xf8, 0xb5, 0xc7, 0x17, 0x6a, 0x28, 0x7f, 0x1e, 0x90, 0x72, - 0x29, 0xe4, 0xd9, 0x82, 0x41, 0x26, 0x7a, 0xdf, 0xd4, 0x51, 0x57, 0xe7, 0x30, 0x2c, - 0xbc, 0x59, 0x36, 0x22, 0x75, 0x52, 0xe7, 0x27, 0x02, 0x96, 0x52, 0xc2, 0x97, 0xc1, - 0x05, 0x07, 0x1c, 0x47, 0x81, 0x86, 0xdc, 0xee, 0x11, 0x07, 0x7e, 0x16, 0x94, 0xd9, - 0x02, 0xc5, 0x92, 0x25, 0xa7, 0x7c, 0x71, 0x8e, 0x4f, 0xd9, 0x79, 0x81, 0x34, 0xd6, - 0x69, 0xb7, 0x64, 0x4e, 0x04, 0xd7, 0x71, 0xe0, 0x0e, 0x69, 0xba, 0x3c, 0x0f, 0x0b, - 0xbe, 0xef, 0xe2, 0x28, 0x87, 0xeb, 0x7a, 0xe1, 0x7a, 0x26, 0x5e, 0x58, 0xae, 0x57, - 0xbe, 0xf6, 0xe2, 0xec, 0x23, 0xf7, 0x2e, 0x91, 0x85, 0x00, 0xea, 0x2d, 0xa6, 0x3c, - 0xf2, 0x08, 0x94, 0xe7, 0x99, 0x16, 0x21, 0x19, 0x41, 0xfd, 0x4a, 0xc6, 0xbe, 0xe7, - 0xc8, 0x16, 0x58, 0x6e, 0xcc, 0xce, 0x45, 0x21, 0x68, 0xfc, 0xd0, 0xa0, 0x20, 0x71, - 0xe7, 0x86, 0x31, 0x44, 0xb6, 0xf3, 0xe2, 0xcf, 0xa6, 0xab, 0x06, 0xc6, 0xf8, 0x7c, - 0xbb, 0x4e, 0x9a, 0x45, 0x37, 0xcb, 0xbf, 0xaf, 0x4c, 0x11, 0x0b, 0xe3, 0xa9, 0x32, - 0xd4, 0xa4, 0x5c, 0x0c, 0x6e, 0xd3, 0x5d, 0x00, 0xf6, 0x01, 0xb7, 0xdd, 0xa9, 0x1e, - 0x4a, 0x02, 0xdb, 0xb4, 0xc6, 0x60, 0x8f, 0x87, 0xd1, 0xf0, 0xf1, 0x86, 0x30, 0xc8, - 0xc3, 0x98, 0x0e, 0xd6, 0x73, 0x13, 0xe1, 0x1c, 0xfa, 0xf3, 0x7b, 0x35, 0x5a, 0x85, - 0x73, 0x85, 0x70, 0xe1, 0x5c, 0x31, 0x2d, 0x4d, 0x97, 0xf1, 0xa0, 0x53, 0x12, 0xa0, - 0x06, 0xf3, 0x53, 0xaf, 0x3e, 0x27, 0xd6, 0x3d, 0xd7, 0xdd, 0xef, 0x22, 0x88, 0xf3, - 0x81, 0x16, 0x68, 0xd2, 0x9c, 0xdc, 0x21, 0x4c, 0x23, 0x1f, 0x60, 0x8f, 0x8a, 0x22, - 0xb6, 0x3d, 0x77, 0x62, 0x09, 0x13, 0xb0, 0x13, 0x0b, 0xea, 0x53, 0xf5, 0x6f, 0x4f, - 0x56, 0x63, 0x76, 0xae, 0x65, 0x7f, 0x2a, 0x40, 0x3a, 0xc8, 0xb4, 0x67, 0x3f, 0x3b, - 0x62, 0x7f, 0x77, 0x24, 0x32, 0x59, 0x7c, 0x0e, 0xcd, 0xc1, 0x21, 0x91, 0xb9, 0xf9, - 0xf2, 0x9d, 0x26, 0x97, 0xc2, 0x69, 0xa4, 0x26, 0x02, 0x28, 0x12, 0x3a, 0xd8, 0xd0, - 0x10, 0x43, 0x14, 0x5e, 0xf2, 0x9d, 0xb4, 0x0f, 0x57, 0x8a, 0xdd, 0xa0, 0x76, 0x6e, - 0xb0, 0xb2, 0x0c, 0xb2, 0x97, 0x10, 0xf8, 0xc1, 0xe1, 0x61, 0x66, 0xf6, 0x4a, 0x24, - 0x8d, 0xae, 0x67, 0x0e, 0x82, 0x3d, 0xa4, 0x95, 0xcb, 0x88, 0xb8, 0x24, 0x4b, 0x88, - 0xb2, 0xb5, 0xd3, 0x9c, 0xe7, 0x1f, 0x1b, 0x55, 0x90, 0x81, 0x5d, 0x62, 0x81, 0x2d, - 0xb2, 0xf7, 0xc6, 0x3b, 0xec, 0x09, 0x00, 0x6b, 0x49, 0xba, 0xb1, 0x6c, 0xfd, 0x2e, - 0x05, 0x56, 0xa1, 0x73, 0xbb, 0x56, 0x4a, 0xe1, 0xf6, 0xca, 0xaa, 0xb5, 0x96, 0x8b, - 0x61, 0xd7, 0x84, 0x21, 0x22, 0x7c, 0x60, 0x90, 0x9e, 0xfa, 0x39, 0x94, 0x3d, 0xf5, - 0x8b, 0xb0, 0x38, 0x61, 0xb2, 0xda, 0x23, 0xb7, 0xd9, 0x19, 0xe1, 0x1b, 0x13, 0xe6, - 0x8b, 0x8f, 0x36, 0x9d, 0x22, 0x6c, 0x6e, 0xe8, 0xf2, 0x69, 0x6b, 0x4f, 0x5d, 0x62, - 0x5b, 0xce, 0x0e, 0x98, 0xae, 0x6c, 0xd1, 0x72, 0x5e, 0x7b, 0x69, 0xf6, 0xf7, 0x7b, - 0xdc, 0x68, 0x69, 0xf9, 0x8a, 0xfe, 0xe6, 0x5c, 0x50, 0x73, 0xf2, 0x6e, 0xfe, 0x48, - 0xaf, 0xc2, 0x58, 0xc7, 0x23, 0x72, 0x55, 0x92, 0x8a, 0xa8, 0x5d, 0x34, 0x1e, 0xe9, - 0x11, 0x51, 0x1f, 0xc4, 0xed, 0x99, 0x1f, 0x30, 0x5d, 0x05, 0x75, 0x3a, 0xab, 0x39, - 0xf2, 0x26, 0xc2, 0x82, 0xe8, 0xd0, 0xc3, 0xb2, 0x89, 0xf6, 0xab, 0x03, 0x7a, 0x6b, - 0xda, 0x97, 0xb6, 0x1f, 0x48, 0xfb, 0x50, 0xf8, 0x83, 0xdc, 0x40, 0xa2, 0x6d, 0x1d, - 0x8e, 0xa2, 0xb2, 0x41, 0x09, 0x53, 0x4b, 0x35, 0x4b, 0xda, 0x5e, 0xc9, 0xc3, 0x21, - 0x70, 0x95, 0xb3, 0xe9, 0xb0, 0xea, 0xc8, 0x26, 0x53, 0x3d, 0x3e, 0xf1, 0x8b, 0x3b, - 0x5f, 0x0f, 0x77, 0xfe, 0x49, 0xba, 0xcd, 0x2c, 0xa9, 0xba, 0xb1, 0xfc, 0xb3, 0xda, - 0xaa, 0x1b, 0x2f, 0x2e, 0x0b, 0xab, 0xa9, 0xc5, 0xfa, 0x16, 0x26, 0xed, 0x45, 0x13, - 0xe6, 0x35, 0x16, 0x2b, 0xc9, 0x7f, 0xf2, 0xfa, 0x20, 0x86, 0xda, 0xcb, 0xec, 0xa4, - 0x17, 0x7e, 0x98, 0x2e, 0xee, 0xb3, 0x7c, 0x49, 0xe6, 0x3c, 0xf5, 0x7c, 0x78, 0x78, - 0x15, 0xf8, 0x66, 0xd2, 0x5b, 0x7f, 0xe4, 0x64, 0xf5, 0x11, 0x26, 0x45, 0xa6, 0x14, - 0x02, 0x50, 0xab, 0x27, 0xd2, 0x00, 0xe2, 0x13, 0xd9, 0xb1, 0x7b, 0xf5, 0x6e, 0x44, - 0xd6, 0x18, 0x2a, 0xb1, 0x1a, 0x4a, 0x8a, 0x99, 0x4c, 0x26, 0xde, 0xa5, 0xb4, 0xb1, - 0x8c, 0xca, 0x95, 0xb4, 0xc8, 0x0e, 0xec, 0x17, 0xc4, 0x96, 0x5d, 0xff, 0xed, 0x6f, - 0x62, 0xff, 0x3f, 0xd3, 0x63, 0x55, 0xce, 0x89, 0x67, 0x5c, 0x44, 0xcc, 0x32, 0x04, - 0x5e, 0xb2, 0xa4, 0x3b, 0x69, 0xe4, 0x41, 0x23, 0x9a, 0x78, 0x4b, 0xea, 0x9c, 0x70, - 0xc4, 0x8b, 0x46, 0x56, 0x0e, 0x78, 0x79, 0x3b, 0x0c, 0x7b, 0x5d, 0xfa, 0xc8, 0x62, - 0xc2, 0x48, 0x36, 0xc6, 0xfa, 0xc6, 0xe0, 0x50, 0xc3, 0xef, 0x91, 0x08, 0x6f, 0x5d, - 0x59, 0xb4, 0xf1, 0xeb, 0xd8, 0x04, 0x92, 0x35, 0x85, 0x8c, 0x64, 0x3d, 0x62, 0x72, - 0x9b, 0x08, 0x75, 0x94, 0xc8, 0x7e, 0x5b, 0x3c, 0x1f, 0xa5, 0xbe, 0xb1, 0xac, 0x44, - 0x10, 0xa4, 0x42, 0xc8, 0x24, 0x9a, 0xdc, 0xa2, 0x68, 0x2a, 0x12, 0xa2, 0xa3, 0x42, - 0xfc, 0x72, 0xf6, 0x26, 0x68, 0x48, 0x1e, 0x6d, 0x3e, 0x85, 0xba, 0x2e, 0x21, 0x65, - 0xb5, 0x03, 0x77, 0x1c, 0x30, 0xc4, 0xc2, 0x34, 0x48, 0x2c, 0x19, 0x06, 0xf9, 0xa1, - 0x2a, 0x1a, 0x83, 0x48, 0xdf, 0x3a, 0x8d, 0x87, 0x71, 0x4b, 0x06, 0x22, 0x97, 0x11, - 0x4c, 0x62, 0xe7, 0xa3, 0xb3, 0xbf, 0xba, 0x75, 0xef, 0x2c, 0xb2, 0x99, 0x20, 0x26, - 0xbd, 0x6e, 0xb9, 0xb7, 0x1e, 0x9f, 0xe4, 0x19, 0x5c, 0xdc, 0x50, 0x74, 0xd6, 0x6f, - 0x51, 0x0b, 0x5a, 0xe9, 0x53, 0xc0, 0x08, 0x0d, 0x7d, 0x1c, 0xfd, 0x5b, 0x36, 0x52, - 0x83, 0x52, 0x40, 0xe7, 0xf2, 0x44, 0x18, 0x05, 0xad, 0xc0, 0x2f, 0x75, 0xd0, 0x16, - 0x5c, 0x17, 0x46, 0xa5, 0xb3, 0xfa, 0x4a, 0x12, 0x8c, 0x8d, 0x5b, 0x55, 0x99, 0xef, - 0x74, 0x7e, 0xd3, 0x34, 0x1d, 0xd8, 0x02, 0x1a, 0x22, 0x6f, 0xaa, 0x48, 0x93, 0x3c, - 0x69, 0x89, 0x0b, 0xa6, 0xa0, 0x55, 0x48, 0x33, 0xde, 0x48, 0x57, 0x90, 0xa8, 0x57, - 0xc8, 0xa5, 0x9b, 0x9a, 0xfa, 0xbe, 0x2e, 0x64, 0x52, 0x56, 0x24, 0xe7, 0xb9, 0xb5, - 0x90, 0x4b, 0x40, 0x8f, 0x6d, 0x6b, 0x91, 0x5a, 0x0b, 0x49, 0xef, 0x37, 0x21, 0x74, - 0x71, 0x0a, 0xf8, 0x7e, 0x13, 0x92, 0xfa, 0x13, 0x42, 0x1e, 0x0d, 0x71, 0xd0, 0x68, - 0x4c, 0x61, 0x34, 0xa6, 0x38, 0x1a, 0x10, 0xec, 0xd9, 0xca, 0x57, 0xd7, 0xef, 0xdc, - 0x12, 0x30, 0x1f, 0xf6, 0x00, 0x18, 0xd0, 0xd3, 0xec, 0x02, 0xb5, 0xa0, 0x1c, 0x52, - 0x13, 0x42, 0xab, 0x9f, 0xe4, 0x54, 0x51, 0x93, 0xc9, 0xcb, 0xbf, 0x38, 0xba, 0xc5, - 0x2a, 0x01, 0x44, 0x87, 0x40, 0xf9, 0x0b, 0xdc, 0xe5, 0x02, 0xab, 0x03, 0x0a, 0xe4, - 0x3b, 0xe4, 0x9c, 0xf3, 0x24, 0x40, 0xfe, 0xc1, 0xfa, 0xc1, 0x89, 0x00, 0xb7, 0xd9, - 0x39, 0x61, 0xa5, 0xce, 0x5c, 0xf3, 0x83, 0x3c, 0x00, 0x2b, 0xb5, 0x43, 0xc4, 0x44, - 0x60, 0x37, 0xd3, 0xda, 0xd7, 0xc6, 0xd9, 0x98, 0x0e, 0x5c, 0xa9, 0xd3, 0x72, 0x97, - 0x3a, 0x87, 0x73, 0x16, 0xb2, 0x01, 0x82, 0x24, 0x25, 0x7c, 0xfb, 0x06, 0x3b, 0xed, - 0xb9, 0x17, 0x56, 0xe2, 0x36, 0xec, 0xa8, 0xe9, 0xe9, 0x47, 0x50, 0xf3, 0x51, 0x46, - 0x79, 0x27, 0x65, 0x08, 0x00, 0x3f, 0x16, 0xd6, 0xcd, 0xad, 0xd4, 0xf5, 0xe0, 0x96, - 0xc0, 0xa1, 0x4b, 0x3e, 0x70, 0xf9, 0x21, 0x76, 0x3b, 0x03, 0xfe, 0x35, 0x6f, 0x74, - 0x98, 0x73, 0x1b, 0x8d, 0x4d, 0xdd, 0x4a, 0x06, 0x11, 0xfe, 0x03, 0x25, 0x47, 0xfb, - 0xc2, 0xb4, 0xdf, 0xe1, 0xee, 0x77, 0x8a, 0xf8, 0x7f, 0xed, 0x63, 0x7d, 0xc4, 0xff, - 0xf2, 0x59, 0xfd, 0x26, 0xf6, 0x2a, 0xa0, 0x09, 0xf0, 0xdb, 0x41, 0x1f, 0xa4, 0xca, - 0xb7, 0x8b, 0x3d, 0x86, 0x44, 0x6a, 0x18, 0xd4, 0x34, 0x06, 0xe4, 0xed, 0x52, 0x7b, - 0x11, 0x2a, 0xf7, 0x1e, 0x8e, 0xee, 0xff, 0x42, 0x5d, 0xed, 0xb0, 0xeb, 0x18, 0xa7, - 0x0c, 0xa8, 0x1d, 0xba, 0x5e, 0xdd, 0xc1, 0x50, 0x4c, 0x32, 0xbb, 0x23, 0xd4, 0x1e, - 0xfb, 0x73, 0x27, 0xd9, 0x0f, 0x9c, 0x44, 0x5e, 0x38, 0x09, 0x44, 0xdb, 0x4a, 0x45, - 0x24, 0x5d, 0x74, 0x21, 0x7a, 0x5e, 0x77, 0x50, 0x36, 0x64, 0x50, 0x22, 0x93, 0x22, - 0x65, 0xc7, 0x48, 0x53, 0x2a, 0x9a, 0xa5, 0xd5, 0x80, 0xbc, 0x8f, 0x90, 0x6d, 0x43, - 0x55, 0xd1, 0x3a, 0x56, 0x79, 0xa4, 0x0a, 0x47, 0xc8, 0x9c, 0xc9, 0x85, 0x6a, 0x6d, - 0x6e, 0x2e, 0x14, 0x55, 0x3b, 0x33, 0x9e, 0x60, 0x11, 0x48, 0x1d, 0x15, 0xd2, 0x13, - 0x29, 0xfa, 0x6b, 0xb3, 0x1f, 0x04, 0xc1, 0x13, 0xf0, 0x1a, 0x9f, 0xa3, 0x16, 0x54, - 0xbc, 0xcd, 0x14, 0x60, 0x5a, 0xb2, 0xae, 0xb0, 0x72, 0x1b, 0x66, 0x7f, 0x19, 0x74, - 0x1c, 0xa0, 0xfb, 0x45, 0x76, 0x63, 0x99, 0xd9, 0x73, 0x00, 0x00, 0x31, 0x48, 0x15, - 0x02, 0x64, 0x98, 0x21, 0xec, 0xb2, 0x21, 0x4b, 0x2d, 0xfd, 0x43, 0xca, 0xa8, 0x01, - 0x20, 0x8a, 0x8f, 0x2a, 0x70, 0x5c, 0x93, 0x9d, 0x1f, 0x12, 0x6a, 0x43, 0x99, 0xb9, - 0x88, 0xc6, 0xb5, 0xd5, 0xe1, 0xf4, 0x1c, 0x52, 0x18, 0x1c, 0xb6, 0x90, 0x58, 0xc2, - 0x17, 0x9d, 0x2e, 0x1a, 0x4a, 0xf7, 0x02, 0xde, 0x31, 0x26, 0xa3, 0x53, 0x00, 0x66, - 0xc4, 0x63, 0x84, 0x47, 0xe2, 0x48, 0xaa, 0x46, 0x20, 0x7d, 0x36, 0x14, 0x71, 0x73, - 0x0d, 0xc7, 0x53, 0x35, 0xdd, 0x1e, 0x44, 0x5d, 0xb7, 0xfc, 0x24, 0x11, 0xb3, 0x68, - 0x71, 0x96, 0x14, 0x79, 0x6d, 0x54, 0x29, 0xe5, 0x87, 0x11, 0x34, 0x98, 0x27, 0x2e, - 0x15, 0x55, 0x55, 0x96, 0xb9, 0xbe, 0x9c, 0xca, 0xe0, 0x76, 0x49, 0x5c, 0x12, 0x92, - 0xbc, 0x00, 0x9a, 0xd8, 0x14, 0xb0, 0x50, 0x0b, 0x25, 0xd0, 0x99, 0x46, 0xe6, 0xc3, - 0xbe, 0x2d, 0x11, 0x48, 0x54, 0x96, 0x90, 0xf4, 0x4e, 0x3c, 0x19, 0x98, 0x17, 0x87, - 0x3c, 0x1b, 0x22, 0x8a, 0xc6, 0x65, 0xd2, 0x07, 0x78, 0x92, 0x99, 0xfa, 0x5c, 0xc9, - 0xdc, 0x97, 0xde, 0x38, 0x74, 0xe8, 0xb8, 0xec, 0x24, 0xa5, 0x6a, 0x83, 0xb9, 0xfa, - 0x31, 0x84, 0x07, 0x25, 0xa9, 0x1a, 0x2a, 0x97, 0x25, 0x34, 0x8d, 0x46, 0x8c, 0x3e, - 0x04, 0x0d, 0x55, 0xba, 0x11, 0x71, 0xba, 0x8d, 0x54, 0x3e, 0x03, 0x73, 0x1a, 0x61, - 0xe7, 0xb9, 0x48, 0x8d, 0x44, 0x3e, 0x4e, 0x9c, 0x07, 0x04, 0x0a, 0x6a, 0x22, 0xea, - 0xd0, 0x85, 0x7f, 0x1c, 0xde, 0x0f, 0xcb, 0x50, 0xea, 0x82, 0x4d, 0xa4, 0x62, 0x7b, - 0x94, 0x10, 0xd1, 0xaa, 0x40, 0x39, 0xdc, 0x6a, 0x00, 0x73, 0x96, 0x3f, 0x48, 0x23, - 0xf0, 0xc7, 0x93, 0x0f, 0xcc, 0xe7, 0x27, 0x90, 0x87, 0x4e, 0xe6, 0x69, 0xe2, 0xaa, - 0xad, 0x7d, 0x4d, 0xab, 0xd2, 0x10, 0xa5, 0x7a, 0x0e, 0x7d, 0xa3, 0xbf, 0xb0, 0x14, - 0x47, 0x04, 0x82, 0xf4, 0x9c, 0xcf, 0x8f, 0x8b, 0x15, 0x83, 0xf9, 0xb2, 0x4c, 0xaf, - 0x6a, 0xa4, 0x75, 0xc5, 0x65, 0x47, 0xd5, 0x7c, 0x72, 0x49, 0x1d, 0xf4, 0xaf, 0xcb, - 0x69, 0x41, 0x33, 0x97, 0xb4, 0x1b, 0x3b, 0x8f, 0xe4, 0x75, 0x03, 0xd2, 0xd1, 0x0e, - 0x63, 0x57, 0xf7, 0x50, 0x68, 0x81, 0x90, 0xff, 0xae, 0x62, 0x5f, 0xaa, 0x88, 0x69, - 0x95, 0x73, 0xa2, 0x2d, 0x88, 0xd2, 0x97, 0xc2, 0xde, 0x84, 0x01, 0xe0, 0xf8, 0x6c, - 0x01, 0x6c, 0x03, 0x1e, 0xac, 0x35, 0xa8, 0xee, 0x57, 0x24, 0x1f, 0x9d, 0x7a, 0x81, - 0xd8, 0x9b, 0x0a, 0x51, 0x9f, 0xb1, 0xb9, 0xba, 0x40, 0x4c, 0x9b, 0xa7, 0xd4, 0xfd, - 0x20, 0x4a, 0x02, 0x2a, 0x95, 0xd4, 0x58, 0x08, 0x6e, 0x22, 0x15, 0x2b, 0x52, 0x33, - 0x9b, 0x96, 0x7a, 0x01, 0xfe, 0x46, 0xb6, 0x04, 0x21, 0xa0, 0x84, 0x55, 0x26, 0xeb, - 0xc5, 0x24, 0x60, 0xb8, 0x18, 0xe9, 0x00, 0x04, 0xae, 0x82, 0xfc, 0x12, 0x4c, 0x0d, - 0xa4, 0x3f, 0x84, 0xc8, 0x64, 0x80, 0xc2, 0x66, 0x22, 0x84, 0xa9, 0x29, 0xaf, 0xcd, - 0x78, 0xa2, 0xf2, 0xc6, 0x5c, 0x35, 0x1e, 0x03, 0xdd, 0x14, 0xcf, 0xf5, 0x2d, 0x39, - 0x23, 0xbe, 0x55, 0x4c, 0x5d, 0xee, 0x00, 0x91, 0x2d, 0x14, 0x6a, 0x69, 0xfc, 0x39, - 0x64, 0x47, 0x6f, 0xef, 0x1b, 0x38, 0x92, 0x78, 0x20, 0xcc, 0x1d, 0x1b, 0xba, 0x15, - 0x6d, 0x7c, 0x81, 0x33, 0x94, 0x37, 0x29, 0x7a, 0x15, 0x71, 0x1b, 0x5a, 0xfa, 0xdd, - 0xf5, 0x3a, 0x42, 0x3b, 0x87, 0xab, 0x2e, 0x8d, 0xc5, 0x70, 0x40, 0x70, 0x14, 0x33, - 0x31, 0x84, 0xc8, 0x9f, 0x0a, 0x85, 0x1a, 0xf2, 0x28, 0x0e, 0xde, 0x42, 0x1a, 0x62, - 0xdd, 0x92, 0x94, 0x80, 0x99, 0x01, 0x0f, 0x40, 0x0e, 0x49, 0x7c, 0x42, 0xa6, 0xe0, - 0x22, 0x56, 0x1d, 0x9b, 0x6d, 0x87, 0x32, 0x73, 0x78, 0xc7, 0xb4, 0xdc, 0xa0, 0x88, - 0x9d, 0x20, 0x8f, 0x1c, 0x22, 0x6c, 0xeb, 0xa8, 0xf3, 0x08, 0x91, 0x49, 0xa3, 0x6c, - 0x19, 0x08, 0xca, 0x29, 0x27, 0xcf, 0x27, 0xcf, 0x7c, 0x32, 0x01, 0x09, 0x34, 0x4a, - 0x8f, 0x65, 0xe6, 0xda, 0x80, 0xf7, 0xe4, 0x68, 0x90, 0xdc, 0x2b, 0x83, 0x5b, 0x16, - 0xa9, 0x5f, 0x32, 0x09, 0x21, 0xb3, 0x8d, 0xd0, 0x05, 0xe0, 0x0f, 0x17, 0x8a, 0x26, - 0x4c, 0x66, 0x12, 0x71, 0x8e, 0xd1, 0x75, 0x22, 0x65, 0xa1, 0x25, 0x54, 0x6e, 0xb0, - 0x18, 0xa2, 0x5c, 0xb8, 0xc9, 0xe0, 0xe3, 0x33, 0x33, 0x83, 0x71, 0x03, 0x22, 0x8e, - 0x4e, 0x91, 0x30, 0x72, 0x27, 0x65, 0xa0, 0x40, 0xe1, 0x0f, 0x91, 0x2d, 0x17, 0x34, - 0x1f, 0x5c, 0x81, 0xaf, 0xd5, 0xf3, 0x25, 0xed, 0x23, 0x49, 0x78, 0x1a, 0x07, 0x1c, - 0x7b, 0xb5, 0xf0, 0xfa, 0xce, 0x4d, 0xb6, 0x6c, 0x3a, 0xfc, 0xcd, 0x95, 0x9c, 0x0a, - 0x98, 0xa2, 0xb6, 0xb4, 0x4f, 0xe7, 0x1e, 0x07, 0xb5, 0x4a, 0xd1, 0xe7, 0xa5, 0xf2, - 0x75, 0x92, 0x8b, 0x2b, 0x5e, 0xe3, 0xcb, 0x4a, 0x18, 0xfc, 0x48, 0x0f, 0xef, 0xfc, - 0x46, 0x25, 0x30, 0x88, 0xe9, 0x28, 0xd7, 0x4a, 0x83, 0xd0, 0x05, 0x89, 0x1c, 0xe7, - 0x97, 0x7d, 0x7b, 0xbb, 0xa7, 0xcc, 0x80, 0x10, 0x7e, 0xf0, 0x4a, 0xdc, 0xb6, 0xba, - 0x3b, 0x08, 0xbe, 0x5d, 0x0c, 0x72, 0xc8, 0x99, 0x92, 0xdb, 0xc1, 0x58, 0x11, 0xb7, - 0xa8, 0xde, 0x1b, 0x2a, 0xd6, 0xc5, 0x95, 0x1e, 0xb6, 0x5f, 0x66, 0x4f, 0xf3, 0x42, - 0xa0, 0x89, 0x39, 0x7c, 0x64, 0xc8, 0x46, 0xdf, 0xf2, 0xa0, 0x06, 0xf4, 0x44, 0x86, - 0xbd, 0xba, 0x14, 0xcf, 0x54, 0x7d, 0x23, 0xfa, 0x49, 0x76, 0x46, 0x78, 0x4b, 0x9c, - 0xa3, 0x19, 0xcf, 0xac, 0xf6, 0xe4, 0x59, 0xe1, 0x6d, 0x2b, 0xed, 0xe5, 0x75, 0x76, - 0x4a, 0x78, 0x3b, 0xa4, 0xeb, 0x4c, 0x3f, 0x29, 0x0d, 0x4a, 0xe9, 0x0a, 0x6f, 0xfb, - 0x1b, 0xb3, 0xa6, 0x0f, 0x15, 0x00, 0xdb, 0xc8, 0x67, 0x8a, 0x5b, 0x63, 0xc5, 0x78, - 0xc3, 0x58, 0x61, 0xc7, 0x9b, 0xe9, 0x7f, 0x81, 0xb0, 0x8e, 0x8f, 0xee, 0x8f, 0xfe, - 0xd1, 0x69, 0x74, 0x7f, 0x99, 0x05, 0xf7, 0xd7, 0xf3, 0x96, 0xd6, 0x11, 0x8f, 0x12, - 0x28, 0x1d, 0x7c, 0x8b, 0xa4, 0x85, 0x89, 0x15, 0x21, 0xed, 0x0d, 0xaa, 0x96, 0xe7, - 0xc9, 0x29, 0xd0, 0x66, 0xe4, 0xd4, 0x31, 0x8c, 0xff, 0xc7, 0xf5, 0xee, 0x43, 0x10, - 0xaf, 0xa9, 0x10, 0xba, 0x29, 0xa8, 0x7c, 0x46, 0xdd, 0x96, 0xac, 0xc8, 0x47, 0x53, - 0x7b, 0x30, 0x11, 0x58, 0x2d, 0x1f, 0x49, 0x45, 0xfc, 0xd0, 0x05, 0xd5, 0xb9, 0xa2, - 0xf3, 0x4e, 0x44, 0x42, 0x2e, 0xed, 0xda, 0x4b, 0x54, 0xe6, 0x26, 0x1f, 0xcc, 0xc2, - 0xb4, 0x97, 0x6c, 0x59, 0x24, 0xb1, 0x95, 0x83, 0x5d, 0x89, 0x03, 0xca, 0xab, 0x0f, - 0xf3, 0x8e, 0x70, 0x89, 0xaa, 0x2b, 0x73, 0x06, 0x82, 0x24, 0xb3, 0x2d, 0x65, 0x3a, - 0x2e, 0xd1, 0x29, 0x8a, 0x90, 0x94, 0xe3, 0x56, 0xf9, 0x03, 0xed, 0x13, 0x7f, 0x88, - 0x3d, 0x4d, 0xae, 0x55, 0x56, 0x40, 0x33, 0xcd, 0xf7, 0x80, 0x13, 0xa8, 0xb7, 0x39, - 0x23, 0xa8, 0xac, 0xf9, 0x3a, 0x8d, 0xa2, 0x2f, 0xcf, 0x84, 0x3d, 0xd6, 0xdf, 0x46, - 0xe9, 0xdc, 0xcd, 0x6a, 0x10, 0xd5, 0x0b, 0x09, 0xbd, 0x11, 0x90, 0xc4, 0x72, 0x14, - 0xc6, 0xff, 0xeb, 0xd6, 0x8a, 0xa9, 0xeb, 0x68, 0x1a, 0x75, 0x6f, 0x0a, 0xf9, 0x92, - 0xf9, 0x73, 0xfd, 0x09, 0xcc, 0x9d, 0xb1, 0x85, 0x94, 0x6e, 0xa8, 0x4e, 0xe4, 0x73, - 0x1d, 0x8f, 0x4a, 0xd3, 0x19, 0xad, 0x81, 0x16, 0xd1, 0xea, 0x10, 0x1d, 0x0d, 0xa2, - 0xa7, 0x3f, 0xe0, 0xa9, 0x92, 0xb5, 0x07, 0x70, 0x98, 0xb5, 0x5a, 0x04, 0x60, 0xb8, - 0xf2, 0xcb, 0x68, 0xa1, 0x49, 0x9d, 0x4f, 0xb9, 0x46, 0x86, 0x79, 0xa6, 0x24, 0x6e, - 0xcf, 0xeb, 0x45, 0xb5, 0xa1, 0x86, 0x85, 0x56, 0x16, 0xc6, 0x11, 0x34, 0x82, 0xde, - 0x89, 0xdf, 0x5f, 0x8d, 0xf4, 0x9d, 0x54, 0x29, 0x52, 0x96, 0xc1, 0xb1, 0xdd, 0xf6, - 0x9d, 0xd3, 0xba, 0x1c, 0xd1, 0xbd, 0x03, 0x7a, 0xc5, 0xf9, 0xdb, 0x39, 0x7d, 0xdb, - 0xd9, 0x6e, 0x4f, 0xda, 0xfe, 0x92, 0xa7, 0xbd, 0x4c, 0x9f, 0xe4, 0x0b, 0x8c, 0xb5, - 0xee, 0xef, 0x82, 0xee, 0xe9, 0x7a, 0xc0, 0xd9, 0x9a, 0xb7, 0x44, 0xaf, 0xed, 0xb2, - 0x23, 0xb5, 0x77, 0x9a, 0x2e, 0x3d, 0x4b, 0x57, 0x9d, 0xa4, 0xcb, 0xce, 0xd1, 0x85, - 0x53, 0x74, 0xb8, 0xbb, 0x44, 0xbf, 0x65, 0xf7, 0xe8, 0xec, 0x1f, 0x9c, 0x83, 0xd7, - 0x97, 0xf3, 0x72, 0xd9, 0x6e, 0x5c, 0xd2, 0xd3, 0xce, 0xd1, 0x47, 0x9b, 0xb2, 0x77, - 0xe6, 0xad, 0x38, 0xf1, 0xda, 0xc3, 0x6e, 0xd9, 0x51, 0xb7, 0xfc, 0xa0, 0xeb, 0x9c, - 0x71, 0xdd, 0x13, 0x0e, 0xfc, 0x8d, 0x49, 0xd8, 0x7f, 0xf4, 0x70, 0xda, 0xaa, 0xed, - 0x65, 0xae, 0x0a, 0xca, 0xc3, 0xe0, 0x60, 0xdc, 0xcc, 0xcb, 0xe3, 0xfe, 0xd4, 0xfa, - 0xe1, 0x49, 0x4b, 0xdf, 0xb5, 0x7e, 0x24, 0xaf, 0x46, 0x63, 0xa9, 0xc6, 0x7e, 0x76, - 0x6c, 0xbc, 0x87, 0xfd, 0x19, 0x52, 0xb6, 0x2e, 0x8d, 0xc3, 0xfd, 0x19, 0x53, 0x3d, - 0x17, 0xa9, 0x41, 0xb7, 0xde, 0xfd, 0xbb, 0xea, 0xd1, 0x28, 0xd3, 0xf7, 0xca, 0xe1, - 0x91, 0x19, 0xa8, 0x98, 0x05, 0x2c, 0xd3, 0x85, 0xb0, 0x13, 0xa5, 0x05, 0x56, 0x4c, - 0xcc, 0x4f, 0x72, 0xbd, 0xf4, 0x64, 0xb5, 0x37, 0x84, 0x28, 0xf6, 0x3d, 0xd9, 0x9c, - 0xfb, 0x72, 0xe7, 0xd2, 0x24, 0x8a, 0x61, 0xad, 0x42, 0xcd, 0xb3, 0xb6, 0x22, 0x7b, - 0x5d, 0x5e, 0x5a, 0x75, 0x6e, 0x5d, 0x58, 0x3e, 0xde, 0x10, 0x96, 0x97, 0x9b, 0xee, - 0x20, 0x5c, 0x40, 0x2f, 0x61, 0x4c, 0xeb, 0xd7, 0x41, 0x4c, 0x8d, 0x35, 0xc6, 0xe0, - 0xf2, 0x1b, 0x96, 0x87, 0x1f, 0x0f, 0xbb, 0x6d, 0x45, 0xd4, 0x72, 0x5d, 0x78, 0x9b, - 0x6e, 0xb3, 0xe5, 0xb6, 0x80, 0x03, 0xb7, 0x30, 0x05, 0xcb, 0xe3, 0xef, 0xc2, 0x03, - 0x95, 0x1c, 0xdc, 0xbb, 0xca, 0x1b, 0x7a, 0x95, 0x9d, 0x14, 0x7a, 0x98, 0x16, 0x29, - 0x34, 0x0f, 0x8a, 0x1b, 0x69, 0xf9, 0x00, 0xb0, 0xf5, 0xa3, 0xa3, 0xea, 0x21, 0x76, - 0x42, 0xf5, 0x92, 0x48, 0x2e, 0xb2, 0x2d, 0xe5, 0x06, 0x0c, 0xe2, 0x8e, 0x07, 0xc1, - 0xf9, 0xf8, 0x22, 0x41, 0xc1, 0xba, 0x97, 0xfc, 0x03, 0x27, 0x59, 0xbf, 0xf6, 0xf1, - 0xd9, 0x57, 0xbe, 0x9a, 0x14, 0x00, 0xdf, 0xb6, 0x5e, 0x3d, 0x01, 0x30, 0x42, 0xa2, - 0x00, 0xe8, 0x79, 0xe0, 0x5f, 0x67, 0xb6, 0x8b, 0x36, 0xc6, 0x2c, 0x5a, 0x24, 0x5b, - 0x75, 0x08, 0x38, 0xa6, 0x62, 0x0d, 0x08, 0x8e, 0xb7, 0x07, 0x42, 0x8e, 0x6f, 0xb0, - 0xd3, 0x2e, 0x97, 0xbf, 0xec, 0xf9, 0xb6, 0xdb, 0xf4, 0xd4, 0x07, 0x19, 0x8f, 0x4f, - 0xcc, 0xfe, 0xc2, 0xd6, 0x72, 0xb8, 0xef, 0x2a, 0xac, 0x5f, 0x0f, 0xee, 0x6b, 0x8f, - 0x00, 0xf7, 0xb5, 0x2d, 0x2c, 0xe5, 0xc2, 0xc4, 0x1d, 0x56, 0x52, 0xd4, 0x1d, 0x9f, - 0x12, 0xe9, 0xb7, 0x6d, 0x56, 0xcf, 0xb0, 0x9b, 0x6d, 0x9d, 0x97, 0xb0, 0x97, 0x5d, - 0x13, 0x9a, 0x18, 0x71, 0x72, 0x02, 0x58, 0x4b, 0x7d, 0xfc, 0x83, 0x23, 0xf6, 0xdd, - 0xa3, 0xec, 0x65, 0x03, 0xd9, 0x2e, 0x1b, 0xaa, 0x60, 0x0d, 0xe8, 0x31, 0x5f, 0xce, - 0x0b, 0x03, 0x24, 0x21, 0x20, 0xda, 0x28, 0x43, 0xd9, 0x62, 0xf2, 0xb4, 0x82, 0xba, - 0x45, 0x18, 0xab, 0xf5, 0x30, 0xc7, 0xd0, 0x82, 0x9c, 0x0a, 0xbb, 0xe8, 0xe6, 0x4f, - 0x67, 0x21, 0x78, 0x90, 0x92, 0xfd, 0x16, 0x85, 0xa0, 0x8a, 0x13, 0x11, 0x93, 0x68, - 0xa3, 0xe2, 0xc2, 0x46, 0x9d, 0x36, 0x4f, 0x27, 0x94, 0x49, 0x51, 0xa1, 0x4e, 0x5e, - 0xf2, 0x7f, 0x84, 0x45, 0x74, 0xf9, 0xa4, 0xa5, 0x10, 0x95, 0x7b, 0x50, 0x63, 0x22, - 0xe9, 0x1f, 0x99, 0x52, 0x54, 0xe6, 0x52, 0x9f, 0x92, 0x8a, 0xa3, 0xb5, 0xcd, 0xa2, - 0x17, 0x1c, 0x7f, 0xe3, 0x11, 0x70, 0x60, 0x31, 0x80, 0x76, 0xb9, 0xc0, 0xda, 0x19, - 0x5a, 0x23, 0xf4, 0xa8, 0xcb, 0xe9, 0x03, 0x84, 0x65, 0x9d, 0xda, 0x79, 0xfa, 0xc6, - 0x10, 0xd4, 0x02, 0x9b, 0x53, 0x50, 0x85, 0x61, 0xe2, 0xb5, 0x37, 0x67, 0xdf, 0xbc, - 0x9a, 0x47, 0x67, 0xa9, 0x0c, 0xdb, 0xec, 0x96, 0x6a, 0x79, 0xb2, 0x87, 0xdc, 0xea, - 0x49, 0xd6, 0x5e, 0xbb, 0x27, 0xaa, 0x53, 0x6d, 0x83, 0x64, 0x8e, 0xae, 0x05, 0x4b, - 0x97, 0x3e, 0x80, 0x82, 0x53, 0x1d, 0x88, 0x79, 0x78, 0x90, 0xea, 0xc9, 0x7f, 0x66, - 0xb3, 0xba, 0xc2, 0x58, 0xa3, 0x4b, 0x11, 0x0e, 0x35, 0xa4, 0x62, 0xfa, 0xfc, 0x88, - 0x7d, 0xcf, 0x88, 0x82, 0x5b, 0xa2, 0x4d, 0xbc, 0x22, 0xb2, 0xa4, 0x46, 0xb9, 0x79, - 0x29, 0xbb, 0x3d, 0x95, 0xb8, 0xfa, 0x30, 0x55, 0xc4, 0x66, 0xae, 0x2c, 0x5b, 0xca, - 0x84, 0x71, 0x93, 0x34, 0x79, 0x4b, 0xf9, 0x2f, 0xd2, 0x10, 0x7f, 0x37, 0x91, 0xe2, - 0x71, 0x85, 0x6e, 0x77, 0x50, 0xdd, 0x7d, 0x46, 0x5c, 0xe7, 0xf4, 0x14, 0x45, 0x6a, - 0xa6, 0xcf, 0x95, 0x3e, 0xbb, 0x09, 0x72, 0x99, 0x45, 0xed, 0x7b, 0x47, 0xec, 0x3b, - 0x47, 0xca, 0xe7, 0x7a, 0xf7, 0x18, 0x8d, 0x20, 0x87, 0x79, 0xc6, 0x6f, 0x5a, 0x94, - 0x68, 0xd9, 0xc0, 0x13, 0x18, 0x38, 0x00, 0x5a, 0xbd, 0xe2, 0x90, 0x86, 0x4f, 0x0c, - 0xd9, 0x25, 0x6c, 0x1a, 0x0e, 0xa4, 0x04, 0x96, 0xdc, 0xb2, 0xd9, 0x45, 0x6d, 0x32, - 0x3d, 0x1b, 0x9c, 0xfa, 0xa1, 0x53, 0xf1, 0xd9, 0xfb, 0x85, 0x32, 0x59, 0x5b, 0x16, - 0xab, 0x64, 0x6d, 0x8f, 0x73, 0xda, 0x57, 0xa7, 0xff, 0xe4, 0xff, 0xb8, 0x73, 0x91, - 0x6d, 0x85, 0x41, 0x52, 0x25, 0x15, 0xc2, 0x5b, 0x99, 0x83, 0x19, 0x06, 0x39, 0x98, - 0x98, 0xa6, 0x71, 0x77, 0xed, 0xb5, 0x4f, 0xce, 0xbe, 0xb8, 0x76, 0xef, 0xa2, 0xc8, - 0xce, 0x44, 0x11, 0x05, 0x8f, 0x92, 0xd7, 0x51, 0x70, 0x5e, 0x47, 0xce, 0x0f, 0xaf, - 0x4a, 0xa2, 0x21, 0x2a, 0xfe, 0x64, 0x75, 0x61, 0xa2, 0x96, 0x46, 0xd1, 0x3b, 0x2b, - 0x6f, 0x25, 0x92, 0x7d, 0x9c, 0x31, 0x93, 0xbd, 0x8f, 0x0d, 0x98, 0xe1, 0xf4, 0x75, - 0xec, 0xe9, 0x5c, 0x1a, 0xad, 0x21, 0xf6, 0x6b, 0xca, 0xf7, 0x21, 0xb3, 0x0a, 0x38, - 0xb7, 0x4c, 0xd3, 0xa7, 0xbf, 0x83, 0xa4, 0x49, 0x09, 0x00, 0x85, 0x74, 0x38, 0xff, - 0xcf, 0xa7, 0xab, 0x0f, 0xb2, 0x67, 0x5a, 0x07, 0x25, 0x60, 0xc3, 0x28, 0x81, 0xb0, - 0x75, 0xcf, 0xf9, 0x3d, 0xc2, 0xf9, 0xc2, 0x64, 0xd4, 0x6d, 0x61, 0x2c, 0xf6, 0x7b, - 0xd7, 0xd9, 0x6f, 0x5d, 0x47, 0x9a, 0x31, 0x2c, 0x7a, 0x92, 0x84, 0x31, 0x05, 0xb0, - 0x70, 0x4d, 0x80, 0xe3, 0x1c, 0xea, 0x68, 0x18, 0xf0, 0x6a, 0xe8, 0x42, 0x66, 0x01, - 0x5c, 0x6a, 0x9e, 0xf8, 0xba, 0xc9, 0x14, 0xa1, 0x3b, 0x64, 0xa1, 0x97, 0x48, 0x3a, - 0xad, 0xf6, 0x44, 0x17, 0x01, 0x39, 0xd9, 0x21, 0x13, 0x5a, 0x64, 0x5b, 0xa5, 0xbc, - 0x45, 0xb5, 0x5c, 0x4d, 0xda, 0x74, 0xb1, 0xd1, 0x10, 0x07, 0x12, 0xd9, 0x6e, 0xed, - 0xbc, 0xc3, 0x60, 0xf0, 0x27, 0xb3, 0x4c, 0x80, 0x1d, 0x49, 0xb5, 0xec, 0x45, 0x8e, - 0xfa, 0x20, 0xbb, 0xa7, 0x1b, 0xdc, 0x2a, 0xe7, 0x99, 0x54, 0x4a, 0x37, 0x52, 0x11, - 0x84, 0x5a, 0x19, 0x9b, 0xa3, 0x68, 0x96, 0x68, 0x2d, 0x5a, 0xb3, 0xb7, 0xdc, 0x8b, - 0x7c, 0x98, 0x70, 0x3b, 0x0c, 0x01, 0xec, 0x0c, 0xa2, 0xc0, 0x08, 0x83, 0x2f, 0xa2, - 0x0b, 0x80, 0xfc, 0xed, 0x31, 0x80, 0x10, 0x46, 0x5a, 0xee, 0xb8, 0xee, 0x7c, 0xc8, - 0x8a, 0xb7, 0x2c, 0xd4, 0x1f, 0x66, 0x4f, 0x2e, 0x99, 0x48, 0x9b, 0x11, 0x8e, 0xaa, - 0x37, 0x9d, 0x01, 0x6f, 0x57, 0xed, 0x71, 0x50, 0xb3, 0x47, 0x8b, 0xef, 0xd1, 0x62, - 0x73, 0x45, 0x39, 0xd5, 0x76, 0x90, 0xad, 0xf4, 0x5b, 0xd8, 0xaf, 0xe0, 0xde, 0x79, - 0xc2, 0x33, 0x42, 0x5d, 0xbf, 0x68, 0x1b, 0xa5, 0x73, 0xd1, 0xff, 0xe8, 0x03, 0xe2, - 0x67, 0xba, 0x44, 0xd8, 0xd9, 0x35, 0x6b, 0x72, 0x29, 0xcf, 0xe2, 0x57, 0x18, 0x5e, - 0xb2, 0x94, 0xd2, 0x6d, 0xdb, 0x4f, 0xe5, 0x50, 0xe8, 0x23, 0x23, 0x7f, 0x9e, 0x61, - 0x17, 0xbd, 0x2e, 0x5e, 0x61, 0x40, 0x31, 0x0a, 0x37, 0x5f, 0xec, 0xb0, 0x26, 0x97, - 0xeb, 0xb3, 0x35, 0x7b, 0x44, 0x00, 0x17, 0x22, 0x9c, 0x5f, 0x75, 0x0b, 0xd0, 0x08, - 0x14, 0x19, 0x73, 0xd9, 0x39, 0x0b, 0x00, 0x82, 0xd5, 0x91, 0xfb, 0xbb, 0x6b, 0xaf, - 0x7d, 0x6a, 0xf6, 0x14, 0x2a, 0x98, 0xd3, 0x3e, 0xb4, 0x6e, 0xb9, 0x7e, 0x7e, 0x92, - 0x43, 0x21, 0x65, 0x63, 0x90, 0x92, 0x06, 0xfe, 0xea, 0x9e, 0x84, 0xa6, 0x7f, 0x12, - 0xc2, 0xf5, 0xfb, 0xa3, 0xeb, 0xd5, 0xc3, 0xdd, 0xa6, 0x5d, 0x02, 0xe4, 0xdc, 0xc4, - 0x56, 0x4f, 0x4c, 0xf8, 0xa1, 0xaf, 0x7f, 0x98, 0x83, 0x5a, 0xea, 0xc0, 0x97, 0x93, - 0x96, 0xd9, 0xfd, 0xd1, 0x6f, 0x1c, 0xd4, 0x37, 0xeb, 0x3c, 0xfb, 0xc9, 0x61, 0x6b, - 0x74, 0xbb, 0x24, 0xa3, 0x5d, 0x38, 0x8c, 0xa9, 0x9a, 0x79, 0x3d, 0x7e, 0xe6, 0x90, - 0x66, 0x69, 0xee, 0xc1, 0x99, 0x81, 0xc4, 0xae, 0x75, 0xea, 0xec, 0x85, 0x09, 0x3f, - 0xc4, 0x26, 0x63, 0x9d, 0xa7, 0x52, 0x08, 0xf9, 0xfe, 0xe8, 0xe9, 0xea, 0x91, 0xee, - 0x8d, 0xb2, 0xdb, 0xdb, 0xa5, 0x37, 0xfc, 0x92, 0xa3, 0x9c, 0xfd, 0x4f, 0x80, 0x86, - 0x44, 0x1c, 0x0a, 0x1a, 0x08, 0xed, 0x43, 0x03, 0x38, 0xc1, 0xeb, 0x4b, 0xae, 0xc0, - 0x99, 0x66, 0xc8, 0x59, 0x75, 0x7f, 0x74, 0x7b, 0x55, 0xfa, 0xee, 0xba, 0x0f, 0x7a, - 0x7c, 0xd2, 0x07, 0x0d, 0x8d, 0x0b, 0xf9, 0x87, 0x3a, 0x40, 0xf3, 0xe9, 0x1d, 0x05, - 0x47, 0x21, 0x75, 0x4a, 0x32, 0xfc, 0xbf, 0xda, 0x3c, 0x18, 0x18, 0x94, 0x16, 0xbb, - 0x51, 0x14, 0x94, 0x5e, 0x86, 0x0d, 0x32, 0x4a, 0x93, 0xde, 0xf9, 0x32, 0xe3, 0x70, - 0x64, 0xa7, 0x43, 0x07, 0x7d, 0x4a, 0xbc, 0x81, 0x3c, 0x93, 0xe0, 0x1a, 0xf2, 0x5a, - 0x4b, 0x20, 0x0e, 0x55, 0x2d, 0x09, 0x42, 0x87, 0x36, 0x34, 0x10, 0xf2, 0x6d, 0x5b, - 0xb0, 0x4b, 0x28, 0x3b, 0xd2, 0x33, 0x94, 0x01, 0xe1, 0xeb, 0x5b, 0x82, 0xe4, 0x2e, - 0x13, 0x85, 0x53, 0x06, 0x80, 0x43, 0x2f, 0xc2, 0x71, 0xe6, 0x9d, 0x90, 0xdc, 0x46, - 0xe4, 0xde, 0xb2, 0x16, 0x8a, 0x1c, 0x8a, 0xa4, 0xcb, 0x02, 0xa3, 0x07, 0x77, 0xd1, - 0x98, 0x52, 0x43, 0xb3, 0x8b, 0x25, 0xf2, 0x82, 0x43, 0xfe, 0xf6, 0x1b, 0xcc, 0x17, - 0x2c, 0x51, 0xe6, 0x86, 0x30, 0x51, 0x4b, 0xa0, 0x92, 0x76, 0x5c, 0x91, 0x26, 0xa5, - 0x45, 0xf4, 0x1c, 0x7c, 0xca, 0x9c, 0x73, 0xb9, 0xd0, 0x2b, 0xad, 0x1d, 0xc7, 0xac, - 0x83, 0x64, 0x85, 0x71, 0x61, 0x20, 0x8b, 0x54, 0xf7, 0x11, 0x46, 0x46, 0x88, 0x23, - 0x21, 0x8c, 0xee, 0xbe, 0xf4, 0x35, 0xe5, 0x14, 0x8d, 0xec, 0x97, 0x97, 0x02, 0x76, - 0xc3, 0xd1, 0x07, 0x21, 0xae, 0x09, 0xb8, 0x74, 0xa4, 0xe1, 0x41, 0x4b, 0x46, 0xc6, - 0x34, 0x2b, 0x34, 0xee, 0x47, 0x05, 0x32, 0x7d, 0x79, 0xa3, 0xba, 0xc0, 0xaa, 0x66, - 0x19, 0xd9, 0xf7, 0x17, 0x46, 0xec, 0x4f, 0x8c, 0x3c, 0x8c, 0x82, 0xe9, 0xa6, 0x09, - 0x61, 0x31, 0x14, 0x09, 0x08, 0x10, 0xab, 0x5a, 0x3a, 0x01, 0xf4, 0x0d, 0xe5, 0xd0, - 0x41, 0x49, 0xcc, 0x86, 0x44, 0xfa, 0xac, 0x16, 0xe4, 0x1a, 0xbd, 0xa0, 0xf9, 0x02, - 0xfb, 0x93, 0x2e, 0x21, 0x0b, 0x9e, 0xd1, 0x1c, 0x70, 0x70, 0xa2, 0x66, 0x8d, 0x08, - 0x0c, 0x6d, 0x3a, 0x4c, 0x04, 0xc8, 0x25, 0x27, 0x31, 0xcb, 0xba, 0x44, 0x66, 0x25, - 0xf4, 0x6a, 0x09, 0x03, 0x8b, 0x77, 0x96, 0x3e, 0x7c, 0xfc, 0x3b, 0x47, 0xec, 0x37, - 0xe3, 0xf7, 0xc8, 0xa6, 0x54, 0x57, 0x50, 0xda, 0x77, 0x01, 0xb7, 0x0d, 0x91, 0x5f, - 0xe5, 0xd0, 0x2e, 0xba, 0xfd, 0xba, 0x9d, 0xe4, 0x99, 0x3f, 0x15, 0x7c, 0x84, 0x85, - 0x97, 0xda, 0x76, 0x62, 0x28, 0x02, 0xd2, 0x8d, 0x78, 0x1a, 0x8f, 0xe5, 0x3d, 0x92, - 0xe2, 0xbd, 0xc9, 0x09, 0x73, 0xf7, 0x63, 0x07, 0xb0, 0x8d, 0x7b, 0x67, 0x8f, 0x24, - 0x09, 0xff, 0xef, 0xad, 0xea, 0x22, 0x3b, 0xd7, 0x06, 0xb4, 0xfb, 0x14, 0x8d, 0x7f, - 0x7b, 0x9d, 0xfd, 0xe5, 0x75, 0xca, 0x1a, 0xb3, 0x39, 0x1f, 0xdc, 0x74, 0xc8, 0xa7, - 0x33, 0xbb, 0x0f, 0xd5, 0xd5, 0x41, 0xb4, 0x14, 0x6a, 0x67, 0xe0, 0xba, 0x09, 0xc8, - 0x5d, 0x4c, 0xb3, 0x85, 0xfa, 0x22, 0xd1, 0x58, 0x63, 0x5d, 0xe2, 0x4c, 0x2d, 0xa8, - 0x91, 0x48, 0xc0, 0x50, 0xd6, 0x3d, 0x44, 0x9f, 0x72, 0x21, 0x4f, 0x9b, 0x19, 0x06, - 0xa8, 0x12, 0x1c, 0xa7, 0x9a, 0xc6, 0x14, 0xd9, 0x57, 0x04, 0x3f, 0x82, 0x17, 0xda, - 0x86, 0xa7, 0xf7, 0x19, 0x45, 0xf1, 0x30, 0x05, 0x01, 0x00, 0xba, 0x98, 0x6d, 0x28, - 0x1d, 0xe8, 0x45, 0x18, 0xfd, 0x13, 0xa0, 0xf2, 0x6a, 0x93, 0x01, 0x4b, 0xdd, 0x35, - 0x84, 0x5f, 0x6d, 0xf8, 0x9c, 0xc7, 0x4c, 0x8e, 0xa4, 0x4a, 0x05, 0x24, 0x21, 0xcd, - 0x1c, 0x20, 0xca, 0xd8, 0x2d, 0x50, 0x65, 0xb1, 0xe6, 0x50, 0x36, 0xf6, 0x0a, 0xc6, - 0x8b, 0xd3, 0x76, 0xa3, 0xea, 0x22, 0xb2, 0x84, 0x84, 0xc4, 0x1c, 0x37, 0x16, 0x70, - 0xf7, 0xf6, 0x49, 0xbd, 0x85, 0x43, 0xa4, 0x58, 0xae, 0x57, 0x94, 0x7b, 0x0c, 0x45, - 0x99, 0x28, 0x08, 0x3a, 0xa5, 0x5a, 0x48, 0x72, 0xaa, 0x30, 0xee, 0x49, 0xf1, 0x9c, - 0x39, 0x07, 0x48, 0xcb, 0x3c, 0x06, 0x3e, 0x64, 0x2d, 0xb0, 0x44, 0x5a, 0x3b, 0x7e, - 0x8d, 0x19, 0x38, 0xba, 0x0c, 0x15, 0x04, 0x70, 0x14, 0xc2, 0x25, 0x3b, 0x3a, 0xff, - 0x3b, 0xb4, 0xff, 0x1e, 0xa2, 0xb6, 0x73, 0x0e, 0xed, 0xf6, 0x98, 0xf8, 0x5c, 0xed, - 0x92, 0xd4, 0xe7, 0x4b, 0xec, 0x64, 0x18, 0xb2, 0x0b, 0x67, 0x02, 0x11, 0x99, 0x6e, - 0x34, 0x83, 0x1b, 0x09, 0x15, 0xbf, 0xbc, 0x10, 0x3b, 0x5f, 0x4c, 0xc8, 0xbf, 0xfb, - 0xf1, 0xd9, 0x9f, 0xdb, 0xea, 0xd3, 0x8b, 0x0f, 0x8b, 0xf8, 0xf7, 0x75, 0x86, 0x53, - 0x50, 0xb2, 0x75, 0x1e, 0xbd, 0x2b, 0x89, 0x1a, 0x3b, 0xd5, 0x23, 0x13, 0xb7, 0x5a, - 0xcb, 0x38, 0x99, 0xd6, 0x87, 0x9b, 0x76, 0xaa, 0xce, 0x75, 0xd3, 0x5b, 0x3a, 0xd9, - 0x5e, 0x6b, 0xae, 0x4d, 0xf6, 0xea, 0xa7, 0xc3, 0x75, 0xd4, 0xae, 0x53, 0x9e, 0x82, - 0x24, 0xd9, 0x81, 0x72, 0x8b, 0x3d, 0xec, 0x74, 0x29, 0x9a, 0x3d, 0x18, 0x64, 0x8d, - 0x74, 0xaf, 0xa6, 0xb7, 0x9f, 0x6f, 0xb2, 0x87, 0x3d, 0x52, 0xc2, 0xfb, 0xde, 0xb4, - 0xc0, 0x00, 0x52, 0x69, 0xbe, 0x61, 0x22, 0xfc, 0x2b, 0x60, 0xb8, 0xe6, 0x1a, 0x84, - 0xc9, 0xec, 0x44, 0x96, 0x95, 0x6c, 0xa7, 0x0a, 0x4d, 0x09, 0x58, 0x3b, 0x6e, 0xaf, - 0x47, 0x56, 0xee, 0x77, 0x84, 0x03, 0xe2, 0x8f, 0x7f, 0x37, 0x2a, 0x35, 0xe1, 0x09, - 0xc3, 0x27, 0x1b, 0x85, 0x0e, 0x0e, 0x95, 0x29, 0x7f, 0x2d, 0xd5, 0x20, 0x93, 0x94, - 0xad, 0x8a, 0x3e, 0x16, 0x2a, 0x5f, 0x85, 0x61, 0x0a, 0x49, 0x42, 0x0e, 0x03, 0x32, - 0xa2, 0x05, 0x9c, 0x59, 0x8a, 0x44, 0x12, 0x73, 0x58, 0x2e, 0x4e, 0x95, 0x03, 0xa8, - 0x36, 0xc7, 0xa2, 0x4a, 0x23, 0x02, 0x73, 0xc1, 0xa9, 0xdd, 0x64, 0xda, 0x1e, 0x22, - 0xc6, 0xa1, 0x25, 0x0b, 0xaa, 0xa8, 0xc2, 0x0e, 0xa0, 0x5e, 0x59, 0x9c, 0x26, 0xa5, - 0x86, 0x19, 0x22, 0xed, 0xe8, 0xc4, 0xb0, 0x2e, 0xe4, 0x4c, 0x5d, 0xa8, 0x97, 0x44, - 0x78, 0xe4, 0x4e, 0x2e, 0x4b, 0x31, 0xf9, 0xc6, 0xb7, 0xd9, 0xc3, 0xa0, 0xe5, 0x95, - 0x62, 0x9f, 0xcb, 0x19, 0xda, 0xb7, 0xbf, 0x85, 0x35, 0x42, 0x16, 0x78, 0x0a, 0x81, - 0x56, 0x60, 0xf4, 0x95, 0xcb, 0xb0, 0xe4, 0x68, 0x6d, 0xf9, 0xa7, 0x73, 0x64, 0x3d, - 0xe7, 0xe3, 0x90, 0x52, 0xf7, 0xc8, 0xea, 0xf3, 0x5e, 0x62, 0xde, 0x32, 0xfe, 0xdd, - 0x4e, 0x92, 0x3c, 0x25, 0x72, 0x7e, 0xd8, 0x9d, 0xcb, 0xec, 0x64, 0x08, 0x83, 0xdc, - 0xaf, 0xb0, 0x24, 0xeb, 0xfd, 0x12, 0xdb, 0xb2, 0x7c, 0x81, 0x34, 0x97, 0x6c, 0xb9, - 0x6d, 0x76, 0xc6, 0x2c, 0xfd, 0xb8, 0x92, 0xba, 0x92, 0xf4, 0xb5, 0xd9, 0xec, 0x13, - 0xe9, 0x24, 0x2a, 0x1b, 0xd0, 0x1c, 0x40, 0xc2, 0x45, 0x89, 0x08, 0x67, 0x31, 0x8a, - 0x66, 0x5c, 0xb2, 0x26, 0x79, 0x71, 0x3b, 0xae, 0x8e, 0x3b, 0xe5, 0x04, 0x86, 0x36, - 0x9d, 0x72, 0xa9, 0x19, 0x01, 0x09, 0x0c, 0x9c, 0xbb, 0xf1, 0x06, 0xe7, 0xce, 0x61, - 0xfe, 0xa6, 0xec, 0x47, 0x8f, 0x06, 0x16, 0x4d, 0x7e, 0xf0, 0xe0, 0x26, 0x7e, 0x40, - 0x50, 0xab, 0xbd, 0xc5, 0xa7, 0x5b, 0xbc, 0xc7, 0x5b, 0x3e, 0xd4, 0x0f, 0x37, 0x2d, - 0x7f, 0xcf, 0x89, 0x64, 0x20, 0xd8, 0xf9, 0xf8, 0x34, 0x4d, 0x7f, 0xb4, 0xb6, 0x5e, - 0x76, 0xfb, 0x8a, 0x4c, 0xd6, 0xa3, 0xde, 0x6e, 0xba, 0x72, 0xe7, 0xf8, 0xb7, 0x5b, - 0xfa, 0x0f, 0x64, 0xb2, 0x1e, 0xe5, 0x76, 0x77, 0x80, 0x93, 0x9a, 0x6e, 0x7e, 0x08, - 0x93, 0x7f, 0x78, 0xf4, 0xb8, 0xa2, 0x68, 0x1a, 0x7f, 0x66, 0x1d, 0xc4, 0x35, 0xdd, - 0xb3, 0xe4, 0xbe, 0x7b, 0x02, 0x23, 0xc7, 0xaa, 0x41, 0xbf, 0xad, 0xb1, 0x08, 0x7d, - 0xc6, 0x90, 0x83, 0x02, 0x2f, 0x90, 0x0e, 0x98, 0xab, 0xed, 0x6c, 0x0c, 0xae, 0x8e, - 0x4e, 0x5b, 0xda, 0xf7, 0x9e, 0x52, 0x0d, 0x05, 0xa8, 0xc7, 0x69, 0x83, 0xeb, 0x10, - 0x3d, 0x4f, 0xb2, 0xc8, 0xce, 0xeb, 0xf1, 0x1f, 0x1a, 0xe1, 0xc3, 0x1d, 0x1c, 0xef, - 0xae, 0x91, 0x1a, 0xad, 0xf4, 0x52, 0xe8, 0xd0, 0x00, 0x4a, 0xc2, 0x5a, 0x94, 0x40, - 0x94, 0xb4, 0xa8, 0xa3, 0x87, 0x64, 0xe9, 0xcc, 0x73, 0x08, 0xa9, 0xf4, 0x3e, 0x77, - 0xaa, 0x86, 0xee, 0x34, 0x12, 0x54, 0xf3, 0xb6, 0x53, 0x21, 0xf5, 0xca, 0x63, 0xb7, - 0x92, 0xdd, 0x06, 0x2e, 0xc8, 0x60, 0xeb, 0xa8, 0x5d, 0xea, 0x1f, 0x24, 0x35, 0x5a, - 0x65, 0x73, 0x27, 0x6d, 0xf4, 0x5c, 0x62, 0x7e, 0x2a, 0x15, 0x8e, 0xaa, 0xeb, 0xf1, - 0x9f, 0xff, 0xda, 0x74, 0x37, 0xc4, 0xe0, 0x32, 0x41, 0xc7, 0xf2, 0x5e, 0x67, 0x84, - 0xf6, 0xb0, 0xf7, 0x59, 0x59, 0x3f, 0xe8, 0x2b, 0x68, 0xde, 0xbf, 0xfd, 0x7c, 0x6f, - 0xb7, 0x2f, 0xdd, 0x61, 0xdf, 0x4f, 0x38, 0x85, 0x25, 0x87, 0x8c, 0xa1, 0x53, 0xc0, - 0xc2, 0x59, 0x43, 0x87, 0x8c, 0x6d, 0xf9, 0x9a, 0x7c, 0xe1, 0xf0, 0xe7, 0x2a, 0xd7, - 0x46, 0x54, 0x53, 0xe3, 0x33, 0x84, 0x05, 0x55, 0x2b, 0x8d, 0xa7, 0x14, 0xd1, 0x2d, - 0x38, 0x2a, 0xf0, 0xe7, 0x5b, 0xf0, 0x4b, 0x48, 0xea, 0x63, 0x2e, 0xe5, 0x20, 0xc1, - 0x09, 0x99, 0x55, 0xba, 0x0c, 0xdb, 0xe7, 0xa8, 0xe4, 0xc1, 0xa2, 0x52, 0x85, 0xf6, - 0x17, 0x9c, 0x95, 0x94, 0x85, 0xa0, 0xa9, 0xb4, 0x23, 0xbd, 0xa6, 0x7f, 0x8e, 0x21, - 0xb3, 0x7e, 0xdf, 0xfc, 0x02, 0x06, 0x82, 0x4e, 0xc1, 0x26, 0xaa, 0xe7, 0x29, 0xf0, - 0xd0, 0x75, 0x85, 0x47, 0x2e, 0x50, 0x69, 0xba, 0x1c, 0x23, 0xd0, 0x21, 0x57, 0x57, - 0x8a, 0x98, 0xd6, 0x04, 0xc3, 0x14, 0x30, 0x47, 0x00, 0xdf, 0x69, 0x5c, 0x3e, 0xfa, - 0x4c, 0x2e, 0xeb, 0x99, 0x29, 0x35, 0xd3, 0x0c, 0x71, 0xa2, 0x79, 0xb2, 0x78, 0x50, - 0x72, 0xe4, 0x22, 0x04, 0x27, 0x2f, 0x75, 0x39, 0xd7, 0x6e, 0x04, 0xcc, 0x0d, 0x7c, - 0xb2, 0x9b, 0xd7, 0xe3, 0xef, 0xdb, 0x5c, 0x3d, 0x53, 0xf8, 0x68, 0x8b, 0x1c, 0x75, - 0x66, 0x9e, 0x17, 0xd6, 0xe1, 0x53, 0x47, 0x08, 0xeb, 0x9c, 0xf5, 0xa0, 0x00, 0x5e, - 0x36, 0x9c, 0x44, 0x6c, 0x84, 0xcf, 0xc2, 0x2a, 0x38, 0x3e, 0xa7, 0x32, 0x64, 0x90, - 0x10, 0x8d, 0x9b, 0xa6, 0x62, 0x94, 0x2d, 0x07, 0x15, 0x38, 0xd3, 0x5d, 0x71, 0x38, - 0xcb, 0xec, 0x67, 0x96, 0x14, 0x06, 0x6a, 0x0d, 0x49, 0x21, 0x28, 0xe9, 0x81, 0x90, - 0x6a, 0x54, 0x1e, 0x82, 0xf2, 0x35, 0x08, 0x6e, 0xb9, 0xb0, 0x36, 0x10, 0xd2, 0x16, - 0xe6, 0xed, 0x5a, 0xad, 0xdf, 0xf9, 0x3a, 0x49, 0x0f, 0xd5, 0x99, 0xe4, 0xae, 0xe9, - 0xc0, 0x99, 0x8e, 0xbc, 0x6a, 0x70, 0x50, 0xc8, 0xcc, 0xb0, 0x79, 0x99, 0x68, 0xe7, - 0x5b, 0xcf, 0x40, 0xae, 0x2a, 0x09, 0x8c, 0x93, 0x9a, 0xf2, 0x41, 0x5a, 0x84, 0x31, - 0x20, 0xc4, 0xe5, 0xb4, 0x20, 0x9a, 0x30, 0x2a, 0x01, 0x84, 0x1b, 0xbd, 0x65, 0x07, - 0x6d, 0xbb, 0xa9, 0x2a, 0x85, 0x06, 0x08, 0x9f, 0x48, 0x66, 0xd6, 0x57, 0x7f, 0x59, - 0xc2, 0xc8, 0x22, 0x34, 0x07, 0xeb, 0xa8, 0x02, 0xe1, 0x67, 0x5d, 0x8f, 0xff, 0xfd, - 0xfb, 0x0b, 0xf5, 0x17, 0xfa, 0x42, 0xcd, 0x45, 0xeb, 0x73, 0x65, 0x5d, 0xaa, 0xa7, - 0x6b, 0x6c, 0x01, 0xb5, 0x76, 0x96, 0x2f, 0x06, 0xe6, 0x0d, 0x19, 0xe9, 0x48, 0x52, - 0x73, 0xf0, 0x52, 0x86, 0xcf, 0xa2, 0x52, 0xc2, 0x24, 0x7d, 0x2d, 0x3e, 0x25, 0xdb, - 0xe2, 0x36, 0x3f, 0x86, 0x7a, 0x93, 0x17, 0x55, 0x68, 0xb0, 0xd2, 0xec, 0xbb, 0xb3, - 0xdc, 0xb1, 0x30, 0x92, 0x6c, 0xf3, 0xa9, 0x28, 0xc1, 0x60, 0xb0, 0x01, 0x7e, 0xdb, - 0x89, 0xf7, 0x37, 0xc0, 0x2f, 0xca, 0x0d, 0x80, 0x65, 0x81, 0xd3, 0x4a, 0xe7, 0xf5, - 0xfb, 0x1b, 0x21, 0xab, 0xa1, 0x7f, 0x6d, 0xfd, 0x00, 0x8e, 0x0e, 0x52, 0x43, 0xbf, - 0x45, 0x90, 0x2a, 0x89, 0x47, 0x19, 0xfa, 0x0d, 0x35, 0x62, 0x5c, 0xa1, 0xa4, 0xa2, - 0x28, 0x1a, 0x22, 0x2e, 0x2b, 0x0d, 0xb9, 0xa5, 0x80, 0x40, 0xcd, 0x9e, 0x76, 0xcb, - 0x49, 0x47, 0x4b, 0x86, 0x3b, 0x6d, 0x13, 0xc2, 0x6f, 0xb6, 0xde, 0x6a, 0xf2, 0xaa, - 0x04, 0x55, 0x8f, 0xbf, 0x7b, 0xd4, 0x7b, 0x69, 0xba, 0x8a, 0xa0, 0x10, 0x24, 0x87, - 0x11, 0x30, 0xda, 0xbd, 0x3e, 0xb8, 0xce, 0x7a, 0xe7, 0xd0, 0x30, 0xb5, 0x83, 0x3d, - 0xfa, 0xce, 0x3b, 0x94, 0xce, 0xd2, 0x7a, 0xfc, 0x5f, 0x1f, 0xd8, 0xa9, 0xb4, 0xf9, - 0xc0, 0x9e, 0xff, 0x9a, 0xf6, 0x2c, 0xcd, 0xb6, 0x88, 0xba, 0x4c, 0xe8, 0xeb, 0x87, - 0x9b, 0x15, 0x37, 0x91, 0x9c, 0x4e, 0xcf, 0x1d, 0xa4, 0x11, 0x26, 0xcb, 0x0c, 0x50, - 0xca, 0x48, 0xb3, 0xec, 0x65, 0x0c, 0x41, 0xd1, 0xd3, 0x3e, 0xd2, 0xfa, 0x12, 0x97, - 0x1a, 0xb5, 0x17, 0x55, 0x2e, 0xf3, 0x46, 0xc9, 0x0c, 0xc0, 0xf6, 0xd1, 0x31, 0x6f, - 0xd5, 0xe1, 0xcb, 0xeb, 0x74, 0xb2, 0xe3, 0xc8, 0xe9, 0x04, 0x77, 0xed, 0x3f, 0xa0, - 0x07, 0x65, 0xff, 0x58, 0x1e, 0x94, 0xfd, 0x07, 0x36, 0xda, 0xf7, 0xdf, 0x37, 0xda, - 0x7f, 0x51, 0x1a, 0xed, 0xfb, 0xef, 0x1b, 0xed, 0xef, 0x1b, 0xed, 0xef, 0xab, 0x82, - 0xef, 0x25, 0x55, 0xf0, 0x7d, 0xa3, 0xfd, 0xfd, 0x85, 0xfa, 0x9e, 0x58, 0xa8, 0xef, - 0x1b, 0xed, 0xef, 0x1b, 0xed, 0xef, 0x6f, 0x80, 0xf7, 0x8d, 0xf6, 0x23, 0x18, 0xed, - 0xfb, 0xef, 0x1b, 0xed, 0xbf, 0xb0, 0x8c, 0xf6, 0xfd, 0xaf, 0xaa, 0xd1, 0xbe, 0xff, - 0x4e, 0x8d, 0xf6, 0xfd, 0x07, 0x32, 0xda, 0x3f, 0x3f, 0xba, 0xc2, 0xb6, 0xe4, 0x90, - 0x58, 0xaf, 0x54, 0x29, 0xf0, 0x43, 0x8a, 0x54, 0xe3, 0x06, 0xe0, 0x0c, 0x93, 0x49, - 0xf8, 0x06, 0xc0, 0x9d, 0xdf, 0xbf, 0x51, 0x6d, 0xb3, 0x0b, 0x08, 0x1f, 0xd9, 0x71, - 0x40, 0x65, 0xdc, 0x07, 0x2d, 0x23, 0x44, 0xf4, 0xb7, 0x8f, 0xd8, 0xb7, 0xb4, 0x8d, - 0x32, 0x27, 0x13, 0xde, 0x21, 0x08, 0xe3, 0x03, 0x8c, 0xcc, 0x48, 0xa3, 0xbc, 0xe3, - 0x4a, 0xfa, 0x80, 0xcf, 0xd7, 0x72, 0x7d, 0x00, 0xbc, 0x48, 0xc2, 0xbd, 0xa4, 0x42, - 0x00, 0x2e, 0x48, 0x62, 0x53, 0x9b, 0xc1, 0x01, 0x9d, 0x5a, 0x2c, 0x92, 0x6a, 0x01, - 0x9b, 0xf1, 0x0b, 0xec, 0x19, 0x94, 0xcd, 0x53, 0x62, 0x68, 0x6e, 0x69, 0x03, 0x10, - 0xcf, 0x36, 0x6f, 0x11, 0x66, 0x03, 0x6c, 0x8d, 0x13, 0xb9, 0xe2, 0xed, 0x53, 0xec, - 0x61, 0xcf, 0x79, 0x53, 0x10, 0xd8, 0x3b, 0xbd, 0x84, 0x83, 0x53, 0x9e, 0x73, 0xd9, - 0x29, 0x7b, 0xcb, 0x0b, 0xa9, 0x4c, 0xbf, 0xec, 0xad, 0x3c, 0x52, 0xd9, 0xdb, 0xd7, - 0x5f, 0x9a, 0xfd, 0xfb, 0xd1, 0xbd, 0x75, 0x8e, 0x18, 0xb2, 0x4d, 0xce, 0x4d, 0xe4, - 0xf7, 0x47, 0xb7, 0x07, 0x14, 0xe8, 0x1d, 0x9c, 0xd7, 0x09, 0xe0, 0xfb, 0x5d, 0x5e, - 0xb9, 0xbe, 0x83, 0xf4, 0x1a, 0x65, 0x7a, 0xf0, 0xa7, 0x8f, 0x02, 0xaa, 0x87, 0x6a, - 0xb9, 0x0f, 0x54, 0xea, 0xfe, 0xc7, 0x37, 0x80, 0xa8, 0x1b, 0xb7, 0x57, 0x66, 0xc6, - 0x6c, 0x89, 0xba, 0x7f, 0x62, 0xc4, 0xfe, 0xec, 0x88, 0x84, 0x2c, 0xe6, 0x8e, 0x63, - 0x52, 0x9c, 0xa2, 0xec, 0x1f, 0x47, 0x0a, 0x81, 0xc4, 0xf4, 0x32, 0xaa, 0xff, 0x5c, - 0x12, 0x86, 0xa4, 0x8c, 0x06, 0xf9, 0x6c, 0xed, 0x5b, 0x6f, 0xe3, 0xa2, 0x81, 0xa6, - 0x88, 0xfb, 0x0c, 0xf8, 0xab, 0xcd, 0x0d, 0xf1, 0x6c, 0xb6, 0x19, 0x97, 0x85, 0x2d, - 0x73, 0x45, 0x87, 0x00, 0x37, 0xe4, 0xd2, 0xe7, 0x01, 0xaf, 0x53, 0x29, 0x04, 0xdb, - 0x32, 0x63, 0x05, 0x28, 0xfc, 0x8a, 0x0a, 0x41, 0xc1, 0xb7, 0x6d, 0x51, 0xea, 0x2a, - 0x00, 0xb0, 0x08, 0x46, 0x1c, 0xa0, 0x72, 0x8a, 0x04, 0xa8, 0xa7, 0x29, 0x20, 0x54, - 0x47, 0xa4, 0x43, 0x8e, 0x30, 0x8b, 0xcb, 0xd8, 0xaf, 0xb7, 0x6f, 0xb0, 0x8a, 0x68, - 0xb9, 0x33, 0x05, 0x7f, 0xbb, 0xb2, 0x08, 0x42, 0x75, 0xe4, 0x24, 0xe1, 0xd7, 0x5f, - 0x99, 0xfd, 0x83, 0x1e, 0x04, 0xf1, 0x20, 0xff, 0x5d, 0x4b, 0x19, 0x0d, 0x23, 0xa5, - 0x44, 0x3a, 0xdf, 0xcb, 0x3a, 0x39, 0x37, 0x48, 0x6d, 0xa1, 0x95, 0xf4, 0xb0, 0x2a, - 0x84, 0x08, 0xc8, 0x89, 0x5b, 0xe8, 0x6a, 0x2f, 0x2e, 0xbc, 0x68, 0x79, 0xa2, 0xfa, - 0xc8, 0x1f, 0x3f, 0x5d, 0xf3, 0xf7, 0x6c, 0x52, 0xf2, 0x76, 0x58, 0x92, 0xbc, 0xfd, - 0x1b, 0x58, 0xd3, 0xd5, 0x49, 0x29, 0x29, 0x4c, 0x12, 0xf5, 0x09, 0x10, 0x02, 0x1a, - 0xc8, 0xfe, 0xcd, 0x1c, 0xdf, 0xe4, 0x05, 0x7c, 0xeb, 0xed, 0x34, 0xd5, 0xbb, 0x38, - 0xab, 0x11, 0xea, 0x68, 0x43, 0x46, 0x18, 0x24, 0xe4, 0x0d, 0x8b, 0x35, 0x85, 0x3d, - 0x79, 0x52, 0x2a, 0x22, 0x62, 0xfd, 0x5b, 0x23, 0xf6, 0xe7, 0x47, 0x6d, 0xae, 0x9c, - 0x42, 0x71, 0x15, 0x1b, 0x09, 0x8b, 0x1e, 0xf8, 0x69, 0x09, 0x91, 0xa8, 0x3d, 0xa5, - 0xe4, 0x65, 0x40, 0x39, 0x74, 0x4f, 0xfb, 0x9a, 0x7a, 0x08, 0x9e, 0xb4, 0xd4, 0x3f, - 0xed, 0xb3, 0x9c, 0xeb, 0x32, 0xdb, 0xa5, 0x86, 0xc4, 0xdc, 0x93, 0xa9, 0xb1, 0x6c, - 0xfb, 0x20, 0xbc, 0xee, 0xfb, 0x9d, 0xa0, 0xbe, 0xc3, 0x9a, 0xb6, 0x54, 0xeb, 0xaa, - 0xb0, 0x4e, 0xf3, 0x0c, 0x55, 0x1c, 0x56, 0xb9, 0x6a, 0x6b, 0x84, 0x4d, 0xd9, 0xe3, - 0xc2, 0x03, 0xac, 0x4a, 0x50, 0x91, 0xc2, 0x52, 0x36, 0x7c, 0x19, 0x69, 0xfc, 0x0e, - 0xbb, 0x20, 0x42, 0xb7, 0xf9, 0x92, 0xd6, 0x47, 0xae, 0xfa, 0xfd, 0xfa, 0xab, 0xb3, - 0x9f, 0x38, 0x71, 0xef, 0x24, 0xe7, 0x08, 0xc5, 0xcf, 0x8b, 0xd8, 0x1f, 0x85, 0xf9, - 0xfc, 0x9c, 0xa0, 0x8a, 0xe3, 0xb8, 0x2e, 0x4b, 0xf9, 0x82, 0xc7, 0x27, 0x50, 0x37, - 0xe3, 0x20, 0x3e, 0xf2, 0x13, 0xd8, 0x62, 0xbc, 0x45, 0x2d, 0x8f, 0xb5, 0x34, 0xff, - 0xc4, 0x7a, 0x55, 0xb3, 0xab, 0xe9, 0x38, 0xf3, 0x08, 0x83, 0xc4, 0x54, 0x0d, 0x38, - 0xee, 0x2c, 0xd1, 0xb7, 0x92, 0xc8, 0xf0, 0x7b, 0xec, 0xf7, 0x8d, 0xd8, 0x77, 0x8c, - 0x60, 0x29, 0xea, 0x8e, 0xe0, 0x33, 0x58, 0xdc, 0x1e, 0xcb, 0xae, 0x2b, 0x4c, 0xde, - 0x05, 0x64, 0x3e, 0xa6, 0x2b, 0x0a, 0x09, 0x0b, 0x56, 0x42, 0xa9, 0x91, 0x08, 0x46, - 0x05, 0x27, 0x02, 0x10, 0xe9, 0x32, 0x99, 0x1d, 0xe7, 0xf1, 0x80, 0x5b, 0x80, 0xf8, - 0x86, 0x73, 0xcc, 0xa5, 0xe4, 0xbc, 0x26, 0x6a, 0xdb, 0xd2, 0x31, 0xb9, 0x09, 0x60, - 0xd2, 0xf1, 0x8c, 0x7d, 0x38, 0x63, 0xec, 0x39, 0xb2, 0x78, 0x2b, 0xaa, 0x78, 0x46, - 0xef, 0xcb, 0xbf, 0x12, 0xae, 0x1d, 0x98, 0x22, 0x85, 0x6e, 0x1f, 0x58, 0x2a, 0x96, - 0xc9, 0x63, 0xd6, 0xd7, 0xd7, 0xec, 0x06, 0x15, 0x0c, 0x2c, 0x68, 0x53, 0x21, 0x89, - 0x1c, 0x17, 0xb1, 0xe3, 0xb2, 0x5b, 0x2d, 0x90, 0x0b, 0xce, 0x39, 0xbf, 0xbb, 0xf6, - 0xfa, 0x6b, 0xb3, 0x3f, 0xbc, 0x99, 0x24, 0xde, 0x01, 0x1c, 0xc0, 0x4b, 0xe7, 0xed, - 0xff, 0x1d, 0x55, 0x8f, 0xb1, 0xd3, 0x49, 0x7b, 0xf4, 0xfd, 0x32, 0xa9, 0x57, 0xd8, - 0x69, 0xd7, 0xe8, 0xc2, 0xba, 0x99, 0x53, 0x6f, 0x29, 0x41, 0x6a, 0x7c, 0xa9, 0x94, - 0xde, 0xea, 0x14, 0x33, 0xa5, 0xa4, 0xf9, 0xce, 0xc7, 0x3e, 0x81, 0x35, 0xb8, 0xec, - 0x42, 0xae, 0xf3, 0xa1, 0x7b, 0xe0, 0x63, 0xb3, 0xdf, 0xb1, 0xd6, 0x2b, 0xa4, 0xd5, - 0x57, 0x46, 0xe5, 0x03, 0x17, 0xd2, 0xfa, 0x5d, 0xeb, 0x2b, 0xd3, 0x7a, 0x5e, 0x60, - 0x1f, 0xf0, 0x36, 0x64, 0x2d, 0x3b, 0x44, 0x65, 0xeb, 0xa8, 0xb8, 0xcc, 0x60, 0x68, - 0xe4, 0x6d, 0x73, 0x7c, 0x59, 0xe2, 0x8a, 0x0d, 0x52, 0x01, 0x30, 0x7c, 0xfc, 0x22, - 0xdb, 0xc1, 0x87, 0x18, 0x8c, 0x25, 0xa0, 0x6d, 0x8b, 0xa5, 0xde, 0x2d, 0xd4, 0x94, - 0xb5, 0x44, 0x90, 0xb4, 0xec, 0x29, 0xce, 0x1a, 0x19, 0x84, 0x7b, 0xcf, 0xa5, 0xbf, - 0xbc, 0xfe, 0xc6, 0x41, 0xe9, 0x2f, 0x36, 0x1c, 0xa9, 0x1e, 0xf2, 0x65, 0xf6, 0xb0, - 0x40, 0xd6, 0x68, 0x3a, 0x43, 0x5c, 0xf7, 0x80, 0xbb, 0xc9, 0xce, 0x91, 0xba, 0x9b, - 0x73, 0x14, 0xda, 0x3a, 0x65, 0xa5, 0x5e, 0xc0, 0x36, 0x3b, 0x03, 0x05, 0x85, 0xd4, - 0x10, 0x21, 0x2d, 0xda, 0x02, 0x86, 0x0f, 0x40, 0x3b, 0xf2, 0xfa, 0x6c, 0xf6, 0x37, - 0x4e, 0xdc, 0xdb, 0xe4, 0x3c, 0x86, 0xd0, 0x16, 0xe0, 0x38, 0x94, 0x96, 0xa7, 0xb0, - 0x8f, 0xdc, 0x3e, 0x24, 0x07, 0x62, 0x24, 0x3b, 0x15, 0x06, 0x0f, 0x4b, 0xb7, 0x7f, - 0x00, 0xcd, 0xe1, 0xf7, 0x3e, 0x54, 0x79, 0xb6, 0x83, 0x30, 0xe1, 0x9c, 0x6e, 0xe0, - 0x72, 0xd6, 0x74, 0x1d, 0x33, 0x1f, 0x0c, 0x64, 0xbf, 0x7b, 0xb4, 0x99, 0x4e, 0xc2, - 0xe9, 0x22, 0xf4, 0x1e, 0xfb, 0x46, 0xf6, 0xbc, 0xcc, 0x4a, 0x07, 0x18, 0x30, 0xd9, - 0x91, 0x03, 0xe6, 0xe4, 0x3c, 0x17, 0x4d, 0x16, 0xa4, 0x5f, 0x08, 0x2a, 0x41, 0x18, - 0xbb, 0xf7, 0xd4, 0xf9, 0x79, 0xbc, 0x5b, 0xa9, 0x73, 0xc2, 0x1e, 0x16, 0x99, 0x3b, - 0x2a, 0xa7, 0x3b, 0x75, 0xb3, 0x98, 0x79, 0xfe, 0xbf, 0xed, 0xe7, 0xd9, 0x07, 0x60, - 0x91, 0xe6, 0xb2, 0xe8, 0x3e, 0x5a, 0xe0, 0x0b, 0x70, 0x01, 0x2b, 0x56, 0xaa, 0xbd, - 0x3a, 0x7a, 0x5e, 0xf4, 0x4b, 0x7a, 0x88, 0x06, 0xfd, 0x31, 0x57, 0x70, 0xba, 0xce, - 0xce, 0x58, 0x3e, 0xa8, 0xc5, 0x8f, 0xf8, 0xfa, 0xc5, 0xea, 0xb9, 0x57, 0xd8, 0x96, - 0x19, 0x1a, 0x8f, 0xa6, 0xc7, 0xca, 0x7e, 0x00, 0x69, 0xfb, 0xdd, 0xb5, 0xd7, 0xdf, - 0x9c, 0xbd, 0x79, 0x4f, 0xe4, 0xb2, 0xb9, 0x26, 0x33, 0x95, 0x69, 0x3b, 0x37, 0xe0, - 0xe9, 0x70, 0xb4, 0xe3, 0x5c, 0x54, 0x58, 0xd2, 0x5d, 0x48, 0x4b, 0xd5, 0x9e, 0xce, - 0xf3, 0x09, 0xe4, 0xcf, 0x81, 0xe0, 0x80, 0x95, 0x2e, 0xf7, 0xea, 0xdd, 0xfb, 0xa3, - 0x97, 0x7a, 0xe6, 0x0f, 0x9e, 0xfb, 0x84, 0xb0, 0xbf, 0x7c, 0xc0, 0x84, 0xe0, 0x0a, - 0xbc, 0xb3, 0xc5, 0x6f, 0xbd, 0xf0, 0xc2, 0x34, 0xad, 0xb0, 0xdf, 0x31, 0x5a, 0x05, - 0xd4, 0xbf, 0x26, 0xd0, 0xbd, 0x55, 0xca, 0x23, 0x53, 0x1f, 0x80, 0x4e, 0x35, 0xcc, - 0xeb, 0xf1, 0xcb, 0x82, 0xc4, 0x5a, 0xb2, 0x12, 0x5a, 0x31, 0x11, 0x43, 0xc8, 0xe6, - 0xa9, 0x9b, 0x73, 0xb8, 0xf2, 0xff, 0xb1, 0xf7, 0x2e, 0xc0, 0x96, 0x5d, 0x69, 0x79, - 0x58, 0x9d, 0x73, 0x5f, 0x7d, 0x77, 0xbf, 0xa4, 0xd5, 0xad, 0x56, 0xf7, 0xe9, 0xee, - 0xdb, 0xb7, 0x6f, 0xb7, 0xd4, 0xe7, 0xb4, 0xee, 0x69, 0xed, 0xf5, 0x5e, 0xbb, 0xa5, - 0x99, 0x1e, 0x49, 0x23, 0x69, 0xa6, 0xa5, 0x96, 0xce, 0xa8, 0xf5, 0x60, 0xfa, 0xf4, - 0x61, 0xc2, 0x58, 0x04, 0xc7, 0xc6, 0x45, 0x1c, 0x1c, 0x52, 0x35, 0xec, 0x4b, 0xf0, - 0x18, 0xf3, 0x18, 0xc6, 0x0e, 0x95, 0x8a, 0x0d, 0xbe, 0xc9, 0xb8, 0x48, 0xdb, 0xc4, - 0x04, 0x87, 0x98, 0x38, 0x29, 0x53, 0x85, 0x13, 0x27, 0x94, 0x8d, 0x87, 0xb8, 0x62, - 0x3c, 0x0e, 0x8c, 0x21, 0xb1, 0x31, 0xe0, 0x4c, 0x0d, 0x2e, 0x43, 0x48, 0x80, 0x32, - 0x2f, 0x0f, 0x90, 0x5a, 0xff, 0xff, 0xaf, 0xb5, 0xd7, 0xde, 0x67, 0x9f, 0x73, 0xee, - 0xb9, 0xd2, 0xd8, 0x28, 0x65, 0x5c, 0x06, 0xf5, 0x3d, 0x6b, 0xbf, 0xd6, 0xf3, 0x7f, - 0x7c, 0xff, 0xf7, 0x01, 0xb1, 0x4c, 0x20, 0xdd, 0xc2, 0x4d, 0x0c, 0x65, 0x27, 0x8a, - 0x62, 0x00, 0x10, 0xf5, 0xe4, 0x85, 0x6e, 0x21, 0x0b, 0x67, 0xa0, 0x3d, 0xd9, 0xe4, - 0x64, 0xfd, 0xf1, 0x5e, 0x16, 0xff, 0x93, 0xf7, 0x8e, 0x56, 0xff, 0xad, 0x9a, 0x9f, - 0x64, 0xb2, 0xd3, 0x71, 0x75, 0xed, 0xb6, 0x86, 0x18, 0xd6, 0x45, 0x15, 0x19, 0x48, - 0x2e, 0x7c, 0x6a, 0x71, 0x60, 0x21, 0xa3, 0x29, 0x53, 0xba, 0xbc, 0x79, 0xf5, 0x64, - 0x6e, 0xbd, 0x3c, 0x5d, 0x7f, 0x9d, 0x47, 0xb2, 0xba, 0x39, 0xa3, 0xd4, 0xfa, 0x76, - 0x66, 0x31, 0x1e, 0x60, 0x6d, 0xac, 0xed, 0x64, 0xea, 0xc5, 0x3e, 0x80, 0x17, 0xea, - 0x39, 0x9b, 0xc8, 0x4a, 0x9e, 0xcb, 0xde, 0x6a, 0x9e, 0xcb, 0xbc, 0xb7, 0xe6, 0xff, - 0xb7, 0x6b, 0x0c, 0xca, 0x5d, 0xfc, 0x36, 0x3d, 0xb7, 0x18, 0x1f, 0xea, 0x0f, 0x6c, - 0xac, 0x3f, 0x30, 0xa5, 0x2d, 0x06, 0xbd, 0x63, 0xc9, 0x3f, 0x9a, 0x77, 0xbd, 0x8d, - 0x54, 0x5e, 0xba, 0x5e, 0xfa, 0x51, 0xdd, 0xba, 0xc9, 0x81, 0x86, 0x25, 0x20, 0x85, - 0x7f, 0x45, 0x5b, 0xd4, 0x6f, 0xf6, 0xe0, 0x5d, 0x5a, 0x10, 0x0f, 0xfe, 0xa0, 0x2d, - 0x88, 0x07, 0xef, 0x78, 0x41, 0x3c, 0x38, 0xec, 0x82, 0x78, 0xf0, 0x8e, 0x16, 0xc4, - 0x83, 0x2f, 0xf3, 0x82, 0x78, 0x70, 0xd8, 0x05, 0xf1, 0x03, 0x9d, 0xcb, 0x6c, 0x93, - 0xeb, 0xb6, 0x03, 0x46, 0x07, 0xb6, 0x90, 0x86, 0x5a, 0xc6, 0x4b, 0x0b, 0x06, 0x36, - 0x4f, 0x46, 0xd5, 0xe6, 0x33, 0x07, 0xb6, 0x5e, 0xea, 0xc9, 0xb5, 0x52, 0x2d, 0x95, - 0x80, 0x9f, 0x5f, 0x85, 0xa2, 0x5f, 0x2e, 0xb4, 0x89, 0xc7, 0x25, 0xc5, 0xf1, 0xdc, - 0x1e, 0xfb, 0x1a, 0xf6, 0x5a, 0x14, 0xfa, 0xa1, 0x80, 0x3e, 0xb1, 0x64, 0xf5, 0x91, - 0x5b, 0x2b, 0xb0, 0x6a, 0xab, 0x20, 0xcc, 0x06, 0x95, 0xab, 0xc8, 0x42, 0x49, 0x94, - 0x44, 0x32, 0x32, 0xce, 0xd4, 0x79, 0x89, 0x50, 0x4c, 0x97, 0x8a, 0xe7, 0xfe, 0x79, - 0x87, 0xfd, 0x54, 0x54, 0xca, 0xcf, 0x75, 0x70, 0x3e, 0x22, 0xff, 0x57, 0x08, 0x28, - 0x09, 0x60, 0x66, 0x44, 0xbe, 0xf7, 0x50, 0xe1, 0x9e, 0x4b, 0x45, 0x91, 0x45, 0x01, - 0x6d, 0x22, 0xe5, 0xbc, 0xa9, 0x64, 0xa6, 0xf3, 0xc0, 0x90, 0x9a, 0x86, 0x9b, 0xc6, - 0x39, 0x12, 0x27, 0xc9, 0x71, 0x2e, 0x23, 0x3b, 0x79, 0x4e, 0xc4, 0xdc, 0x42, 0x60, - 0xa8, 0x92, 0x2b, 0xd2, 0xa7, 0x46, 0x35, 0x82, 0x20, 0x57, 0x1d, 0xb5, 0x3c, 0x43, - 0x65, 0xe1, 0x38, 0x0f, 0x95, 0xe9, 0x05, 0xce, 0x92, 0x46, 0xff, 0x6b, 0x72, 0xc0, - 0x0f, 0x65, 0x00, 0xbe, 0x35, 0xfa, 0xb1, 0x0d, 0xf4, 0x47, 0x5e, 0xac, 0x51, 0x25, - 0xc6, 0x7d, 0x67, 0xfb, 0xaa, 0xe8, 0xed, 0xc2, 0x84, 0x20, 0xce, 0xd9, 0x8a, 0xa1, - 0x95, 0x98, 0x55, 0xb5, 0x80, 0xd4, 0x51, 0x01, 0x29, 0x98, 0x62, 0x32, 0x47, 0x55, - 0xed, 0xb4, 0xf0, 0x26, 0x3f, 0x46, 0x34, 0x74, 0xc8, 0xbb, 0x2e, 0x1b, 0x85, 0xfc, - 0xcc, 0x6a, 0xf6, 0xa8, 0x77, 0xed, 0xda, 0x3c, 0x9d, 0x6f, 0xee, 0xb0, 0x3f, 0x2c, - 0x95, 0x0e, 0xae, 0x8e, 0x80, 0xe9, 0xa3, 0xfc, 0x94, 0xf6, 0xff, 0x94, 0xa5, 0x74, - 0xa5, 0x22, 0xdf, 0x5a, 0x8d, 0x89, 0xa2, 0xd8, 0x60, 0xd0, 0xd1, 0xda, 0x38, 0xd7, - 0x39, 0x94, 0x69, 0x0b, 0x0d, 0x0c, 0x47, 0x8e, 0x52, 0x87, 0x0a, 0xb8, 0xbc, 0xf4, - 0xb0, 0xb5, 0xc0, 0x5f, 0x2a, 0x2d, 0xd0, 0xfa, 0xeb, 0xfd, 0x61, 0x36, 0xc2, 0x37, - 0x90, 0x82, 0xdc, 0x7f, 0x14, 0x13, 0x85, 0xea, 0x6d, 0x4d, 0xa4, 0x60, 0x86, 0xe2, - 0x02, 0xd6, 0x0c, 0x4a, 0xa3, 0x0a, 0x42, 0x41, 0x61, 0x1b, 0x52, 0x3a, 0x86, 0xc4, - 0x54, 0xeb, 0x93, 0xa4, 0x90, 0x87, 0xa6, 0x12, 0xc0, 0x45, 0x71, 0xfd, 0x49, 0x76, - 0xae, 0xe6, 0x4b, 0x95, 0x52, 0xe9, 0x02, 0x54, 0xfa, 0x54, 0xc3, 0xaf, 0x9a, 0xb2, - 0x20, 0xdf, 0x25, 0xbf, 0xea, 0xa3, 0x0d, 0xbf, 0xea, 0x32, 0x3b, 0x2a, 0x95, 0x76, - 0xaa, 0x68, 0xbc, 0x03, 0xfe, 0xd1, 0x7f, 0xef, 0x8f, 0x74, 0x56, 0x9a, 0xf5, 0xc9, - 0xed, 0xd1, 0xc4, 0xf5, 0xec, 0x71, 0x10, 0x22, 0x96, 0x32, 0xd1, 0x09, 0xcb, 0xa3, - 0xd0, 0x61, 0xe5, 0x3d, 0xb1, 0x7f, 0xba, 0xc2, 0x3e, 0xbb, 0x22, 0xa5, 0x01, 0x8d, - 0x45, 0x8d, 0xeb, 0x39, 0x50, 0x8b, 0x05, 0x32, 0x0b, 0x2c, 0xef, 0xd7, 0x05, 0x80, - 0x04, 0x79, 0xfd, 0x07, 0xa0, 0x58, 0x2b, 0x06, 0xc9, 0x0e, 0x06, 0xff, 0x94, 0x41, - 0x94, 0xac, 0x22, 0x81, 0xa3, 0x55, 0xe3, 0x7f, 0x55, 0x69, 0x80, 0x88, 0xf6, 0x0e, - 0x4d, 0x35, 0xcb, 0x3a, 0x5e, 0xc9, 0xc3, 0x22, 0xb3, 0x78, 0x15, 0x66, 0x4f, 0x21, - 0x34, 0xe1, 0x5b, 0xfb, 0x79, 0xeb, 0xed, 0x6d, 0x11, 0x94, 0x3a, 0x84, 0x0d, 0x11, - 0xa7, 0x20, 0x4a, 0x03, 0x11, 0x27, 0xa2, 0xd2, 0x4d, 0x5f, 0x3b, 0x24, 0x48, 0xa4, - 0x32, 0x81, 0x60, 0x9b, 0x5e, 0x16, 0x05, 0x4d, 0x0c, 0x50, 0xd6, 0x1a, 0x1b, 0x49, - 0x93, 0xab, 0xa7, 0xca, 0xc0, 0x99, 0x4b, 0xef, 0x28, 0xaa, 0xaf, 0xd2, 0xb5, 0x9e, - 0xe1, 0x02, 0x4d, 0x0a, 0xdf, 0x6d, 0x9c, 0xa2, 0xf6, 0xf5, 0xcf, 0x52, 0x78, 0x99, - 0xa5, 0xc0, 0x6d, 0x11, 0x89, 0x43, 0x84, 0x8d, 0xd4, 0x5c, 0x8d, 0x11, 0xa0, 0x48, - 0x3e, 0x3d, 0x9a, 0xd2, 0xec, 0xc5, 0x34, 0x75, 0xa2, 0xad, 0xf8, 0x1a, 0x6f, 0xb1, - 0x81, 0x8d, 0x2c, 0x0a, 0x90, 0xf1, 0xb6, 0x40, 0xf1, 0x39, 0x44, 0x15, 0x25, 0x8d, - 0xbe, 0x48, 0x93, 0x26, 0xd1, 0x5a, 0xef, 0xa1, 0x15, 0x45, 0xe1, 0x76, 0xb6, 0x02, - 0xad, 0x5d, 0x5d, 0xfd, 0xf6, 0xc0, 0xea, 0xb9, 0xd5, 0xba, 0x81, 0x96, 0x6e, 0xaa, - 0x65, 0xe4, 0xb3, 0xda, 0x62, 0x47, 0xac, 0xe6, 0xcd, 0x37, 0xd1, 0x95, 0x1e, 0xf8, - 0x4b, 0xf7, 0x46, 0x1b, 0xf7, 0x56, 0x1c, 0xcf, 0x3f, 0xde, 0x71, 0x9f, 0xe8, 0xb8, - 0x4f, 0x75, 0x56, 0xdd, 0x37, 0xf1, 0xe5, 0xa2, 0x62, 0x7f, 0x13, 0x59, 0x52, 0x91, - 0x42, 0xa5, 0x19, 0x68, 0x7f, 0x81, 0x71, 0xa2, 0x47, 0xa5, 0x00, 0x20, 0x04, 0xa4, - 0x15, 0x88, 0xa0, 0x0c, 0x2d, 0x52, 0x35, 0x2b, 0x0e, 0x08, 0x06, 0xe3, 0xea, 0x92, - 0xea, 0x05, 0x86, 0x2a, 0xb8, 0x70, 0x46, 0xf4, 0x9e, 0x65, 0xbb, 0x22, 0xc7, 0x8c, - 0xb7, 0x24, 0x59, 0x1c, 0x42, 0x7f, 0xd8, 0x31, 0x65, 0xf8, 0x79, 0x9a, 0x93, 0x4b, - 0x92, 0x98, 0x82, 0x6a, 0xde, 0x0f, 0x73, 0x92, 0xbd, 0xfc, 0xcc, 0xe8, 0x67, 0xd6, - 0xd3, 0xe4, 0x08, 0xcf, 0xce, 0xf5, 0x45, 0xde, 0x62, 0x91, 0x4f, 0xe5, 0x2c, 0xba, - 0x22, 0x14, 0x7b, 0x3f, 0x85, 0xd2, 0x7f, 0xae, 0xc9, 0xa6, 0x5a, 0x73, 0x0f, 0x1e, - 0xa6, 0x3e, 0x42, 0xf2, 0x6a, 0x55, 0x51, 0x5d, 0xfa, 0x27, 0xca, 0xbc, 0x11, 0xce, - 0x6b, 0x7f, 0xa2, 0xcc, 0x97, 0x0f, 0x76, 0xfc, 0x96, 0x1f, 0xbd, 0xe3, 0x63, 0x2e, - 0x87, 0x2d, 0xf6, 0xd4, 0x5b, 0xec, 0x79, 0x30, 0x9c, 0x48, 0x80, 0x96, 0x8c, 0x13, - 0x24, 0xf1, 0x03, 0x1d, 0x39, 0x88, 0x41, 0x23, 0x6d, 0x35, 0xc1, 0x42, 0x43, 0x2e, - 0x33, 0x98, 0x15, 0x75, 0x32, 0x42, 0x9a, 0x78, 0xbd, 0x0f, 0x31, 0x89, 0xd1, 0x95, - 0xb2, 0x22, 0x0b, 0x20, 0x58, 0x2c, 0x80, 0x2b, 0x02, 0xe2, 0x47, 0xfa, 0x5b, 0xf2, - 0x5a, 0x1a, 0x0d, 0x2d, 0xb1, 0x20, 0xf9, 0x9b, 0x0c, 0xea, 0x02, 0xad, 0xfc, 0x56, - 0x9e, 0x8f, 0x29, 0xad, 0xc8, 0x74, 0xec, 0x9f, 0x1d, 0xfd, 0x68, 0x2d, 0x31, 0xf6, - 0xda, 0x54, 0x5c, 0xaa, 0x3e, 0x84, 0x43, 0xa0, 0x02, 0x4c, 0xa0, 0x2d, 0x76, 0x32, - 0xa7, 0x8b, 0x68, 0x78, 0xef, 0xf8, 0xc9, 0x41, 0xda, 0x3a, 0x33, 0xef, 0xdc, 0x0f, - 0xbd, 0x34, 0xab, 0x8f, 0x00, 0xef, 0x93, 0xf3, 0x99, 0x42, 0x85, 0xad, 0x43, 0xff, - 0xb7, 0x57, 0xc0, 0xe6, 0x09, 0x44, 0x62, 0x35, 0x9b, 0xe7, 0x65, 0xa6, 0xac, 0x0e, - 0xe4, 0x5a, 0x12, 0xb8, 0x97, 0x86, 0x45, 0x82, 0xa7, 0x24, 0x1e, 0x18, 0x8b, 0x32, - 0x0e, 0x46, 0xba, 0x69, 0xa3, 0xc2, 0x6a, 0xa7, 0x24, 0x10, 0x75, 0x79, 0xf3, 0x05, - 0xef, 0x26, 0x1c, 0x66, 0x5e, 0xa5, 0x53, 0x31, 0x50, 0xec, 0x6f, 0xa7, 0xe2, 0x41, - 0x45, 0x8a, 0xe5, 0x79, 0xe9, 0x54, 0x10, 0x36, 0x87, 0x47, 0xd2, 0x69, 0xc2, 0xdb, - 0xcc, 0x17, 0xab, 0x9d, 0x70, 0xc8, 0x56, 0xf1, 0x5e, 0x0b, 0x05, 0xbf, 0xfc, 0xdc, - 0x9c, 0x50, 0xb0, 0xd5, 0x6e, 0xf1, 0x28, 0xfe, 0xf2, 0x6a, 0xb6, 0xc5, 0x4e, 0x19, - 0x22, 0xee, 0x14, 0x32, 0xd0, 0xc2, 0x25, 0xbc, 0xb4, 0xb8, 0x8c, 0x45, 0xd0, 0x74, - 0x13, 0xc4, 0x40, 0x64, 0x10, 0x75, 0x4e, 0x55, 0x01, 0x92, 0xc8, 0x44, 0x31, 0x07, - 0xee, 0xc6, 0xb9, 0x22, 0x50, 0x95, 0xa9, 0x4c, 0xc6, 0xb0, 0x8c, 0x83, 0x1b, 0xf4, - 0x55, 0xec, 0xa5, 0x48, 0xeb, 0x55, 0x94, 0x90, 0xcd, 0xcb, 0xa3, 0x9b, 0x03, 0x82, - 0x1e, 0x40, 0x98, 0x04, 0xb6, 0x81, 0x24, 0xd1, 0x79, 0xda, 0x43, 0x64, 0x10, 0xeb, - 0x12, 0xa5, 0x36, 0x4d, 0x02, 0xd8, 0x4d, 0x13, 0xc2, 0x8c, 0x3b, 0xd7, 0xd9, 0x59, - 0x24, 0x97, 0x43, 0x34, 0x7c, 0xb5, 0xab, 0x88, 0x5a, 0x9a, 0x44, 0x08, 0x21, 0xae, - 0xdf, 0x64, 0xfd, 0x22, 0xb4, 0xd5, 0xa4, 0xfc, 0xe1, 0xed, 0x73, 0x3c, 0x70, 0x0c, - 0xd2, 0xd7, 0x37, 0xae, 0x2d, 0xf0, 0xda, 0x85, 0x07, 0xc1, 0x87, 0x47, 0x7f, 0x65, - 0x25, 0x6c, 0x06, 0x0f, 0xe5, 0xa4, 0x3c, 0xcf, 0xfd, 0x44, 0x35, 0x66, 0xb0, 0xdf, - 0xb9, 0xbe, 0x30, 0xef, 0xd2, 0xdb, 0xa0, 0x5c, 0x32, 0x72, 0x41, 0x2e, 0xc8, 0xb0, - 0xaf, 0x81, 0x1b, 0xb3, 0xdf, 0xb9, 0x9a, 0x9d, 0xea, 0x9b, 0x62, 0x90, 0x32, 0x6b, - 0x37, 0x28, 0xe0, 0x4d, 0x61, 0x67, 0xad, 0xfa, 0x2b, 0xec, 0x61, 0x67, 0xe1, 0xd4, - 0x74, 0xa5, 0xb3, 0xcd, 0x4e, 0xb3, 0xb9, 0x70, 0x5c, 0xfc, 0xb3, 0xce, 0x2e, 0x3b, - 0x6b, 0x0a, 0x70, 0x5e, 0xfc, 0x50, 0x80, 0xa8, 0x40, 0x24, 0xac, 0x8e, 0x51, 0xdf, - 0xc2, 0x3a, 0xc8, 0xd8, 0x64, 0xff, 0xb2, 0x9b, 0x3d, 0xc2, 0xb2, 0x48, 0xc5, 0x93, - 0xcc, 0xb2, 0xaf, 0x65, 0x6f, 0x12, 0xbf, 0x0e, 0x1e, 0x0f, 0xde, 0x03, 0x28, 0xac, - 0x24, 0x71, 0xf3, 0x40, 0x92, 0x8e, 0x6a, 0x08, 0x88, 0xb9, 0xe4, 0x1a, 0x95, 0x07, - 0x50, 0x98, 0xcf, 0x10, 0xfc, 0xc2, 0x6f, 0x00, 0x7c, 0x90, 0xdc, 0x25, 0x99, 0x17, - 0x51, 0xd6, 0xa8, 0xb7, 0xc3, 0x4e, 0x58, 0x30, 0xc0, 0x86, 0x21, 0xf9, 0x91, 0xc0, - 0x70, 0x0e, 0x4f, 0x99, 0xfe, 0xf2, 0x4b, 0xa3, 0xaf, 0x4c, 0xf7, 0xfc, 0x27, 0x17, - 0x0f, 0xd5, 0xc6, 0x98, 0x83, 0x25, 0x32, 0x2f, 0x29, 0xf1, 0xce, 0x69, 0xd0, 0x3f, - 0xbb, 0x92, 0xdd, 0x60, 0x57, 0x44, 0xe0, 0x73, 0x05, 0xa2, 0x46, 0x5c, 0xf3, 0x0a, - 0xbb, 0x5a, 0x53, 0x7e, 0xa7, 0x1a, 0x90, 0xeb, 0x40, 0xdd, 0x1d, 0xb8, 0xc8, 0xfd, - 0xff, 0x24, 0xeb, 0xcc, 0x05, 0xfb, 0x0a, 0x53, 0x41, 0x77, 0x18, 0xa6, 0x6a, 0x29, - 0x35, 0x2c, 0x73, 0xb0, 0x91, 0x0d, 0x81, 0xee, 0xb4, 0x1e, 0xdc, 0x02, 0xf1, 0x2f, - 0xf2, 0x7b, 0x2a, 0xb0, 0x83, 0x4e, 0x47, 0xc7, 0x86, 0xa8, 0x7e, 0xd2, 0xf3, 0xd7, - 0xd9, 0x19, 0x89, 0x74, 0x68, 0x02, 0xf1, 0x07, 0x53, 0x73, 0x4b, 0x4a, 0x81, 0xdb, - 0xeb, 0xc2, 0xb1, 0x79, 0x6d, 0xf4, 0x8b, 0x9d, 0x74, 0x70, 0xae, 0x65, 0xa7, 0xfa, - 0x62, 0xde, 0xb9, 0x19, 0x33, 0x45, 0xbb, 0xd9, 0x23, 0xfd, 0xb1, 0x82, 0x9c, 0xcb, - 0xac, 0xb6, 0xab, 0xa0, 0xc9, 0x8e, 0xcd, 0x9f, 0x5c, 0x3c, 0x86, 0x1b, 0x20, 0x62, - 0xe1, 0x96, 0xc7, 0x3c, 0x65, 0xff, 0x02, 0xb3, 0xc8, 0x42, 0x9b, 0x74, 0xe6, 0xba, - 0x3d, 0x76, 0x8e, 0xad, 0x8b, 0xf4, 0x0f, 0x49, 0xee, 0xe7, 0x02, 0xdb, 0xc4, 0x20, - 0x52, 0xfa, 0x6b, 0x94, 0xe9, 0xdf, 0x66, 0xc7, 0x01, 0x6e, 0x86, 0x2d, 0x54, 0x8d, - 0xc8, 0x0c, 0xee, 0xb0, 0xc4, 0xfc, 0xbf, 0x3b, 0xfa, 0x54, 0xb7, 0x26, 0xa1, 0x30, - 0x45, 0x75, 0xba, 0x1c, 0xd4, 0x61, 0x35, 0x3b, 0xc5, 0xb2, 0x20, 0x6d, 0x50, 0x7d, - 0xeb, 0x93, 0x8c, 0xc2, 0xce, 0x0a, 0x21, 0xc3, 0x1c, 0x30, 0x69, 0xa5, 0x16, 0x83, - 0xba, 0x89, 0x16, 0xf8, 0xaa, 0x7a, 0xe7, 0xd8, 0xba, 0xa9, 0x7f, 0x7e, 0x60, 0xdd, - 0xdc, 0x39, 0x1f, 0xdc, 0x29, 0xdd, 0x42, 0xe1, 0x76, 0x8d, 0x9d, 0xa6, 0x30, 0x99, - 0x90, 0xc0, 0xe0, 0x37, 0x98, 0x41, 0xe7, 0x76, 0x3e, 0xb8, 0x52, 0xb5, 0xbb, 0xb8, - 0xc0, 0xe7, 0x76, 0xc4, 0x36, 0x1f, 0x11, 0xe0, 0x58, 0xb5, 0xee, 0x7b, 0x7d, 0xf4, - 0x6b, 0x5d, 0x9c, 0xa2, 0xee, 0x13, 0xab, 0xe3, 0xdc, 0x4d, 0xf6, 0x3b, 0x37, 0xb3, - 0x93, 0x7d, 0x4c, 0xff, 0x37, 0x21, 0x76, 0x67, 0xa4, 0x45, 0xb1, 0x98, 0x52, 0xa3, - 0xfa, 0x0f, 0xa2, 0xc6, 0x76, 0xd6, 0xfb, 0x6e, 0x78, 0x95, 0x0f, 0xf2, 0xce, 0x7e, - 0xe7, 0x83, 0xd9, 0xa9, 0x3e, 0xa0, 0x82, 0x12, 0x30, 0x5f, 0x75, 0x83, 0x0b, 0xbe, - 0x03, 0xdd, 0x24, 0x7a, 0xff, 0xfe, 0x48, 0xc7, 0xe0, 0x99, 0x2b, 0x4d, 0x7a, 0x1b, - 0x9d, 0xf5, 0x9a, 0x1a, 0xdf, 0xa2, 0xf5, 0xd8, 0x81, 0x46, 0x3b, 0xab, 0x6e, 0x3b, - 0xc8, 0xa3, 0xb0, 0xbe, 0x1e, 0xf8, 0x45, 0xd6, 0x7e, 0xfa, 0x1c, 0xd1, 0x02, 0xc3, - 0x11, 0xd5, 0xc3, 0x66, 0xeb, 0x88, 0x1c, 0xb5, 0x39, 0xc1, 0x5b, 0x6a, 0xbd, 0x88, - 0xfb, 0x75, 0x23, 0x1e, 0xf7, 0xbb, 0x47, 0xb2, 0x5b, 0x0c, 0x34, 0x6c, 0xe1, 0x9d, - 0x65, 0xc5, 0x54, 0x4e, 0x60, 0x4c, 0xc8, 0x9b, 0x16, 0x7b, 0x04, 0x89, 0x2f, 0x10, - 0x44, 0x95, 0xa8, 0x40, 0x70, 0x88, 0xdb, 0xfd, 0x91, 0x88, 0xc5, 0x0f, 0xed, 0x29, - 0x27, 0x5a, 0xdd, 0x26, 0xde, 0x01, 0x24, 0x98, 0x6c, 0xa2, 0x08, 0x49, 0xa1, 0xfb, - 0xe0, 0x1b, 0x85, 0x78, 0x6b, 0x50, 0x01, 0xb3, 0x11, 0x15, 0xd5, 0x78, 0xb0, 0x38, - 0x22, 0xe8, 0x0c, 0xea, 0x3d, 0xc6, 0x1e, 0x36, 0x80, 0x95, 0x2b, 0x26, 0x84, 0xe7, - 0x4a, 0x53, 0xa9, 0x82, 0xfc, 0xf4, 0xf9, 0x33, 0xf8, 0x12, 0x3b, 0x06, 0xd2, 0xda, - 0x7a, 0x32, 0x6f, 0xe6, 0xf2, 0xe6, 0xd5, 0x78, 0x54, 0x26, 0xab, 0x9c, 0xb3, 0xf3, - 0x82, 0x40, 0x57, 0xde, 0x0a, 0xab, 0x84, 0xcb, 0x79, 0x4c, 0x39, 0x2b, 0x4a, 0x39, - 0x13, 0x1a, 0xf6, 0x76, 0xf7, 0xe5, 0x37, 0x46, 0x3f, 0x0f, 0xf3, 0xf9, 0x13, 0x79, - 0x9f, 0x53, 0xc4, 0xdc, 0x00, 0xa5, 0xa5, 0x98, 0x94, 0x52, 0x93, 0x9e, 0x13, 0x24, - 0x65, 0x85, 0x99, 0x54, 0x71, 0xff, 0xfb, 0x6f, 0x0f, 0xf6, 0x3b, 0xcf, 0xd6, 0x98, - 0x06, 0x65, 0x35, 0x6d, 0x2f, 0x23, 0xee, 0xdf, 0x12, 0xf6, 0xca, 0x81, 0x34, 0x5a, - 0xec, 0x6d, 0x3f, 0x14, 0xd7, 0xd7, 0xaf, 0x3e, 0xf7, 0xdc, 0xb6, 0xdf, 0x8a, 0xeb, - 0x0a, 0x53, 0xad, 0x86, 0xd5, 0x32, 0xb7, 0x1b, 0xb6, 0xdd, 0xae, 0xbe, 0x06, 0xba, - 0x22, 0xaf, 0xda, 0x7f, 0x38, 0xdb, 0x6a, 0x7d, 0x7c, 0x3f, 0x80, 0xf6, 0xea, 0x2e, - 0x38, 0x23, 0xc5, 0x35, 0x94, 0x80, 0x01, 0x32, 0xf9, 0xea, 0x5e, 0x75, 0x51, 0xa3, - 0x45, 0xce, 0x7c, 0xfa, 0x16, 0x77, 0xb3, 0xc7, 0x66, 0x5e, 0x59, 0x7b, 0x99, 0x13, - 0xc9, 0x2d, 0xb6, 0xaf, 0xea, 0xf9, 0xef, 0xb3, 0x37, 0xf7, 0xdb, 0xa6, 0x52, 0x8c, - 0x2f, 0x08, 0x4a, 0xd0, 0x23, 0xe9, 0x29, 0x07, 0x79, 0x34, 0x99, 0xf4, 0xbc, 0x6b, - 0x76, 0x3b, 0x2d, 0x98, 0x4a, 0x27, 0xb1, 0x3e, 0x16, 0x4f, 0xb7, 0xd9, 0xcc, 0x8d, - 0xa8, 0x88, 0x85, 0xea, 0x6d, 0xef, 0x24, 0xd2, 0x1a, 0xa8, 0x2e, 0x6f, 0x55, 0x7a, - 0x6a, 0x9c, 0xff, 0x26, 0x34, 0x5f, 0x3a, 0x1f, 0xd0, 0xc5, 0x43, 0x9a, 0x96, 0x48, - 0xed, 0x90, 0x6e, 0x9e, 0x43, 0x74, 0x46, 0xf5, 0x5a, 0xce, 0xef, 0x70, 0x44, 0xcd, - 0x09, 0x3e, 0x5c, 0xef, 0x91, 0x90, 0xc5, 0xac, 0xa0, 0x05, 0x6f, 0x5c, 0xc7, 0xe7, - 0x06, 0x2d, 0xde, 0x1c, 0xfd, 0x3a, 0x9d, 0xdf, 0xbb, 0xd9, 0xd9, 0x7e, 0xf8, 0x80, - 0x39, 0x40, 0x46, 0x6c, 0xb2, 0x6c, 0xff, 0xfc, 0xa7, 0xdd, 0xec, 0x51, 0x76, 0xcc, - 0x9b, 0x1c, 0x76, 0xca, 0x11, 0x78, 0x0a, 0x81, 0xcd, 0x63, 0x2e, 0x49, 0x61, 0x47, - 0x2a, 0xd4, 0x22, 0x13, 0x12, 0xf0, 0xd9, 0x96, 0x0f, 0xea, 0xc2, 0x29, 0x62, 0xb3, - 0xd2, 0x31, 0xb8, 0xc4, 0x8e, 0x16, 0x44, 0xdc, 0x9c, 0x1a, 0xf5, 0xef, 0x48, 0x07, - 0xe9, 0xe5, 0x8f, 0x8e, 0xfe, 0xcf, 0x9a, 0xe1, 0x38, 0xc8, 0x58, 0x9f, 0xb6, 0x65, - 0xea, 0x1b, 0x5b, 0x25, 0xb2, 0x37, 0xe8, 0x97, 0xe5, 0x2d, 0xbb, 0x3f, 0xb3, 0x0e, - 0xc6, 0x8e, 0x8e, 0xbe, 0x11, 0xbe, 0x3d, 0xfb, 0xb3, 0x1d, 0xf6, 0x09, 0x1d, 0xab, - 0xd6, 0x38, 0x3d, 0x17, 0xe8, 0x80, 0x87, 0x24, 0x8a, 0xae, 0x6d, 0x94, 0x6a, 0x77, - 0xa4, 0x4c, 0x3e, 0x20, 0x25, 0x6e, 0x7f, 0x54, 0x39, 0x54, 0x4d, 0xb6, 0x93, 0x50, - 0x5d, 0x4d, 0x25, 0x4f, 0x12, 0x23, 0x9e, 0x7e, 0x1f, 0x36, 0xe1, 0xe8, 0x02, 0xcd, - 0xa9, 0x66, 0xf0, 0x0d, 0x8a, 0x34, 0x42, 0x41, 0x47, 0xef, 0xc3, 0x4c, 0x13, 0x64, - 0x33, 0xa8, 0x20, 0x63, 0x48, 0x47, 0xd5, 0x84, 0x3f, 0x27, 0xc0, 0x51, 0x0d, 0x02, - 0xb3, 0x4d, 0x1a, 0x51, 0x13, 0x6d, 0xcf, 0xf3, 0x34, 0xb3, 0x93, 0xb1, 0xaa, 0x40, - 0x44, 0xfe, 0xc7, 0xa2, 0xf1, 0x63, 0x4b, 0x14, 0xbb, 0x1a, 0xb4, 0xcb, 0xec, 0xb8, - 0x2e, 0x84, 0xa2, 0x30, 0x5e, 0xfa, 0xee, 0x85, 0x50, 0x74, 0x26, 0xdd, 0x79, 0x66, - 0xf4, 0x53, 0xb5, 0xd1, 0x7c, 0xda, 0xdb, 0x48, 0x7a, 0x68, 0x13, 0xe3, 0xc6, 0x54, - 0xc3, 0x79, 0x4e, 0x63, 0xb9, 0x0c, 0xd7, 0x81, 0xb5, 0x19, 0xa2, 0xcf, 0xc6, 0x06, - 0x63, 0xff, 0x8f, 0xfb, 0xc9, 0x80, 0x48, 0xdc, 0x7a, 0x72, 0xd1, 0x5f, 0x7d, 0x5e, - 0x93, 0x05, 0xa1, 0xb0, 0x2e, 0x08, 0xab, 0xff, 0xc4, 0xa0, 0x74, 0x85, 0xe8, 0x89, - 0x38, 0xa8, 0xfe, 0x77, 0x24, 0x5f, 0x8e, 0xea, 0x26, 0x3a, 0x88, 0xbd, 0xc2, 0x9f, - 0x0a, 0xa1, 0xe0, 0x1a, 0x7a, 0x66, 0x91, 0x9d, 0xec, 0xeb, 0x56, 0x18, 0x45, 0xa6, - 0x09, 0x4e, 0xe9, 0x06, 0xbd, 0x13, 0xd5, 0x7f, 0x8f, 0x2b, 0x07, 0xf3, 0x85, 0xec, - 0x52, 0x7f, 0xac, 0xa7, 0x2d, 0xb9, 0xe4, 0x6c, 0xac, 0xed, 0xdb, 0x0f, 0x03, 0x33, - 0x03, 0x4c, 0x10, 0x9c, 0x1b, 0x01, 0x7f, 0x3f, 0xcc, 0x4e, 0xf4, 0x1d, 0x18, 0x8c, - 0x8d, 0x15, 0x70, 0x12, 0x76, 0x72, 0x92, 0x12, 0x0a, 0x78, 0xfd, 0x43, 0x68, 0x15, - 0xfc, 0xfd, 0x15, 0x48, 0xd6, 0x4b, 0x15, 0x76, 0xd1, 0x1a, 0x43, 0xf7, 0x75, 0xf6, - 0xa8, 0xb3, 0x68, 0xf4, 0x20, 0xf1, 0xba, 0xad, 0x81, 0xcd, 0x60, 0x1f, 0xa4, 0xc9, - 0xd2, 0x73, 0x6c, 0x47, 0x22, 0x9c, 0x11, 0x98, 0xec, 0xa3, 0x7a, 0x10, 0x45, 0x94, - 0x4c, 0xb5, 0x03, 0x39, 0x8c, 0x1f, 0xc5, 0xed, 0x62, 0xce, 0xee, 0x7a, 0xf0, 0x0d, - 0xe4, 0xce, 0x73, 0xa3, 0xdf, 0xee, 0xd6, 0x6b, 0x24, 0x66, 0x1f, 0xe5, 0x53, 0x03, - 0xb0, 0x3a, 0x96, 0xc5, 0x04, 0xa9, 0x46, 0x0f, 0x82, 0x58, 0x54, 0x71, 0x8e, 0x5c, - 0xea, 0x9b, 0xd9, 0x07, 0x7e, 0xdb, 0x71, 0xdf, 0x09, 0x22, 0x58, 0xad, 0x11, 0x26, - 0xd1, 0x44, 0x46, 0x76, 0x97, 0xdc, 0xdf, 0xbe, 0x6d, 0x35, 0x7b, 0xc4, 0x6f, 0xfa, - 0x91, 0x71, 0x3d, 0x9e, 0x8a, 0xef, 0x63, 0xd7, 0x71, 0xcb, 0x1f, 0x16, 0x21, 0x63, - 0x48, 0x30, 0x04, 0x48, 0x99, 0x02, 0x12, 0xc2, 0x4e, 0x06, 0x0d, 0xdf, 0x8b, 0xb2, - 0xdb, 0xba, 0xf7, 0x2c, 0x7b, 0xb2, 0x7f, 0xeb, 0xa6, 0x36, 0x22, 0xc5, 0x40, 0x8c, - 0xb9, 0x0b, 0xcc, 0xf9, 0x16, 0x59, 0xce, 0x6d, 0xc8, 0x93, 0xeb, 0x94, 0x12, 0x1c, - 0xcf, 0xc3, 0x03, 0xd9, 0xd0, 0xe8, 0x20, 0x2f, 0xed, 0xfd, 0x55, 0x73, 0xe2, 0x22, - 0xcb, 0x64, 0xd4, 0x9d, 0x49, 0xa0, 0xe5, 0x41, 0xff, 0xec, 0xce, 0x07, 0x47, 0xff, - 0xb2, 0x36, 0x51, 0x76, 0x17, 0x0f, 0xf8, 0xaa, 0x10, 0xa5, 0x8c, 0xa9, 0xa2, 0xf3, - 0x78, 0x30, 0x2d, 0x72, 0xd4, 0x8e, 0x8b, 0x31, 0x01, 0x44, 0x7c, 0xe3, 0x04, 0x38, - 0x3b, 0x76, 0x45, 0xbb, 0xaf, 0xb8, 0xb8, 0x42, 0x0b, 0xfa, 0x40, 0x36, 0xfb, 0x40, - 0xb6, 0xb9, 0x67, 0xbf, 0xbc, 0x82, 0xc7, 0x7f, 0x83, 0x79, 0xdf, 0xec, 0xba, 0x3d, - 0xf6, 0x0d, 0xec, 0xab, 0xb0, 0xae, 0x09, 0xce, 0x28, 0x49, 0x26, 0xa0, 0x25, 0x09, - 0x62, 0x3c, 0xdb, 0x4a, 0x89, 0xd4, 0xfb, 0x81, 0x8f, 0xde, 0x9b, 0x88, 0x16, 0x08, - 0xe9, 0x4d, 0xd0, 0x3e, 0xcd, 0xc7, 0x22, 0xf9, 0x5b, 0x29, 0xc6, 0x20, 0xac, 0x98, - 0x56, 0xa1, 0x20, 0x9a, 0x59, 0x52, 0xa4, 0xb8, 0x77, 0x8b, 0xed, 0x22, 0xda, 0x08, - 0x33, 0x05, 0x98, 0x0c, 0x37, 0x28, 0x0f, 0xeb, 0x4f, 0xcf, 0xca, 0xfd, 0x6d, 0x90, - 0xca, 0x5b, 0x23, 0x44, 0x91, 0xf3, 0x9d, 0xcb, 0xec, 0x84, 0xb7, 0x35, 0x87, 0x42, - 0xbb, 0xc9, 0xd4, 0x3c, 0x72, 0x79, 0x9e, 0x8b, 0xeb, 0x18, 0xb6, 0x00, 0xaa, 0x19, - 0x52, 0x88, 0xd5, 0x58, 0x57, 0xda, 0x8c, 0x2a, 0x28, 0xcd, 0xfd, 0xff, 0x6b, 0xdd, - 0x58, 0xb6, 0xd9, 0x71, 0x0b, 0xa8, 0xd5, 0xa2, 0xe9, 0x0b, 0x3b, 0x9e, 0x3b, 0xeb, - 0xf2, 0xdb, 0xdd, 0x3b, 0xcf, 0x8f, 0x7e, 0xaf, 0x36, 0x8f, 0x8a, 0xc5, 0xf3, 0xe8, - 0xe1, 0xc0, 0x85, 0x03, 0x55, 0xe6, 0x66, 0xb8, 0x60, 0xb4, 0x2f, 0xb1, 0x63, 0xd6, - 0x86, 0x38, 0x6e, 0xfa, 0x12, 0x56, 0x58, 0x3f, 0xa1, 0x6b, 0xea, 0x1e, 0x9d, 0x8c, - 0xc5, 0x08, 0x54, 0x65, 0xd7, 0xdc, 0x64, 0x8f, 0xeb, 0x82, 0x04, 0xa0, 0x27, 0x40, - 0x96, 0xc4, 0x25, 0xd6, 0xb1, 0xf9, 0x9e, 0x19, 0x5b, 0x37, 0xb1, 0x4d, 0x13, 0xa4, - 0xc8, 0xd1, 0x37, 0xee, 0x3d, 0xc9, 0xce, 0x9b, 0x82, 0x8a, 0x37, 0x2a, 0x89, 0xf7, - 0x96, 0xc0, 0x73, 0xbe, 0x64, 0x51, 0x48, 0xba, 0x6d, 0xbf, 0x30, 0xfa, 0x89, 0xd5, - 0x54, 0x8d, 0x65, 0x89, 0xbd, 0xee, 0x9f, 0x78, 0x07, 0x60, 0x93, 0x10, 0x64, 0xa9, - 0x75, 0xfb, 0xef, 0xb2, 0x11, 0x66, 0xa2, 0x09, 0x59, 0x36, 0x56, 0x16, 0xa3, 0x08, - 0xa0, 0x18, 0x09, 0x53, 0x4e, 0x54, 0x98, 0x2b, 0x31, 0x16, 0x50, 0x4c, 0xa3, 0x09, - 0x75, 0x25, 0x4c, 0xe0, 0x86, 0x57, 0x49, 0x28, 0xb4, 0x56, 0x88, 0x4a, 0x47, 0xde, - 0x36, 0x3b, 0x06, 0xb4, 0x02, 0x45, 0xc3, 0x12, 0x96, 0x4b, 0x43, 0xf3, 0xcf, 0xb3, - 0x0d, 0x21, 0xea, 0x37, 0x09, 0x81, 0x45, 0x7b, 0xbb, 0x7b, 0xe7, 0xc5, 0xd1, 0x9f, - 0xae, 0x4d, 0x35, 0x9b, 0x5d, 0xec, 0xe3, 0x77, 0xb7, 0xa4, 0xb9, 0x5b, 0x0e, 0x37, - 0x21, 0x0f, 0x61, 0x2a, 0x7f, 0x7b, 0x17, 0x4c, 0x65, 0xd4, 0x18, 0x4d, 0x2a, 0x69, - 0x1e, 0x67, 0xa7, 0x7d, 0xaf, 0x29, 0x8b, 0x31, 0x2c, 0xa1, 0x9b, 0x99, 0x27, 0x85, - 0xd3, 0x67, 0xc8, 0xce, 0x43, 0x72, 0x47, 0x97, 0x52, 0x14, 0xa5, 0xd2, 0x58, 0x9e, - 0xa7, 0xa6, 0x9a, 0x4b, 0xbd, 0xd4, 0xe4, 0xe9, 0xb1, 0x23, 0x46, 0xea, 0x86, 0x80, - 0x1e, 0xde, 0xe3, 0x76, 0xf7, 0xce, 0x87, 0x46, 0xff, 0xc3, 0x5a, 0x92, 0xac, 0x9b, - 0xa1, 0x32, 0x3b, 0x5c, 0x32, 0x44, 0xfa, 0xc3, 0xab, 0xb4, 0x97, 0xa2, 0x6e, 0xc0, - 0x37, 0xda, 0x64, 0x2f, 0xfd, 0xce, 0x0e, 0xfb, 0x86, 0x68, 0x63, 0x4a, 0x02, 0xcc, - 0x10, 0x4a, 0xc5, 0x60, 0xf1, 0x37, 0x15, 0x57, 0x82, 0x78, 0x81, 0x90, 0x93, 0x58, - 0xcb, 0x28, 0xb5, 0x09, 0xa2, 0x79, 0xc9, 0x9f, 0x25, 0x51, 0x59, 0x69, 0x54, 0xd2, - 0x21, 0xfa, 0x07, 0x0c, 0xbe, 0x3a, 0x50, 0xc3, 0x9b, 0xde, 0x61, 0xe3, 0x31, 0xfd, - 0x14, 0xa3, 0x44, 0xf4, 0x30, 0xa4, 0x5d, 0xc4, 0x5e, 0x29, 0x01, 0x78, 0x28, 0x38, - 0x72, 0x2c, 0xd4, 0x16, 0x30, 0x16, 0x75, 0x91, 0x21, 0xb6, 0xe8, 0x7c, 0xd6, 0xb1, - 0x0a, 0xda, 0x4c, 0xa3, 0x10, 0xc5, 0x13, 0xec, 0xac, 0x23, 0x4d, 0x95, 0xfa, 0x5e, - 0xa1, 0x0f, 0x9a, 0xce, 0xbf, 0xf3, 0xd2, 0xe8, 0x4f, 0xaf, 0x34, 0xc5, 0x70, 0xc5, - 0x01, 0xaa, 0x4c, 0x9e, 0xcc, 0x1e, 0xed, 0x03, 0x63, 0xc0, 0x3c, 0x37, 0x7a, 0x0d, - 0x5a, 0xd0, 0x15, 0xb0, 0x82, 0xb4, 0xab, 0xce, 0xe1, 0x05, 0xe6, 0xa1, 0x3e, 0x44, - 0x1a, 0xc1, 0x9f, 0xc2, 0xff, 0xcd, 0x0a, 0xda, 0x63, 0x21, 0x20, 0x5a, 0xd9, 0x63, - 0x1f, 0x61, 0xef, 0x0f, 0x19, 0x5f, 0x42, 0x37, 0x59, 0x90, 0x1e, 0x45, 0xb0, 0x19, - 0x40, 0x06, 0xa1, 0x2a, 0x90, 0xa2, 0x03, 0x83, 0x52, 0x29, 0xef, 0x9e, 0x17, 0xd3, - 0xe3, 0x17, 0x36, 0xa4, 0xde, 0x07, 0xd8, 0x30, 0xdc, 0xd2, 0x16, 0x25, 0xb7, 0xa0, - 0x4e, 0x4b, 0xde, 0xbf, 0xdc, 0x03, 0xaf, 0x75, 0xc6, 0xf9, 0x4a, 0xbe, 0xe2, 0x5c, - 0xa5, 0x95, 0x83, 0xef, 0xe9, 0x2f, 0x8f, 0x7e, 0x8e, 0x34, 0x9e, 0xd5, 0x32, 0x46, - 0xf8, 0x06, 0x75, 0xd3, 0x7e, 0xe7, 0x34, 0x22, 0xc6, 0x15, 0x21, 0xc6, 0xd7, 0x8c, - 0x2d, 0xad, 0x7a, 0x70, 0xb8, 0xbb, 0x2d, 0xb5, 0xd0, 0x7f, 0xf0, 0x58, 0xf6, 0xd5, - 0xec, 0xa3, 0x60, 0x2f, 0x04, 0x4a, 0x02, 0x5c, 0x79, 0x54, 0x50, 0x49, 0x3c, 0x13, - 0xd8, 0xa5, 0xf9, 0xae, 0x77, 0xe5, 0x4b, 0xaa, 0x1b, 0x84, 0x52, 0x5c, 0x83, 0x6a, - 0xc4, 0x10, 0xe9, 0xbb, 0x05, 0xd1, 0x36, 0xaa, 0x77, 0x49, 0xea, 0x78, 0xb0, 0x68, - 0xfe, 0xb7, 0x57, 0xd9, 0x17, 0x56, 0x39, 0x1d, 0x52, 0x58, 0xc6, 0x0b, 0x27, 0x10, - 0x6c, 0x07, 0x10, 0x79, 0x10, 0xd2, 0x40, 0x4a, 0x1e, 0xca, 0x99, 0x09, 0x3e, 0x82, - 0x7a, 0xcf, 0x58, 0x90, 0x1a, 0x48, 0x76, 0x40, 0xd9, 0xd8, 0x8f, 0x2f, 0xc9, 0x77, - 0x24, 0x9a, 0x62, 0xe4, 0xba, 0x09, 0x43, 0x25, 0xac, 0x08, 0xb2, 0x0c, 0x0d, 0x35, - 0x45, 0x9a, 0xe5, 0xae, 0xd9, 0x2b, 0xe3, 0xd2, 0x96, 0xbb, 0x7a, 0xcf, 0x4f, 0x9b, - 0x4a, 0x05, 0x92, 0x68, 0x4c, 0x94, 0x0e, 0xc6, 0x22, 0xe6, 0x0a, 0x07, 0xb7, 0x4a, - 0x90, 0x94, 0x2c, 0xb5, 0xb9, 0x35, 0x40, 0xc4, 0x3b, 0xb1, 0xf0, 0x49, 0xaa, 0x79, - 0x55, 0xa8, 0xb4, 0x15, 0x5e, 0xb4, 0xea, 0x18, 0xd2, 0xf0, 0x84, 0xaa, 0x6e, 0xca, - 0x8d, 0x08, 0x7e, 0x0b, 0x31, 0x55, 0x40, 0xfa, 0x21, 0x43, 0xa6, 0xa5, 0xe2, 0xcf, - 0x11, 0xc4, 0x88, 0x57, 0x95, 0x1a, 0x12, 0x8a, 0xc1, 0x37, 0xe6, 0xe1, 0xad, 0x4a, - 0x75, 0xff, 0x6d, 0x78, 0x00, 0x6c, 0xad, 0x02, 0xdf, 0x48, 0xd2, 0xee, 0x19, 0x08, - 0x47, 0x42, 0x1b, 0xbf, 0x95, 0x22, 0x79, 0x4e, 0x8c, 0xd7, 0x10, 0x2e, 0x11, 0x82, - 0xb1, 0x38, 0x10, 0x7e, 0x04, 0xb4, 0x1f, 0x01, 0x07, 0x72, 0xd4, 0x64, 0x23, 0x28, - 0x1d, 0x38, 0x75, 0x6e, 0x95, 0x2a, 0x08, 0xb1, 0xe1, 0xce, 0xab, 0x26, 0xc8, 0x2a, - 0x81, 0x2f, 0x95, 0xc3, 0x83, 0xbc, 0xc5, 0x0c, 0x54, 0x05, 0x02, 0x6b, 0x02, 0x92, - 0x8f, 0x70, 0x84, 0xd3, 0x4c, 0xe6, 0x41, 0x58, 0xf3, 0x15, 0x46, 0x93, 0xe6, 0x44, - 0x3e, 0xc0, 0x3e, 0xf2, 0xbf, 0x49, 0xc2, 0x92, 0x92, 0x42, 0x16, 0x9c, 0x3b, 0x68, - 0xb1, 0xf8, 0x6f, 0x09, 0xdb, 0xbc, 0x4c, 0x88, 0x0d, 0x36, 0x42, 0xa2, 0xee, 0x8b, - 0x1d, 0xf6, 0x0f, 0x3a, 0xdc, 0xc6, 0x10, 0x4e, 0x59, 0xc4, 0xc8, 0x17, 0xbc, 0x1e, - 0x9e, 0x1a, 0x86, 0x0a, 0x81, 0x83, 0x14, 0xec, 0x50, 0xa2, 0x2c, 0x9e, 0xa1, 0x78, - 0x16, 0x41, 0x48, 0x14, 0x16, 0xb0, 0x13, 0x94, 0x33, 0x9a, 0x5c, 0xa1, 0x26, 0x3d, - 0xdc, 0xcd, 0xb9, 0x41, 0x20, 0xe7, 0x30, 0x54, 0x56, 0x8e, 0x40, 0x91, 0x32, 0x4a, - 0xec, 0xf8, 0xfb, 0x98, 0xe8, 0x01, 0xd0, 0xea, 0x09, 0x70, 0x12, 0x84, 0x4a, 0x43, - 0x88, 0x2d, 0xb8, 0x5e, 0x25, 0x42, 0x7b, 0x07, 0x95, 0x80, 0x22, 0x82, 0x8d, 0x8e, - 0x84, 0xd2, 0xc8, 0x03, 0xdb, 0x14, 0x17, 0xd8, 0x26, 0x97, 0x52, 0x36, 0xca, 0x1b, - 0xa4, 0x94, 0x64, 0x55, 0xdc, 0x19, 0x7d, 0xac, 0x8e, 0x38, 0x38, 0xdd, 0x44, 0x99, - 0x35, 0xca, 0xd6, 0x8f, 0xf0, 0x12, 0x56, 0x4c, 0x38, 0x6e, 0xae, 0xc5, 0x83, 0xac, - 0xb5, 0xf0, 0x68, 0x45, 0x68, 0x1e, 0xb1, 0x09, 0xac, 0x3f, 0x65, 0xd6, 0xa5, 0xae, - 0x28, 0x37, 0xa5, 0x88, 0xe4, 0xaf, 0x07, 0xa8, 0xa0, 0xdf, 0x54, 0x52, 0x94, 0xc6, - 0x96, 0x8e, 0x27, 0x87, 0xe5, 0xb4, 0xeb, 0x3a, 0xa5, 0x1b, 0x9f, 0xe0, 0x1b, 0x9f, - 0xc9, 0x4e, 0xf5, 0x8b, 0xda, 0x31, 0x1c, 0x74, 0x5f, 0xa8, 0xf5, 0xf9, 0x02, 0x03, - 0x78, 0x40, 0xce, 0x10, 0xea, 0x04, 0x38, 0xf2, 0x6a, 0x45, 0xa6, 0xdb, 0x47, 0xfc, - 0x3d, 0x68, 0xb3, 0x6c, 0xed, 0x85, 0x33, 0xc8, 0xd0, 0x17, 0x27, 0x1a, 0xd1, 0x86, - 0xc6, 0x9a, 0xff, 0xb3, 0xf5, 0x97, 0x98, 0x85, 0xea, 0x5c, 0x2f, 0xa0, 0x4a, 0x3e, - 0x32, 0x58, 0xb4, 0x5f, 0x36, 0x75, 0x5e, 0x74, 0x89, 0xdf, 0x67, 0xa9, 0xf3, 0xe2, - 0xf7, 0x56, 0xb3, 0x2b, 0xec, 0x51, 0xef, 0x35, 0x93, 0x7b, 0x50, 0x8e, 0x03, 0x9f, - 0x4d, 0xad, 0xd6, 0xf7, 0xeb, 0xd9, 0xc4, 0x37, 0x0a, 0x7c, 0x0a, 0xfd, 0x28, 0x23, - 0x7f, 0xab, 0xb4, 0xb4, 0x98, 0x87, 0x91, 0x65, 0x02, 0x59, 0xa9, 0xaa, 0x7f, 0x6a, - 0x00, 0x77, 0x87, 0x44, 0x60, 0x00, 0x75, 0xf8, 0xd5, 0x44, 0xf8, 0x04, 0x93, 0xca, - 0x87, 0x46, 0xcc, 0x81, 0xb7, 0x05, 0xfb, 0xb7, 0x6e, 0x22, 0x91, 0x84, 0xc6, 0xeb, - 0x09, 0x9f, 0x17, 0xe3, 0x86, 0x6d, 0xea, 0x5e, 0xcb, 0x2d, 0x1d, 0xef, 0xa3, 0x7a, - 0xf7, 0xb0, 0x19, 0x70, 0xb1, 0x3a, 0x06, 0x5c, 0x5e, 0x19, 0x7d, 0x6e, 0xe3, 0xde, - 0x4a, 0x9e, 0xf3, 0xb0, 0x7e, 0x6e, 0x64, 0x67, 0xfa, 0xd8, 0x67, 0xe9, 0x14, 0x9c, - 0xd2, 0x9c, 0x17, 0x13, 0x1e, 0xb1, 0x21, 0x0c, 0x2e, 0x08, 0x48, 0x92, 0x9a, 0xde, - 0x59, 0x06, 0xbf, 0x40, 0x7f, 0x52, 0xf3, 0x17, 0xa9, 0x79, 0x6b, 0x2d, 0xca, 0x43, - 0x34, 0x10, 0xc2, 0x62, 0x6a, 0x6c, 0xd0, 0x3b, 0xd5, 0xf8, 0xcb, 0xfd, 0xb7, 0x07, - 0x61, 0x85, 0x5d, 0x99, 0xa5, 0x25, 0xbb, 0x8e, 0xe3, 0x8c, 0x21, 0xc3, 0x3b, 0xd9, - 0xe9, 0xf0, 0xbc, 0x9a, 0xae, 0xd2, 0xcc, 0x27, 0x3e, 0x3a, 0xfd, 0x44, 0xc0, 0x57, - 0x1e, 0x22, 0x9f, 0x41, 0x4e, 0x5a, 0x13, 0xa8, 0x52, 0xb0, 0xc7, 0x11, 0xcb, 0x19, - 0x02, 0x0e, 0x0e, 0x49, 0x17, 0x2a, 0xb9, 0xcb, 0xa9, 0x48, 0x9f, 0x23, 0x2b, 0x72, - 0x97, 0x9d, 0xa3, 0xa2, 0x03, 0x4d, 0xda, 0x9c, 0x5c, 0xbb, 0x49, 0x33, 0xa6, 0x67, - 0x0e, 0x8f, 0xd8, 0xbe, 0xf3, 0xea, 0xe8, 0xf3, 0xeb, 0x68, 0x1f, 0x5e, 0xc9, 0x4e, - 0xf5, 0xc3, 0xcb, 0xb7, 0x89, 0xb6, 0xfb, 0x9f, 0x96, 0xa3, 0x94, 0xc1, 0x22, 0x21, - 0x9a, 0xee, 0x75, 0xc0, 0xec, 0x27, 0x3b, 0xec, 0x8f, 0x18, 0x04, 0xdb, 0x21, 0x15, - 0x28, 0xd4, 0x58, 0x98, 0xd2, 0x01, 0x97, 0xdd, 0xa0, 0x94, 0xc2, 0x1b, 0xd8, 0x64, - 0x8f, 0x48, 0x59, 0x3a, 0x50, 0x0c, 0x25, 0xa2, 0x3f, 0x51, 0x6a, 0x0d, 0x87, 0x98, - 0xef, 0x1b, 0xa3, 0xa0, 0x4a, 0x4e, 0x0c, 0x4a, 0xeb, 0xb0, 0x20, 0x09, 0x74, 0xc9, - 0x8b, 0x89, 0x2b, 0x0b, 0x57, 0x4c, 0xa3, 0x5f, 0x8d, 0x0d, 0xc0, 0xd2, 0xde, 0x1f, - 0x84, 0x97, 0x78, 0xcf, 0x41, 0x70, 0xef, 0x8c, 0x6a, 0x10, 0xdc, 0xef, 0xea, 0x74, - 0xea, 0x28, 0x5c, 0x63, 0xf3, 0xc5, 0x53, 0xe3, 0x47, 0xbb, 0xad, 0x11, 0xb2, 0x57, - 0xd9, 0x53, 0xba, 0x20, 0x4b, 0x72, 0xa8, 0x31, 0x04, 0x9a, 0xfb, 0x7d, 0x32, 0x12, - 0x31, 0xa2, 0xec, 0x28, 0x9a, 0x1d, 0xa5, 0x2b, 0x80, 0x95, 0xb9, 0xa6, 0xe1, 0x8f, - 0x61, 0x33, 0x83, 0x31, 0xe6, 0x9e, 0x63, 0x57, 0x4d, 0x41, 0x89, 0x3b, 0x4a, 0x98, - 0x44, 0xcb, 0x07, 0x53, 0x5b, 0xcd, 0xf8, 0x99, 0x11, 0x87, 0x8f, 0x9f, 0x7d, 0x64, - 0xf4, 0x53, 0xab, 0x75, 0x75, 0xca, 0x0b, 0xd3, 0x19, 0xfb, 0x19, 0x3e, 0xd2, 0xf2, - 0xdb, 0xcd, 0x5f, 0xa1, 0x9c, 0x3b, 0xa6, 0x3b, 0x93, 0xfd, 0x46, 0xb2, 0x6d, 0xa1, - 0x29, 0xec, 0xae, 0xf7, 0x4a, 0x89, 0x8c, 0x16, 0xa5, 0xd2, 0x81, 0x8a, 0x21, 0xd9, - 0x3b, 0xa4, 0x8e, 0xd0, 0x1b, 0x06, 0x45, 0x46, 0x09, 0x60, 0xc8, 0x4c, 0x23, 0xeb, - 0xe6, 0x87, 0x25, 0x0e, 0xde, 0x53, 0xaf, 0x8d, 0xfe, 0x29, 0x79, 0xa5, 0x26, 0xbb, - 0xd4, 0x0f, 0xdf, 0x70, 0x10, 0x57, 0x72, 0x1d, 0x1b, 0x2f, 0xd5, 0x53, 0xff, 0x47, - 0x77, 0xf6, 0x46, 0x74, 0x85, 0x1d, 0x35, 0x46, 0xa9, 0x82, 0x4f, 0xaf, 0x51, 0xf8, - 0x33, 0x6c, 0xc3, 0xd7, 0xd8, 0x49, 0xf8, 0x57, 0x08, 0xc0, 0xb5, 0x34, 0xc4, 0xee, - 0x79, 0xcf, 0x2d, 0xe6, 0xbb, 0x73, 0xf0, 0xf4, 0xc6, 0xa8, 0xc5, 0x7d, 0xfb, 0x8f, - 0x57, 0xb2, 0x33, 0xec, 0x38, 0xa0, 0x3b, 0x5b, 0xb2, 0x5c, 0x21, 0xa4, 0x32, 0xe6, - 0x26, 0x66, 0xba, 0x20, 0x9f, 0x0c, 0xba, 0xd5, 0xad, 0xf1, 0x0f, 0xc1, 0x49, 0xb4, - 0xf6, 0xab, 0xd8, 0x2b, 0xfd, 0x5b, 0x37, 0x21, 0x2a, 0xcc, 0xf3, 0x72, 0x6c, 0xa3, - 0x33, 0x12, 0x3c, 0x24, 0x8e, 0x3c, 0x49, 0x7c, 0x50, 0x9a, 0x02, 0xb0, 0xb7, 0x70, - 0xae, 0x62, 0x4d, 0xb2, 0xdf, 0x1a, 0xec, 0x60, 0x46, 0xb1, 0x6e, 0x61, 0x0a, 0x38, - 0x32, 0x31, 0x85, 0x91, 0x87, 0x50, 0x74, 0x03, 0x0a, 0x0a, 0x91, 0xd3, 0xeb, 0xaf, - 0xb2, 0xa7, 0x75, 0x90, 0x0c, 0x47, 0x21, 0x44, 0x25, 0x07, 0x31, 0xef, 0x96, 0xa3, - 0x6a, 0x2e, 0x37, 0xe8, 0x07, 0xa2, 0xe1, 0x91, 0x63, 0x99, 0x79, 0x9d, 0xad, 0x49, - 0xe7, 0xb9, 0xf4, 0x77, 0x9c, 0xe5, 0xf3, 0x48, 0x0d, 0x9c, 0x20, 0x2a, 0x5d, 0x9a, - 0x3a, 0xa4, 0xf0, 0x5f, 0x1f, 0x7d, 0x61, 0x21, 0xca, 0xf4, 0x02, 0xdb, 0xb4, 0x9c, - 0xdb, 0x46, 0x38, 0x91, 0x73, 0xf8, 0x8c, 0x66, 0xe2, 0x4a, 0x37, 0x01, 0x70, 0x9a, - 0x00, 0x70, 0x8d, 0x90, 0xd9, 0xa7, 0x57, 0xd3, 0xc4, 0x55, 0xbd, 0xda, 0xe9, 0x3f, - 0xc4, 0xc4, 0x15, 0x22, 0xa6, 0x90, 0xe3, 0x89, 0x4a, 0xba, 0x81, 0x61, 0xd3, 0x84, - 0x3a, 0x45, 0x28, 0x92, 0xc0, 0x38, 0xbe, 0x18, 0x63, 0x16, 0x0b, 0x52, 0xec, 0xca, - 0x3b, 0xae, 0x96, 0xc7, 0xce, 0x74, 0x58, 0xe1, 0x2b, 0xc7, 0x5c, 0x54, 0x25, 0x14, - 0xb1, 0x84, 0x69, 0x23, 0x30, 0x4e, 0xfe, 0x07, 0xec, 0x63, 0x08, 0x32, 0xd0, 0x51, - 0x4c, 0x16, 0x0c, 0x4e, 0x80, 0x59, 0x41, 0xe4, 0x0e, 0x62, 0x9e, 0x05, 0xb8, 0xb2, - 0xd5, 0x9d, 0x21, 0x0a, 0x4b, 0x86, 0xb7, 0x1a, 0x13, 0xb2, 0x06, 0xab, 0x0f, 0xc1, - 0x04, 0x1f, 0xba, 0xe9, 0x60, 0x9e, 0x16, 0xb8, 0x3b, 0xee, 0x6c, 0xb1, 0x63, 0x0e, - 0x25, 0xe9, 0xeb, 0xb1, 0x6e, 0xda, 0xf9, 0xae, 0x9f, 0x63, 0x1b, 0x32, 0xaf, 0x93, - 0x59, 0x51, 0x92, 0xb3, 0x75, 0xb8, 0x77, 0x18, 0x70, 0xfc, 0x89, 0x1c, 0xde, 0xb2, - 0x7e, 0x4b, 0x19, 0xb0, 0x84, 0x77, 0xde, 0x18, 0x7d, 0xb1, 0x73, 0xef, 0x21, 0x98, - 0x78, 0x25, 0x04, 0x29, 0x40, 0x91, 0xfa, 0x53, 0x9d, 0x95, 0x5c, 0x00, 0x26, 0xe7, - 0x4c, 0x3f, 0x40, 0xc5, 0xea, 0x76, 0x3b, 0x19, 0x6c, 0x47, 0xc2, 0xaf, 0xfb, 0x9d, - 0xf3, 0x04, 0x9f, 0x98, 0xb6, 0xea, 0x3a, 0x7a, 0xa9, 0x8d, 0xf4, 0x73, 0x2b, 0xd9, - 0x90, 0x5d, 0xf6, 0xeb, 0x85, 0x7c, 0x0c, 0xef, 0x65, 0x15, 0x94, 0x45, 0xfc, 0x46, - 0x0b, 0xd1, 0x2c, 0x43, 0xe0, 0x48, 0xdc, 0x5e, 0xef, 0xb2, 0x67, 0x02, 0xad, 0x0e, - 0x96, 0x90, 0xca, 0xc0, 0x5e, 0x6c, 0x88, 0x9d, 0xd6, 0x1f, 0xea, 0x28, 0x15, 0x92, - 0x0b, 0x05, 0x39, 0x42, 0x87, 0x7f, 0x9a, 0xae, 0xa3, 0x31, 0x08, 0x98, 0xef, 0x29, - 0xb6, 0xe3, 0x27, 0x90, 0x19, 0x2b, 0x13, 0x14, 0x87, 0x61, 0x1d, 0x72, 0xdd, 0xcc, - 0x89, 0x25, 0xb4, 0x62, 0x07, 0x29, 0x23, 0x2d, 0xa6, 0x7e, 0x8f, 0xc4, 0x7a, 0xed, - 0x00, 0x9c, 0x74, 0x2b, 0x7d, 0x73, 0xf4, 0xbf, 0x6c, 0xdc, 0xdb, 0xc4, 0xf1, 0xe2, - 0xc5, 0xe0, 0x53, 0x1d, 0x58, 0xb0, 0x7c, 0x46, 0xce, 0xa3, 0x77, 0x16, 0xb7, 0x9d, - 0x28, 0xb0, 0x1f, 0x11, 0x7f, 0x07, 0x62, 0x7f, 0x5a, 0x9f, 0xcf, 0xa3, 0x77, 0x91, - 0x1d, 0x55, 0xe3, 0x5c, 0x4f, 0xf2, 0x7a, 0x57, 0xa8, 0xbc, 0x29, 0x17, 0x9d, 0x7d, - 0xe7, 0x4a, 0xf6, 0x04, 0xdb, 0xa6, 0xb8, 0x17, 0x05, 0x48, 0xcb, 0xb1, 0xb0, 0x2e, - 0x89, 0x4e, 0xa7, 0xc5, 0x51, 0x4f, 0xb0, 0x47, 0x93, 0x2a, 0x33, 0xde, 0x5a, 0xd9, - 0x10, 0x83, 0x5b, 0x4f, 0x42, 0xda, 0x89, 0x73, 0x0e, 0xb5, 0x10, 0x50, 0x08, 0x51, - 0x16, 0xc5, 0x14, 0x53, 0x67, 0x51, 0xbc, 0x03, 0xfa, 0xac, 0x3b, 0x6f, 0x8d, 0xbe, - 0xa3, 0x96, 0x90, 0x9b, 0xe6, 0xc3, 0x92, 0xed, 0xc4, 0x59, 0xd7, 0xb3, 0x33, 0x29, - 0x54, 0x7b, 0x7e, 0x49, 0x84, 0x5b, 0xc2, 0x96, 0xeb, 0xad, 0x8f, 0xb9, 0x3d, 0x94, - 0x0b, 0xf9, 0xa5, 0xe3, 0xd9, 0x39, 0x76, 0x3c, 0xa4, 0x99, 0x81, 0x49, 0x24, 0x2c, - 0x26, 0xbe, 0xc7, 0x7e, 0x7c, 0x85, 0xfd, 0xb5, 0x15, 0x42, 0x88, 0xe8, 0xd2, 0x01, - 0x2e, 0xd0, 0x01, 0x46, 0x5b, 0x04, 0x5a, 0xbf, 0x92, 0x08, 0x0f, 0x24, 0xd2, 0x77, - 0x60, 0xb1, 0x80, 0x1c, 0x92, 0x96, 0x3c, 0x0a, 0xa1, 0x10, 0x35, 0xbc, 0xb7, 0x9d, - 0x8d, 0x8d, 0x29, 0x31, 0x94, 0xec, 0x47, 0x96, 0xc5, 0x40, 0x97, 0xce, 0xa9, 0x54, - 0x18, 0x69, 0xc6, 0xa9, 0x19, 0xfa, 0xb0, 0x18, 0xc6, 0xa5, 0x79, 0x2b, 0xed, 0x04, - 0xdb, 0xba, 0xc0, 0x1a, 0x02, 0xc1, 0x61, 0xe4, 0xf5, 0xf6, 0xbb, 0xb5, 0x73, 0x70, - 0x1b, 0x1b, 0x16, 0x3e, 0xa7, 0x68, 0x33, 0x9a, 0x9c, 0x3c, 0x94, 0xdf, 0x4b, 0x62, - 0x7d, 0xe7, 0x24, 0x5f, 0x43, 0xd4, 0x22, 0xa8, 0x8f, 0x13, 0x6c, 0x7d, 0x42, 0xbb, - 0xc0, 0xea, 0xc1, 0x4b, 0x05, 0x3e, 0x5c, 0x8f, 0x43, 0xad, 0x27, 0x9c, 0x3e, 0xc0, - 0x61, 0x1d, 0xa5, 0x57, 0x78, 0x54, 0x99, 0xe1, 0x98, 0xda, 0xa3, 0x12, 0x0a, 0x78, - 0x98, 0x19, 0x46, 0xb1, 0x7d, 0xaa, 0x8d, 0x56, 0x36, 0xf2, 0xd5, 0xc3, 0x76, 0x47, - 0x4f, 0x51, 0x08, 0x3f, 0xa4, 0xc2, 0x7a, 0xff, 0x12, 0xc0, 0x46, 0x5f, 0x54, 0x3d, - 0x26, 0xf0, 0xf9, 0x84, 0x71, 0xb0, 0x35, 0x43, 0x51, 0xc4, 0x3c, 0x72, 0xef, 0xef, - 0xae, 0xb0, 0xff, 0x16, 0xc4, 0x73, 0x66, 0x0e, 0xe7, 0x7b, 0x6d, 0x20, 0x87, 0xff, - 0x3f, 0x1f, 0xc8, 0x01, 0x1e, 0x0a, 0x7c, 0x4f, 0x1c, 0xe5, 0xd5, 0x40, 0xee, 0x3c, - 0xc6, 0x4e, 0x92, 0xc5, 0xef, 0x5c, 0x93, 0xc3, 0x60, 0x89, 0xc3, 0x65, 0x8b, 0x1d, - 0x91, 0x53, 0xbf, 0xcb, 0xf8, 0xfb, 0xcd, 0x2d, 0x6f, 0xb3, 0x35, 0x7f, 0xd7, 0xf1, - 0xf7, 0xda, 0x86, 0xf8, 0x15, 0x23, 0x75, 0x6f, 0x0d, 0x88, 0x6e, 0x3e, 0xde, 0xcd, - 0xf9, 0x27, 0x4e, 0xe7, 0xf0, 0x31, 0xb9, 0x1a, 0x2b, 0x3d, 0xe9, 0xe3, 0xb5, 0x83, - 0x4f, 0x76, 0x56, 0x38, 0xf2, 0x80, 0x3d, 0xda, 0x1f, 0x4b, 0x1d, 0xbd, 0xaf, 0xd6, - 0x60, 0xf0, 0x91, 0x30, 0x43, 0x77, 0xd6, 0x72, 0x4e, 0xa5, 0x2e, 0x6f, 0x2d, 0x3e, - 0xa3, 0x9e, 0x20, 0x48, 0x92, 0x04, 0xac, 0x2c, 0xce, 0x03, 0x0d, 0x79, 0x82, 0x50, - 0xd4, 0x0d, 0x86, 0x17, 0x4c, 0xb3, 0xe4, 0xce, 0xb7, 0xb2, 0x5e, 0x9f, 0x0f, 0x66, - 0xbd, 0xd5, 0xb1, 0x5c, 0xa9, 0x6a, 0xa3, 0x3d, 0xce, 0xd3, 0xf5, 0xb3, 0xd3, 0xc5, - 0x3b, 0x7c, 0x2c, 0x3b, 0xeb, 0xef, 0xd0, 0xfa, 0x7a, 0xf5, 0xeb, 0x9f, 0x44, 0x56, - 0x8e, 0xd9, 0xaf, 0x49, 0x6f, 0x49, 0x8b, 0x81, 0x9e, 0xf0, 0xe0, 0xb0, 0xdd, 0xf6, - 0xe0, 0xcb, 0xd6, 0x6d, 0x0f, 0x3a, 0x6e, 0x6e, 0xb7, 0xd5, 0x8e, 0xa7, 0x7a, 0xaf, - 0x3d, 0xe8, 0x7c, 0xc5, 0x9c, 0xfe, 0xaa, 0x5d, 0xb8, 0x6c, 0x77, 0x2d, 0x9b, 0xa1, - 0xff, 0xd5, 0x75, 0x3c, 0xfe, 0x64, 0x2b, 0x0b, 0xb5, 0xa0, 0x22, 0x38, 0xb2, 0xf7, - 0x20, 0x4a, 0x8b, 0x0c, 0xd9, 0x0d, 0x1e, 0x8c, 0x4d, 0x19, 0xc9, 0x47, 0x7e, 0xbf, - 0xc3, 0x7e, 0xb1, 0x93, 0xd0, 0xc9, 0x90, 0x23, 0xa2, 0x30, 0x06, 0x64, 0x89, 0xe6, - 0x8c, 0x1c, 0x80, 0x81, 0xf7, 0x60, 0x30, 0x1f, 0x10, 0x38, 0xaa, 0x30, 0x18, 0x55, - 0x43, 0x5c, 0x0d, 0x80, 0x3a, 0x1a, 0xe8, 0xee, 0x63, 0xa9, 0xd4, 0x5e, 0x40, 0x8e, - 0xe8, 0xea, 0x0f, 0x79, 0x3e, 0x28, 0x75, 0x41, 0xe9, 0xfe, 0xa0, 0xb0, 0x46, 0xd7, - 0xa6, 0x17, 0xe5, 0x86, 0x38, 0xcc, 0x31, 0x1c, 0x55, 0x6a, 0x82, 0xde, 0xc5, 0xb7, - 0x0b, 0xf4, 0x32, 0x48, 0xfb, 0x30, 0x16, 0x76, 0x42, 0xa8, 0xec, 0xe8, 0xb6, 0x24, - 0x01, 0x46, 0x62, 0x36, 0x8f, 0xf4, 0x2b, 0x3b, 0x57, 0xd8, 0x71, 0x0e, 0xe5, 0xaf, - 0x79, 0xde, 0x08, 0x09, 0xf0, 0xb8, 0xbf, 0x5c, 0xbf, 0xc4, 0x36, 0xb9, 0x99, 0x6e, - 0x60, 0xe6, 0xd2, 0x4a, 0xbf, 0xc2, 0x1c, 0xd7, 0x8a, 0x90, 0xf1, 0x39, 0x79, 0x7f, - 0x32, 0x12, 0xc7, 0xe8, 0x09, 0x07, 0x1a, 0x1a, 0x64, 0x1d, 0xc9, 0x87, 0x40, 0xe3, - 0x35, 0x98, 0xa2, 0xae, 0xd6, 0xca, 0xe0, 0x43, 0x6e, 0x77, 0xef, 0x7c, 0x74, 0xf4, - 0x74, 0x3d, 0xb7, 0x77, 0xa6, 0x3f, 0x46, 0xd5, 0x87, 0xe9, 0xd5, 0x32, 0x0c, 0x86, - 0xb0, 0x8a, 0xd5, 0x07, 0x08, 0x52, 0x91, 0x2d, 0x2b, 0x92, 0x1a, 0x77, 0x02, 0x70, - 0xf4, 0xe9, 0xec, 0x6c, 0x1f, 0x2b, 0xcc, 0x5a, 0xd3, 0x75, 0xd4, 0xfc, 0x61, 0x1e, - 0xc5, 0x4d, 0xa8, 0x64, 0x87, 0x2e, 0xbf, 0x95, 0x9d, 0xc7, 0xb5, 0xe6, 0x8f, 0x8f, - 0x3c, 0x6f, 0x66, 0x4e, 0x8e, 0x06, 0xca, 0xb8, 0xe1, 0x55, 0xd5, 0x3b, 0xc2, 0xa9, - 0x59, 0x6f, 0x33, 0xfc, 0x17, 0xd4, 0xe2, 0xb2, 0x3e, 0xe7, 0xb3, 0xdf, 0xb4, 0xcb, - 0xab, 0x14, 0xe1, 0x99, 0x3e, 0xd7, 0x63, 0x35, 0xb7, 0x13, 0xb0, 0xc1, 0xa1, 0x50, - 0x31, 0x3f, 0xde, 0xcd, 0xce, 0xb0, 0xa3, 0x81, 0x14, 0xb7, 0x06, 0x39, 0x77, 0xec, - 0x31, 0x11, 0x8e, 0xe8, 0x10, 0x39, 0x15, 0x88, 0x54, 0x84, 0x23, 0xa5, 0x90, 0xcd, - 0xbc, 0x45, 0x20, 0x2c, 0xb9, 0xc4, 0x8e, 0xa2, 0x20, 0x50, 0xa3, 0x9a, 0x21, 0x1e, - 0x9b, 0x17, 0x82, 0x33, 0x66, 0xd2, 0x42, 0x88, 0xe5, 0x91, 0xe6, 0xf7, 0x46, 0x9f, - 0xa4, 0xc8, 0xc8, 0x0d, 0xa8, 0xdf, 0x99, 0x39, 0xa4, 0x61, 0x4f, 0x16, 0xa4, 0x54, - 0xb4, 0xdf, 0xb9, 0x9a, 0x9d, 0xee, 0x03, 0xad, 0xeb, 0x4c, 0xe3, 0xbf, 0xeb, 0x96, - 0x03, 0x41, 0x7e, 0xdf, 0x3a, 0x74, 0xa5, 0x69, 0xe9, 0xca, 0x4f, 0xaf, 0xb0, 0xdf, - 0xe8, 0x1a, 0x72, 0xb3, 0xb8, 0x25, 0x1e, 0x37, 0x82, 0x6c, 0x23, 0x32, 0xc2, 0xde, - 0x7f, 0xfb, 0x56, 0xc8, 0xef, 0x73, 0xb0, 0x5f, 0xc4, 0xfd, 0xb7, 0x43, 0x08, 0x45, - 0xa8, 0x49, 0xc9, 0xf3, 0x5b, 0xde, 0xea, 0xd1, 0x93, 0x5b, 0x83, 0xd2, 0x14, 0xb0, - 0x3d, 0x28, 0x22, 0x8f, 0xe2, 0x96, 0x28, 0xdd, 0x86, 0x28, 0xe0, 0xa3, 0xe0, 0x5e, - 0xbe, 0x51, 0x4e, 0x66, 0x61, 0x78, 0xa4, 0x90, 0x16, 0x52, 0x9d, 0xc0, 0x52, 0x03, - 0x66, 0x9d, 0x54, 0xa5, 0x19, 0x0b, 0x17, 0xf4, 0x51, 0x80, 0xc0, 0x5c, 0xd5, 0xde, - 0x52, 0x84, 0x97, 0x0b, 0xfb, 0x55, 0xc9, 0xe1, 0x9f, 0x3a, 0x44, 0x77, 0xac, 0x37, - 0x00, 0xfd, 0x96, 0x59, 0xbd, 0x59, 0xe0, 0x27, 0x09, 0x37, 0x51, 0x1a, 0x6c, 0x4d, - 0x69, 0x20, 0x50, 0x54, 0x6b, 0x67, 0xaa, 0x76, 0x1a, 0xf5, 0x02, 0x80, 0x23, 0x4e, - 0x24, 0x4d, 0x6c, 0x72, 0x2b, 0x6d, 0x0a, 0x72, 0x1c, 0x62, 0x87, 0xe5, 0xf8, 0x45, - 0x12, 0xd8, 0x03, 0xe3, 0x97, 0x0c, 0xa6, 0xea, 0xf7, 0x0d, 0x27, 0x82, 0xb8, 0xc7, - 0x19, 0xf3, 0xfb, 0x56, 0xee, 0x4d, 0x3c, 0xa1, 0x03, 0x25, 0x59, 0x9c, 0x88, 0x7c, - 0xda, 0x1f, 0xbd, 0xc8, 0x36, 0x9d, 0x4d, 0xa3, 0x66, 0xd0, 0xd0, 0xce, 0xdb, 0x1f, - 0xfb, 0xec, 0x94, 0x23, 0x52, 0x64, 0xb1, 0x57, 0x3a, 0x33, 0xa5, 0x08, 0xe0, 0x90, - 0x24, 0x42, 0xdf, 0xee, 0xbe, 0xf2, 0xcc, 0xe8, 0xdb, 0x6b, 0x4e, 0xec, 0x30, 0x3b, - 0xd5, 0x77, 0xf3, 0x58, 0x9d, 0x37, 0xd0, 0x42, 0x4f, 0x69, 0x14, 0xcc, 0xfc, 0xa9, - 0x1f, 0xab, 0x1d, 0xfc, 0xde, 0xe3, 0xdc, 0xbc, 0x69, 0xef, 0xe2, 0x5d, 0x4f, 0xf5, - 0x9d, 0x9d, 0xc3, 0xeb, 0xbf, 0xe2, 0xec, 0x21, 0x48, 0x94, 0xfe, 0x6a, 0x17, 0x63, - 0xc6, 0xc3, 0xa8, 0x37, 0x83, 0x5d, 0x6a, 0xfc, 0x19, 0x7f, 0x39, 0x88, 0x82, 0x16, - 0x14, 0x2c, 0x42, 0x39, 0x11, 0x3b, 0x21, 0x03, 0x5b, 0x85, 0xb6, 0x62, 0x1d, 0x43, - 0x65, 0xbd, 0x27, 0xd9, 0x16, 0x70, 0xa9, 0x22, 0xe4, 0xa1, 0xaa, 0xcf, 0xb2, 0xc5, - 0xa4, 0x71, 0x81, 0x6d, 0xc2, 0x5b, 0xcf, 0xb2, 0x0d, 0x69, 0xea, 0x6d, 0xa4, 0x31, - 0x96, 0xb7, 0x23, 0xd1, 0x93, 0x8d, 0xe7, 0x95, 0xe7, 0x46, 0x7f, 0x6d, 0x0d, 0x37, - 0x1e, 0x31, 0xa7, 0xe4, 0xf6, 0xc6, 0x55, 0x71, 0x03, 0xa5, 0x75, 0x13, 0x4d, 0x1c, - 0xb5, 0x5c, 0xf6, 0xe2, 0x2f, 0xac, 0x40, 0x9e, 0x27, 0x17, 0xcd, 0xda, 0xca, 0xaf, - 0x63, 0xf7, 0x23, 0x64, 0x31, 0xc7, 0x22, 0x12, 0xf4, 0x12, 0x91, 0xea, 0x14, 0x80, - 0x54, 0x1c, 0xc1, 0xaf, 0x36, 0xca, 0xc1, 0x71, 0x04, 0xe3, 0x53, 0xa9, 0x21, 0xb5, - 0x01, 0x17, 0xce, 0x42, 0x90, 0xde, 0xf7, 0xf2, 0x34, 0xa6, 0x31, 0xa7, 0x55, 0x73, - 0x0a, 0x34, 0x66, 0xc1, 0xd8, 0xab, 0x87, 0x71, 0x20, 0xac, 0x1e, 0x98, 0xc3, 0x7a, - 0x6c, 0x23, 0x77, 0xf5, 0xdf, 0x02, 0xc7, 0xda, 0x75, 0xff, 0x5b, 0xd1, 0xf8, 0xad, - 0x98, 0xb3, 0x88, 0xd2, 0x3e, 0x7f, 0x7e, 0xf4, 0x7f, 0x51, 0xd6, 0x68, 0xa9, 0x82, - 0xa2, 0x23, 0x79, 0x51, 0xc2, 0x06, 0xb7, 0xdf, 0xd9, 0xc9, 0x58, 0x3f, 0x9f, 0x37, - 0xf5, 0x73, 0xb7, 0xd4, 0xd8, 0x7c, 0x1a, 0x61, 0xef, 0x5c, 0x4e, 0x52, 0xe1, 0x1a, - 0xb3, 0xc7, 0x34, 0x84, 0x28, 0xc1, 0xf0, 0x34, 0xa5, 0xdf, 0xb9, 0x1c, 0x80, 0xd7, - 0x24, 0x05, 0x91, 0x6b, 0x70, 0x30, 0x3f, 0xeb, 0x78, 0x6e, 0x4c, 0x5e, 0xf4, 0xa0, - 0x60, 0x26, 0xc8, 0x5c, 0x24, 0x3f, 0x4b, 0x77, 0xd8, 0xa4, 0xe4, 0x2b, 0x2f, 0x8c, - 0xbe, 0x97, 0x26, 0x6a, 0xaf, 0x56, 0x60, 0x9e, 0x46, 0x81, 0x01, 0x9b, 0x7d, 0x34, - 0x44, 0xcd, 0x12, 0xb8, 0x44, 0x67, 0x39, 0xfd, 0x83, 0x5f, 0xdc, 0xcc, 0x6e, 0xb0, - 0x9d, 0x50, 0x8f, 0x8a, 0x20, 0x4d, 0x42, 0xbc, 0x11, 0x51, 0xce, 0x37, 0xea, 0x5d, - 0x2e, 0x23, 0xf6, 0x52, 0xed, 0xb1, 0x1f, 0xec, 0xb0, 0xef, 0xee, 0x10, 0x60, 0x03, - 0x08, 0xe0, 0x31, 0x1e, 0x2a, 0xa7, 0x70, 0xcb, 0x25, 0xc1, 0xd2, 0x94, 0x3f, 0xc3, - 0xa8, 0x96, 0x24, 0x17, 0x32, 0x84, 0x8e, 0x87, 0x0a, 0xa8, 0xc4, 0xc6, 0x0a, 0x22, - 0x06, 0x2e, 0xf1, 0x0b, 0x4a, 0x54, 0xde, 0x43, 0xee, 0x1c, 0xa5, 0x91, 0x6e, 0x94, - 0xd3, 0xb2, 0xc8, 0x21, 0x0f, 0x35, 0xa0, 0x8e, 0xf6, 0x4d, 0xad, 0x2b, 0x15, 0xaf, - 0xe9, 0x10, 0x01, 0x00, 0x2d, 0x60, 0x06, 0xfe, 0xd5, 0x0a, 0xfb, 0x67, 0x2b, 0x34, - 0xb4, 0x16, 0x11, 0x54, 0x58, 0xc9, 0xad, 0x4a, 0x8c, 0x76, 0xc4, 0xed, 0xc7, 0x9f, - 0x46, 0x85, 0x06, 0xe8, 0xa0, 0xb3, 0x98, 0x17, 0x81, 0x93, 0xd8, 0x51, 0x84, 0x25, - 0x10, 0x9d, 0xc1, 0x92, 0xd2, 0xa4, 0x30, 0x88, 0x7c, 0x91, 0x0a, 0xf1, 0x22, 0x48, - 0x16, 0x06, 0x0f, 0xe2, 0x51, 0x45, 0x0f, 0xb4, 0xd8, 0x5c, 0xa4, 0x14, 0xa3, 0x68, - 0x91, 0x1d, 0x23, 0xb2, 0x04, 0x00, 0x4c, 0x8e, 0x62, 0x40, 0x8a, 0x1e, 0x61, 0x1c, - 0xe5, 0x5d, 0x4c, 0x4b, 0x6b, 0xc0, 0x36, 0xe0, 0xbf, 0x41, 0x47, 0x92, 0x0b, 0x3c, - 0x3f, 0x55, 0x08, 0xbd, 0x20, 0x0e, 0x94, 0xde, 0xa6, 0x70, 0xe3, 0xaa, 0xe8, 0x55, - 0x86, 0xfb, 0x63, 0xab, 0xd2, 0x3a, 0x12, 0x8b, 0x24, 0xee, 0x32, 0xdc, 0xc3, 0xe9, - 0x4a, 0x4a, 0xd4, 0x08, 0x24, 0xed, 0xb3, 0x91, 0xff, 0x12, 0x07, 0x0d, 0xbf, 0x8e, - 0x6c, 0x92, 0xb2, 0xc8, 0xe1, 0x89, 0xd5, 0x4d, 0x61, 0x5f, 0x22, 0xa1, 0x8b, 0xc2, - 0x55, 0x72, 0x4f, 0x0a, 0x87, 0x0c, 0x53, 0x8c, 0x04, 0xd5, 0xc4, 0x51, 0xa5, 0xb7, - 0xc8, 0x63, 0x9e, 0x90, 0x7c, 0x35, 0xe2, 0x0f, 0x45, 0xc7, 0x09, 0x72, 0x77, 0x40, - 0x0d, 0x9c, 0x47, 0xdf, 0x2d, 0x41, 0x07, 0x3b, 0x92, 0xce, 0xc8, 0x93, 0x68, 0xcf, - 0x51, 0xca, 0x21, 0xec, 0x72, 0xbe, 0xd7, 0xdb, 0x04, 0x2f, 0x06, 0xb4, 0x00, 0xfc, - 0xdf, 0xb9, 0xd5, 0x85, 0xff, 0xff, 0x4b, 0xac, 0xce, 0x17, 0x47, 0xff, 0x02, 0xd4, - 0xc8, 0xa2, 0xf2, 0xc3, 0xfb, 0x16, 0xe2, 0x19, 0xcf, 0xa0, 0xed, 0xdd, 0x58, 0x26, - 0x01, 0x9a, 0xf7, 0xe1, 0x36, 0x1c, 0xa2, 0xd8, 0xad, 0x6f, 0x73, 0x97, 0xb0, 0xb0, - 0xc1, 0xd6, 0x52, 0x0f, 0x36, 0x88, 0x41, 0x46, 0x6f, 0xea, 0xe9, 0x83, 0x48, 0x99, - 0x31, 0x0b, 0xd2, 0x3a, 0x48, 0x39, 0x80, 0x9d, 0x18, 0xa9, 0x18, 0xcf, 0xf6, 0xc7, - 0x36, 0x3a, 0x48, 0x35, 0x38, 0x56, 0x9a, 0xc9, 0x80, 0x26, 0xed, 0xd7, 0x10, 0x9b, - 0xbb, 0x6e, 0x60, 0x1c, 0xeb, 0xd7, 0x78, 0x7b, 0xc6, 0xba, 0xd9, 0x30, 0xcd, 0xae, - 0x9d, 0xaf, 0x6a, 0x71, 0x95, 0x1d, 0xb5, 0xed, 0x83, 0x9a, 0x45, 0x0d, 0x31, 0xdb, - 0xf0, 0x9a, 0xfe, 0x46, 0x17, 0x6a, 0x09, 0x9a, 0x84, 0x5a, 0xed, 0xb4, 0x44, 0x21, - 0xe8, 0xfb, 0x47, 0xd9, 0x57, 0x44, 0xed, 0x16, 0x58, 0x38, 0x44, 0x1e, 0x86, 0xeb, - 0x12, 0x80, 0x2e, 0x52, 0xa3, 0x22, 0x28, 0x2a, 0x9c, 0x69, 0xe4, 0x08, 0xa1, 0x8c, - 0x26, 0x08, 0xa0, 0x82, 0x28, 0x27, 0x4e, 0xde, 0x1a, 0xad, 0x54, 0xc5, 0x77, 0x10, - 0x3d, 0xac, 0x4d, 0x8e, 0x73, 0x35, 0xc5, 0xd1, 0x86, 0x8c, 0xe5, 0xc1, 0x67, 0xe8, - 0x87, 0x47, 0xbf, 0xbd, 0xf2, 0x2e, 0x32, 0x1c, 0xfd, 0x9d, 0xf5, 0xec, 0x09, 0x76, - 0x09, 0xd0, 0x16, 0x40, 0xcc, 0x45, 0x4e, 0xa2, 0xff, 0x4f, 0x62, 0xe2, 0xab, 0x0b, - 0xda, 0xbd, 0xca, 0x9e, 0xa2, 0x25, 0x8c, 0x51, 0x70, 0x41, 0xba, 0xa5, 0x60, 0x1b, - 0xa2, 0xd6, 0x1c, 0xfc, 0x04, 0xb5, 0x9d, 0x88, 0x0a, 0x1a, 0x2b, 0xeb, 0x9a, 0x26, - 0x3d, 0x0f, 0xe3, 0xd8, 0xdb, 0x66, 0xc7, 0x60, 0x9f, 0x6d, 0xf2, 0xa0, 0x55, 0x35, - 0xd0, 0x97, 0x82, 0x5c, 0x9c, 0xda, 0xad, 0xc5, 0xef, 0x63, 0xba, 0xf7, 0x0a, 0x3b, - 0x51, 0xe4, 0x44, 0x2f, 0x3e, 0xd5, 0xa8, 0xc8, 0xcd, 0x4c, 0x76, 0xae, 0x01, 0x50, - 0x8c, 0x19, 0xeb, 0x1d, 0x0f, 0xdd, 0x1c, 0x3d, 0x70, 0x28, 0x74, 0x2c, 0x34, 0x7b, - 0xe5, 0xe5, 0xd1, 0xa5, 0xd4, 0x23, 0x98, 0x64, 0xe7, 0xfa, 0x64, 0xc5, 0xcd, 0xf3, - 0x0b, 0x38, 0xc7, 0x49, 0x24, 0x80, 0x38, 0x7d, 0x82, 0x73, 0x8a, 0xfa, 0x49, 0x42, - 0xd5, 0x97, 0xff, 0xbf, 0x7e, 0x5f, 0xf5, 0x1d, 0x15, 0x29, 0xb9, 0xf6, 0x3b, 0xaf, - 0x67, 0xbd, 0x7e, 0x15, 0xf8, 0x9a, 0x6d, 0x22, 0x5d, 0xe3, 0x63, 0x6e, 0x70, 0x24, - 0x50, 0x7c, 0xc4, 0x1f, 0x7b, 0x60, 0x77, 0xd2, 0x9e, 0xce, 0x05, 0x44, 0x7a, 0x22, - 0x6a, 0x33, 0xa3, 0xb2, 0x6c, 0x57, 0x99, 0x15, 0x9b, 0x26, 0x20, 0x8a, 0xa9, 0xd5, - 0xc5, 0xec, 0x68, 0xdf, 0x60, 0xb3, 0x44, 0x7a, 0xb1, 0x6b, 0x82, 0xcb, 0xb2, 0x95, - 0x1d, 0xef, 0x73, 0x95, 0xec, 0x3f, 0xa1, 0x05, 0x57, 0x08, 0xfb, 0xbc, 0x46, 0xb5, - 0xbc, 0xc1, 0x9f, 0x57, 0xa9, 0x84, 0xe3, 0x1a, 0xfc, 0x42, 0x7b, 0xc0, 0x79, 0xb6, - 0x61, 0x4c, 0x63, 0xe8, 0x8d, 0x68, 0x11, 0xee, 0xfc, 0x74, 0x87, 0x7d, 0x82, 0xab, - 0x3c, 0x8a, 0xd0, 0x49, 0x00, 0xa4, 0x19, 0x82, 0xfc, 0x07, 0xdc, 0x03, 0xd4, 0x91, - 0xe9, 0x22, 0xc1, 0xe6, 0x63, 0x77, 0x43, 0xaf, 0x54, 0xfe, 0x3b, 0x74, 0x3d, 0x76, - 0x51, 0x10, 0x56, 0xa4, 0x71, 0x08, 0xfd, 0x45, 0x78, 0x05, 0x18, 0x15, 0x37, 0x19, - 0x54, 0xc6, 0xdf, 0x1a, 0x57, 0xb9, 0xc8, 0x9b, 0xfb, 0xcf, 0x6a, 0x76, 0x81, 0x3d, - 0x8c, 0xab, 0xbb, 0x8c, 0x85, 0xc5, 0x89, 0x0c, 0xda, 0x8b, 0x2c, 0x20, 0x23, 0x54, - 0x48, 0x22, 0xa1, 0x24, 0x32, 0xc4, 0x66, 0x09, 0xa3, 0x01, 0x0f, 0x0e, 0xb5, 0x4e, - 0x0d, 0xc4, 0x57, 0x58, 0x2f, 0x1c, 0xbc, 0x2b, 0x05, 0x8c, 0x10, 0x70, 0x03, 0x88, - 0xf4, 0xda, 0x16, 0xfb, 0x5f, 0xe1, 0xcc, 0xd7, 0x3b, 0x5b, 0xfe, 0x94, 0xa4, 0x8a, - 0x86, 0x36, 0x9c, 0x98, 0xff, 0x5d, 0x20, 0x11, 0x7f, 0xed, 0x77, 0x82, 0x78, 0x88, - 0x21, 0xeb, 0x39, 0x9e, 0x57, 0xb4, 0x98, 0x81, 0x0d, 0xb8, 0x8e, 0xa8, 0x71, 0x1c, - 0xcf, 0xe5, 0x9b, 0xe7, 0xd9, 0x11, 0xe7, 0x9a, 0x98, 0x34, 0xaa, 0x6e, 0x7b, 0xf6, - 0x12, 0x3b, 0xe6, 0x34, 0x55, 0x4f, 0xd4, 0x1a, 0xe8, 0x10, 0x75, 0x7c, 0xe5, 0xd5, - 0xd1, 0x93, 0xb8, 0xc1, 0x0d, 0xfd, 0x12, 0x50, 0xee, 0x00, 0xb4, 0x5f, 0x0a, 0xbc, - 0x09, 0x97, 0x6d, 0xf7, 0xa9, 0x42, 0xfb, 0x60, 0xe0, 0xb5, 0x0d, 0x6a, 0x3d, 0x87, - 0x1c, 0xe2, 0x26, 0xeb, 0xd3, 0xa8, 0xba, 0x10, 0xb6, 0xce, 0xd1, 0x3a, 0xe3, 0x30, - 0x71, 0xe2, 0xae, 0x51, 0x93, 0x96, 0xa3, 0xb4, 0xbe, 0xef, 0x58, 0x0a, 0x33, 0x37, - 0xce, 0x04, 0xf8, 0x56, 0x3f, 0x71, 0xbe, 0x7b, 0x35, 0x7b, 0x3f, 0xc3, 0x3c, 0x1b, - 0x42, 0x36, 0x0a, 0xb2, 0x9d, 0x68, 0xf3, 0x75, 0x7b, 0x28, 0x22, 0x1e, 0x6b, 0xae, - 0x50, 0xb2, 0x69, 0x90, 0xc4, 0xe1, 0xff, 0xb3, 0x0e, 0xfb, 0x8f, 0x71, 0x4f, 0x86, - 0x66, 0x25, 0x12, 0x55, 0x16, 0x93, 0x50, 0xe0, 0x83, 0x3b, 0x75, 0x28, 0xa1, 0xe4, - 0x18, 0x3f, 0xa5, 0x72, 0x24, 0xe4, 0x4b, 0xc5, 0x7f, 0x19, 0x0c, 0xf4, 0x53, 0xf4, - 0x0b, 0xd1, 0x1b, 0xf8, 0x0f, 0x17, 0x28, 0xd4, 0xf1, 0x9f, 0x94, 0x71, 0x84, 0x7f, - 0x4c, 0x95, 0x5b, 0x72, 0x8c, 0x73, 0xe7, 0x3d, 0xcb, 0x2e, 0x17, 0xc4, 0x91, 0x2b, - 0xb1, 0x4a, 0x53, 0x13, 0xf5, 0xae, 0xa2, 0xeb, 0x6a, 0xb9, 0x37, 0xa7, 0xde, 0x01, - 0xe8, 0xe0, 0x95, 0xd1, 0xe8, 0x1f, 0xd6, 0xc8, 0x8e, 0xb7, 0xb3, 0x8c, 0x52, 0x28, - 0x09, 0x31, 0xc8, 0x3a, 0x64, 0x47, 0xc3, 0x1e, 0xf7, 0xbe, 0x9a, 0xfb, 0x65, 0x52, - 0x29, 0x98, 0x60, 0xa0, 0x06, 0x19, 0x6e, 0x4c, 0x7b, 0x52, 0x97, 0x04, 0xcb, 0x4e, - 0x64, 0x27, 0xfb, 0x45, 0x75, 0x83, 0xe4, 0x39, 0xa7, 0x5b, 0xbe, 0x7b, 0xb0, 0x34, - 0x5d, 0xc5, 0x3f, 0xe9, 0x00, 0x7c, 0x9d, 0x54, 0x16, 0xab, 0x1a, 0xe3, 0x1d, 0xf6, - 0x10, 0xc0, 0xb5, 0x54, 0xe9, 0x6a, 0x11, 0x18, 0x00, 0x94, 0xa0, 0xea, 0x48, 0x6f, - 0x8b, 0x1d, 0xd3, 0x3a, 0xa8, 0x15, 0x27, 0xbf, 0x6b, 0xbd, 0x5c, 0x41, 0x71, 0xda, - 0xc5, 0xaf, 0x8d, 0x1e, 0xac, 0xd5, 0x0c, 0x8f, 0x29, 0xf8, 0xd2, 0x52, 0x9f, 0xf7, - 0xdf, 0xe3, 0xe7, 0xd1, 0x09, 0x47, 0xfb, 0x88, 0xda, 0x63, 0x67, 0xa3, 0xda, 0x60, - 0xfc, 0x9b, 0x58, 0x55, 0x79, 0x2e, 0x7a, 0xe7, 0x7c, 0x73, 0xa1, 0x1b, 0x3f, 0x1d, - 0xfa, 0x7b, 0xde, 0x18, 0xfd, 0x55, 0xf8, 0x9e, 0xa5, 0xde, 0xfa, 0xcf, 0xaf, 0x67, - 0x03, 0x76, 0xd1, 0x54, 0x99, 0x25, 0xb3, 0x97, 0xd4, 0x0d, 0x54, 0x19, 0x32, 0x44, - 0x5b, 0xdd, 0x61, 0x8e, 0x32, 0x64, 0xa8, 0xc7, 0x5d, 0x54, 0x04, 0x48, 0x68, 0x22, - 0xd9, 0x70, 0x2d, 0xb9, 0xc6, 0x42, 0xe5, 0x45, 0x51, 0x6d, 0x26, 0x48, 0x16, 0x1e, - 0xb2, 0x67, 0xbd, 0x09, 0x7b, 0x81, 0x82, 0xc6, 0x31, 0xa2, 0x4d, 0xde, 0x93, 0xac, - 0x4a, 0x32, 0x91, 0x8e, 0x36, 0x38, 0xd0, 0x63, 0xc2, 0xd8, 0x42, 0xdd, 0xa2, 0xa5, - 0x53, 0x69, 0x90, 0x78, 0x53, 0x9b, 0x22, 0x06, 0x57, 0x9f, 0x60, 0xa7, 0x35, 0xc6, - 0x89, 0x60, 0x9f, 0xc9, 0x03, 0x23, 0x6b, 0xd2, 0xd8, 0xa5, 0x19, 0xaa, 0x22, 0x4f, - 0x31, 0x88, 0xc8, 0x5c, 0xd3, 0x26, 0x7c, 0x7a, 0x9e, 0x04, 0xd4, 0x52, 0x92, 0xdb, - 0xb6, 0x44, 0xf9, 0x2b, 0xf7, 0x46, 0x1f, 0xb8, 0x97, 0x11, 0x60, 0xcb, 0xf0, 0x01, - 0xae, 0x65, 0xc2, 0x6d, 0xdd, 0x9a, 0xa5, 0xaa, 0x47, 0x29, 0x97, 0x9e, 0x50, 0x79, - 0x19, 0xfc, 0xd7, 0x50, 0xd8, 0x51, 0x54, 0xd2, 0x42, 0x91, 0xe3, 0x78, 0x9e, 0x2d, - 0xd5, 0x15, 0x21, 0xcb, 0x73, 0xbb, 0xbd, 0x7c, 0xac, 0xee, 0x2a, 0x6d, 0x0b, 0x42, - 0x6e, 0x14, 0x88, 0x55, 0xa0, 0xf8, 0x05, 0xfa, 0xe3, 0x79, 0xe9, 0x4c, 0x94, 0x16, - 0x7e, 0xa4, 0x22, 0x7a, 0x9d, 0x21, 0xaf, 0x25, 0x60, 0x54, 0xeb, 0xaf, 0x3a, 0x8f, - 0x5a, 0xae, 0x5b, 0xe4, 0x4b, 0x79, 0x85, 0xf0, 0xaa, 0x79, 0x69, 0xd5, 0xa0, 0xd4, - 0x65, 0x6a, 0x7f, 0x5d, 0x66, 0xc7, 0xc6, 0xc2, 0x4d, 0xcc, 0xd4, 0x58, 0x1e, 0x11, - 0x64, 0x82, 0x1f, 0x28, 0x6d, 0xf5, 0xad, 0x2b, 0x59, 0x9f, 0x5d, 0x84, 0x94, 0x01, - 0xd5, 0x00, 0xd3, 0x94, 0x26, 0x78, 0xfa, 0x6e, 0x0a, 0x5a, 0xdb, 0x62, 0x47, 0x45, - 0x83, 0x3c, 0x01, 0x6c, 0x9c, 0x40, 0x45, 0x67, 0xd8, 0x15, 0x3b, 0xe6, 0x61, 0x7d, - 0x35, 0x11, 0x79, 0x53, 0x85, 0x59, 0xb1, 0xa6, 0x71, 0xc0, 0x4e, 0xbb, 0x3c, 0xb7, - 0xe4, 0xd5, 0x96, 0x3a, 0xb8, 0x5b, 0x11, 0x09, 0x57, 0xe1, 0x88, 0xcf, 0x07, 0x00, - 0x48, 0x1b, 0x9d, 0xce, 0x82, 0xad, 0xe3, 0xd5, 0x3b, 0xa3, 0x1f, 0x27, 0x81, 0xa0, - 0xb3, 0xd9, 0xb1, 0x38, 0xb4, 0xa9, 0xfa, 0xb8, 0xd8, 0xef, 0x5c, 0xf6, 0x26, 0x70, - 0x28, 0x30, 0x6f, 0x86, 0xf8, 0x56, 0xfd, 0x2f, 0xfb, 0x9d, 0x9d, 0xec, 0x61, 0x28, - 0xb5, 0x0f, 0x2e, 0x79, 0x5a, 0xbb, 0xb5, 0x8e, 0x3f, 0x2c, 0x9b, 0x3f, 0xfc, 0x2f, - 0xd6, 0x01, 0x22, 0xcc, 0xdb, 0x20, 0xc2, 0x3f, 0xb4, 0xc2, 0x3e, 0x13, 0x82, 0x65, - 0x39, 0x58, 0x99, 0x25, 0xf7, 0xbb, 0x52, 0x29, 0xc6, 0x12, 0x21, 0x04, 0x5c, 0x62, - 0xcc, 0x1a, 0xc3, 0x73, 0x39, 0x0a, 0x12, 0x39, 0xca, 0xcc, 0x03, 0x60, 0x48, 0x23, - 0x90, 0x47, 0x06, 0x9d, 0x14, 0x0c, 0xff, 0x61, 0x98, 0x8d, 0xe0, 0xc6, 0x0a, 0xb5, - 0x02, 0x20, 0x3e, 0xe6, 0x02, 0xa1, 0x58, 0x1e, 0x5a, 0x70, 0x28, 0x56, 0x16, 0x11, - 0x7e, 0x2a, 0xd1, 0x17, 0x02, 0x0e, 0x39, 0xa0, 0xe2, 0xcc, 0x31, 0xfa, 0x9d, 0x07, - 0x01, 0x36, 0x33, 0x0c, 0xd0, 0x65, 0xd4, 0x86, 0x31, 0x11, 0x59, 0x8c, 0x85, 0xb4, - 0x31, 0xf1, 0x45, 0xac, 0x74, 0xe0, 0xc9, 0x6b, 0x33, 0xc9, 0x4b, 0x4b, 0x6a, 0x2a, - 0x00, 0xbe, 0x81, 0x9f, 0x04, 0x41, 0x25, 0x0c, 0xe8, 0x90, 0x15, 0x13, 0x90, 0x06, - 0x20, 0x94, 0x12, 0x0a, 0x98, 0xc3, 0x7b, 0x63, 0x4c, 0xcd, 0x21, 0x31, 0xfc, 0x38, - 0x68, 0xbd, 0xe4, 0x10, 0xca, 0xf7, 0x5f, 0x15, 0xc9, 0x21, 0xe1, 0x52, 0x54, 0x67, - 0x43, 0x67, 0x18, 0xf3, 0x7d, 0x72, 0x2c, 0x51, 0x38, 0x06, 0xee, 0xaf, 0x10, 0x7c, - 0x15, 0x9f, 0x83, 0xa9, 0x07, 0x87, 0xd9, 0x67, 0xda, 0xa4, 0xa6, 0x38, 0xea, 0x23, - 0xea, 0xfe, 0x65, 0xdc, 0x64, 0xcc, 0x84, 0x97, 0x02, 0xe5, 0x05, 0x5c, 0x0c, 0xa2, - 0x59, 0x6f, 0x5c, 0x0e, 0x92, 0x92, 0x6f, 0xd2, 0x9b, 0xa2, 0xb1, 0xd0, 0x01, 0x16, - 0x12, 0xb9, 0xc6, 0x92, 0x63, 0x25, 0x12, 0x10, 0xf7, 0x42, 0xee, 0xb7, 0x05, 0x49, - 0x6d, 0xd8, 0x55, 0xaa, 0x93, 0xf4, 0x43, 0x93, 0x97, 0x76, 0x0c, 0x59, 0x8b, 0x22, - 0x6a, 0x2b, 0x37, 0x5e, 0xdb, 0x99, 0x03, 0x49, 0xfe, 0x8e, 0x9e, 0x19, 0xfd, 0xab, - 0x95, 0x20, 0xf9, 0x3b, 0x03, 0x90, 0x7b, 0x24, 0x40, 0xe2, 0x62, 0xa4, 0x7c, 0x9a, - 0x6e, 0xae, 0x63, 0x96, 0x5d, 0x1e, 0xbf, 0x46, 0x82, 0x21, 0x6a, 0x8a, 0xfb, 0xa9, - 0x08, 0x72, 0x2f, 0x1c, 0xa2, 0xda, 0x51, 0xa1, 0x4e, 0xa1, 0x69, 0x3c, 0xb4, 0x78, - 0xb2, 0x28, 0x83, 0xe1, 0x6c, 0x55, 0x87, 0xb9, 0x80, 0xe9, 0x1b, 0x7c, 0xb4, 0x1e, - 0x5b, 0x2f, 0xd2, 0x42, 0xaa, 0x94, 0x00, 0x72, 0x6e, 0xc5, 0x0e, 0xfc, 0xa8, 0x9b, - 0x3f, 0x6a, 0xbe, 0x98, 0x28, 0x17, 0x7d, 0x3c, 0xf0, 0x71, 0xeb, 0xbf, 0xe3, 0xde, - 0x58, 0xeb, 0xfc, 0xe7, 0x47, 0xf2, 0xde, 0x69, 0x8e, 0x18, 0x3c, 0x08, 0x16, 0x58, - 0x5b, 0x16, 0xf9, 0xa0, 0xb2, 0x9e, 0x2f, 0x36, 0xad, 0x67, 0xcc, 0x4a, 0xec, 0xac, - 0xf5, 0xf3, 0xab, 0x7c, 0xe0, 0x0f, 0xb4, 0x87, 0xfa, 0xa1, 0xd8, 0xbe, 0xb1, 0xf3, - 0x1d, 0x43, 0x85, 0x0c, 0xec, 0xa1, 0x78, 0xc1, 0xce, 0x2c, 0xf5, 0xb3, 0xae, 0xcb, - 0x63, 0xa3, 0x41, 0x76, 0x26, 0x35, 0xa8, 0xdb, 0xf1, 0xbf, 0xc5, 0xb2, 0x76, 0xb4, - 0x1f, 0xf4, 0x1f, 0xee, 0x66, 0x3d, 0x76, 0x52, 0xa5, 0x2e, 0x54, 0x4a, 0x53, 0x73, - 0x83, 0x9d, 0x53, 0xb4, 0x45, 0x8d, 0x55, 0x2c, 0x4a, 0xa8, 0x89, 0xe1, 0xa3, 0x3f, - 0x8d, 0x2e, 0x4a, 0xef, 0x22, 0xcb, 0x1c, 0xed, 0xec, 0x29, 0x19, 0x88, 0x3d, 0x7c, - 0xd9, 0xe7, 0xe8, 0x85, 0xd1, 0x7f, 0x47, 0xc6, 0xb5, 0x5b, 0x26, 0x95, 0x76, 0x54, - 0xc1, 0xce, 0xe6, 0xf0, 0x34, 0x79, 0x6c, 0x31, 0xd9, 0x70, 0x57, 0xa9, 0xa5, 0xec, - 0xdd, 0xfd, 0x95, 0xd9, 0xa7, 0xc9, 0xc7, 0xd9, 0x88, 0x8a, 0xd2, 0x05, 0x91, 0x2d, - 0xe8, 0xc8, 0x25, 0x05, 0x54, 0x0b, 0x8a, 0xc0, 0x9b, 0x81, 0x75, 0x07, 0xf5, 0xbd, - 0xf2, 0x41, 0xe9, 0x74, 0x04, 0xf2, 0x94, 0xc5, 0x94, 0x62, 0x03, 0x94, 0x5d, 0x90, - 0x25, 0x30, 0x60, 0x67, 0xe8, 0xea, 0x90, 0x4c, 0xd0, 0x83, 0x26, 0x03, 0x77, 0xcc, - 0x72, 0x1e, 0xe1, 0xae, 0xb1, 0x8d, 0x71, 0x77, 0x90, 0xf0, 0xea, 0x75, 0x76, 0x56, - 0x04, 0xc6, 0x06, 0x58, 0xe5, 0xda, 0xd4, 0x6a, 0x18, 0x61, 0x3f, 0xb6, 0x44, 0xa3, - 0x34, 0x7a, 0x71, 0xf4, 0x97, 0xd6, 0xee, 0x1d, 0xe5, 0x2a, 0xc7, 0xca, 0xa6, 0x3c, - 0x58, 0xa8, 0x57, 0x67, 0x78, 0x45, 0xbd, 0xa3, 0x11, 0x23, 0x2b, 0xac, 0x5f, 0x5b, - 0x33, 0xca, 0xa6, 0x57, 0x45, 0x5e, 0xce, 0xd4, 0xc2, 0x68, 0x1d, 0x9c, 0x4f, 0x1e, - 0xc9, 0x6e, 0xb2, 0x1b, 0x9c, 0xe2, 0xe3, 0x62, 0x0f, 0x18, 0x26, 0xd0, 0x0b, 0x90, - 0x31, 0x8c, 0xeb, 0x42, 0xf5, 0x7d, 0x51, 0x95, 0xda, 0x41, 0xd2, 0x8f, 0x7d, 0x3d, - 0x9b, 0xa0, 0xc6, 0x5b, 0x52, 0x69, 0x40, 0xee, 0x0a, 0x06, 0x28, 0x05, 0x06, 0x10, - 0x29, 0x38, 0x20, 0x86, 0x9a, 0xd8, 0x96, 0x20, 0x72, 0xe5, 0xc0, 0x3f, 0x46, 0x37, - 0xbe, 0x74, 0x90, 0x61, 0x12, 0x54, 0xd8, 0x28, 0xf0, 0xc3, 0xaa, 0xa8, 0x71, 0x12, - 0xbe, 0xfa, 0x06, 0xf6, 0xef, 0xf8, 0x03, 0x85, 0x83, 0xc1, 0x51, 0x54, 0x68, 0x3e, - 0x4e, 0x27, 0x17, 0x1a, 0x06, 0x9a, 0xd0, 0x06, 0x02, 0xeb, 0x4c, 0x83, 0xa6, 0x1a, - 0x50, 0x20, 0x92, 0xc2, 0x7a, 0x69, 0xc7, 0x92, 0x8e, 0x6b, 0x2c, 0x3b, 0x2d, 0x22, - 0xc4, 0x3b, 0x01, 0xf4, 0x86, 0xf8, 0xed, 0xce, 0xe3, 0xec, 0x28, 0x0f, 0xa9, 0xa2, - 0x82, 0x92, 0x0a, 0xdc, 0x77, 0x83, 0x38, 0xc6, 0x2b, 0x5c, 0xb0, 0x5b, 0x62, 0xc9, - 0x7e, 0x68, 0x74, 0xab, 0xae, 0xe6, 0xb0, 0x88, 0x8f, 0x29, 0xec, 0x73, 0x7e, 0x77, - 0x15, 0x53, 0x99, 0xdd, 0xea, 0xf7, 0x9f, 0xed, 0xd4, 0x54, 0x27, 0x6b, 0x46, 0xe1, - 0x0b, 0x92, 0x44, 0x61, 0x8a, 0x52, 0x99, 0x40, 0x3f, 0x83, 0xec, 0x59, 0x52, 0x4f, - 0x0a, 0xdf, 0x57, 0xde, 0x03, 0x32, 0x94, 0x89, 0x44, 0xb1, 0x47, 0xa3, 0x04, 0xd8, - 0x0c, 0xa0, 0xe6, 0x24, 0x94, 0x9e, 0x0c, 0x7a, 0x5f, 0x8f, 0xf7, 0xc9, 0x4b, 0x59, - 0xd8, 0x52, 0x19, 0x82, 0x18, 0x41, 0xd9, 0xb5, 0x06, 0xbe, 0x1a, 0x55, 0x6a, 0x3e, - 0x28, 0x65, 0x61, 0xf0, 0x07, 0x01, 0x52, 0x7f, 0xba, 0x00, 0x9e, 0xa8, 0xd2, 0x9a, - 0x31, 0xd7, 0x21, 0xdb, 0x29, 0x78, 0xa9, 0x14, 0x68, 0x36, 0x0a, 0xe0, 0x9b, 0xc1, - 0x27, 0x09, 0x42, 0x1d, 0xaa, 0x89, 0x80, 0x30, 0xd3, 0x64, 0x30, 0x88, 0x1f, 0xf8, - 0x3a, 0x2e, 0x01, 0x3d, 0xb5, 0x04, 0x1e, 0x91, 0x8a, 0x9e, 0x67, 0xcb, 0xc2, 0x7f, - 0xd0, 0xa0, 0x74, 0x4e, 0xf6, 0x2e, 0x4a, 0x65, 0x0a, 0xfa, 0x3b, 0xea, 0x42, 0xca, - 0xbc, 0xd4, 0x66, 0x00, 0xbf, 0xaa, 0x78, 0x5b, 0x0e, 0x20, 0xe0, 0x29, 0xa1, 0xb2, - 0x26, 0x77, 0x82, 0x6f, 0x11, 0xaf, 0x69, 0x65, 0xe1, 0xae, 0x5f, 0xb1, 0xea, 0x78, - 0x59, 0x90, 0xaf, 0xf5, 0x44, 0x76, 0xba, 0xef, 0xa7, 0xcb, 0xec, 0xd6, 0x2b, 0xdc, - 0xe5, 0xbd, 0x55, 0xdf, 0x06, 0x89, 0xb4, 0x62, 0x6b, 0x60, 0xa7, 0x98, 0x07, 0xe6, - 0xad, 0xae, 0x5c, 0x6a, 0x13, 0xf8, 0x85, 0x63, 0xd9, 0x1d, 0xf6, 0x0c, 0x0f, 0x02, - 0x4a, 0xc3, 0x90, 0xd5, 0xe7, 0x14, 0x4a, 0x8c, 0xfa, 0x02, 0xc0, 0x8e, 0xef, 0xb7, - 0x08, 0x2c, 0x01, 0xc2, 0xb5, 0x0a, 0xae, 0xa2, 0xdd, 0x1b, 0xc4, 0x78, 0xa2, 0xd8, - 0x63, 0xdf, 0xdd, 0x65, 0xbf, 0xd7, 0x81, 0x32, 0xcf, 0x52, 0x89, 0x41, 0x15, 0xcc, - 0x46, 0x11, 0x1c, 0x81, 0x19, 0x31, 0x1e, 0xf0, 0x33, 0x69, 0xfc, 0x1a, 0x51, 0x2b, - 0x60, 0x23, 0x73, 0x33, 0x29, 0x0b, 0x9e, 0x94, 0xbe, 0x96, 0xb1, 0xac, 0x5f, 0x40, - 0x9c, 0x5d, 0x21, 0xdf, 0x4f, 0x81, 0xdb, 0x48, 0xa9, 0x34, 0x15, 0x01, 0x6a, 0x15, - 0xe8, 0x34, 0x4d, 0x3e, 0x86, 0x4a, 0x34, 0x4b, 0x7c, 0x4f, 0x8e, 0xb8, 0x8c, 0xa9, - 0xdc, 0x00, 0x05, 0x4c, 0xb0, 0x78, 0x10, 0x02, 0xe1, 0xc4, 0x19, 0x57, 0x50, 0x33, - 0x30, 0xc3, 0x85, 0xa5, 0x1d, 0x04, 0xf7, 0x30, 0xa9, 0x31, 0x89, 0x0e, 0x69, 0xc2, - 0x41, 0x7c, 0x3b, 0x08, 0x95, 0x68, 0x07, 0xca, 0xec, 0x0d, 0x7a, 0x12, 0x91, 0x45, - 0x72, 0xef, 0xa2, 0xf7, 0x14, 0x7b, 0x8c, 0xf0, 0x80, 0x2a, 0xf8, 0x1a, 0x64, 0x62, - 0x93, 0xef, 0xa2, 0x9a, 0x3b, 0x90, 0xcc, 0x0f, 0x6c, 0xf8, 0x1d, 0xc4, 0x1d, 0xbd, - 0xc0, 0x8e, 0x70, 0xda, 0x66, 0xab, 0x54, 0x9a, 0x10, 0xb9, 0xf2, 0xff, 0x53, 0xdb, - 0x9d, 0x5e, 0x1a, 0xdd, 0x9f, 0x82, 0xee, 0x42, 0x89, 0xda, 0xa0, 0x3f, 0x8b, 0x52, - 0x97, 0x6a, 0xd8, 0x68, 0xaa, 0x5f, 0xca, 0x4e, 0xf6, 0x79, 0xab, 0xcd, 0xd6, 0xe1, - 0x98, 0xe3, 0xb9, 0x5f, 0x13, 0xe5, 0xf6, 0x26, 0x41, 0x6c, 0x72, 0x93, 0xc0, 0x05, - 0x38, 0x57, 0x86, 0x62, 0x89, 0xc9, 0x12, 0x97, 0xe6, 0xd7, 0xe3, 0xed, 0xe9, 0xf9, - 0x26, 0x4d, 0x20, 0xed, 0x88, 0xb1, 0xf4, 0x6e, 0xab, 0xd2, 0xa5, 0x56, 0xe0, 0x96, - 0x20, 0x8c, 0x54, 0xe3, 0x7c, 0xf2, 0x8e, 0x5d, 0x6f, 0x88, 0x5b, 0xe3, 0x82, 0x66, - 0x83, 0xfb, 0x6f, 0xd7, 0x9f, 0x3a, 0xc8, 0x1e, 0xea, 0x6b, 0xd7, 0xfa, 0xdd, 0x1b, - 0x34, 0x43, 0x62, 0xdb, 0xed, 0xec, 0x64, 0x5f, 0x4e, 0x45, 0x80, 0x11, 0xa7, 0x43, - 0xbd, 0xf8, 0x8f, 0x3b, 0x59, 0x2f, 0x74, 0x12, 0xe7, 0x4d, 0x50, 0x7f, 0x7d, 0x03, - 0x30, 0x87, 0xea, 0x34, 0xde, 0xb3, 0x87, 0xbb, 0x8e, 0xf7, 0xdc, 0x21, 0x2f, 0xac, - 0x1c, 0x81, 0xcf, 0xd1, 0xe7, 0xc9, 0x03, 0x7c, 0xde, 0xf6, 0xfc, 0xd1, 0x28, 0x26, - 0xbd, 0x6b, 0x0b, 0x87, 0x0c, 0x06, 0x8c, 0xf7, 0xfa, 0x07, 0x6c, 0xc8, 0x7b, 0x83, - 0x83, 0xb6, 0x0c, 0xdf, 0x34, 0x6b, 0xef, 0xfd, 0xe5, 0x0e, 0xfb, 0x87, 0x9d, 0x50, - 0x5f, 0x0d, 0x5d, 0x36, 0x6b, 0x23, 0x0b, 0xc6, 0x6e, 0x94, 0x94, 0xb5, 0x31, 0x44, - 0x11, 0x3a, 0x36, 0x6c, 0x71, 0x54, 0x75, 0x0b, 0xbd, 0x8c, 0x9b, 0x5d, 0x28, 0xc2, - 0x52, 0x44, 0x19, 0x1c, 0xd0, 0xfb, 0xa0, 0x35, 0x7d, 0xb0, 0xbd, 0x8f, 0x13, 0x9b, - 0xda, 0x8c, 0x9d, 0x0f, 0xa4, 0xc1, 0xc3, 0xfe, 0x1f, 0xed, 0x20, 0xb1, 0x27, 0x8e, - 0x0a, 0xce, 0x39, 0x77, 0x42, 0x3b, 0xe7, 0x1a, 0xfe, 0xd3, 0xff, 0xbe, 0x9e, 0x5d, - 0x61, 0x67, 0x83, 0x3f, 0x1e, 0xf2, 0x52, 0x86, 0xd2, 0x5d, 0x95, 0xff, 0xfc, 0x27, - 0xd8, 0x57, 0x52, 0x0d, 0x9a, 0xa3, 0xd7, 0x25, 0x7d, 0x00, 0x4c, 0x48, 0x0f, 0x15, - 0xc2, 0xc4, 0x82, 0xf6, 0xa9, 0x89, 0x69, 0x50, 0x3f, 0xc5, 0xd0, 0x6d, 0x44, 0xa4, - 0x54, 0x01, 0x88, 0xc8, 0x01, 0x1a, 0xa6, 0x76, 0xaf, 0xe4, 0x18, 0x14, 0x1f, 0xa4, - 0x5a, 0x6a, 0x71, 0x57, 0x2e, 0x40, 0xb0, 0xc1, 0x0f, 0x2f, 0xc5, 0xaf, 0x0c, 0x60, - 0x01, 0x20, 0x38, 0xe2, 0x8a, 0x49, 0x55, 0x08, 0x16, 0xf9, 0x48, 0xe2, 0x9e, 0x3c, - 0x1f, 0xf6, 0x7e, 0x95, 0x3d, 0x64, 0x41, 0xca, 0x3c, 0xd6, 0x57, 0xb7, 0x44, 0xb0, - 0xc5, 0x85, 0xe0, 0x96, 0x9b, 0x16, 0x0d, 0x81, 0x3a, 0x8f, 0xad, 0x6c, 0xa8, 0x09, - 0xc8, 0x22, 0xc2, 0x0b, 0x46, 0x2f, 0x8f, 0x72, 0x74, 0x00, 0xeb, 0xbe, 0x72, 0xa2, - 0x3b, 0xb3, 0xc9, 0xf9, 0x18, 0xe0, 0x75, 0x6a, 0xbf, 0xf3, 0x30, 0xb2, 0x40, 0x6a, - 0x62, 0x81, 0xec, 0xf2, 0x62, 0xbf, 0xf3, 0xb5, 0x8b, 0xc5, 0x61, 0x3e, 0xfc, 0xae, - 0x8d, 0x8d, 0x37, 0x78, 0x1f, 0x9d, 0x0e, 0x52, 0x37, 0x91, 0x4d, 0x5d, 0xff, 0xb2, - 0xb7, 0x17, 0x4b, 0x9d, 0x5c, 0x13, 0x06, 0x6c, 0xda, 0xda, 0x20, 0x12, 0x84, 0x30, - 0xa7, 0x61, 0x44, 0x3d, 0xaa, 0x3f, 0x56, 0xf3, 0x8f, 0xa7, 0x15, 0x0b, 0x6b, 0x7b, - 0xce, 0x07, 0x68, 0x25, 0x11, 0xba, 0x21, 0x21, 0x19, 0x3c, 0xe0, 0x67, 0xfe, 0x40, - 0xe7, 0x12, 0xdb, 0x34, 0x2a, 0xe0, 0x4a, 0xaa, 0x92, 0x26, 0x13, 0xd2, 0x95, 0xb5, - 0x5d, 0x02, 0xe6, 0x82, 0x6a, 0xce, 0x05, 0x6a, 0xda, 0x58, 0x54, 0xbf, 0x82, 0xac, - 0xd4, 0x4a, 0xd7, 0x11, 0xd7, 0x67, 0xd9, 0x86, 0xe2, 0x75, 0x08, 0xb4, 0x82, 0x18, - 0x4f, 0xef, 0x12, 0x3b, 0xe1, 0xe7, 0x79, 0x5e, 0x6a, 0xdd, 0xc0, 0x51, 0x1f, 0x3e, - 0xab, 0x37, 0xba, 0x33, 0xfa, 0xd2, 0x4a, 0x1d, 0xe8, 0x7e, 0xa6, 0x8f, 0xef, 0x34, - 0x3b, 0x88, 0x50, 0x69, 0xcd, 0x2d, 0x65, 0xa9, 0xfe, 0xbf, 0xdd, 0xd9, 0x82, 0xad, - 0x43, 0x40, 0xe2, 0x58, 0x67, 0xcb, 0x42, 0x16, 0x29, 0x61, 0x4a, 0xaa, 0x93, 0xea, - 0x02, 0x1b, 0x6f, 0x6f, 0xb9, 0xe6, 0xef, 0x44, 0x15, 0x7e, 0x3e, 0x0d, 0xcc, 0x97, - 0x49, 0x09, 0x7e, 0xf4, 0xda, 0x5c, 0x4e, 0xa7, 0x0d, 0xfa, 0xf0, 0x03, 0xa0, 0xbb, - 0x56, 0xb2, 0xcb, 0xec, 0x11, 0x0e, 0xbd, 0x8d, 0x25, 0xc8, 0x55, 0xd4, 0xb3, 0xea, - 0xfc, 0x67, 0xd8, 0x2e, 0x38, 0x72, 0x63, 0xe1, 0x8f, 0x13, 0x7f, 0x6a, 0x08, 0x10, - 0x74, 0x73, 0xc2, 0x5b, 0xba, 0x10, 0xf0, 0x17, 0x63, 0x69, 0x5a, 0x62, 0xc8, 0x42, - 0x90, 0x5b, 0xbf, 0xc5, 0x32, 0x3d, 0x36, 0x4d, 0xb2, 0x6f, 0x1d, 0x98, 0x04, 0x76, - 0x2e, 0x45, 0xf4, 0x5b, 0xad, 0xa0, 0xad, 0xad, 0xc4, 0xc8, 0x37, 0xb5, 0xd3, 0x4d, - 0x23, 0xf4, 0x6f, 0xc6, 0x44, 0xbe, 0x3b, 0xfa, 0x7b, 0x1b, 0x75, 0xa9, 0xeb, 0x47, - 0xfb, 0x63, 0xa1, 0x5c, 0x31, 0x99, 0x23, 0x00, 0xb7, 0x81, 0x2d, 0x52, 0xae, 0x64, - 0xfa, 0x8c, 0xd9, 0x5b, 0xd5, 0x1a, 0xb4, 0x88, 0x34, 0x04, 0x8f, 0xf6, 0x79, 0x02, - 0x90, 0x6c, 0x17, 0x29, 0xc2, 0x16, 0xbd, 0x0d, 0x6a, 0xb9, 0x34, 0x14, 0xe0, 0x67, - 0x56, 0xa9, 0x40, 0x23, 0xd0, 0x8b, 0x54, 0x14, 0x5d, 0xf7, 0x58, 0x10, 0xb6, 0x82, - 0xca, 0x25, 0xa9, 0x27, 0xa1, 0x1c, 0xdd, 0x6f, 0xea, 0x3a, 0x6e, 0x71, 0x24, 0x36, - 0xce, 0x1b, 0x75, 0xdc, 0x42, 0x9b, 0x49, 0x83, 0xfd, 0xa1, 0x12, 0x33, 0x1a, 0xb2, - 0x73, 0x08, 0x7f, 0x48, 0x2a, 0x24, 0x5d, 0xde, 0x80, 0xc8, 0x15, 0x09, 0x4e, 0x0f, - 0x60, 0x46, 0x62, 0x32, 0xeb, 0x3c, 0x7d, 0x99, 0x39, 0xac, 0xdf, 0xe4, 0x68, 0xbc, - 0x44, 0xc9, 0xf4, 0xd2, 0xd2, 0xdf, 0x21, 0x09, 0xc4, 0x41, 0x4d, 0x05, 0x0d, 0x20, - 0x3b, 0x69, 0x3c, 0xce, 0x9a, 0x90, 0x60, 0xbe, 0xce, 0xce, 0x80, 0xb4, 0xae, 0x23, - 0xae, 0x11, 0x5b, 0x34, 0xdb, 0x46, 0x25, 0xf9, 0x9b, 0x57, 0xd9, 0x43, 0xce, 0x81, - 0xc4, 0x7e, 0xcc, 0x87, 0x57, 0xad, 0x02, 0xf2, 0x04, 0x4e, 0xe8, 0x46, 0xa2, 0x3a, - 0xfa, 0x6f, 0xb7, 0xbb, 0xa3, 0xd7, 0x47, 0x3f, 0x47, 0xb5, 0x6d, 0x8f, 0x4f, 0x2b, - 0x77, 0x36, 0xa2, 0x0c, 0x80, 0xac, 0xde, 0xef, 0x14, 0x40, 0x46, 0xdf, 0x64, 0x85, - 0x69, 0x9d, 0x24, 0x27, 0x04, 0xa1, 0x87, 0xe5, 0x5c, 0x6a, 0xe6, 0x5d, 0x76, 0xd6, - 0x12, 0x0e, 0x09, 0xd1, 0x69, 0xbc, 0x2e, 0x4c, 0x82, 0xb6, 0x89, 0x0d, 0x27, 0xce, - 0x05, 0x76, 0xc4, 0x34, 0x0d, 0x1c, 0x93, 0xe7, 0x9c, 0xe7, 0x79, 0x9e, 0xfb, 0x53, - 0xe8, 0xaf, 0x07, 0x26, 0xfb, 0x06, 0xca, 0xe4, 0x0f, 0xb1, 0x8f, 0x08, 0xad, 0x85, - 0xd0, 0x1a, 0x1c, 0x77, 0x6b, 0x4b, 0xa9, 0x74, 0xa9, 0x9c, 0x43, 0xb6, 0x3d, 0xed, - 0x77, 0x36, 0x67, 0x09, 0x2a, 0x2b, 0xbc, 0x65, 0x1d, 0x92, 0x6d, 0x7e, 0xd7, 0xb3, - 0x84, 0x39, 0x87, 0xad, 0xd6, 0x9a, 0xa9, 0xe4, 0x96, 0x0d, 0x2a, 0x0a, 0x17, 0x01, - 0x29, 0x23, 0x50, 0x63, 0x27, 0x2f, 0x2d, 0xe8, 0xa4, 0xb8, 0xa2, 0x19, 0x7d, 0x7d, - 0x07, 0x2c, 0x70, 0xa3, 0xb7, 0x46, 0xdf, 0xbf, 0x76, 0x6f, 0x3d, 0xe7, 0x38, 0x22, - 0xef, 0x0a, 0x76, 0xe5, 0x3b, 0x37, 0xb2, 0x3e, 0xbb, 0x18, 0x61, 0x6c, 0x0a, 0xb9, - 0xb0, 0xe3, 0x30, 0x47, 0xa3, 0x58, 0x7b, 0xa3, 0xf8, 0x93, 0x5d, 0xf6, 0x4b, 0x1d, - 0x88, 0x85, 0x99, 0x09, 0xf7, 0x16, 0x48, 0x10, 0xa0, 0x53, 0x86, 0xec, 0x0e, 0x88, - 0x9a, 0xe1, 0x2a, 0x1b, 0x84, 0x08, 0x6e, 0x64, 0x9d, 0x40, 0x0e, 0x1e, 0x3b, 0xe6, - 0xba, 0x62, 0x8c, 0xc0, 0xba, 0x85, 0x52, 0x8e, 0x39, 0x2a, 0xe3, 0x09, 0x28, 0xf9, - 0xd3, 0xa1, 0x50, 0xd0, 0x95, 0xb8, 0x7f, 0x4b, 0x40, 0xa6, 0x43, 0xf4, 0xad, 0x34, - 0xaa, 0xb4, 0x1c, 0x6e, 0xa0, 0x6c, 0xe5, 0x8e, 0x84, 0xc4, 0xa6, 0x90, 0x8a, 0x9c, - 0x11, 0x89, 0x51, 0x6d, 0xa5, 0x60, 0xb3, 0x80, 0x57, 0x8c, 0xe5, 0x7e, 0x0a, 0x4b, - 0xba, 0x4c, 0xe0, 0xb9, 0xb0, 0x1a, 0xf0, 0x5c, 0xbe, 0x85, 0xd3, 0x6e, 0x90, 0xa6, - 0xf9, 0x75, 0x43, 0x17, 0x4d, 0xb1, 0x6d, 0x04, 0x45, 0xf1, 0x58, 0xb0, 0x1a, 0x90, - 0x64, 0xba, 0xb9, 0x01, 0x15, 0x86, 0x30, 0x64, 0x07, 0x1e, 0xee, 0x1d, 0x76, 0xc2, - 0xd9, 0x3c, 0x30, 0x2e, 0xa7, 0x04, 0x82, 0x2e, 0x1c, 0x1b, 0xb7, 0xbb, 0xa3, 0x8f, - 0x8e, 0x7e, 0xb2, 0x46, 0x07, 0xf8, 0x7c, 0x0d, 0x00, 0x96, 0x38, 0xfa, 0x8f, 0xb5, - 0x0c, 0x15, 0x39, 0xc2, 0x43, 0x49, 0x5c, 0x1c, 0x49, 0x18, 0xe0, 0x23, 0x07, 0xa1, - 0x1a, 0x5e, 0xf2, 0x9e, 0x8f, 0xd7, 0x82, 0x1f, 0xb2, 0x8e, 0x0b, 0xf0, 0x76, 0x44, - 0x08, 0xd3, 0xd4, 0xb3, 0x0e, 0x69, 0xb3, 0x1a, 0xf8, 0xa5, 0x55, 0xc8, 0x47, 0x4d, - 0xd5, 0x0e, 0xf6, 0x56, 0x7d, 0x87, 0xf9, 0xe6, 0xe9, 0xe3, 0x6b, 0x8c, 0xad, 0xb8, - 0x57, 0xe0, 0xbd, 0xc3, 0xdb, 0x8a, 0xc5, 0x06, 0x7e, 0x7a, 0xd9, 0x3c, 0xcb, 0xf1, - 0x0a, 0x9c, 0x73, 0xc5, 0x24, 0x9f, 0x36, 0xb9, 0xc5, 0x0c, 0xec, 0xff, 0xff, 0x44, - 0x62, 0x7e, 0x81, 0x03, 0x2b, 0xcd, 0x51, 0x5d, 0x64, 0x19, 0x88, 0x7c, 0x36, 0x90, - 0xb1, 0xb4, 0xe3, 0xf7, 0xb6, 0xd8, 0x51, 0xef, 0x19, 0xdb, 0x49, 0xbd, 0x42, 0x40, - 0x56, 0x95, 0x73, 0xb3, 0x53, 0xe3, 0x07, 0xde, 0x81, 0x3e, 0xf2, 0xcc, 0xe8, 0x27, - 0x36, 0x42, 0xb2, 0x9b, 0x51, 0x51, 0x74, 0x4b, 0xd9, 0xd7, 0xaa, 0xff, 0x85, 0x78, - 0x5f, 0x29, 0x7f, 0xd3, 0xc6, 0xfb, 0x2a, 0x01, 0xb0, 0xfa, 0x18, 0x3b, 0x95, 0x9c, - 0xfb, 0x86, 0x37, 0x77, 0xd8, 0x25, 0xa0, 0x3b, 0x3f, 0xb2, 0x92, 0xf2, 0xe4, 0x56, - 0xa6, 0xc5, 0x05, 0x76, 0x44, 0x98, 0x46, 0xb0, 0x51, 0x18, 0xc1, 0x01, 0x38, 0xd0, - 0xfb, 0xe3, 0x6c, 0x62, 0x8a, 0x4a, 0x48, 0x26, 0x50, 0x8a, 0x29, 0x83, 0x78, 0x08, - 0x49, 0x78, 0x0b, 0x84, 0x78, 0x20, 0x5b, 0xe8, 0x30, 0x01, 0x95, 0xe4, 0x48, 0xf7, - 0x80, 0x5a, 0xfd, 0x43, 0x49, 0xf2, 0x73, 0xca, 0xd6, 0x91, 0x10, 0xc8, 0x01, 0x5a, - 0x91, 0x5d, 0xce, 0x11, 0xeb, 0xbb, 0xc2, 0x4e, 0x3a, 0x60, 0xba, 0xa8, 0xeb, 0xb0, - 0x91, 0x68, 0x1f, 0xd9, 0x0c, 0x82, 0x6d, 0x05, 0xf0, 0x04, 0xa6, 0x9a, 0xb8, 0x36, - 0x93, 0xd2, 0xa9, 0xb2, 0xc8, 0x1b, 0x9b, 0x90, 0xe3, 0x73, 0xcd, 0xcd, 0xd7, 0x9e, - 0x1f, 0x7d, 0x6b, 0xb7, 0xae, 0xe2, 0x77, 0x39, 0xb2, 0xf5, 0x1e, 0x2c, 0x77, 0x8b, - 0x0c, 0xbe, 0x2d, 0xe2, 0x74, 0x3f, 0xd2, 0xf1, 0xfd, 0x5e, 0x9a, 0xa2, 0x74, 0x07, - 0x52, 0xa8, 0xbe, 0xcc, 0xce, 0x04, 0x8c, 0x31, 0x94, 0x70, 0xd8, 0x9a, 0xb8, 0x3d, - 0x04, 0x66, 0xbe, 0x9a, 0xbd, 0x2a, 0x2a, 0x4e, 0x31, 0x8b, 0xc9, 0x40, 0xb9, 0x37, - 0x40, 0xa2, 0xff, 0xf8, 0xd7, 0xfb, 0x6f, 0x07, 0x82, 0x46, 0x3c, 0x62, 0x60, 0x20, - 0xf0, 0x57, 0xb9, 0x17, 0x64, 0x01, 0x08, 0x42, 0x98, 0xac, 0xcb, 0x88, 0x7b, 0x18, - 0xb2, 0x73, 0xb6, 0xaa, 0xe6, 0xf2, 0xd3, 0x22, 0xb0, 0x8b, 0xa5, 0xd6, 0xc9, 0x01, - 0xa3, 0x2f, 0xdb, 0x28, 0x7a, 0x26, 0x4d, 0x63, 0x34, 0x2b, 0x88, 0xe1, 0x8c, 0xc8, - 0xcb, 0xdc, 0x71, 0x7b, 0x75, 0xd4, 0xaf, 0xbb, 0xbb, 0x0b, 0xf7, 0xc5, 0x35, 0xdf, - 0xb9, 0xbc, 0x4e, 0x7a, 0x3d, 0xbd, 0x78, 0x6b, 0xad, 0xec, 0xe2, 0xfd, 0xf0, 0x24, - 0xc8, 0xda, 0x48, 0xac, 0x3a, 0x1a, 0x26, 0x84, 0x19, 0x27, 0x1b, 0x1c, 0x68, 0x71, - 0x3f, 0xc7, 0x3c, 0xdf, 0x02, 0x09, 0xb4, 0x0d, 0x69, 0x1b, 0x06, 0xac, 0x15, 0xad, - 0xd1, 0x87, 0x5f, 0x5d, 0xcb, 0xde, 0xc7, 0xbc, 0x4d, 0x64, 0x62, 0x76, 0x88, 0x47, - 0x89, 0x6a, 0x42, 0xad, 0x41, 0xc2, 0xc8, 0xa5, 0xfa, 0xd3, 0x31, 0xa7, 0x2b, 0xf6, - 0xd8, 0x9f, 0xe9, 0xb0, 0xff, 0x28, 0x16, 0x63, 0x88, 0xc0, 0xfd, 0x52, 0xf2, 0xa0, - 0x6c, 0x48, 0xe8, 0x30, 0x00, 0x55, 0x4d, 0x22, 0x49, 0x8c, 0xac, 0xeb, 0x1b, 0x53, - 0x11, 0x60, 0xd4, 0x51, 0x70, 0xb1, 0x25, 0xaa, 0x89, 0xe0, 0x7f, 0x63, 0xeb, 0x01, - 0xec, 0x0c, 0x32, 0xf8, 0xae, 0xf0, 0x16, 0xe2, 0x08, 0x0f, 0x02, 0x6a, 0x37, 0xd8, - 0xa3, 0xa6, 0x82, 0x0a, 0x00, 0x77, 0x7c, 0x38, 0x0e, 0x12, 0x04, 0x6b, 0x70, 0x1f, - 0xec, 0xce, 0x76, 0x28, 0x2b, 0x92, 0x09, 0xad, 0x8d, 0x48, 0x93, 0x32, 0x37, 0xd8, - 0xd9, 0xfe, 0xad, 0x9b, 0xa0, 0xdc, 0x0b, 0x91, 0x28, 0x47, 0x35, 0x0f, 0xbb, 0xb6, - 0xd6, 0xfe, 0xa0, 0xb0, 0xc1, 0xd7, 0xee, 0x8e, 0x7e, 0xb7, 0xb6, 0x67, 0x88, 0xec, - 0x34, 0x49, 0x55, 0xc5, 0x09, 0xe5, 0xfb, 0x38, 0x8c, 0xf8, 0x09, 0x8c, 0x5d, 0x43, - 0xc4, 0xb7, 0x18, 0x84, 0x03, 0xff, 0x55, 0x7f, 0x3c, 0x20, 0x41, 0x3e, 0xd5, 0xe2, - 0xf1, 0xbc, 0xba, 0x66, 0x97, 0xd7, 0xba, 0x1d, 0xfb, 0x9b, 0xe4, 0x8c, 0x63, 0x17, - 0x07, 0xc8, 0x59, 0xcc, 0xf4, 0x9c, 0x88, 0x5c, 0x05, 0x26, 0xcd, 0xe2, 0x24, 0x7a, - 0x8c, 0xa7, 0x1b, 0xca, 0x7c, 0x32, 0x7d, 0xd1, 0xd5, 0x44, 0xde, 0xf3, 0xb1, 0xec, - 0xa1, 0xbe, 0xf5, 0xb6, 0xce, 0xf4, 0xf7, 0xac, 0xc1, 0xdf, 0xd3, 0x22, 0x41, 0x24, - 0x45, 0x6e, 0x6d, 0x99, 0x2f, 0x10, 0x15, 0xba, 0xca, 0x8e, 0x5b, 0xa4, 0xea, 0xc1, - 0xc4, 0x66, 0x32, 0x20, 0x9b, 0x31, 0x54, 0xd0, 0x98, 0xf3, 0x3f, 0xbd, 0x96, 0x9d, - 0x61, 0xc7, 0xc6, 0x32, 0x48, 0x75, 0x16, 0x31, 0xbe, 0xc0, 0xfe, 0x66, 0x87, 0xfd, - 0xe5, 0x4e, 0x64, 0xc6, 0xf4, 0x46, 0xaa, 0xa2, 0x68, 0x7d, 0xc8, 0x88, 0x4c, 0x4a, - 0xa3, 0x91, 0xe2, 0x0d, 0xcf, 0x2a, 0x08, 0x50, 0xa3, 0xd2, 0x07, 0xf7, 0x93, 0x1e, - 0x2a, 0x8a, 0x04, 0xd1, 0xa7, 0x61, 0x81, 0x3f, 0x05, 0x13, 0xb1, 0xbf, 0x91, 0xdc, - 0x23, 0x50, 0xe2, 0x22, 0x58, 0x90, 0x63, 0x79, 0xc6, 0x90, 0x34, 0x1d, 0xb0, 0x1e, - 0x48, 0x07, 0x97, 0x7d, 0x68, 0x23, 0x79, 0x5a, 0x1b, 0xb8, 0x41, 0xe6, 0x71, 0xdf, - 0xbd, 0x80, 0x78, 0xb3, 0x22, 0x8d, 0x4e, 0x55, 0x8c, 0x43, 0x97, 0xd1, 0x2f, 0x57, - 0x93, 0xd9, 0x74, 0x68, 0xd8, 0x44, 0x16, 0xd3, 0x4d, 0x5a, 0xf4, 0x6e, 0xb7, 0x82, - 0xd8, 0x64, 0xbd, 0xa5, 0x6b, 0x81, 0x74, 0xbf, 0xf6, 0xc6, 0x68, 0xe3, 0xde, 0x8a, - 0xe3, 0xf9, 0xc7, 0x3b, 0xee, 0x13, 0x1d, 0xf7, 0xa9, 0xce, 0xaa, 0xfb, 0x26, 0x0e, - 0xe9, 0xc8, 0x16, 0x80, 0xb3, 0x88, 0x80, 0xee, 0x21, 0x64, 0x23, 0x21, 0x0e, 0x1b, - 0x38, 0xc4, 0x9e, 0xcb, 0x76, 0xfa, 0x63, 0x59, 0x2f, 0x06, 0x9a, 0x15, 0xfc, 0x25, - 0xa6, 0x9f, 0x75, 0x6c, 0xbf, 0xb3, 0xee, 0xb6, 0xfb, 0xa0, 0xed, 0x8f, 0x69, 0x50, - 0xbb, 0x60, 0xbf, 0xef, 0xd8, 0xea, 0x8a, 0x07, 0xef, 0xca, 0x73, 0x1f, 0x2c, 0xfd, - 0xdc, 0x25, 0xd5, 0x6a, 0xb3, 0x4f, 0xa1, 0x54, 0x6d, 0x2e, 0x6c, 0x03, 0xd6, 0x08, - 0x64, 0x37, 0x03, 0x76, 0x4a, 0x8c, 0x45, 0xa8, 0xb0, 0x2c, 0x73, 0x53, 0x01, 0x17, - 0x11, 0xb5, 0x2f, 0xa2, 0x2e, 0xc6, 0x25, 0x76, 0x14, 0xd2, 0x26, 0x8d, 0x40, 0x9e, - 0x0d, 0xb6, 0xf7, 0x82, 0x33, 0xfb, 0x42, 0x48, 0x63, 0xb7, 0x9e, 0xd7, 0x8b, 0xf6, - 0xc7, 0xb7, 0x46, 0xbf, 0xd3, 0xa9, 0x4b, 0x9c, 0x1d, 0x84, 0x10, 0xd4, 0xef, 0xa3, - 0xbd, 0x7e, 0xa2, 0x8f, 0x39, 0x3b, 0x72, 0x97, 0x9e, 0xb4, 0xbb, 0x59, 0xaf, 0x9f, - 0x1f, 0xac, 0x4c, 0x6c, 0x49, 0xed, 0xc5, 0xdf, 0x5c, 0xcd, 0x0c, 0xbb, 0xce, 0x43, - 0x85, 0x06, 0x09, 0x2c, 0x03, 0xd1, 0xa2, 0x20, 0xbc, 0x94, 0xae, 0xb0, 0x59, 0xb5, - 0x30, 0xf8, 0x88, 0xdd, 0x84, 0xcc, 0x9c, 0xdd, 0x2b, 0xf9, 0x2d, 0x92, 0x96, 0x22, - 0x3c, 0x31, 0x71, 0x4e, 0xca, 0x21, 0x32, 0x2c, 0x08, 0x54, 0xae, 0x8f, 0x5a, 0xdb, - 0x29, 0x29, 0xac, 0xd8, 0xe4, 0xd1, 0xf1, 0xfe, 0x00, 0x1b, 0x50, 0x8d, 0x33, 0x62, - 0xa7, 0x93, 0x92, 0x7c, 0x83, 0x9e, 0xbb, 0x7f, 0x60, 0x52, 0x64, 0x4f, 0x84, 0x65, - 0x55, 0x8e, 0x6c, 0x11, 0x4f, 0x6f, 0x1a, 0xb9, 0x3d, 0x5a, 0x08, 0x6f, 0xdf, 0x37, - 0x26, 0x00, 0x61, 0x99, 0x75, 0xfb, 0xb0, 0xdf, 0x7d, 0x66, 0xf4, 0x77, 0xa7, 0x23, - 0xb7, 0x1c, 0x13, 0xa4, 0x33, 0x57, 0xcb, 0x06, 0xb5, 0x88, 0x25, 0x16, 0xa7, 0xfa, - 0x7c, 0x5e, 0x44, 0xee, 0x08, 0xaf, 0x5f, 0x70, 0x2d, 0x3b, 0xd5, 0xd7, 0xf3, 0x2e, - 0xe8, 0x68, 0x6a, 0x79, 0x39, 0x7b, 0xa8, 0x5f, 0x88, 0xd6, 0x40, 0x41, 0xb7, 0x10, - 0x08, 0x85, 0xe8, 0x67, 0xa7, 0xfa, 0xf3, 0x61, 0x41, 0x0e, 0xc3, 0xbe, 0xfb, 0x9d, - 0x27, 0xb2, 0x47, 0xfa, 0xae, 0x91, 0x2a, 0xdf, 0x6d, 0x36, 0x26, 0xb6, 0xb1, 0x65, - 0x71, 0xae, 0x7f, 0xa9, 0x86, 0xd6, 0x54, 0x55, 0x30, 0xc6, 0xee, 0xb1, 0xa7, 0x21, - 0xc8, 0xcf, 0x91, 0x9e, 0xad, 0x24, 0xee, 0x3b, 0x85, 0x2e, 0x1a, 0xe8, 0x6a, 0x83, - 0x02, 0x03, 0x05, 0x5c, 0xa9, 0xbe, 0x4a, 0xef, 0x89, 0x35, 0xd0, 0x2d, 0xef, 0x7d, - 0x4f, 0x87, 0xfd, 0xa9, 0x8e, 0x42, 0x5c, 0x04, 0x46, 0xf9, 0xf2, 0x72, 0x4c, 0x69, - 0x51, 0x08, 0x20, 0xe9, 0x40, 0xdb, 0x17, 0xe5, 0xcd, 0x5c, 0xa8, 0x3f, 0xd3, 0x7b, - 0xc4, 0xf7, 0x29, 0x08, 0xdf, 0xc7, 0x23, 0x99, 0x90, 0x00, 0x18, 0x7e, 0xe0, 0x32, - 0x53, 0x11, 0x88, 0x4f, 0x7c, 0xaa, 0x39, 0x65, 0xe2, 0xf2, 0x4a, 0x53, 0x22, 0x7c, - 0x8f, 0xd8, 0xb0, 0x0a, 0x2c, 0xdb, 0x9d, 0x1e, 0xcb, 0xf8, 0x58, 0xba, 0x49, 0xfd, - 0xb5, 0xb9, 0x3f, 0x8e, 0x16, 0xca, 0x65, 0x66, 0x3a, 0x6a, 0xe1, 0xc4, 0x2b, 0xb5, - 0x5f, 0x3c, 0xb7, 0xbb, 0x77, 0x9f, 0x1d, 0x7d, 0xdf, 0x1a, 0xf0, 0x76, 0xf2, 0xc9, - 0x7e, 0x67, 0x6b, 0x56, 0xac, 0x08, 0xf7, 0x94, 0x65, 0x85, 0x22, 0x1e, 0x65, 0x27, - 0xc6, 0x22, 0xc6, 0xa2, 0x77, 0xab, 0xb0, 0xeb, 0x16, 0x3b, 0x86, 0xe0, 0x80, 0x49, - 0x9d, 0xbe, 0x5c, 0x09, 0x20, 0x8e, 0xef, 0x5d, 0x64, 0x47, 0x05, 0xf1, 0x0d, 0xa4, - 0x3f, 0x0b, 0x0d, 0xee, 0xea, 0xce, 0x79, 0xe6, 0x37, 0xe3, 0xbc, 0xfa, 0x20, 0x0a, - 0x58, 0xf8, 0xff, 0x59, 0xd0, 0x19, 0x57, 0xd8, 0xc3, 0x20, 0x9c, 0xe2, 0x4d, 0x6f, - 0xdb, 0x0c, 0x27, 0x50, 0xb6, 0xf3, 0x76, 0xf7, 0xee, 0x73, 0xa3, 0xdf, 0xea, 0xdc, - 0x3b, 0x1e, 0x54, 0x73, 0x4b, 0x9e, 0xdf, 0x0a, 0xcc, 0xda, 0x8f, 0x2d, 0xe0, 0x79, - 0x5e, 0xf3, 0x5f, 0xbc, 0x5c, 0x4f, 0xfd, 0x3e, 0xa6, 0x48, 0x79, 0x23, 0xe7, 0x31, - 0x64, 0xe7, 0x78, 0x80, 0x61, 0x40, 0x0c, 0x1c, 0x42, 0x38, 0x83, 0x26, 0x2c, 0x8a, - 0x63, 0x3d, 0x51, 0x6f, 0x87, 0x9d, 0x40, 0x82, 0xce, 0xa9, 0xfc, 0x14, 0xc4, 0x05, - 0x0e, 0x1b, 0x58, 0xbe, 0xfb, 0xc1, 0xd1, 0x6f, 0x77, 0xea, 0x44, 0xd7, 0x8b, 0x7c, - 0xc9, 0xe5, 0x73, 0xa6, 0xbf, 0x79, 0x3a, 0x7b, 0x8c, 0x9d, 0x0b, 0x04, 0x9e, 0x11, - 0xd9, 0xa7, 0xd2, 0xda, 0x3c, 0x44, 0xed, 0xfd, 0xe4, 0x2a, 0xfb, 0x5b, 0xab, 0x9c, - 0xd2, 0x28, 0x2e, 0x94, 0x26, 0x72, 0x59, 0x55, 0x0e, 0x93, 0x0e, 0x19, 0x51, 0x5a, - 0x60, 0x1e, 0x1c, 0xb4, 0x50, 0xd1, 0xcc, 0x44, 0x14, 0xa9, 0x8b, 0xf5, 0x55, 0xbb, - 0x66, 0x8f, 0x2a, 0x7c, 0x5a, 0x6e, 0x62, 0x89, 0xe8, 0x81, 0xf8, 0x7a, 0x73, 0x2e, - 0xa9, 0x48, 0x08, 0x4b, 0x76, 0x38, 0xed, 0x05, 0x15, 0x95, 0x0f, 0xb9, 0x1f, 0x52, - 0xd7, 0x6e, 0x85, 0x21, 0xdb, 0x92, 0x13, 0x98, 0x8e, 0x90, 0x48, 0xda, 0x50, 0x39, - 0x0e, 0x05, 0x87, 0xe0, 0x66, 0x42, 0x26, 0xf7, 0x0a, 0x24, 0x7c, 0xb5, 0x9b, 0x41, - 0xd8, 0x09, 0x4f, 0xcb, 0x9c, 0x4b, 0x22, 0xd4, 0x1a, 0xda, 0x58, 0xdb, 0x63, 0x02, - 0xab, 0x8d, 0x36, 0xf8, 0x7a, 0x86, 0x12, 0x0d, 0x78, 0x4f, 0x9d, 0x14, 0xb8, 0x73, - 0x3d, 0x41, 0x6c, 0x9f, 0x20, 0x56, 0x0b, 0x89, 0x2f, 0xaa, 0x50, 0x93, 0x5b, 0xe2, - 0xe1, 0x0b, 0x51, 0xae, 0x64, 0x97, 0xe2, 0x15, 0x71, 0x91, 0x69, 0x94, 0x65, 0x56, - 0x4a, 0x18, 0x24, 0x05, 0xa7, 0xbc, 0xcf, 0xac, 0x31, 0x20, 0x36, 0x24, 0xbc, 0xc3, - 0x50, 0xa6, 0xdf, 0x2d, 0x94, 0x0d, 0xcc, 0xb2, 0x26, 0x79, 0x4d, 0x17, 0xe0, 0x37, - 0x55, 0x59, 0x1c, 0xed, 0xf5, 0x65, 0x28, 0x02, 0x47, 0xaa, 0x42, 0xc4, 0x4f, 0xd3, - 0x60, 0xcb, 0x40, 0x75, 0x86, 0xa4, 0x42, 0x58, 0x3b, 0x44, 0x1c, 0x1e, 0xf1, 0xde, - 0x09, 0x63, 0x3c, 0x19, 0xf3, 0xbd, 0xcb, 0xe0, 0x66, 0x09, 0x39, 0xb5, 0x74, 0x22, - 0xfe, 0x65, 0x67, 0x8b, 0x6d, 0x8a, 0xe9, 0x68, 0xed, 0x91, 0x60, 0x31, 0x5e, 0xbf, - 0xc9, 0x76, 0x8c, 0x2a, 0x92, 0x52, 0xbe, 0x1c, 0x90, 0x1e, 0x6a, 0x10, 0xe6, 0xa9, - 0xdc, 0xad, 0x27, 0xee, 0x13, 0x1a, 0x66, 0xcb, 0x2e, 0x43, 0xf5, 0x00, 0xee, 0x68, - 0x69, 0x24, 0x8a, 0xa4, 0x73, 0x4c, 0x2d, 0x12, 0x65, 0x43, 0x6c, 0xe9, 0xe6, 0x36, - 0x3b, 0x66, 0x75, 0xb5, 0x10, 0xaa, 0xd7, 0xd6, 0x2d, 0x5e, 0xca, 0xdd, 0xe7, 0x47, - 0x37, 0xd2, 0x85, 0x2c, 0xb3, 0x0b, 0x7d, 0x57, 0xc1, 0x59, 0xea, 0xff, 0x11, 0xf9, - 0x44, 0x83, 0x71, 0x18, 0xc8, 0xf9, 0xde, 0xce, 0x2e, 0xf7, 0x43, 0xe1, 0xfe, 0xd4, - 0x35, 0xad, 0x97, 0x0e, 0x61, 0xc6, 0x62, 0x65, 0x00, 0xfc, 0x17, 0x55, 0xeb, 0x1b, - 0xd2, 0x56, 0x02, 0x4d, 0x68, 0x98, 0x6f, 0x93, 0x32, 0x96, 0x7b, 0xde, 0x41, 0xde, - 0x11, 0x35, 0x95, 0xa5, 0x16, 0xb5, 0x7a, 0xd8, 0xcb, 0x20, 0x57, 0x4f, 0xf7, 0xac, - 0xdd, 0xb2, 0x71, 0xbf, 0xcf, 0x74, 0x16, 0x33, 0xe9, 0x57, 0xaf, 0xfc, 0x47, 0x39, - 0xe0, 0xff, 0x27, 0xb8, 0x31, 0x88, 0xc0, 0x1b, 0x05, 0xeb, 0x7f, 0x80, 0xba, 0xf5, - 0x36, 0x48, 0x1c, 0x46, 0x2e, 0x62, 0xc2, 0xf3, 0x23, 0xd6, 0x2d, 0x20, 0x6f, 0x2c, - 0x31, 0x66, 0x51, 0x86, 0x59, 0xd3, 0xc2, 0xad, 0x26, 0x6c, 0x08, 0x4f, 0xfc, 0xb9, - 0x4e, 0x1d, 0x68, 0xb4, 0xdb, 0xfa, 0xbd, 0xff, 0x06, 0x5e, 0x8c, 0x67, 0x3d, 0xef, - 0xd4, 0xcd, 0x76, 0x09, 0x93, 0x49, 0x62, 0xe9, 0x9a, 0xc7, 0x33, 0xd6, 0xb7, 0xb6, - 0xd9, 0x76, 0x03, 0xda, 0x02, 0x35, 0x92, 0x8d, 0x54, 0x8f, 0xa7, 0xfb, 0x22, 0x9f, - 0xf7, 0xc5, 0x5d, 0x11, 0x86, 0xf0, 0xa9, 0xec, 0x52, 0xbf, 0x18, 0xe7, 0x50, 0x75, - 0xd3, 0x32, 0x88, 0xb2, 0xf9, 0x36, 0xeb, 0xd8, 0x38, 0xd1, 0xdf, 0xac, 0x5d, 0x9d, - 0xd4, 0xd7, 0xd5, 0x5b, 0xbe, 0x94, 0x5d, 0x99, 0xfe, 0xd6, 0xe9, 0x2f, 0x3f, 0x91, - 0x3c, 0x6b, 0xfb, 0xaa, 0xee, 0x9d, 0x14, 0xa8, 0xbe, 0x5a, 0x1a, 0x5b, 0x85, 0x30, - 0x1f, 0x74, 0x6e, 0x2c, 0x5e, 0x65, 0x89, 0x0b, 0xe6, 0x1e, 0x74, 0x3e, 0x76, 0xc0, - 0x05, 0xb6, 0x7d, 0xc8, 0x05, 0xf6, 0xa0, 0xf3, 0xa1, 0x05, 0x6b, 0x6b, 0xfb, 0xa0, - 0x6b, 0xeb, 0x41, 0xe7, 0x7b, 0x0e, 0xb0, 0xac, 0xb6, 0xff, 0x8d, 0x2c, 0xab, 0x07, - 0x9d, 0xef, 0x9a, 0xbf, 0xa2, 0xb6, 0xff, 0xf5, 0xaf, 0xa8, 0x07, 0xe0, 0x8e, 0xcf, - 0x5d, 0x4c, 0xc9, 0x5c, 0xb0, 0x0f, 0x80, 0x38, 0x72, 0x7a, 0x1d, 0xa5, 0x1c, 0x63, - 0xf6, 0x01, 0x30, 0x0a, 0xcf, 0x58, 0x43, 0xb1, 0xe0, 0x3f, 0x7f, 0x00, 0x92, 0x67, - 0x8b, 0x97, 0xcf, 0x76, 0x73, 0xf9, 0x3c, 0x80, 0xea, 0xed, 0xb6, 0x95, 0xb3, 0x5d, - 0xad, 0x9c, 0x07, 0x9d, 0x17, 0x0e, 0xbc, 0x68, 0xb6, 0xe7, 0x2d, 0x9a, 0x1f, 0xe8, - 0xf8, 0xa3, 0x58, 0x35, 0x55, 0xe6, 0xe1, 0x4c, 0x53, 0xf9, 0xfc, 0x6c, 0x5f, 0x0e, - 0x71, 0xec, 0xc6, 0x0d, 0x07, 0x49, 0xc0, 0x50, 0xec, 0x89, 0x63, 0x42, 0xab, 0x18, - 0x32, 0xf4, 0xbe, 0xe4, 0xef, 0xae, 0x64, 0x57, 0xd9, 0xd9, 0xb1, 0xa4, 0x84, 0x4f, - 0x24, 0x4b, 0xc2, 0x53, 0x3a, 0x84, 0xd4, 0x39, 0x14, 0xf3, 0x9b, 0x58, 0x20, 0x58, - 0xe5, 0x50, 0x43, 0x79, 0x71, 0x6f, 0xc0, 0xce, 0x00, 0xa5, 0x22, 0x69, 0x5e, 0xb4, - 0x70, 0x1b, 0x45, 0x8e, 0xb4, 0xab, 0x2c, 0xe3, 0xb7, 0x62, 0xb0, 0x21, 0x10, 0xbf, - 0x81, 0xc4, 0x43, 0x12, 0x70, 0xd8, 0x66, 0x9b, 0xbc, 0x2e, 0xde, 0x00, 0x2d, 0x16, - 0x48, 0x03, 0x01, 0x95, 0x27, 0x17, 0x8d, 0xb7, 0x94, 0x11, 0xde, 0x73, 0xf7, 0xc5, - 0xd1, 0x33, 0xf7, 0x8e, 0xa0, 0x2a, 0xd2, 0xfd, 0xb7, 0xb1, 0xd4, 0x67, 0x2c, 0xc9, - 0x45, 0x9b, 0xce, 0xc3, 0x1e, 0x03, 0x40, 0x1c, 0x71, 0xc1, 0xed, 0x77, 0x14, 0xe0, - 0xc0, 0xa6, 0x0a, 0x2c, 0x54, 0x13, 0x07, 0xe6, 0x5b, 0xf4, 0x36, 0xa8, 0x25, 0x3e, - 0xc4, 0xe6, 0x75, 0x42, 0xbe, 0x06, 0xa3, 0xaf, 0xcd, 0xf3, 0xde, 0xaa, 0x6f, 0xb3, - 0xdf, 0xb9, 0x7a, 0x90, 0x28, 0xc3, 0x2c, 0xf7, 0x62, 0x9b, 0x6d, 0xda, 0x7c, 0xaa, - 0xd7, 0xfc, 0x9f, 0xda, 0xb3, 0xea, 0x5f, 0xe8, 0x64, 0x17, 0xd8, 0xc3, 0x63, 0xa1, - 0x49, 0x61, 0xaf, 0x74, 0x15, 0x2f, 0x89, 0xda, 0xd5, 0xde, 0x0b, 0x3b, 0x4f, 0xa9, - 0x06, 0x42, 0x85, 0x97, 0x66, 0x1c, 0x0a, 0xcd, 0x45, 0xd5, 0x4e, 0xac, 0x09, 0xc1, - 0xb5, 0xeb, 0x9d, 0x8b, 0xfa, 0x92, 0x2a, 0xf5, 0xb5, 0x97, 0x71, 0xbe, 0xce, 0x86, - 0x84, 0xb4, 0xa8, 0xee, 0x20, 0x8c, 0xe0, 0xe2, 0x76, 0xf7, 0xee, 0x87, 0x46, 0x0f, - 0xba, 0x0d, 0x36, 0x97, 0x03, 0x45, 0x4e, 0x7f, 0x69, 0x95, 0xa0, 0xed, 0x36, 0x32, - 0x9e, 0x52, 0xa6, 0x23, 0xda, 0xb3, 0xc0, 0xdf, 0xf5, 0x2c, 0x1b, 0x06, 0x91, 0x6d, - 0xa1, 0x27, 0xb1, 0xbc, 0x48, 0x61, 0x54, 0x0e, 0xff, 0xaf, 0x45, 0xed, 0xf6, 0x34, - 0x18, 0x57, 0x2b, 0x0b, 0x47, 0x0e, 0x30, 0x10, 0x75, 0x41, 0xb2, 0x02, 0x70, 0xa1, - 0x50, 0x04, 0xd3, 0xdf, 0x19, 0x76, 0x4d, 0x45, 0x44, 0x98, 0xa6, 0x98, 0x34, 0x65, - 0x68, 0x65, 0x62, 0x72, 0x63, 0xa5, 0xeb, 0x6e, 0xad, 0xfe, 0x3c, 0x24, 0xc3, 0xaf, - 0x0f, 0xd9, 0xd9, 0x22, 0xfc, 0x5e, 0x62, 0x56, 0x1c, 0x33, 0x78, 0x35, 0x0e, 0xd5, - 0x62, 0x5e, 0x5c, 0xf6, 0x31, 0x60, 0xe4, 0xd6, 0x05, 0x22, 0x53, 0x9a, 0x2b, 0x56, - 0x17, 0x01, 0x55, 0x73, 0xf7, 0xc3, 0xa3, 0x4f, 0xd6, 0x00, 0xc4, 0xaf, 0x64, 0xe7, - 0xfa, 0x07, 0xdb, 0xc7, 0x2f, 0x22, 0x18, 0x48, 0x46, 0x51, 0x78, 0x4d, 0x3a, 0xf3, - 0xf5, 0x12, 0xbd, 0x5b, 0x58, 0xd6, 0x67, 0xe7, 0x82, 0x32, 0x1f, 0x09, 0xbd, 0x1a, - 0xfa, 0xb4, 0xd4, 0xbc, 0x34, 0xb1, 0x6a, 0xef, 0x14, 0xa4, 0xaf, 0xc6, 0x79, 0x20, - 0xed, 0x4f, 0xf1, 0x34, 0x47, 0xc2, 0x4f, 0xb1, 0x35, 0xeb, 0x13, 0xe7, 0xef, 0x74, - 0xb8, 0x67, 0x33, 0xf6, 0xc8, 0xa1, 0x02, 0x74, 0xdf, 0xbd, 0x92, 0x6d, 0xb1, 0x53, - 0x81, 0x26, 0x4e, 0x05, 0x28, 0x74, 0x3a, 0xd1, 0x7a, 0x6c, 0xc3, 0x36, 0x08, 0x99, - 0x2d, 0x25, 0x61, 0x7a, 0x37, 0x40, 0xbf, 0xab, 0xc1, 0xfd, 0xd6, 0x42, 0xfc, 0x56, - 0xcd, 0x93, 0xf7, 0x12, 0xf1, 0xdb, 0xdd, 0xdb, 0x48, 0xfc, 0x36, 0xab, 0x53, 0xbf, - 0x9c, 0x54, 0x6c, 0xd9, 0x77, 0xad, 0x67, 0x8f, 0xb1, 0x1e, 0xc6, 0xea, 0x8d, 0x9b, - 0xa4, 0x74, 0xc9, 0x90, 0x13, 0xad, 0xb0, 0x14, 0x7f, 0x88, 0xdd, 0x09, 0x58, 0x0a, - 0x43, 0xc1, 0x5b, 0x10, 0x36, 0x04, 0x38, 0x45, 0x2c, 0x96, 0x1c, 0xa0, 0x7a, 0x35, - 0x9c, 0x7a, 0x49, 0x6b, 0x6f, 0x87, 0xc4, 0xd6, 0xd3, 0x48, 0x8a, 0x58, 0x26, 0xfd, - 0x21, 0xa6, 0x8a, 0xa8, 0xd5, 0x19, 0xb8, 0x71, 0x31, 0x8d, 0x4b, 0x5e, 0x3e, 0x56, - 0x4b, 0x13, 0x54, 0x7f, 0x0a, 0x64, 0x51, 0x70, 0x71, 0xa0, 0x84, 0xcd, 0x75, 0x06, - 0xca, 0xf2, 0x44, 0x06, 0x6d, 0xf7, 0x4a, 0x6a, 0x3a, 0x68, 0x49, 0xdf, 0x80, 0x88, - 0x84, 0x1e, 0x36, 0x23, 0x01, 0x61, 0x00, 0x53, 0xc4, 0xc5, 0x0d, 0x06, 0xd5, 0x6c, - 0xb9, 0x08, 0x51, 0x07, 0x08, 0xb7, 0x34, 0x43, 0x74, 0x26, 0xec, 0x40, 0xb7, 0xbb, - 0x77, 0x5f, 0x1a, 0x7d, 0x5f, 0x6d, 0x1b, 0xd9, 0xcd, 0x4e, 0xf5, 0xc5, 0xa0, 0xcf, - 0xc7, 0x31, 0x0b, 0xb0, 0xdb, 0x64, 0x4c, 0x82, 0xdf, 0xa2, 0x2f, 0x76, 0xae, 0x1f, - 0xe4, 0xc2, 0xfb, 0xb3, 0xcb, 0x51, 0xd6, 0xa0, 0x4d, 0x44, 0x7b, 0x9f, 0xad, 0x57, - 0x6c, 0xd7, 0x9d, 0x8f, 0x27, 0x2b, 0x83, 0x33, 0xe0, 0xc3, 0x8b, 0x6c, 0xab, 0xf6, - 0x94, 0xd6, 0x0d, 0xee, 0xc9, 0x04, 0xe1, 0x93, 0x3c, 0x0d, 0x92, 0x54, 0xa6, 0x2d, - 0x8f, 0xd8, 0x7c, 0x45, 0x53, 0x65, 0xd3, 0x1f, 0xcf, 0x8e, 0xf7, 0x8b, 0xbc, 0xc8, - 0x9b, 0x60, 0x90, 0x95, 0x22, 0x2f, 0x7a, 0xab, 0xfe, 0x97, 0xc8, 0xa2, 0xb9, 0xe9, - 0xff, 0x55, 0x0f, 0xfc, 0xfa, 0xbf, 0x70, 0x21, 0x9b, 0x10, 0x91, 0xa2, 0x41, 0xb7, - 0x59, 0x98, 0x76, 0x0b, 0xe0, 0x33, 0xdd, 0xec, 0x11, 0x80, 0x06, 0xa7, 0x7b, 0x14, - 0x10, 0x66, 0x5c, 0x67, 0x8f, 0x8c, 0x85, 0xd4, 0x13, 0x81, 0x32, 0x63, 0x22, 0xf2, - 0xcc, 0x55, 0x67, 0x91, 0x20, 0x4d, 0xae, 0xde, 0x87, 0x18, 0xca, 0x83, 0x72, 0xac, - 0x94, 0x95, 0x64, 0xf5, 0xab, 0x08, 0x05, 0x33, 0xa5, 0x1d, 0x87, 0xd0, 0x9c, 0xb7, - 0x10, 0x8b, 0x26, 0xf3, 0xa5, 0x3e, 0x3c, 0xaf, 0xc6, 0xdd, 0x97, 0x47, 0xff, 0xbc, - 0x16, 0xa3, 0xdd, 0x6a, 0x23, 0xfd, 0xdb, 0xbe, 0x2a, 0x16, 0x54, 0xff, 0xb5, 0x9a, - 0x0e, 0x7f, 0x76, 0x15, 0xd4, 0x91, 0x72, 0x4d, 0xba, 0x2a, 0x4d, 0x75, 0xa4, 0x5e, - 0xae, 0x15, 0xb2, 0x89, 0xe7, 0x9c, 0xf8, 0xc8, 0x22, 0xcf, 0x45, 0x52, 0x5f, 0xec, - 0x5b, 0x39, 0x67, 0xa4, 0xb5, 0xbd, 0x8b, 0x2c, 0x33, 0x63, 0xde, 0xa4, 0xc5, 0x32, - 0xc6, 0x18, 0xbf, 0x9c, 0x93, 0x0e, 0xd8, 0x62, 0x47, 0x2d, 0xa0, 0xe8, 0x1b, 0x07, - 0x05, 0x9f, 0x73, 0xa2, 0x6f, 0xb1, 0xa3, 0x1a, 0xe4, 0xea, 0x1b, 0x47, 0xb9, 0xdf, - 0x0c, 0x38, 0xcf, 0x6f, 0x77, 0xef, 0xde, 0x19, 0xfd, 0x0e, 0xd8, 0x50, 0x9f, 0x38, - 0xed, 0xd7, 0xae, 0x56, 0xc5, 0xe0, 0x56, 0x80, 0x7d, 0xe8, 0xbd, 0xc1, 0x27, 0x3b, - 0xeb, 0xfe, 0x6f, 0x38, 0x97, 0x97, 0xe0, 0x28, 0x59, 0x03, 0xba, 0x86, 0xfd, 0xce, - 0xe5, 0xec, 0x78, 0x1f, 0x6e, 0x5a, 0xef, 0xf9, 0xde, 0x4a, 0xae, 0x55, 0x6f, 0xd5, - 0xff, 0xb2, 0xdf, 0x39, 0x8b, 0x65, 0x6d, 0xfe, 0xd7, 0x0d, 0xff, 0x97, 0xed, 0xab, - 0x1c, 0xd1, 0x25, 0x0f, 0x0e, 0xf3, 0xcc, 0x07, 0x9d, 0x2b, 0xcd, 0x67, 0x6e, 0xf4, - 0xaf, 0xf2, 0x41, 0xfd, 0xa9, 0x0f, 0x3a, 0xbd, 0xea, 0xa9, 0x9b, 0xd8, 0x3c, 0x3e, - 0x77, 0xa9, 0x09, 0xf1, 0x0f, 0x50, 0x19, 0x42, 0xd2, 0xa9, 0x5e, 0x25, 0x2c, 0x5e, - 0x64, 0x52, 0x56, 0xe4, 0xe7, 0x10, 0xdf, 0xcd, 0x07, 0xa5, 0x70, 0x02, 0x82, 0xe2, - 0x91, 0x4f, 0x5a, 0xc2, 0xfe, 0x6e, 0x38, 0x6f, 0x6c, 0xe6, 0x32, 0x27, 0x30, 0x62, - 0x8f, 0xd0, 0xff, 0xc8, 0x8d, 0x75, 0xff, 0xed, 0x52, 0xf0, 0x69, 0xe4, 0x62, 0x15, - 0x99, 0x9d, 0xbf, 0xf5, 0x5f, 0x66, 0xc7, 0x9d, 0x1b, 0x87, 0x24, 0x94, 0x69, 0x29, - 0x88, 0x10, 0x3b, 0xec, 0x84, 0xe3, 0x24, 0x08, 0xbb, 0x18, 0x1e, 0xa9, 0xd8, 0xb6, - 0x2c, 0xc8, 0xda, 0x30, 0x7b, 0xa5, 0x94, 0x85, 0xa0, 0xec, 0x9f, 0x94, 0x32, 0xaf, - 0x83, 0x3a, 0xe1, 0x4f, 0x48, 0xa8, 0x72, 0xf7, 0x95, 0xd1, 0xcf, 0x76, 0x82, 0x74, - 0xc7, 0x12, 0xb5, 0x7d, 0x6b, 0x63, 0x09, 0xac, 0x37, 0x37, 0x96, 0x09, 0xb4, 0x74, - 0x96, 0xd3, 0x93, 0xf8, 0xf9, 0xd5, 0x34, 0xa1, 0x5a, 0x2f, 0x76, 0x7d, 0x8d, 0xbd, - 0x9f, 0x30, 0x92, 0x7c, 0x57, 0xec, 0x21, 0xf1, 0x18, 0x89, 0x6a, 0xe7, 0x28, 0x64, - 0x78, 0x8b, 0x32, 0xac, 0x16, 0xfe, 0x4b, 0x17, 0x58, 0xaf, 0x21, 0xf4, 0xa4, 0x46, - 0x2d, 0x84, 0x42, 0xb0, 0x38, 0xbe, 0xdf, 0xd2, 0x61, 0x5f, 0xe7, 0x6f, 0xaa, 0x09, - 0x3e, 0xa7, 0xfc, 0x25, 0x83, 0x52, 0xa2, 0xb8, 0x32, 0x14, 0xe0, 0x44, 0x1c, 0x56, - 0x89, 0x5e, 0xf7, 0x2d, 0xfc, 0x87, 0x4d, 0x2d, 0x85, 0x40, 0x37, 0x81, 0x5b, 0x2a, - 0x21, 0x31, 0x91, 0xaf, 0xcc, 0x12, 0xe8, 0xae, 0x32, 0x19, 0x2a, 0x72, 0xbc, 0xb0, - 0x7d, 0x1c, 0x6a, 0xa7, 0x7d, 0x75, 0xf4, 0xa5, 0xda, 0x4e, 0x7b, 0xba, 0x5a, 0x54, - 0xdd, 0xab, 0xbc, 0xb7, 0x06, 0x3a, 0x28, 0xde, 0x87, 0x8d, 0xba, 0x16, 0xc9, 0x1e, - 0x70, 0x62, 0xcc, 0x65, 0x48, 0xb7, 0xc0, 0xa0, 0x5e, 0xac, 0x9a, 0x25, 0x65, 0xf5, - 0x1b, 0x42, 0x95, 0xfe, 0x13, 0x10, 0xb3, 0xd6, 0x8a, 0xc3, 0x5c, 0xc7, 0x1e, 0xde, - 0xef, 0xe8, 0x1a, 0x3b, 0x81, 0x4e, 0xe9, 0x03, 0x7a, 0x5c, 0x97, 0xc2, 0x05, 0x94, - 0x55, 0x31, 0x29, 0x6d, 0x51, 0x50, 0x2d, 0xf8, 0x7e, 0xe7, 0xd9, 0xc5, 0xd8, 0xcd, - 0x4b, 0x30, 0x1e, 0x38, 0x14, 0xa5, 0x41, 0xc1, 0xce, 0xd2, 0x16, 0xe1, 0x00, 0x5b, - 0x0e, 0x2d, 0xf2, 0x2b, 0x35, 0xf4, 0xba, 0xae, 0x3c, 0x3a, 0xbb, 0xc7, 0x6e, 0xb2, - 0x6b, 0x41, 0x4e, 0x3b, 0xd2, 0x4c, 0x28, 0x48, 0x96, 0x23, 0x19, 0x8f, 0x71, 0xf1, - 0x40, 0x89, 0x73, 0x69, 0x1d, 0xe1, 0xb8, 0xbd, 0x5d, 0xb0, 0x66, 0x2d, 0x44, 0xe1, - 0xb0, 0xac, 0x15, 0x32, 0x7d, 0x83, 0x7a, 0xe2, 0xd8, 0xe2, 0x52, 0x5f, 0xc2, 0x05, - 0xdf, 0xd0, 0x0d, 0x81, 0x1e, 0x6d, 0x68, 0x1d, 0xbf, 0x36, 0xfa, 0xfc, 0x6a, 0xa8, - 0x8f, 0x6a, 0x29, 0x61, 0x1e, 0x5e, 0x15, 0xbd, 0xe3, 0xb1, 0xfe, 0xd6, 0xbf, 0xff, - 0x7c, 0xc6, 0x2a, 0xc2, 0x81, 0x75, 0xb5, 0x89, 0xc7, 0xf6, 0x34, 0x49, 0xdc, 0xda, - 0xd8, 0x2f, 0xb4, 0xa5, 0x3a, 0xfc, 0xd7, 0xda, 0x93, 0xca, 0xe7, 0xd9, 0x06, 0x77, - 0x0d, 0x92, 0xfa, 0x10, 0x98, 0xea, 0x5d, 0x03, 0xa5, 0x1d, 0x2e, 0xb0, 0x64, 0xce, - 0x36, 0xd9, 0xec, 0x0b, 0xfb, 0x0e, 0xb8, 0xbf, 0xee, 0xde, 0x1d, 0xfd, 0x64, 0x5b, - 0x1e, 0x79, 0xce, 0x0c, 0x5c, 0x3e, 0x8f, 0xfc, 0x7f, 0xe3, 0x47, 0x8b, 0xa2, 0x5e, - 0xe5, 0x75, 0x8e, 0x6d, 0x08, 0xd1, 0x80, 0x12, 0x90, 0xdd, 0x56, 0xb0, 0x6b, 0x45, - 0xf4, 0xb2, 0x6a, 0x82, 0x8b, 0xe5, 0x38, 0x15, 0xa3, 0x4e, 0xed, 0x4d, 0xb7, 0xdc, - 0x64, 0x4a, 0x3b, 0xe1, 0xf5, 0xd1, 0xff, 0xd3, 0x79, 0x17, 0xd9, 0x85, 0xbf, 0xd4, - 0xcd, 0xae, 0xb3, 0xad, 0xb1, 0x08, 0xa5, 0x1d, 0x51, 0xcd, 0x80, 0x92, 0x88, 0x6a, - 0x6f, 0x70, 0x2b, 0x51, 0x72, 0x06, 0x42, 0x52, 0x3e, 0x4d, 0x48, 0x5a, 0x01, 0x2c, - 0x37, 0xc7, 0x53, 0x55, 0x22, 0x91, 0x79, 0xec, 0x1a, 0x63, 0xa1, 0x4a, 0xa4, 0xed, - 0xee, 0x55, 0xc9, 0xc8, 0x35, 0xc6, 0x8a, 0xb9, 0x0d, 0xc9, 0xd9, 0x5a, 0xd8, 0x5b, - 0x6f, 0x8e, 0x7e, 0x93, 0xe8, 0x13, 0xb7, 0x66, 0xd1, 0x89, 0xad, 0xc1, 0xc7, 0x47, - 0xbe, 0xb1, 0x36, 0x0a, 0x52, 0x20, 0x4d, 0xbf, 0x56, 0x9b, 0x6d, 0xad, 0xe4, 0xb4, - 0xcb, 0x5b, 0x42, 0xdf, 0xb1, 0x32, 0xbb, 0xd4, 0xbb, 0x60, 0x97, 0xad, 0xe0, 0x1a, - 0x02, 0x19, 0x02, 0x29, 0x3e, 0x85, 0x24, 0x3d, 0x0d, 0x33, 0x49, 0xec, 0xe3, 0x50, - 0xc7, 0x2d, 0xb8, 0x56, 0x02, 0xc0, 0x6c, 0xcf, 0xb0, 0x01, 0x5d, 0xca, 0x01, 0x7d, - 0x22, 0x10, 0x38, 0x24, 0x91, 0x37, 0x1f, 0x05, 0x6b, 0xdc, 0x8c, 0x5b, 0x88, 0xfc, - 0xd0, 0xa5, 0xe0, 0x64, 0x30, 0xcd, 0x2f, 0x05, 0x9f, 0xb2, 0xbc, 0xdf, 0x9d, 0x52, - 0xf0, 0xbb, 0x5f, 0x51, 0x2b, 0x05, 0xaf, 0xd5, 0x81, 0xaf, 0x58, 0xc1, 0x17, 0x8f, - 0xc5, 0x9f, 0x24, 0xc6, 0xcb, 0xa1, 0x6e, 0x61, 0xbc, 0xfc, 0x4a, 0xf6, 0xa1, 0x20, - 0x82, 0x78, 0xff, 0xed, 0x5b, 0x70, 0xb8, 0x04, 0x2e, 0x11, 0x11, 0xfe, 0x08, 0xae, - 0x1e, 0xe1, 0x37, 0x38, 0xc2, 0xc6, 0x06, 0x90, 0xf5, 0x09, 0xc8, 0xe8, 0x29, 0xbd, - 0xd7, 0x0a, 0x7e, 0x28, 0xd9, 0xa5, 0x02, 0x2b, 0x44, 0xbd, 0x2f, 0xec, 0x28, 0x4c, - 0x9c, 0x47, 0x46, 0xd2, 0x14, 0x26, 0xa8, 0x88, 0x39, 0xfe, 0x50, 0xfb, 0xc7, 0x47, - 0x47, 0x7f, 0x7b, 0x0a, 0x44, 0xb8, 0xb0, 0x28, 0x6f, 0x0d, 0x50, 0xda, 0xb0, 0x9b, - 0xe6, 0x9d, 0xfd, 0xce, 0xee, 0xc1, 0x08, 0x28, 0xb1, 0xf9, 0x52, 0xeb, 0xe1, 0xd7, - 0x91, 0xec, 0x3c, 0x17, 0xf5, 0x3d, 0x24, 0x10, 0x21, 0x37, 0x73, 0x27, 0x02, 0xd1, - 0x5e, 0xaa, 0x07, 0x7e, 0x9e, 0x99, 0xfa, 0xdd, 0x9a, 0x18, 0xdc, 0xd9, 0xcc, 0xa7, - 0x44, 0x65, 0xf2, 0xa5, 0x2b, 0xd4, 0xee, 0xde, 0x1b, 0x7d, 0xba, 0xbb, 0x70, 0x3f, - 0xf1, 0x6f, 0xbf, 0xd4, 0x57, 0xff, 0xe7, 0x9d, 0xec, 0x24, 0x5b, 0x77, 0xd5, 0x21, - 0xa1, 0xf6, 0xd8, 0x23, 0x8d, 0x3f, 0x88, 0x55, 0x57, 0x14, 0x45, 0x2f, 0x5e, 0x74, - 0x98, 0xc1, 0x7f, 0xfd, 0x99, 0xe9, 0xe0, 0xff, 0xe2, 0xb7, 0xfb, 0x1b, 0xb4, 0x47, - 0x99, 0x96, 0x3d, 0x4a, 0xb2, 0xf3, 0x06, 0x7c, 0x77, 0xeb, 0xcf, 0x7c, 0x32, 0xc4, - 0x75, 0x3e, 0x98, 0xde, 0x5a, 0x8c, 0x2a, 0x2c, 0xc6, 0xda, 0x7a, 0x6f, 0xb2, 0xf7, - 0xe3, 0x45, 0x48, 0x73, 0x06, 0xc2, 0x5d, 0x28, 0x95, 0x88, 0x8b, 0x07, 0x4a, 0x6b, - 0x43, 0x65, 0x3e, 0x50, 0x05, 0x8d, 0x51, 0x6d, 0x5f, 0xb6, 0x6c, 0x59, 0x46, 0x15, - 0x42, 0xc2, 0x3a, 0x7a, 0x6f, 0xb0, 0x57, 0x3c, 0xce, 0x4e, 0x40, 0x57, 0x90, 0xff, - 0xd7, 0xd2, 0x49, 0xe4, 0xee, 0xbd, 0xfe, 0xdc, 0x9c, 0x0d, 0xcd, 0xa8, 0x03, 0x90, - 0x5a, 0xfc, 0xc5, 0x2e, 0xb8, 0xd9, 0xc2, 0xd8, 0x86, 0x00, 0xa3, 0x60, 0x97, 0x84, - 0xc0, 0x0c, 0x8b, 0x23, 0x6a, 0xe7, 0x21, 0x54, 0x53, 0xd4, 0x0b, 0xca, 0x71, 0x85, - 0x61, 0xd4, 0xb2, 0x27, 0xd9, 0x36, 0x8a, 0x35, 0x44, 0x2d, 0x6a, 0x6b, 0xc9, 0x85, - 0x9a, 0xd2, 0x72, 0x32, 0xc4, 0x06, 0x70, 0xa8, 0x39, 0xfa, 0xc1, 0xd1, 0x2f, 0x75, - 0xee, 0xad, 0xe5, 0x79, 0xc9, 0x0d, 0x01, 0x26, 0x9f, 0x58, 0x22, 0xa2, 0xb1, 0x5c, - 0x79, 0x7a, 0x37, 0x31, 0xf6, 0xaa, 0xee, 0xd1, 0x6c, 0x47, 0x10, 0x37, 0x9e, 0x45, - 0x12, 0xa9, 0x49, 0x3a, 0x9d, 0x9a, 0xda, 0xc1, 0x14, 0x8c, 0xee, 0x5d, 0x26, 0xf8, - 0xe4, 0xf4, 0x36, 0x54, 0x50, 0x05, 0xca, 0xa1, 0xfa, 0xe3, 0xc5, 0xd1, 0x17, 0xc8, - 0xe0, 0xe3, 0xcb, 0x44, 0x76, 0x56, 0xfd, 0x67, 0x2d, 0xd5, 0x1b, 0x3f, 0x17, 0x39, - 0x50, 0x1c, 0xe8, 0x1e, 0x8a, 0x61, 0x9d, 0x03, 0x05, 0x0a, 0xc3, 0xd8, 0x53, 0xac, - 0x8f, 0xc5, 0xac, 0x25, 0x0a, 0x9a, 0x03, 0x73, 0x96, 0x8e, 0xf4, 0xa7, 0x16, 0x32, - 0x50, 0xb3, 0x34, 0x79, 0x86, 0xec, 0x9c, 0x3f, 0x2c, 0x15, 0xb8, 0x94, 0x35, 0x14, - 0x65, 0x4d, 0xc5, 0xb6, 0x22, 0xca, 0x58, 0x40, 0x86, 0x72, 0x29, 0x66, 0xb8, 0x6b, - 0x0d, 0xe6, 0x57, 0x52, 0x6c, 0xb1, 0xcc, 0x90, 0xbb, 0x9f, 0x6a, 0x29, 0x55, 0x04, - 0x16, 0xaf, 0x7f, 0x68, 0xf4, 0x6c, 0xbd, 0xbc, 0x62, 0x11, 0x63, 0x29, 0x06, 0xa1, - 0x35, 0x28, 0x51, 0x21, 0x8b, 0xe4, 0xbc, 0xd3, 0xf4, 0x08, 0x57, 0x25, 0xc4, 0xb0, - 0x6a, 0xdc, 0x28, 0x53, 0x39, 0xf1, 0x29, 0x6e, 0x94, 0x5a, 0x4e, 0xfc, 0x30, 0xf4, - 0xce, 0x3f, 0xb2, 0x0a, 0x16, 0x8e, 0x8c, 0xf4, 0x64, 0x64, 0xe1, 0x48, 0x6f, 0xe1, - 0xbc, 0xc9, 0x3e, 0x40, 0x75, 0x5d, 0x7c, 0x4c, 0x31, 0x06, 0x51, 0x91, 0x23, 0x40, - 0xea, 0x16, 0x50, 0x98, 0x42, 0x4f, 0x4a, 0x2b, 0x10, 0x5a, 0xaa, 0x4c, 0x69, 0x81, - 0xde, 0x22, 0xb1, 0x6c, 0xe4, 0x6e, 0xad, 0x9c, 0xb2, 0x77, 0x8b, 0x3d, 0xe1, 0x5b, - 0xf2, 0x31, 0x77, 0x93, 0x12, 0x25, 0xe4, 0x48, 0x1e, 0xce, 0x11, 0x6a, 0xb3, 0x8a, - 0xb2, 0xa4, 0x56, 0x0e, 0x7f, 0x07, 0xae, 0xe2, 0xeb, 0xb7, 0x47, 0x3f, 0xdf, 0x5a, - 0x4f, 0x65, 0xfc, 0x10, 0x49, 0xd5, 0xa2, 0x94, 0x54, 0x1f, 0xa2, 0x63, 0xfe, 0xc4, - 0xb1, 0x65, 0x81, 0x44, 0x34, 0x9d, 0xfd, 0xce, 0x87, 0xb3, 0x73, 0xfd, 0xb1, 0xa2, - 0x7e, 0x9b, 0x3d, 0x17, 0xb6, 0xd5, 0x98, 0x2b, 0x07, 0x92, 0x6e, 0x41, 0x13, 0x27, - 0x27, 0x52, 0x5e, 0x3e, 0xd6, 0xc5, 0x04, 0x8a, 0xab, 0x9e, 0xca, 0x4e, 0xf5, 0xa5, - 0xe4, 0x16, 0x87, 0xbb, 0x05, 0x6d, 0xb3, 0x22, 0x25, 0xef, 0xad, 0xfa, 0x26, 0xbd, - 0x35, 0x68, 0xd8, 0x5b, 0xc7, 0xf6, 0xfe, 0xea, 0xdb, 0x00, 0x1f, 0x27, 0xc3, 0xa3, - 0x0d, 0x3c, 0x21, 0xc1, 0x58, 0xeb, 0x6d, 0x4b, 0xc2, 0x16, 0xe9, 0x09, 0x55, 0x34, - 0x52, 0xd9, 0x29, 0x89, 0x01, 0x0c, 0x96, 0x34, 0xcd, 0x7e, 0xa2, 0x03, 0x93, 0x07, - 0x28, 0x67, 0x02, 0x18, 0x75, 0x83, 0xd2, 0xff, 0x6c, 0x80, 0xc8, 0x19, 0x8c, 0x5a, - 0x20, 0xad, 0xf5, 0x20, 0x4d, 0xa4, 0xfb, 0x46, 0x62, 0x55, 0xf2, 0x9c, 0xf7, 0xb6, - 0xd8, 0x71, 0xa0, 0x87, 0x9f, 0x4c, 0xff, 0x6e, 0xc5, 0xe1, 0x8c, 0xda, 0xd7, 0x5f, - 0x1a, 0xfd, 0xf5, 0xe5, 0x25, 0x6a, 0x7e, 0xba, 0x9b, 0x6d, 0xb3, 0x47, 0xfc, 0xab, - 0x04, 0x97, 0x17, 0x12, 0x8e, 0x75, 0x5e, 0x04, 0x64, 0x5e, 0x11, 0x58, 0xa5, 0x28, - 0x31, 0x00, 0x8d, 0x9c, 0xf7, 0x8d, 0x00, 0x11, 0x15, 0x77, 0xa3, 0x25, 0x2a, 0x87, - 0x53, 0x19, 0x07, 0x5a, 0x0f, 0x3b, 0xe7, 0xa8, 0x36, 0x5f, 0xa7, 0x75, 0x07, 0x98, - 0x65, 0x3e, 0xc7, 0x36, 0x8a, 0xc6, 0x4f, 0xc5, 0x54, 0xc5, 0xec, 0x39, 0x12, 0x89, - 0x49, 0x63, 0x53, 0x94, 0x39, 0x4e, 0x7b, 0xe4, 0xe5, 0xd1, 0x5f, 0x24, 0x9e, 0xf4, - 0x2b, 0xb3, 0xfc, 0xda, 0x8c, 0x3e, 0xbd, 0xb4, 0x79, 0x8c, 0x13, 0x4e, 0x9b, 0xb3, - 0xeb, 0xf8, 0x35, 0x4b, 0xf5, 0xec, 0xff, 0xba, 0x42, 0x92, 0x45, 0xa6, 0x7e, 0xb0, - 0x7e, 0x73, 0x87, 0xfd, 0x31, 0xf2, 0xa2, 0xf0, 0x00, 0xc1, 0x44, 0xad, 0x20, 0x06, - 0x66, 0xdc, 0x0c, 0x82, 0x10, 0x06, 0xfe, 0x45, 0x46, 0x4d, 0x0b, 0x20, 0x6b, 0xe4, - 0xc2, 0x05, 0x70, 0x79, 0x42, 0xac, 0x5c, 0x6a, 0x4c, 0x6f, 0x9b, 0xa8, 0xc4, 0xda, - 0x44, 0x84, 0x44, 0x3f, 0x6b, 0x16, 0x08, 0xcb, 0xbc, 0x83, 0xcd, 0xe6, 0xce, 0xe8, - 0x17, 0x5a, 0x37, 0x1b, 0x7b, 0xa0, 0xf3, 0x9a, 0x8a, 0x21, 0xbb, 0x5c, 0xec, 0xac, - 0xf7, 0xdd, 0x36, 0x11, 0xa6, 0xb6, 0x67, 0xdf, 0x7a, 0x1d, 0xb3, 0xb3, 0xea, 0xdb, - 0xec, 0x77, 0x6e, 0x02, 0x7c, 0x84, 0x86, 0x75, 0xee, 0x9d, 0x8f, 0x70, 0x09, 0xd2, - 0x4b, 0x93, 0x70, 0xff, 0xa5, 0xc6, 0xf2, 0x73, 0x4d, 0xcd, 0xf3, 0x6a, 0x38, 0x3f, - 0xc0, 0x86, 0x32, 0x08, 0xed, 0xa3, 0xbb, 0x0a, 0x19, 0x6c, 0xca, 0xca, 0x94, 0x96, - 0x28, 0xcf, 0xb9, 0x48, 0x0b, 0x6d, 0x30, 0xfd, 0x46, 0xf6, 0xc0, 0x75, 0xf6, 0x28, - 0x20, 0x09, 0x74, 0x11, 0x8a, 0xac, 0xcc, 0x94, 0xed, 0x50, 0x15, 0x54, 0x6e, 0xba, - 0x9c, 0x37, 0x5c, 0x38, 0x47, 0x19, 0x9f, 0xeb, 0x3d, 0xb6, 0xe1, 0x1a, 0xd2, 0xdd, - 0xce, 0xc5, 0x7c, 0xfc, 0x31, 0xe7, 0x0f, 0xb1, 0xa9, 0x8b, 0x39, 0x5e, 0x3c, 0x63, - 0x58, 0x5f, 0x19, 0xfd, 0x4c, 0x27, 0xb0, 0x91, 0x2c, 0x52, 0x44, 0x5a, 0xaa, 0x4b, - 0x7f, 0xa3, 0x0b, 0x3b, 0x69, 0x4e, 0xa1, 0xec, 0x7a, 0xf9, 0xd9, 0xfb, 0xd9, 0x8d, - 0x64, 0x79, 0xb8, 0xb0, 0xdb, 0x04, 0xa1, 0x16, 0x3f, 0xc3, 0x31, 0x84, 0xa3, 0x9b, - 0x05, 0x68, 0xd0, 0x53, 0xbd, 0x01, 0x74, 0xa9, 0x1d, 0x13, 0xf7, 0xbc, 0xb2, 0x2d, - 0xb1, 0x6c, 0xcb, 0x35, 0x15, 0x41, 0x91, 0x53, 0x9c, 0xc4, 0x26, 0xfd, 0x5f, 0x84, - 0x10, 0x4b, 0x4c, 0xff, 0x57, 0x47, 0x7f, 0x99, 0xb6, 0x9a, 0x27, 0x6a, 0xd3, 0x36, - 0x09, 0x67, 0x33, 0x34, 0xf7, 0x2c, 0xce, 0x10, 0x78, 0xf9, 0xfd, 0xce, 0xb5, 0x59, - 0x1b, 0xd3, 0x09, 0x8b, 0x71, 0x54, 0x7a, 0xfb, 0xa6, 0xac, 0x49, 0x92, 0xde, 0x5f, - 0xb2, 0xe0, 0xf4, 0x73, 0x6b, 0xde, 0xc2, 0x85, 0x98, 0x3a, 0xb9, 0xb2, 0xa5, 0x52, - 0xaa, 0xe1, 0x85, 0xb1, 0xbf, 0xd0, 0x61, 0x9f, 0xac, 0x18, 0x6c, 0xe5, 0x04, 0x98, - 0xe2, 0xc7, 0xc2, 0x4d, 0xa0, 0x12, 0x0d, 0xa1, 0x24, 0x40, 0x49, 0x02, 0x29, 0x16, - 0x28, 0xd6, 0xaa, 0x82, 0x3e, 0xbe, 0x5d, 0x89, 0x99, 0x8e, 0xd0, 0xdc, 0xba, 0x09, - 0xa5, 0x06, 0xcb, 0x82, 0xec, 0xa6, 0x31, 0xc7, 0x9f, 0xa1, 0xbe, 0xd0, 0x8f, 0x14, - 0xb5, 0x05, 0x56, 0xfa, 0xa9, 0x02, 0xf6, 0x84, 0x58, 0xfb, 0x0e, 0xb3, 0x7e, 0xcb, - 0xa3, 0x8a, 0x16, 0x3b, 0x29, 0x21, 0x60, 0x44, 0xec, 0x54, 0x48, 0x63, 0x57, 0xe0, - 0x1b, 0x51, 0xea, 0x8b, 0x9b, 0x90, 0x24, 0x4d, 0x9c, 0xd1, 0x03, 0x97, 0xac, 0x6e, - 0x85, 0x32, 0xe5, 0xba, 0x58, 0xc0, 0x5c, 0xfc, 0x68, 0x3a, 0x35, 0x5e, 0x1b, 0xdd, - 0x4b, 0x0d, 0xe9, 0xd7, 0x6a, 0x19, 0xc8, 0x05, 0x69, 0xcb, 0x0b, 0xe8, 0x77, 0x21, - 0x72, 0x12, 0x4d, 0x28, 0x15, 0xcd, 0x45, 0x82, 0x21, 0x78, 0x7b, 0xe8, 0xe9, 0x65, - 0x6e, 0x7a, 0x44, 0x93, 0x0c, 0x6f, 0x8c, 0x65, 0xf1, 0xc5, 0xc4, 0xf6, 0x1b, 0x9a, - 0x97, 0x91, 0xb9, 0xc1, 0x5f, 0xf3, 0x78, 0x76, 0xaa, 0xaf, 0x14, 0xca, 0xba, 0xf2, - 0x56, 0x30, 0xaa, 0x52, 0xca, 0x9b, 0x57, 0x5b, 0xec, 0x88, 0xe6, 0xa2, 0xd1, 0x7f, - 0xb1, 0x62, 0xb8, 0xee, 0xc2, 0x3f, 0xce, 0x1e, 0x0e, 0x93, 0xb1, 0x74, 0x3a, 0xaf, - 0xe8, 0xd5, 0x49, 0x9f, 0x57, 0x29, 0xc5, 0x95, 0x52, 0x0d, 0x93, 0xfe, 0xcf, 0xaf, - 0x66, 0x67, 0x58, 0x36, 0xd6, 0x2d, 0xb1, 0x99, 0xaf, 0x66, 0x77, 0x9c, 0x71, 0x34, - 0x91, 0x73, 0x4e, 0xa5, 0xac, 0xc8, 0x5e, 0x96, 0x8f, 0x2d, 0x69, 0x49, 0x20, 0xc3, - 0x02, 0x8a, 0x86, 0x49, 0xac, 0x19, 0x80, 0x75, 0x8a, 0xaa, 0xda, 0x02, 0x74, 0x6f, - 0xa6, 0xa3, 0x2e, 0xce, 0x38, 0x41, 0xf9, 0xb3, 0x6f, 0xeb, 0xb0, 0xaf, 0xab, 0x9e, - 0x63, 0x10, 0xa2, 0x32, 0xc6, 0x80, 0xf6, 0x80, 0xe8, 0x8e, 0x78, 0x50, 0xae, 0x48, - 0xb9, 0x4c, 0x4a, 0x45, 0x11, 0xbb, 0x20, 0x23, 0x6d, 0x1d, 0x2a, 0xbb, 0xdb, 0xd9, - 0xd7, 0xb4, 0xbf, 0x49, 0xf1, 0x1e, 0x8a, 0xff, 0xa4, 0xcb, 0xe3, 0xf5, 0x39, 0x11, - 0x1e, 0x67, 0x66, 0x92, 0x1a, 0x5d, 0x61, 0x47, 0x9d, 0x71, 0x06, 0xb8, 0x9e, 0xa7, - 0x3a, 0xc3, 0x70, 0x00, 0x41, 0x66, 0x3f, 0xd6, 0xc1, 0x74, 0xa9, 0x6d, 0x29, 0x71, - 0xbe, 0xc0, 0x8e, 0x89, 0x08, 0x90, 0x9f, 0x3a, 0x41, 0xae, 0x80, 0x6e, 0xa6, 0x37, - 0x32, 0x09, 0x33, 0x51, 0xcb, 0x9a, 0x16, 0x87, 0x26, 0x18, 0x7c, 0xfd, 0xcd, 0xd1, - 0x0f, 0x2d, 0x6f, 0xa5, 0xff, 0xa9, 0xf5, 0x6c, 0x97, 0x6d, 0x8b, 0x50, 0xcc, 0x37, - 0x0e, 0xa5, 0xf9, 0xc8, 0x19, 0x60, 0xef, 0x4f, 0x69, 0x49, 0x7e, 0x6f, 0x87, 0x7d, - 0x47, 0xdc, 0xbe, 0x85, 0xa4, 0x1a, 0x60, 0x89, 0xb5, 0xa0, 0x80, 0x73, 0xa3, 0xc8, - 0x05, 0xe1, 0x04, 0xb0, 0x19, 0x92, 0xee, 0x90, 0xfe, 0xb6, 0xd8, 0x23, 0x88, 0x6d, - 0xc0, 0x0f, 0x08, 0x24, 0x19, 0x21, 0x04, 0x41, 0xb0, 0x1f, 0xc5, 0x5e, 0x19, 0xa6, - 0xbd, 0xf4, 0xb3, 0xd8, 0x0c, 0xca, 0x84, 0x5d, 0x21, 0xe9, 0x39, 0xd7, 0x00, 0x2d, - 0x5e, 0x62, 0x47, 0x8b, 0xc0, 0xfd, 0x64, 0xdb, 0x18, 0x42, 0x2f, 0xb3, 0xe3, 0x2e, - 0x8f, 0xfc, 0x42, 0xad, 0xa8, 0x94, 0x27, 0xd9, 0x39, 0x91, 0xfb, 0xa7, 0x97, 0x95, - 0x72, 0x05, 0x06, 0xe2, 0x52, 0x1d, 0xbf, 0x4d, 0x91, 0xcb, 0xa9, 0x50, 0xc8, 0x79, - 0xb6, 0x51, 0x34, 0x08, 0xb6, 0x8b, 0x80, 0x30, 0x7c, 0xf6, 0x22, 0xf9, 0x17, 0x2e, - 0x99, 0xbe, 0x11, 0x29, 0xe3, 0x6e, 0x77, 0x5f, 0x7f, 0x6b, 0xf4, 0x1b, 0xeb, 0xf7, - 0x1e, 0xc2, 0x74, 0xa7, 0x00, 0x41, 0xbb, 0x92, 0x17, 0x83, 0x2a, 0x56, 0x72, 0x92, - 0x4a, 0x49, 0xda, 0x60, 0xf7, 0x22, 0x0f, 0xb1, 0x92, 0x17, 0xb2, 0x33, 0x7d, 0xa0, - 0xda, 0x98, 0x83, 0xd2, 0xbf, 0x28, 0xf2, 0x50, 0x03, 0xaf, 0xf3, 0x58, 0xf6, 0x1e, - 0x3a, 0x86, 0x6e, 0xf4, 0x1c, 0xd0, 0xd7, 0x7a, 0xaf, 0x21, 0x86, 0x5a, 0xa6, 0xef, - 0x74, 0xae, 0xc2, 0xa2, 0xa3, 0xf4, 0x25, 0x31, 0x2b, 0x26, 0x9a, 0x97, 0x07, 0xce, - 0x68, 0x10, 0x25, 0x4f, 0x3e, 0x3b, 0x0d, 0xd8, 0xb5, 0xf9, 0x02, 0xea, 0xbe, 0x93, - 0xd5, 0xf7, 0xd4, 0xc7, 0x57, 0xcf, 0x60, 0xe4, 0xf9, 0xec, 0x4a, 0xf6, 0x10, 0xc3, - 0x46, 0x95, 0x3a, 0xe4, 0x65, 0x4c, 0x8a, 0xb8, 0x04, 0x75, 0x48, 0x83, 0x2e, 0x82, - 0xbb, 0xf3, 0x04, 0x58, 0x83, 0x06, 0x23, 0x75, 0x16, 0x83, 0x53, 0x8d, 0x70, 0x9b, - 0x09, 0xd3, 0x32, 0xf0, 0xd2, 0x4e, 0x41, 0x98, 0xe2, 0x9c, 0x3b, 0x4f, 0x0e, 0xaa, - 0x6d, 0x23, 0x2d, 0x79, 0x9c, 0x81, 0x88, 0xab, 0xca, 0xc1, 0x0d, 0x6b, 0x26, 0xad, - 0x9c, 0x9a, 0xc6, 0x41, 0x9d, 0x27, 0x06, 0xef, 0xe4, 0x76, 0x2a, 0x99, 0x68, 0xf7, - 0x46, 0xbf, 0xdf, 0xb9, 0xb7, 0x91, 0xe7, 0x90, 0xee, 0xac, 0xd1, 0x6e, 0x0b, 0x35, - 0x37, 0x08, 0xb3, 0xea, 0x1b, 0xd0, 0x58, 0xe5, 0xd9, 0xb9, 0x3e, 0x65, 0xa4, 0xe7, - 0x8d, 0xed, 0x6a, 0x02, 0x91, 0x85, 0x4b, 0xda, 0xc4, 0xb4, 0x5b, 0x92, 0xbd, 0xcb, - 0x03, 0x0c, 0xfe, 0xce, 0x11, 0x00, 0x8b, 0xca, 0x5a, 0x00, 0x0e, 0xf8, 0x4f, 0xdf, - 0x07, 0x20, 0x96, 0xca, 0xea, 0x97, 0xc4, 0x73, 0x44, 0x0a, 0x13, 0x42, 0xe9, 0x38, - 0x76, 0x15, 0x73, 0xa8, 0x8c, 0x45, 0x13, 0x0e, 0x14, 0x08, 0x65, 0x51, 0x6a, 0x3f, - 0x02, 0x32, 0x25, 0xcd, 0x2c, 0x02, 0xd5, 0x58, 0x2b, 0xa7, 0xfe, 0x02, 0xf8, 0xdb, - 0x0e, 0x3b, 0x81, 0x47, 0xa3, 0x6a, 0x12, 0x02, 0xc7, 0x6c, 0xee, 0x4c, 0xae, 0x51, - 0xa0, 0x2d, 0x9d, 0xde, 0xc4, 0x2a, 0x36, 0xff, 0x37, 0x9e, 0x19, 0x7d, 0x29, 0xa1, - 0xfa, 0xfa, 0x54, 0x67, 0x25, 0xff, 0xa6, 0x7c, 0xbf, 0xf3, 0xfd, 0x1d, 0xac, 0x65, - 0x98, 0x1f, 0x6c, 0x73, 0x63, 0xe9, 0x26, 0xa8, 0x77, 0x04, 0x36, 0x39, 0x24, 0x31, - 0x9c, 0xa5, 0x0a, 0x75, 0xb4, 0xce, 0x25, 0x88, 0x47, 0x84, 0xee, 0xa0, 0x9e, 0xe8, - 0x7d, 0x70, 0xfe, 0x95, 0xc4, 0xef, 0x0a, 0x01, 0x4f, 0x3b, 0x28, 0x6d, 0xfb, 0x5d, - 0x68, 0xba, 0x7c, 0xa1, 0x93, 0x5d, 0xe8, 0x57, 0xc7, 0xd2, 0xbc, 0x59, 0xf6, 0x72, - 0x7d, 0x7c, 0x81, 0x57, 0x46, 0x10, 0xc5, 0x2c, 0x94, 0x10, 0x0a, 0x40, 0x49, 0x45, - 0xb9, 0x0b, 0x31, 0x19, 0x0b, 0xd2, 0x43, 0x16, 0xc0, 0xc5, 0x3f, 0x19, 0x10, 0x91, - 0x6c, 0x59, 0xe4, 0xbd, 0xaf, 0x91, 0xc4, 0x4d, 0xeb, 0xef, 0x13, 0xd9, 0x42, 0x74, - 0x74, 0x31, 0xa4, 0x75, 0xfe, 0x86, 0xe1, 0x97, 0xc1, 0x61, 0x1f, 0x44, 0xdf, 0xf9, - 0x73, 0x5d, 0xe4, 0xdb, 0x34, 0x49, 0x9d, 0x57, 0x52, 0xf0, 0xf1, 0xed, 0x9d, 0xf4, - 0x75, 0xb0, 0xfe, 0x31, 0xc6, 0x6e, 0xfc, 0xcb, 0x4c, 0xc2, 0x1b, 0x42, 0x8f, 0xc3, - 0x56, 0x6e, 0x80, 0xfb, 0xc4, 0xa4, 0xaf, 0x16, 0x5b, 0x49, 0xd8, 0x46, 0x22, 0x1f, - 0x37, 0x36, 0x8b, 0x6f, 0x8b, 0x8b, 0x03, 0x84, 0xa2, 0xc3, 0x77, 0x63, 0x95, 0x7e, - 0x31, 0x19, 0xf4, 0x7e, 0xa8, 0xf6, 0x2a, 0x95, 0xb6, 0x53, 0x29, 0xc4, 0xe0, 0x80, - 0x2f, 0xd6, 0xb8, 0x68, 0xee, 0x6b, 0x62, 0x5b, 0x4d, 0x8a, 0x23, 0x28, 0xc2, 0x30, - 0x58, 0xee, 0x95, 0x97, 0xdf, 0x46, 0x7e, 0x7f, 0xb5, 0x7e, 0x20, 0xc0, 0x0e, 0xf2, - 0x3d, 0x1d, 0xf6, 0x27, 0x3b, 0x22, 0x27, 0xe5, 0x25, 0x22, 0x46, 0x45, 0x7c, 0x64, - 0x5e, 0x52, 0x45, 0xc2, 0xe0, 0xfe, 0xdb, 0x15, 0x07, 0x29, 0xf8, 0x9f, 0xb0, 0x3b, - 0x0e, 0x02, 0xb5, 0x4c, 0xb0, 0x79, 0xc0, 0xbc, 0x25, 0x62, 0xd2, 0xd0, 0x56, 0x47, - 0x33, 0x03, 0xf5, 0xe9, 0x53, 0x70, 0x13, 0xb9, 0xa1, 0xe9, 0x8e, 0xe6, 0x77, 0xa7, - 0x70, 0x10, 0x7d, 0x8c, 0xbd, 0x44, 0x02, 0xb3, 0x00, 0x02, 0x2f, 0xc7, 0x5c, 0xdb, - 0x60, 0x5f, 0x89, 0xc8, 0x01, 0x51, 0x9a, 0x7c, 0x50, 0xca, 0x9c, 0x62, 0x41, 0x2a, - 0xd2, 0x1b, 0x92, 0x60, 0xbf, 0x55, 0x53, 0x0c, 0xde, 0x75, 0x93, 0x29, 0x07, 0x8e, - 0xe8, 0x26, 0xb9, 0x79, 0x9d, 0x28, 0x93, 0x5a, 0xd4, 0x88, 0xb7, 0xe6, 0xc1, 0xc1, - 0x13, 0x0b, 0xf6, 0x8d, 0x17, 0x47, 0xdf, 0xdc, 0xa5, 0x23, 0xc9, 0xc6, 0x23, 0xe9, - 0xdf, 0x9b, 0xc5, 0x2c, 0xbc, 0x25, 0x48, 0x3b, 0x58, 0xc1, 0x19, 0xac, 0x34, 0x51, - 0x58, 0x92, 0x99, 0xd8, 0x7b, 0x22, 0x0c, 0x95, 0x44, 0x27, 0x4c, 0xc7, 0x69, 0x39, - 0xdd, 0x98, 0x16, 0xa1, 0xaa, 0x45, 0x58, 0x12, 0xa8, 0xe6, 0x19, 0x49, 0xf3, 0x19, - 0x13, 0xb9, 0x94, 0x86, 0x1c, 0x24, 0xe5, 0x11, 0x22, 0x17, 0xaa, 0xb9, 0x68, 0xbd, - 0x41, 0xd6, 0x5b, 0xf5, 0xbf, 0x2c, 0x3f, 0x03, 0x3f, 0x7b, 0x0c, 0x3c, 0x4f, 0x31, - 0x9c, 0xf6, 0x3c, 0xbf, 0xb8, 0xca, 0xfe, 0xfe, 0x6a, 0x70, 0x3c, 0x23, 0x78, 0x34, - 0xf8, 0x72, 0x02, 0x8a, 0x1b, 0x70, 0xb5, 0x40, 0x30, 0x4b, 0x01, 0x1c, 0xb4, 0x92, - 0x90, 0xcd, 0x05, 0x71, 0x91, 0x08, 0x90, 0x90, 0xe5, 0x72, 0x52, 0xf9, 0x91, 0x58, - 0x1f, 0x90, 0xdc, 0x0a, 0x08, 0x4c, 0x50, 0xbc, 0x17, 0x95, 0x84, 0x01, 0xba, 0x0b, - 0x74, 0x45, 0x18, 0x0f, 0xc6, 0x78, 0x93, 0x09, 0x1c, 0x84, 0x80, 0xf3, 0x0c, 0xb7, - 0xf0, 0x67, 0x53, 0x29, 0x30, 0xdd, 0x05, 0x85, 0xda, 0x58, 0x73, 0x21, 0x80, 0x14, - 0xc5, 0xf9, 0x1d, 0x1f, 0x5f, 0x44, 0x13, 0xcd, 0x92, 0x9a, 0x04, 0xfa, 0x93, 0xf4, - 0x4d, 0x90, 0x72, 0x4c, 0xe4, 0xc0, 0xa7, 0x42, 0x1f, 0xc4, 0xe1, 0x1d, 0x48, 0x55, - 0x00, 0xc5, 0x32, 0x73, 0x84, 0xee, 0x86, 0xb7, 0x31, 0x53, 0x9d, 0x13, 0x64, 0x1d, - 0x65, 0xd8, 0x4a, 0x38, 0x54, 0xcc, 0xfb, 0xff, 0xed, 0xb7, 0x0a, 0xe2, 0x3e, 0xc1, - 0xce, 0x71, 0x80, 0xe2, 0x12, 0x93, 0xca, 0x5b, 0xc6, 0x7d, 0x37, 0xe9, 0x19, 0x85, - 0xd9, 0x6b, 0x0e, 0xfc, 0x28, 0x6a, 0x9c, 0x4b, 0xe8, 0x17, 0x85, 0xb7, 0x11, 0x52, - 0x53, 0x1f, 0x43, 0xd0, 0xc8, 0x8d, 0xb9, 0x0e, 0x1a, 0x4a, 0x39, 0x90, 0x30, 0x26, - 0xd1, 0x01, 0x87, 0xfd, 0x8b, 0x1a, 0x4e, 0x28, 0x02, 0xa3, 0x83, 0x38, 0xb3, 0x21, - 0xee, 0x14, 0x4b, 0x12, 0xd6, 0x44, 0xb6, 0x82, 0xdc, 0xfc, 0xe9, 0xdb, 0xe8, 0xf0, - 0x4d, 0xc8, 0xe6, 0xee, 0xbb, 0x88, 0x28, 0x23, 0x85, 0xaa, 0x24, 0xe1, 0x43, 0x3f, - 0x0f, 0xa1, 0xaa, 0xb3, 0x5d, 0xaf, 0x44, 0xe4, 0x5c, 0x6b, 0x08, 0x62, 0xf5, 0xfe, - 0xed, 0x44, 0xfb, 0xb7, 0x13, 0xed, 0x5f, 0xc7, 0x44, 0x7b, 0xcf, 0x85, 0x96, 0xde, - 0xb8, 0xdb, 0x14, 0xc6, 0xd9, 0xef, 0x9c, 0x9b, 0x81, 0x0d, 0xcf, 0x3b, 0x11, 0x5f, - 0x3e, 0x1d, 0x05, 0xcd, 0xa8, 0x0e, 0x68, 0x78, 0x55, 0xe6, 0x9d, 0x07, 0x21, 0x13, - 0xd2, 0x1a, 0x2d, 0x45, 0x1c, 0xfa, 0x92, 0x75, 0xe5, 0xde, 0xb9, 0xfd, 0x56, 0x04, - 0x5e, 0x8a, 0x90, 0x87, 0xad, 0x25, 0x60, 0xaf, 0x31, 0x86, 0x01, 0x54, 0x00, 0x9a, - 0x10, 0x97, 0x51, 0xaa, 0xac, 0x13, 0xd8, 0xcb, 0xb6, 0xd8, 0xd1, 0xa2, 0x25, 0xb3, - 0x57, 0x28, 0x62, 0x2e, 0xbb, 0x88, 0xde, 0xad, 0x9e, 0xb4, 0xb3, 0xd4, 0x6f, 0x21, - 0x8b, 0x36, 0xa5, 0x64, 0xd2, 0x0c, 0xec, 0x81, 0x90, 0xc6, 0x6f, 0x7c, 0x74, 0xf4, - 0x8f, 0x56, 0xef, 0x9d, 0xcc, 0x09, 0x3e, 0x81, 0x6c, 0xcc, 0x83, 0xe0, 0xd5, 0x40, - 0x76, 0x64, 0xb6, 0xa0, 0xb1, 0x37, 0xb8, 0xf7, 0x3b, 0x37, 0x16, 0x66, 0x99, 0x1a, - 0x5a, 0x05, 0x33, 0x33, 0xbb, 0x6b, 0x00, 0x11, 0x59, 0xfe, 0x48, 0xff, 0x99, 0xe3, - 0xe0, 0x9b, 0x12, 0x5e, 0xcc, 0x25, 0xa1, 0x86, 0xdf, 0xea, 0xb2, 0x5f, 0xe8, 0x7a, - 0xc3, 0x24, 0xa4, 0x6f, 0x31, 0x19, 0xab, 0x26, 0x89, 0x00, 0x3c, 0x69, 0xed, 0x19, - 0x15, 0x33, 0xba, 0x32, 0xea, 0x89, 0x29, 0x1e, 0x73, 0xb5, 0x12, 0xc9, 0xbc, 0x35, - 0xec, 0x43, 0x7e, 0x25, 0x9b, 0xa4, 0x30, 0x07, 0xd9, 0x16, 0x2d, 0x14, 0xf5, 0x97, - 0x45, 0xc8, 0x02, 0x83, 0xc7, 0x64, 0xc6, 0x7e, 0x07, 0x1e, 0xd0, 0x3e, 0x04, 0x40, - 0x12, 0x15, 0x93, 0xbe, 0x06, 0xf5, 0x41, 0x14, 0x32, 0x96, 0x11, 0x5d, 0x57, 0xc9, - 0x89, 0xf5, 0x3f, 0xbe, 0x0e, 0x97, 0x58, 0x4a, 0x0e, 0xba, 0x12, 0x52, 0xd3, 0xbe, - 0xa0, 0x42, 0xc6, 0x19, 0x93, 0x6e, 0xa4, 0x18, 0x18, 0x34, 0x08, 0x35, 0xa9, 0xed, - 0x44, 0xed, 0x5f, 0x4a, 0xcd, 0xe9, 0xc0, 0x3a, 0x1c, 0x65, 0x0b, 0x21, 0x11, 0xcd, - 0xf1, 0x9d, 0xb8, 0xf7, 0xb2, 0xa2, 0xea, 0x8b, 0x24, 0xb7, 0x2b, 0xb8, 0xf5, 0xf1, - 0xdb, 0xb0, 0xfd, 0x60, 0xd0, 0x2c, 0x31, 0xda, 0x34, 0x26, 0x58, 0xce, 0xff, 0xc9, - 0x26, 0xfb, 0x9d, 0x23, 0xb1, 0xdf, 0xfb, 0xb7, 0x6e, 0x16, 0x0e, 0x29, 0x91, 0x07, - 0xa5, 0xa4, 0xa2, 0x61, 0x9d, 0x83, 0xb4, 0x01, 0x24, 0x4c, 0xb0, 0xec, 0x8d, 0x4f, - 0x70, 0x1f, 0x07, 0x38, 0xa6, 0x2e, 0x0b, 0xb4, 0x2d, 0x09, 0xab, 0xcc, 0x03, 0xe7, - 0x38, 0x17, 0x13, 0x0e, 0x7c, 0x6c, 0x32, 0x91, 0x5e, 0x04, 0x69, 0x57, 0xe2, 0x71, - 0x1b, 0x94, 0x44, 0xc6, 0x0b, 0xbf, 0x71, 0x28, 0x5a, 0xc3, 0xde, 0xf4, 0x4e, 0xb0, - 0x80, 0xc4, 0x57, 0x1e, 0x4a, 0xb6, 0x42, 0x53, 0x43, 0xef, 0xc9, 0x31, 0x8b, 0x07, - 0xe7, 0x8c, 0x3f, 0x20, 0x5c, 0xa9, 0x78, 0xa9, 0x05, 0xda, 0xf8, 0x28, 0x0b, 0x0f, - 0x1d, 0xaa, 0x4d, 0xe9, 0x24, 0xe9, 0x39, 0xe6, 0xe0, 0x1c, 0x70, 0x7c, 0x79, 0x09, - 0xb2, 0x07, 0x6a, 0x9c, 0x2b, 0xd2, 0x43, 0xf0, 0xa3, 0x60, 0xe1, 0x3c, 0x02, 0x74, - 0xcd, 0x18, 0xde, 0xba, 0x20, 0x26, 0x12, 0xbc, 0x83, 0x40, 0x35, 0x1d, 0x09, 0x92, - 0x48, 0xa5, 0x1a, 0x07, 0xd2, 0x3e, 0x9c, 0x10, 0x9a, 0x2a, 0x7d, 0xf0, 0x70, 0x44, - 0x3f, 0x0d, 0x59, 0xd3, 0x4a, 0x7f, 0x02, 0xfb, 0xe7, 0xd1, 0xc9, 0x82, 0x59, 0x10, - 0x50, 0x59, 0x28, 0x8b, 0xf8, 0x41, 0x5c, 0xc0, 0x99, 0x8f, 0xfd, 0xc3, 0x43, 0x42, - 0xd3, 0x3b, 0x95, 0xe0, 0x44, 0xe1, 0xa7, 0xfb, 0x23, 0xcc, 0xdb, 0x13, 0xf0, 0x4a, - 0x69, 0x2c, 0xb8, 0xac, 0x18, 0xda, 0x4a, 0x40, 0x92, 0xe3, 0x4d, 0xf0, 0x7c, 0x56, - 0x20, 0xe8, 0x04, 0x72, 0xbe, 0x66, 0x50, 0x5a, 0x8e, 0xc9, 0x98, 0xb2, 0x80, 0xdb, - 0x88, 0xa8, 0x72, 0x03, 0x0c, 0x7a, 0x9a, 0xe6, 0x2b, 0x7e, 0x9d, 0xc1, 0xb4, 0x79, - 0xa9, 0xad, 0x7f, 0x69, 0x7a, 0x79, 0x3e, 0xe6, 0xa8, 0x0c, 0x05, 0xfd, 0x08, 0x7d, - 0xa1, 0x62, 0x1f, 0x1a, 0x7f, 0x98, 0xd0, 0x3d, 0x02, 0x17, 0xde, 0xa4, 0x14, 0xbc, - 0x94, 0x63, 0x3a, 0x22, 0xb9, 0x06, 0x22, 0x74, 0xe9, 0xc7, 0xb6, 0x72, 0x16, 0xf5, - 0x18, 0x26, 0x7d, 0x11, 0x3a, 0x1b, 0x4e, 0x52, 0x1b, 0x72, 0xf7, 0xa8, 0x45, 0x0c, - 0x9f, 0xe0, 0xc6, 0x39, 0xe8, 0xe1, 0x14, 0xe0, 0x04, 0x43, 0xae, 0x27, 0x7c, 0x41, - 0x81, 0x2c, 0xa8, 0x64, 0x63, 0x04, 0x06, 0xf0, 0x20, 0xb5, 0xc3, 0x29, 0x43, 0x0c, - 0x65, 0xfc, 0xe8, 0x0f, 0x55, 0x5f, 0x94, 0xa3, 0x2e, 0x1b, 0xcc, 0x7e, 0xfc, 0x2e, - 0x54, 0x40, 0x1c, 0x2b, 0x03, 0x43, 0x07, 0xc6, 0x0b, 0xc8, 0xd2, 0x13, 0xc7, 0xaa, - 0x0d, 0xbb, 0x88, 0x05, 0x26, 0x88, 0x22, 0x02, 0x0e, 0xe9, 0x61, 0x5c, 0x40, 0xcf, - 0xe6, 0xc0, 0xaa, 0x18, 0x02, 0x20, 0x6a, 0x00, 0x9b, 0x00, 0x62, 0x5c, 0xb5, 0xc0, - 0x80, 0x00, 0xf9, 0xae, 0xb8, 0x37, 0xd0, 0xf4, 0xf4, 0xcb, 0xcd, 0x86, 0xe9, 0x39, - 0xc6, 0xe2, 0xe6, 0xd2, 0x8d, 0x71, 0x6a, 0xd2, 0xd4, 0x31, 0x71, 0xe0, 0x38, 0xd9, - 0x7c, 0x02, 0x26, 0x8c, 0xf4, 0x0b, 0x46, 0xf9, 0x41, 0xf2, 0x5b, 0x10, 0x40, 0x71, - 0x55, 0x11, 0xe8, 0x5d, 0x2b, 0x63, 0x0b, 0x9f, 0x83, 0xb5, 0x04, 0xa0, 0x51, 0x0e, - 0x86, 0x87, 0xc5, 0xe1, 0xc3, 0x2d, 0x04, 0x21, 0x31, 0x92, 0x26, 0x9e, 0x42, 0x3e, - 0xff, 0x52, 0x7b, 0x5b, 0xd2, 0x08, 0x7a, 0x73, 0x6f, 0x15, 0x21, 0x93, 0xac, 0xa4, - 0x3d, 0xc1, 0xe4, 0xa5, 0x1d, 0x0b, 0x18, 0x4d, 0x67, 0xe1, 0x75, 0x69, 0x13, 0x52, - 0x7b, 0x44, 0x48, 0x39, 0x45, 0x5f, 0x50, 0x65, 0x27, 0x0e, 0x91, 0xfb, 0x79, 0xe3, - 0xde, 0xe8, 0x8b, 0xad, 0x18, 0x99, 0x9b, 0xd9, 0x56, 0x9f, 0x0e, 0x9c, 0x83, 0xd5, - 0xb2, 0xfa, 0xb6, 0x88, 0x81, 0x59, 0xea, 0x68, 0xfb, 0x9e, 0xd5, 0xec, 0x4d, 0x76, - 0x9b, 0x4e, 0x0e, 0x67, 0x1d, 0x42, 0x54, 0x8c, 0x29, 0xf0, 0xbf, 0x06, 0xe5, 0x98, - 0xeb, 0xc0, 0x32, 0xcb, 0x73, 0x12, 0x78, 0x80, 0x4d, 0x3b, 0x04, 0x6a, 0xcb, 0x40, - 0xf1, 0xb4, 0x5b, 0x24, 0x32, 0xe0, 0x7c, 0x8f, 0x6d, 0xb3, 0x2c, 0x8f, 0x37, 0xaa, - 0x0c, 0x33, 0xf8, 0x1b, 0x62, 0xc2, 0xde, 0x47, 0x72, 0xd8, 0xf5, 0xfb, 0x99, 0x90, - 0xc4, 0x92, 0xe1, 0xae, 0x81, 0x57, 0x9a, 0xef, 0x89, 0x2c, 0x86, 0x4e, 0x8a, 0x9d, - 0x01, 0x3b, 0x05, 0x02, 0x6e, 0x39, 0xd5, 0x0b, 0x63, 0x37, 0x25, 0x65, 0x24, 0x55, - 0x88, 0xe3, 0x9b, 0xd8, 0xd7, 0xe4, 0xf1, 0xeb, 0xfc, 0x1e, 0xe3, 0xcd, 0x47, 0x48, - 0x79, 0x90, 0x80, 0x9c, 0x0b, 0x52, 0x34, 0x72, 0x2f, 0xe4, 0xd6, 0x43, 0xc8, 0x27, - 0x84, 0x77, 0x14, 0x6d, 0xf7, 0x2d, 0x3f, 0x99, 0xbd, 0x01, 0x32, 0x7d, 0xec, 0x0d, - 0x92, 0xca, 0xfc, 0x4d, 0x17, 0xe4, 0x0b, 0xc5, 0x93, 0xec, 0x9c, 0xc3, 0xdb, 0x56, - 0xcc, 0xaa, 0x41, 0xa0, 0x27, 0x7d, 0x61, 0x15, 0x04, 0xe7, 0x06, 0xec, 0x61, 0x0e, - 0x0a, 0x95, 0x7e, 0xc5, 0x17, 0x53, 0xf4, 0xda, 0x19, 0xb7, 0x91, 0x2e, 0xff, 0x22, - 0xdb, 0xd0, 0xba, 0x91, 0x99, 0xd2, 0xba, 0x4a, 0x18, 0xbc, 0xf9, 0xcc, 0xe8, 0xda, - 0xb2, 0xe9, 0x45, 0x6f, 0x7e, 0xfe, 0xa3, 0x39, 0x35, 0x58, 0x7f, 0x82, 0xdd, 0xb7, - 0xf0, 0x41, 0xc2, 0x18, 0x98, 0x13, 0x94, 0xdf, 0x46, 0x49, 0x39, 0x20, 0x17, 0x09, - 0x0e, 0x9f, 0x74, 0xc8, 0xeb, 0x66, 0xb0, 0x54, 0x2b, 0x8f, 0x07, 0x8e, 0xd6, 0x81, - 0xac, 0xb4, 0x90, 0x83, 0xd2, 0x48, 0x57, 0x5a, 0xa7, 0x5a, 0x6a, 0xaf, 0x9c, 0x12, - 0x08, 0x43, 0xeb, 0xdd, 0x65, 0x4f, 0xe1, 0x53, 0xe1, 0xbe, 0x18, 0x9d, 0xd6, 0xa8, - 0x34, 0x59, 0xe0, 0xf2, 0x0c, 0xf7, 0xa6, 0xed, 0x89, 0x4e, 0xeb, 0xd6, 0x9b, 0x2a, - 0x04, 0xe3, 0xbf, 0xe7, 0x5c, 0x98, 0x37, 0xe7, 0xd5, 0x3f, 0x58, 0xa7, 0x16, 0xaf, - 0xf9, 0x9f, 0xed, 0x66, 0x67, 0xd9, 0xb1, 0x4a, 0xcd, 0xb3, 0x36, 0xb2, 0x1f, 0x61, - 0xf1, 0x58, 0xf7, 0xf6, 0x19, 0x2e, 0xcc, 0x72, 0xac, 0x29, 0x2f, 0xe8, 0x0f, 0x15, - 0x1b, 0xd8, 0x64, 0xe0, 0x74, 0xcd, 0x43, 0x56, 0xcb, 0xd6, 0x9d, 0x44, 0x9e, 0xa0, - 0xdb, 0x1f, 0x55, 0xc8, 0xdf, 0xad, 0x30, 0xa0, 0x47, 0xcb, 0x2e, 0x05, 0x7f, 0xa8, - 0xd8, 0xfc, 0xcb, 0x0d, 0xbe, 0x79, 0xf3, 0xf9, 0xd1, 0xcd, 0x14, 0x7c, 0x53, 0x17, - 0x40, 0xb3, 0xd1, 0xfd, 0x03, 0x37, 0xe1, 0xfa, 0xfa, 0xd5, 0xe7, 0x9e, 0x5b, 0x76, - 0x4f, 0xfd, 0x3c, 0x2e, 0x1c, 0xd1, 0xd6, 0xbd, 0xf7, 0xd8, 0xb3, 0x02, 0xa6, 0x30, - 0x1c, 0x52, 0x45, 0x40, 0x70, 0x16, 0x63, 0x50, 0x03, 0xb1, 0x56, 0x41, 0x04, 0xc0, - 0x5b, 0x83, 0x63, 0xc8, 0x6b, 0xd1, 0xd9, 0xa3, 0x0a, 0x13, 0xa8, 0x8f, 0x24, 0xed, - 0x31, 0xa1, 0x9f, 0x9d, 0x12, 0x02, 0xb6, 0x99, 0xde, 0xd7, 0xb2, 0xd7, 0xe3, 0xbd, - 0x43, 0x28, 0x5b, 0x46, 0xe1, 0x2c, 0xe3, 0xca, 0x62, 0x0c, 0x32, 0x7d, 0x0a, 0x39, - 0xa0, 0x40, 0xd7, 0xdb, 0xf9, 0xdd, 0xa5, 0xd4, 0xaa, 0x22, 0x5b, 0xa6, 0xa7, 0x99, - 0x80, 0x82, 0x68, 0x3e, 0x4d, 0xe6, 0xef, 0xd1, 0x75, 0xf3, 0xe2, 0x9c, 0x75, 0x23, - 0x0e, 0xb2, 0x6e, 0xfe, 0xd6, 0x2a, 0x8c, 0xab, 0x6c, 0x1b, 0xd7, 0x3f, 0xd7, 0x61, - 0x7b, 0x52, 0xe5, 0x15, 0xaa, 0x48, 0x8c, 0x73, 0x8c, 0xb3, 0xa8, 0xd2, 0x5a, 0xaa, - 0xdf, 0xf2, 0x96, 0x4a, 0x04, 0xed, 0x5a, 0x1c, 0x0c, 0xb4, 0xee, 0xa4, 0xb7, 0x22, - 0x35, 0xd9, 0x45, 0x06, 0x14, 0x19, 0xa1, 0x16, 0x80, 0x78, 0xab, 0x51, 0x40, 0x91, - 0x00, 0x7a, 0xa5, 0xb0, 0x68, 0xcc, 0x38, 0xa7, 0xca, 0xa2, 0x70, 0xd3, 0xbb, 0x9b, - 0x54, 0xb9, 0x41, 0x72, 0xfb, 0xde, 0x1f, 0xd0, 0xf7, 0x7a, 0xef, 0xcd, 0x9e, 0x0f, - 0xcf, 0x55, 0x54, 0x5e, 0x91, 0x2a, 0x5f, 0x3c, 0x81, 0xfe, 0xcb, 0x8d, 0xec, 0x29, - 0xf6, 0x24, 0xa7, 0xe3, 0xbe, 0x14, 0x08, 0xb5, 0x34, 0x81, 0x37, 0xd0, 0x92, 0x29, - 0x12, 0x09, 0xba, 0xf1, 0x50, 0xaf, 0x26, 0xd9, 0xbf, 0xcf, 0xee, 0x61, 0x44, 0x57, - 0x86, 0x8a, 0x85, 0x40, 0x4d, 0x4b, 0x2c, 0xec, 0x49, 0xe9, 0x91, 0xa3, 0xd0, 0x5e, - 0xf0, 0x84, 0x28, 0x90, 0x8a, 0x54, 0x0e, 0x62, 0x48, 0xd4, 0xe0, 0x10, 0xb2, 0x9d, - 0xc6, 0x55, 0x86, 0xbd, 0xb4, 0xf7, 0x26, 0xbb, 0xe5, 0x3d, 0x6b, 0xef, 0x66, 0x90, - 0x8b, 0x4f, 0x98, 0x09, 0x07, 0x4a, 0xf2, 0x45, 0x41, 0xa0, 0x4c, 0xd8, 0xb5, 0xa0, - 0x4e, 0x8e, 0x7c, 0x14, 0x17, 0xcb, 0x73, 0x13, 0x4d, 0x90, 0xca, 0x54, 0xbe, 0xc2, - 0x8e, 0x52, 0x05, 0x93, 0x0a, 0xe4, 0xdd, 0x6e, 0xb7, 0x59, 0xc5, 0xe4, 0x1b, 0x15, - 0xed, 0x8d, 0x0e, 0xac, 0x09, 0xf3, 0xe6, 0x2b, 0xa3, 0xd7, 0xd3, 0xdd, 0xfe, 0x5a, - 0x76, 0xb2, 0xef, 0x4d, 0xaf, 0xa2, 0x98, 0x02, 0xf4, 0xe3, 0x9f, 0x23, 0x98, 0xf1, - 0xc9, 0x5a, 0xd8, 0xa9, 0x15, 0xd0, 0xb2, 0x26, 0xc6, 0xca, 0x55, 0xf0, 0xc7, 0x4b, - 0xd9, 0xd1, 0xbe, 0xcb, 0x9b, 0xb9, 0xa4, 0xae, 0xcb, 0x63, 0x8b, 0x2b, 0xd9, 0xc9, - 0xbe, 0x29, 0xa2, 0x62, 0x55, 0xda, 0xca, 0x54, 0x4f, 0x56, 0x6d, 0x15, 0xf5, 0x0d, - 0x35, 0x4c, 0x24, 0xe2, 0x8f, 0x78, 0x1f, 0x54, 0x38, 0xba, 0x48, 0xf8, 0x8c, 0x83, - 0x78, 0x0c, 0x27, 0xfc, 0x88, 0x39, 0x1a, 0xa9, 0xb2, 0x7a, 0xf8, 0x07, 0xb2, 0x73, - 0x7d, 0x3e, 0x16, 0x66, 0xea, 0x46, 0xf5, 0x4f, 0x67, 0x9c, 0x14, 0x69, 0xab, 0x99, - 0x90, 0x40, 0x47, 0xcf, 0xf4, 0x1d, 0x16, 0x4d, 0xce, 0x8e, 0xd8, 0x61, 0x83, 0x78, - 0x8d, 0xc8, 0x58, 0xad, 0xd6, 0x4b, 0xd5, 0x14, 0x4b, 0x5b, 0x6a, 0xbc, 0x66, 0x57, - 0xe9, 0x70, 0x76, 0x11, 0x87, 0x12, 0x0f, 0x33, 0xdf, 0xdf, 0xc8, 0xa9, 0x1f, 0xea, - 0x4b, 0x62, 0x90, 0x74, 0x83, 0x17, 0x85, 0xc8, 0xf3, 0x3c, 0x5d, 0xa3, 0x3f, 0xd6, - 0xcd, 0x7a, 0xec, 0x64, 0x82, 0xeb, 0xaf, 0x43, 0x04, 0x9f, 0x63, 0xe4, 0x52, 0x92, - 0xb2, 0x1c, 0xf8, 0x2f, 0xd1, 0xc7, 0x45, 0xe3, 0x56, 0xa1, 0x72, 0x49, 0xe9, 0x88, - 0x5d, 0x25, 0x65, 0x1b, 0xf5, 0xbb, 0x5f, 0xef, 0xa9, 0xa8, 0xa9, 0x63, 0xb1, 0x48, - 0x90, 0x56, 0x32, 0xc4, 0x0f, 0x20, 0x4d, 0x41, 0xa9, 0xe7, 0x34, 0xe0, 0xaa, 0x8b, - 0x43, 0xd7, 0x4a, 0xbe, 0xf9, 0xc6, 0xe8, 0xbf, 0x5a, 0xab, 0x95, 0x67, 0xb7, 0xc5, - 0x46, 0xbd, 0xd7, 0x3b, 0xab, 0x4f, 0x1f, 0x63, 0xa7, 0x24, 0xc9, 0x11, 0xc8, 0xbd, - 0x32, 0x70, 0x50, 0x54, 0x62, 0x2a, 0x6b, 0x60, 0x4c, 0xd7, 0xf0, 0x89, 0xa8, 0x0b, - 0xad, 0x6a, 0x52, 0x23, 0x66, 0x8f, 0xed, 0x80, 0x4c, 0x88, 0xce, 0xbd, 0xe9, 0x61, - 0xc5, 0xa0, 0x41, 0x05, 0x83, 0x35, 0xb5, 0x7d, 0x40, 0x67, 0x85, 0x36, 0xc0, 0xef, - 0x30, 0x69, 0x6d, 0x79, 0x98, 0xce, 0x78, 0xeb, 0x85, 0xd1, 0x7f, 0xbd, 0xd6, 0x56, - 0xbf, 0xd0, 0xc6, 0x03, 0x7d, 0x00, 0xbb, 0xef, 0xbc, 0xff, 0x4a, 0x37, 0xc9, 0xeb, - 0xef, 0x87, 0xb0, 0xae, 0xec, 0x47, 0x6b, 0xe4, 0x3c, 0xf5, 0xa9, 0xc4, 0xd9, 0x25, - 0xa4, 0x8b, 0xd4, 0x58, 0x25, 0x82, 0xd2, 0xea, 0x6a, 0x9a, 0x85, 0xd2, 0xc6, 0x89, - 0xd3, 0x67, 0x8f, 0xf8, 0x7d, 0x16, 0x83, 0x14, 0xe9, 0x24, 0xa9, 0x70, 0xa8, 0x58, - 0xaf, 0xb9, 0x73, 0x2e, 0x18, 0xd1, 0xb2, 0x7a, 0x27, 0xdc, 0x59, 0x97, 0xe8, 0xa9, - 0xbb, 0xa3, 0x1f, 0x5c, 0xbb, 0xd7, 0x81, 0x10, 0xfd, 0xc3, 0x7d, 0x97, 0xc4, 0xe0, - 0x77, 0x93, 0x89, 0xd3, 0x71, 0xfb, 0x9d, 0xb3, 0xd9, 0xb1, 0x48, 0xbe, 0x9d, 0x6c, - 0x6a, 0x1d, 0x1b, 0x69, 0x9c, 0x74, 0xa4, 0x71, 0x12, 0xc3, 0x25, 0x45, 0x5c, 0x7e, - 0xa3, 0x4b, 0x1c, 0x5a, 0xc4, 0xb0, 0x9b, 0xd2, 0x4f, 0xdc, 0x8f, 0xf4, 0x13, 0x16, - 0x98, 0x27, 0x86, 0xc6, 0x2f, 0x40, 0x81, 0xff, 0x01, 0xd1, 0x4e, 0x4c, 0x9a, 0x21, - 0xdd, 0x11, 0xd5, 0xe2, 0x1a, 0xa0, 0x92, 0x00, 0xf5, 0x2b, 0x35, 0x24, 0x0d, 0x79, - 0x9d, 0x70, 0x0f, 0x6e, 0x84, 0xd3, 0x6f, 0x9b, 0x1d, 0xb3, 0x18, 0x4b, 0x6b, 0x68, - 0x57, 0xbc, 0x93, 0x90, 0xcf, 0x47, 0x9f, 0x1f, 0x7d, 0xb6, 0xc6, 0x34, 0xe1, 0x50, - 0xae, 0xaa, 0x2e, 0x56, 0xd5, 0xac, 0x8d, 0x3d, 0x11, 0x2a, 0x45, 0xf0, 0x95, 0x23, - 0x24, 0xaf, 0x4d, 0x16, 0xae, 0xbe, 0xd3, 0x6e, 0xd0, 0x27, 0x2c, 0x9f, 0xf6, 0xf8, - 0x4c, 0xb7, 0x5d, 0xd7, 0x77, 0xc0, 0x1e, 0x11, 0x06, 0xd5, 0xb8, 0x29, 0xcc, 0xde, - 0x50, 0xdc, 0x15, 0xa6, 0xc0, 0x69, 0xd8, 0x1b, 0xb1, 0xa7, 0x8d, 0x2c, 0x02, 0xc0, - 0x05, 0x8d, 0x16, 0x0e, 0xb8, 0xf5, 0x10, 0x4d, 0x27, 0x7c, 0x11, 0x94, 0xf0, 0xa0, - 0xac, 0x0a, 0x48, 0xae, 0x34, 0x35, 0x7c, 0x25, 0x01, 0x71, 0xe7, 0x6b, 0xf8, 0x1e, - 0x7c, 0x10, 0x5e, 0xaf, 0xc9, 0xef, 0xd6, 0x6c, 0xb9, 0x75, 0x61, 0x8a, 0xd2, 0xc8, - 0x03, 0x91, 0xbb, 0x5d, 0x62, 0xa7, 0x31, 0xd3, 0x51, 0xe9, 0xb1, 0xa9, 0x9a, 0x78, - 0xfb, 0xb3, 0x50, 0xb6, 0xc4, 0x11, 0xef, 0x02, 0x44, 0x5c, 0xd6, 0x61, 0xc1, 0xa4, - 0x29, 0x02, 0x17, 0x17, 0x24, 0x6b, 0x5d, 0x13, 0x87, 0x58, 0x19, 0x61, 0xb7, 0x81, - 0xf6, 0xd9, 0x50, 0x01, 0x02, 0x24, 0x76, 0x13, 0xab, 0x8b, 0x54, 0xd8, 0xbf, 0x91, - 0xef, 0x6a, 0xd4, 0x85, 0xd3, 0x7b, 0x09, 0x83, 0x36, 0xe2, 0x8d, 0x02, 0x31, 0x9b, - 0x9d, 0xdf, 0x7d, 0xbb, 0xec, 0xac, 0x33, 0x95, 0x4d, 0x0c, 0x16, 0xa2, 0x68, 0xcc, - 0x7d, 0x17, 0x12, 0x30, 0xa0, 0x9e, 0x6b, 0x9a, 0xf0, 0x48, 0xd3, 0x0a, 0x67, 0x75, - 0x0d, 0x51, 0x59, 0x67, 0x23, 0xd2, 0xf1, 0xde, 0x33, 0xa3, 0xf3, 0xe9, 0x6a, 0x18, - 0x64, 0xa7, 0xfa, 0xce, 0xcc, 0x29, 0xf8, 0x5e, 0x71, 0x26, 0x8f, 0xf0, 0x9d, 0x94, - 0xa2, 0xad, 0xb6, 0x2b, 0xad, 0x3b, 0xe8, 0x97, 0xb8, 0x4e, 0x5a, 0xc8, 0x5c, 0x9a, - 0xdc, 0xae, 0xf5, 0x4b, 0x9e, 0x59, 0x2c, 0xec, 0x7b, 0x0e, 0x87, 0x1e, 0x47, 0x21, - 0xc7, 0x64, 0x58, 0x22, 0x8c, 0x3a, 0x6b, 0xad, 0x41, 0xbf, 0x35, 0x55, 0x87, 0x0d, - 0x6f, 0xc5, 0x37, 0xff, 0x8f, 0xb4, 0x04, 0x9b, 0x84, 0x90, 0xdb, 0xec, 0x98, 0xe0, - 0x2d, 0xf2, 0x34, 0x95, 0x94, 0xf2, 0x0d, 0xd6, 0x2b, 0xb0, 0xaa, 0x5c, 0x62, 0x76, - 0x60, 0x1c, 0xf0, 0x6c, 0x35, 0x88, 0x57, 0x08, 0x14, 0x2e, 0x00, 0xbb, 0x1e, 0x78, - 0x61, 0xdd, 0xbb, 0x33, 0xfa, 0x96, 0x9a, 0x46, 0xad, 0x37, 0x79, 0x91, 0x49, 0xa2, - 0x09, 0xcd, 0x02, 0x26, 0x86, 0xa8, 0x56, 0x32, 0xc5, 0x4c, 0xdf, 0x1c, 0xf5, 0xfc, - 0x10, 0x89, 0xdb, 0x9f, 0x38, 0x9a, 0x7d, 0x84, 0x3d, 0x5f, 0x67, 0x99, 0x07, 0x01, - 0x60, 0x82, 0x1f, 0x92, 0xa4, 0x69, 0x89, 0x43, 0x3b, 0x28, 0xc7, 0xde, 0xf4, 0x22, - 0xab, 0xaf, 0xd8, 0xf3, 0x06, 0x1d, 0x09, 0x44, 0x91, 0x1b, 0x06, 0x8a, 0xc6, 0xec, - 0xd7, 0x57, 0xd8, 0xcf, 0xae, 0x04, 0x8f, 0x3a, 0x70, 0xbb, 0x50, 0x92, 0x4f, 0x8c, - 0x05, 0xe0, 0xf7, 0x4a, 0xe5, 0x28, 0xeb, 0x44, 0x07, 0x57, 0x39, 0xce, 0x5d, 0x85, - 0x12, 0xa4, 0x83, 0x1f, 0x63, 0x6b, 0x1c, 0x65, 0xa8, 0xfc, 0x0f, 0x85, 0x23, 0xa4, - 0x8d, 0x2b, 0xb9, 0x2d, 0x25, 0x24, 0x4d, 0xf0, 0x26, 0x05, 0x96, 0x3a, 0x82, 0x7f, - 0x0d, 0xe9, 0x0a, 0xdf, 0x14, 0xd4, 0x5e, 0xa1, 0x11, 0x38, 0xe8, 0x78, 0x44, 0x97, - 0xd2, 0x96, 0x06, 0xaf, 0xd4, 0xde, 0x17, 0x73, 0xf0, 0x38, 0x88, 0xcc, 0x92, 0x02, - 0x32, 0xaa, 0x70, 0xa1, 0x83, 0x1f, 0x64, 0xcc, 0xed, 0xa4, 0x94, 0x1c, 0x1e, 0xe1, - 0xbb, 0xa5, 0xb4, 0x63, 0xa9, 0xbd, 0x35, 0x32, 0x28, 0xa5, 0x28, 0x68, 0xb7, 0xa1, - 0x93, 0x56, 0x52, 0xec, 0x1b, 0x82, 0x79, 0x45, 0x48, 0xc3, 0xe5, 0xf8, 0x57, 0x2e, - 0x4a, 0x51, 0x08, 0x7f, 0x9f, 0xaa, 0xce, 0x09, 0x0b, 0x05, 0x73, 0x2e, 0x95, 0xc6, - 0x3f, 0x22, 0x9a, 0x98, 0x63, 0x55, 0xbc, 0x30, 0xa5, 0xff, 0x1e, 0x41, 0x5d, 0x58, - 0x8e, 0x83, 0x25, 0x0c, 0x43, 0xe4, 0xdf, 0x6f, 0x9c, 0x73, 0x54, 0xea, 0x2a, 0xc7, - 0x01, 0x1b, 0x99, 0x7e, 0x87, 0xf7, 0x4e, 0x65, 0x51, 0x6a, 0x45, 0xa1, 0x7c, 0x0a, - 0xae, 0x69, 0xff, 0x17, 0x27, 0xef, 0xbf, 0x5d, 0x0a, 0xed, 0x48, 0x64, 0xde, 0x60, - 0xf9, 0x0a, 0xd5, 0xb2, 0xe0, 0xd0, 0xa1, 0xef, 0x5d, 0x44, 0x12, 0x62, 0xef, 0x95, - 0x55, 0x83, 0x2d, 0x36, 0x38, 0x66, 0x1c, 0x7a, 0xcf, 0xc3, 0x4e, 0x1e, 0x02, 0x1e, - 0x2e, 0x3a, 0xdb, 0x96, 0x0c, 0x37, 0x30, 0xe4, 0x06, 0xa5, 0x33, 0x4a, 0x4d, 0x7b, - 0xbe, 0x95, 0xc5, 0x30, 0x64, 0xe7, 0x1d, 0xc1, 0x1b, 0x21, 0x7b, 0x95, 0x07, 0xb7, - 0xa1, 0x5e, 0x6e, 0x7a, 0x30, 0x0a, 0x26, 0xc3, 0xb6, 0x9d, 0xa1, 0x0c, 0xec, 0xa4, - 0x94, 0x79, 0xa9, 0x35, 0x44, 0x36, 0xc6, 0xd2, 0x44, 0x1d, 0x81, 0x2a, 0x84, 0x62, - 0x1c, 0x55, 0x73, 0xdf, 0xee, 0xde, 0x7b, 0x6b, 0xf4, 0x6d, 0xdd, 0x3a, 0xdd, 0xd5, - 0x99, 0xfe, 0x58, 0xd5, 0x3d, 0x36, 0xd1, 0xe4, 0xe7, 0x50, 0xd4, 0x4d, 0x71, 0xd1, - 0x3e, 0xd2, 0x94, 0x5c, 0x69, 0x9a, 0x2d, 0x51, 0xb7, 0xc8, 0xef, 0xc0, 0xce, 0x2c, - 0x82, 0x71, 0x38, 0x93, 0x94, 0x28, 0x7c, 0x7b, 0x07, 0x6a, 0x1a, 0x48, 0xf1, 0x2d, - 0x6e, 0xf2, 0x89, 0x7d, 0xf9, 0x71, 0x8c, 0x86, 0x28, 0x24, 0xe5, 0xb0, 0x04, 0x23, - 0x76, 0x58, 0xaf, 0x44, 0xe4, 0x0e, 0xfe, 0xdf, 0xd5, 0x52, 0x1a, 0x73, 0x8d, 0xaa, - 0x1b, 0x80, 0x5c, 0xaf, 0x2f, 0x1f, 0xbf, 0x1d, 0x39, 0xbf, 0x78, 0x40, 0xe1, 0x0c, - 0xd7, 0x4f, 0x00, 0x8a, 0xbe, 0x51, 0x13, 0xbc, 0x99, 0xf1, 0xb1, 0x4f, 0x2c, 0xb1, - 0xa4, 0x62, 0xb9, 0xcf, 0x69, 0x10, 0xe3, 0xc6, 0x95, 0x3d, 0xf5, 0x81, 0x3b, 0x88, - 0x99, 0xf1, 0xb7, 0x13, 0xf0, 0xe2, 0xd2, 0x7b, 0x8a, 0x08, 0x91, 0x46, 0x60, 0xb5, - 0x89, 0x00, 0xd8, 0x73, 0xd0, 0x57, 0x8b, 0x28, 0x56, 0xbc, 0x2b, 0xe5, 0xd7, 0x0a, - 0x5d, 0xf6, 0x34, 0x28, 0x88, 0xeb, 0x49, 0x7a, 0x45, 0xf2, 0xfc, 0xac, 0x5a, 0x48, - 0xbd, 0x63, 0x42, 0x83, 0x23, 0x56, 0x6a, 0xe5, 0x64, 0x94, 0x36, 0x3d, 0xd9, 0x77, - 0xad, 0x18, 0xdf, 0xae, 0x33, 0x51, 0x1d, 0xfc, 0x78, 0xdf, 0xe5, 0xd3, 0x02, 0x37, - 0x21, 0x2e, 0xb2, 0xd4, 0x86, 0xfe, 0xc3, 0x9d, 0xec, 0x04, 0x5b, 0xab, 0x8e, 0x42, - 0xb7, 0xc7, 0xe2, 0x8f, 0x09, 0x07, 0xd8, 0xd9, 0x7a, 0x9b, 0x8a, 0xe7, 0xe0, 0xc0, - 0x07, 0xd9, 0x4a, 0x9e, 0xf3, 0xd1, 0xf7, 0xae, 0x03, 0x40, 0xec, 0xd1, 0x19, 0x00, - 0xa5, 0x2f, 0xc7, 0x9b, 0xb7, 0x39, 0x14, 0x33, 0xbf, 0x66, 0xf6, 0x9b, 0x7f, 0xff, - 0xbb, 0xf8, 0xe6, 0x3f, 0xdd, 0x41, 0x56, 0x6a, 0xa2, 0x29, 0xaf, 0x8c, 0x90, 0xea, - 0xfd, 0xb1, 0x9c, 0x8a, 0xc4, 0x19, 0x81, 0x8e, 0x7d, 0xca, 0x9c, 0x95, 0x91, 0x55, - 0x7a, 0x79, 0x9f, 0x09, 0x3e, 0xe9, 0x8b, 0xeb, 0xfb, 0xed, 0x30, 0xbb, 0xc3, 0x13, - 0x0e, 0xfc, 0x6f, 0x9d, 0xec, 0x61, 0xb6, 0xc1, 0x51, 0xcb, 0x26, 0x28, 0x19, 0x1d, - 0x78, 0x58, 0xda, 0xde, 0x79, 0x9b, 0x1d, 0x01, 0x36, 0x05, 0x9e, 0x27, 0xca, 0x48, - 0xd1, 0x92, 0x77, 0x45, 0x8e, 0xdf, 0xf2, 0x2b, 0x38, 0x3c, 0xf5, 0xf8, 0x83, 0xae, - 0x6a, 0x47, 0x0e, 0xf7, 0x39, 0x7f, 0x0f, 0x39, 0x5a, 0xcd, 0xcc, 0x61, 0xba, 0x38, - 0xfd, 0xab, 0xd8, 0x34, 0xef, 0xc0, 0x99, 0x85, 0x8f, 0xf9, 0xd5, 0xf5, 0xfd, 0xce, - 0xd5, 0x29, 0xed, 0x56, 0x3d, 0x5d, 0x47, 0xb6, 0xd4, 0xc7, 0x7c, 0xcb, 0x1a, 0x24, - 0x29, 0x39, 0x16, 0x25, 0xec, 0xfa, 0x01, 0xa2, 0x40, 0x78, 0x6d, 0x88, 0x9e, 0x62, - 0x8f, 0xcb, 0x2a, 0x73, 0x2f, 0x6d, 0x55, 0xbc, 0x2a, 0x82, 0x4c, 0xc6, 0x54, 0x1e, - 0x62, 0x43, 0x52, 0x12, 0xe2, 0xa0, 0x1f, 0xfc, 0x1d, 0x1d, 0xf6, 0x75, 0xbc, 0x4a, - 0xaa, 0x49, 0x45, 0xe8, 0x13, 0x52, 0x8a, 0x11, 0xe3, 0x9c, 0x34, 0x51, 0xa1, 0x2e, - 0x07, 0xe2, 0xed, 0x8a, 0xd0, 0xbd, 0x86, 0xa0, 0xbd, 0x84, 0x7e, 0x31, 0x91, 0x49, - 0x0e, 0xc2, 0xfe, 0x80, 0xa9, 0xc0, 0x93, 0x4a, 0x69, 0x88, 0xf7, 0xcb, 0xbd, 0x7a, - 0x2a, 0xd5, 0xcf, 0x9f, 0xe0, 0xfb, 0xfa, 0x09, 0x84, 0x5d, 0xfe, 0x6b, 0xeb, 0xfb, - 0x9d, 0x7e, 0x5b, 0x7c, 0xba, 0x21, 0x05, 0x01, 0x1c, 0x6d, 0x4d, 0xb2, 0x6b, 0x9d, - 0x06, 0x56, 0x4d, 0x29, 0x95, 0xc0, 0xa3, 0x7c, 0x41, 0xb0, 0x7b, 0x5d, 0xaa, 0xb1, - 0xb6, 0x93, 0x26, 0xbd, 0x70, 0x6b, 0xdb, 0x15, 0xa9, 0x9c, 0x9f, 0x14, 0x2d, 0xe1, - 0xb5, 0x86, 0x7d, 0x00, 0x65, 0xa3, 0x8f, 0x36, 0xbd, 0xb8, 0x96, 0xda, 0x51, 0x6e, - 0xf6, 0x3b, 0xd7, 0x6b, 0x2d, 0xc1, 0x52, 0x9b, 0x9e, 0x6a, 0x6b, 0xfe, 0x9b, 0x8a, - 0x03, 0xcc, 0xb5, 0x2b, 0xec, 0x98, 0x54, 0xce, 0x7f, 0x53, 0x43, 0xd3, 0x4a, 0x2a, - 0x17, 0xe0, 0x13, 0xd9, 0xe7, 0xbb, 0xd9, 0x45, 0xf6, 0xb0, 0xc6, 0x72, 0xcc, 0x4a, - 0x3f, 0x34, 0xd8, 0x76, 0xef, 0x70, 0xbb, 0x28, 0xd8, 0x8e, 0x06, 0x29, 0x1a, 0x8c, - 0x4c, 0xd7, 0xf4, 0x49, 0xe5, 0x04, 0xcb, 0x8d, 0x07, 0xd5, 0xb3, 0xc4, 0xa6, 0xe6, - 0xe4, 0x92, 0xe1, 0x3c, 0xf8, 0x75, 0xdc, 0x47, 0x16, 0x13, 0x3e, 0xf7, 0x56, 0x34, - 0xcf, 0xbd, 0x15, 0xd6, 0xc2, 0x09, 0x91, 0xb4, 0xaf, 0x65, 0x08, 0xf0, 0x12, 0x9a, - 0x19, 0x6a, 0xde, 0xcc, 0xd0, 0xdc, 0xbf, 0xee, 0x52, 0xcb, 0xfb, 0xc7, 0x3b, 0xd9, - 0x43, 0x6c, 0x3d, 0xdd, 0x79, 0xf9, 0x3b, 0xeb, 0xca, 0xc6, 0xa6, 0xf4, 0x5b, 0xb5, - 0x1d, 0xb6, 0xfe, 0xa5, 0x07, 0xda, 0x61, 0x2f, 0x36, 0xdf, 0x4e, 0x1c, 0xad, 0x76, - 0x71, 0x9e, 0x7e, 0xca, 0xff, 0x1c, 0x4e, 0xf6, 0xa2, 0x65, 0xcb, 0x6d, 0xfb, 0x90, - 0x73, 0xf5, 0xd6, 0x62, 0x33, 0xde, 0xf8, 0x20, 0x5f, 0xf6, 0x93, 0x1b, 0xf0, 0x65, - 0x5b, 0xd5, 0x8e, 0xdb, 0x36, 0x28, 0xcb, 0x0c, 0xc6, 0xff, 0x17, 0x00, 0x00, 0xff, - 0xff, 0xef, 0xf5, 0x86, 0x38, 0x44, 0x7f, 0x02, 0x00, -} diff --git a/vendor/github.com/nyaruka/phonenumbers/metadata_util.go b/vendor/github.com/nyaruka/phonenumbers/metadata_util.go deleted file mode 100644 index 83f002f..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/metadata_util.go +++ /dev/null @@ -1,73 +0,0 @@ -package phonenumbers - -// merge merges two number formats -func (nf *NumberFormat) merge(other *NumberFormat) { - if other.Pattern != nil { - nf.Pattern = other.Pattern - } - if other.Format != nil { - nf.Format = other.Format - } - for i := 0; i < len(other.LeadingDigitsPattern); i++ { - nf.LeadingDigitsPattern = append(nf.LeadingDigitsPattern, other.LeadingDigitsPattern[i]) - } - if other.NationalPrefixFormattingRule != nil { - nf.NationalPrefixFormattingRule = other.NationalPrefixFormattingRule - } - if other.DomesticCarrierCodeFormattingRule != nil { - nf.DomesticCarrierCodeFormattingRule = other.DomesticCarrierCodeFormattingRule - } - if other.NationalPrefixOptionalWhenFormatting != nil { - nf.NationalPrefixOptionalWhenFormatting = other.NationalPrefixOptionalWhenFormatting - } -} - -func (pd *PhoneNumberDesc) hasPossibleLength(length int32) bool { - for _, l := range pd.PossibleLength { - if l == length { - return true - } - } - - return false -} - -func (pd *PhoneNumberDesc) hasPossibleLengthLocalOnly(length int32) bool { - for _, l := range pd.PossibleLengthLocalOnly { - if l == length { - return true - } - } - return false -} - -// utility function called by the builder to remove possible lengths from our protobufs since -// we don't want to write them -func (pd *PhoneNumberDesc) clearPossibleLengths() { - if pd == nil { - return - } - pd.PossibleLength = nil - pd.PossibleLengthLocalOnly = nil -} - -// ClearPossibleLengths is called by the builder to remove possible lengths from our protobufs since -// we don't want to write them -func (md *PhoneMetadata) ClearPossibleLengths() { - md.GeneralDesc.clearPossibleLengths() - md.NoInternationalDialling.clearPossibleLengths() - md.FixedLine.clearPossibleLengths() - md.Mobile.clearPossibleLengths() - md.Pager.clearPossibleLengths() - md.TollFree.clearPossibleLengths() - md.PremiumRate.clearPossibleLengths() - md.SharedCost.clearPossibleLengths() - md.PersonalNumber.clearPossibleLengths() - md.Voip.clearPossibleLengths() - md.Uan.clearPossibleLengths() - md.Voicemail.clearPossibleLengths() - md.StandardRate.clearPossibleLengths() - md.ShortCode.clearPossibleLengths() - md.Emergency.clearPossibleLengths() - md.CarrierSpecific.clearPossibleLengths() -} diff --git a/vendor/github.com/nyaruka/phonenumbers/phonemetadata.pb.go b/vendor/github.com/nyaruka/phonenumbers/phonemetadata.pb.go deleted file mode 100644 index 41b19b2..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/phonemetadata.pb.go +++ /dev/null @@ -1,707 +0,0 @@ -// Code generated by protoc-gen-go. -// source: phonemetadata.proto -// DO NOT EDIT! - -/* -Package i18n_phonenumbers is a generated protocol buffer package. - -It is generated from these files: - phonemetadata.proto - phonenumber.proto - -It has these top-level messages: - NumberFormat - PhoneNumberDesc - PhoneMetadata - PhoneMetadataCollection - PhoneNumber -*/ -package phonenumbers - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type NumberFormat struct { - // pattern is a regex that is used to match the national (significant) - // number. For example, the pattern "(20)(\d{4})(\d{4})" will match number - // "2070313000", which is the national (significant) number for Google London. - // Note the presence of the parentheses, which are capturing groups what - // specifies the grouping of numbers. - Pattern *string `protobuf:"bytes,1,req,name=pattern" json:"pattern,omitempty"` - // format specifies how the national (significant) number matched by - // pattern should be formatted. - // Using the same example as above, format could contain "$1 $2 $3", - // meaning that the number should be formatted as "20 7031 3000". - // Each $x are replaced by the numbers captured by group x in the - // regex specified by pattern. - Format *string `protobuf:"bytes,2,req,name=format" json:"format,omitempty"` - // This field is a regex that is used to match a certain number of digits - // at the beginning of the national (significant) number. When the match is - // successful, the accompanying pattern and format should be used to format - // this number. For example, if leading_digits="[1-3]|44", then all the - // national numbers starting with 1, 2, 3 or 44 should be formatted using the - // accompanying pattern and format. - // - // The first leadingDigitsPattern matches up to the first three digits of the - // national (significant) number; the next one matches the first four digits, - // then the first five and so on, until the leadingDigitsPattern can uniquely - // identify one pattern and format to be used to format the number. - // - // In the case when only one formatting pattern exists, no - // leading_digits_pattern is needed. - LeadingDigitsPattern []string `protobuf:"bytes,3,rep,name=leading_digits_pattern,json=leadingDigitsPattern" json:"leading_digits_pattern,omitempty"` - // This field specifies how the national prefix ($NP) together with the first - // group ($FG) in the national significant number should be formatted in - // the NATIONAL format when a national prefix exists for a certain country. - // For example, when this field contains "($NP$FG)", a number from Beijing, - // China (whose $NP = 0), which would by default be formatted without - // national prefix as 10 1234 5678 in NATIONAL format, will instead be - // formatted as (010) 1234 5678; to format it as (0)10 1234 5678, the field - // would contain "($NP)$FG". Note $FG should always be present in this field, - // but $NP can be omitted. For example, having "$FG" could indicate the - // number should be formatted in NATIONAL format without the national prefix. - // This is commonly used to override the rule specified for the territory in - // the XML file. - // - // When this field is missing, a number will be formatted without national - // prefix in NATIONAL format. This field does not affect how a number - // is formatted in other formats, such as INTERNATIONAL. - NationalPrefixFormattingRule *string `protobuf:"bytes,4,opt,name=national_prefix_formatting_rule,json=nationalPrefixFormattingRule" json:"national_prefix_formatting_rule,omitempty"` - // This field specifies whether the $NP can be omitted when formatting a - // number in national format, even though it usually wouldn't be. For example, - // a UK number would be formatted by our library as 020 XXXX XXXX. If we have - // commonly seen this number written by people without the leading 0, for - // example as (20) XXXX XXXX, this field would be set to true. This will be - // inherited from the value set for the territory in the XML file, unless a - // national_prefix_optional_when_formatting is defined specifically for this - // NumberFormat. - NationalPrefixOptionalWhenFormatting *bool `protobuf:"varint,6,opt,name=national_prefix_optional_when_formatting,json=nationalPrefixOptionalWhenFormatting,def=0" json:"national_prefix_optional_when_formatting,omitempty"` - // This field specifies how any carrier code ($CC) together with the first - // group ($FG) in the national significant number should be formatted - // when formatWithCarrierCode is called, if carrier codes are used for a - // certain country. - DomesticCarrierCodeFormattingRule *string `protobuf:"bytes,5,opt,name=domestic_carrier_code_formatting_rule,json=domesticCarrierCodeFormattingRule" json:"domestic_carrier_code_formatting_rule,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *NumberFormat) Reset() { *m = NumberFormat{} } -func (m *NumberFormat) String() string { return proto.CompactTextString(m) } -func (*NumberFormat) ProtoMessage() {} -func (*NumberFormat) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -const Default_NumberFormat_NationalPrefixOptionalWhenFormatting bool = false - -func (m *NumberFormat) GetPattern() string { - if m != nil && m.Pattern != nil { - return *m.Pattern - } - return "" -} - -func (m *NumberFormat) GetFormat() string { - if m != nil && m.Format != nil { - return *m.Format - } - return "" -} - -func (m *NumberFormat) GetLeadingDigitsPattern() []string { - if m != nil { - return m.LeadingDigitsPattern - } - return nil -} - -func (m *NumberFormat) GetNationalPrefixFormattingRule() string { - if m != nil && m.NationalPrefixFormattingRule != nil { - return *m.NationalPrefixFormattingRule - } - return "" -} - -func (m *NumberFormat) GetNationalPrefixOptionalWhenFormatting() bool { - if m != nil && m.NationalPrefixOptionalWhenFormatting != nil { - return *m.NationalPrefixOptionalWhenFormatting - } - return Default_NumberFormat_NationalPrefixOptionalWhenFormatting -} - -func (m *NumberFormat) GetDomesticCarrierCodeFormattingRule() string { - if m != nil && m.DomesticCarrierCodeFormattingRule != nil { - return *m.DomesticCarrierCodeFormattingRule - } - return "" -} - -// If you add, remove, or rename fields, or change their semantics, check if you -// should change the excludable field sets or the behavior in MetadataFilter. -type PhoneNumberDesc struct { - // The national_number_pattern is the pattern that a valid national - // significant number would match. This specifies information such as its - // total length and leading digits. - NationalNumberPattern *string `protobuf:"bytes,2,opt,name=national_number_pattern,json=nationalNumberPattern" json:"national_number_pattern,omitempty"` - // The possible_number_pattern represents what a potentially valid phone - // number for this region may be written as. This is a superset of the - // national_number_pattern above and includes numbers that have the area code - // omitted. Typically the only restrictions here are in the number of digits. - // This could be used to highlight tokens in a text that may be a phone - // number, or to quickly prune numbers that could not possibly be a phone - // number for this locale. - PossibleNumberPattern *string `protobuf:"bytes,3,opt,name=possible_number_pattern,json=possibleNumberPattern" json:"possible_number_pattern,omitempty"` - // These represent the lengths a phone number from this region can be. They - // will be sorted from smallest to biggest. Note that these lengths are for - // the full number, without country calling code or national prefix. For - // example, for the Swiss number +41789270000, in local format 0789270000, - // this would be 9. - // This could be used to highlight tokens in a text that may be a phone - // number, or to quickly prune numbers that could not possibly be a phone - // number for this locale. - PossibleLength []int32 `protobuf:"varint,9,rep,name=possible_length,json=possibleLength" json:"possible_length,omitempty"` - // These represent the lengths that only local phone numbers (without an area - // code) from this region can be. They will be sorted from smallest to - // biggest. For example, since the American number 456-1234 may be locally - // diallable, although not diallable from outside the area, 7 could be a - // possible value. - // This could be used to highlight tokens in a text that may be a phone - // number. - // To our knowledge, area codes are usually only relevant for some fixed-line - // and mobile numbers, so this field should only be set for those types of - // numbers (and the general description) - however there are exceptions for - // NANPA countries. - // This data is used to calculate whether a number could be a possible number - // for a particular type. - PossibleLengthLocalOnly []int32 `protobuf:"varint,10,rep,name=possible_length_local_only,json=possibleLengthLocalOnly" json:"possible_length_local_only,omitempty"` - // An example national significant number for the specific type. It should - // not contain any formatting information. - ExampleNumber *string `protobuf:"bytes,6,opt,name=example_number,json=exampleNumber" json:"example_number,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PhoneNumberDesc) Reset() { *m = PhoneNumberDesc{} } -func (m *PhoneNumberDesc) String() string { return proto.CompactTextString(m) } -func (*PhoneNumberDesc) ProtoMessage() {} -func (*PhoneNumberDesc) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *PhoneNumberDesc) GetNationalNumberPattern() string { - if m != nil && m.NationalNumberPattern != nil { - return *m.NationalNumberPattern - } - return "" -} - -func (m *PhoneNumberDesc) GetPossibleNumberPattern() string { - if m != nil && m.PossibleNumberPattern != nil { - return *m.PossibleNumberPattern - } - return "" -} - -func (m *PhoneNumberDesc) GetPossibleLength() []int32 { - if m != nil { - return m.PossibleLength - } - return nil -} - -func (m *PhoneNumberDesc) GetPossibleLengthLocalOnly() []int32 { - if m != nil { - return m.PossibleLengthLocalOnly - } - return nil -} - -func (m *PhoneNumberDesc) GetExampleNumber() string { - if m != nil && m.ExampleNumber != nil { - return *m.ExampleNumber - } - return "" -} - -// If you add, remove, or rename fields, or change their semantics, check if you -// should change the excludable field sets or the behavior in MetadataFilter. -type PhoneMetadata struct { - // The general_desc contains information which is a superset of descriptions - // for all types of phone numbers. If any element is missing in the - // description of a specific type in the XML file, the element will inherit - // from its counterpart in the general_desc. Every locale is assumed to have - // fixed line and mobile numbers - if these types are missing in the - // PhoneNumberMetadata XML file, they will inherit all fields from the - // general_desc. For all other types that are generally relevant to normal - // phone numbers, if the whole type is missing in the PhoneNumberMetadata XML - // file, it will be given a national_number_pattern of "NA" and a - // possible_number_pattern of "NA". - GeneralDesc *PhoneNumberDesc `protobuf:"bytes,1,opt,name=general_desc,json=generalDesc" json:"general_desc,omitempty"` - FixedLine *PhoneNumberDesc `protobuf:"bytes,2,opt,name=fixed_line,json=fixedLine" json:"fixed_line,omitempty"` - Mobile *PhoneNumberDesc `protobuf:"bytes,3,opt,name=mobile" json:"mobile,omitempty"` - TollFree *PhoneNumberDesc `protobuf:"bytes,4,opt,name=toll_free,json=tollFree" json:"toll_free,omitempty"` - PremiumRate *PhoneNumberDesc `protobuf:"bytes,5,opt,name=premium_rate,json=premiumRate" json:"premium_rate,omitempty"` - SharedCost *PhoneNumberDesc `protobuf:"bytes,6,opt,name=shared_cost,json=sharedCost" json:"shared_cost,omitempty"` - PersonalNumber *PhoneNumberDesc `protobuf:"bytes,7,opt,name=personal_number,json=personalNumber" json:"personal_number,omitempty"` - Voip *PhoneNumberDesc `protobuf:"bytes,8,opt,name=voip" json:"voip,omitempty"` - Pager *PhoneNumberDesc `protobuf:"bytes,21,opt,name=pager" json:"pager,omitempty"` - Uan *PhoneNumberDesc `protobuf:"bytes,25,opt,name=uan" json:"uan,omitempty"` - Emergency *PhoneNumberDesc `protobuf:"bytes,27,opt,name=emergency" json:"emergency,omitempty"` - Voicemail *PhoneNumberDesc `protobuf:"bytes,28,opt,name=voicemail" json:"voicemail,omitempty"` - ShortCode *PhoneNumberDesc `protobuf:"bytes,29,opt,name=short_code,json=shortCode" json:"short_code,omitempty"` - StandardRate *PhoneNumberDesc `protobuf:"bytes,30,opt,name=standard_rate,json=standardRate" json:"standard_rate,omitempty"` - CarrierSpecific *PhoneNumberDesc `protobuf:"bytes,31,opt,name=carrier_specific,json=carrierSpecific" json:"carrier_specific,omitempty"` - // The rules here distinguish the numbers that are only able to be dialled - // nationally. - NoInternationalDialling *PhoneNumberDesc `protobuf:"bytes,24,opt,name=no_international_dialling,json=noInternationalDialling" json:"no_international_dialling,omitempty"` - // The CLDR 2-letter representation of a country/region, with the exception of - // "country calling codes" used for non-geographical entities, such as - // Universal International Toll Free Number (+800). These are all given the ID - // "001", since this is the numeric region code for the world according to UN - // M.49: http://en.wikipedia.org/wiki/UN_M.49 - Id *string `protobuf:"bytes,9,req,name=id" json:"id,omitempty"` - // The country calling code that one would dial from overseas when trying to - // dial a phone number in this country. For example, this would be "64" for - // New Zealand. - CountryCode *int32 `protobuf:"varint,10,opt,name=country_code,json=countryCode" json:"country_code,omitempty"` - // The international_prefix of country A is the number that needs to be - // dialled from country A to another country (country B). This is followed - // by the country code for country B. Note that some countries may have more - // than one international prefix, and for those cases, a regular expression - // matching the international prefixes will be stored in this field. - InternationalPrefix *string `protobuf:"bytes,11,opt,name=international_prefix,json=internationalPrefix" json:"international_prefix,omitempty"` - // If more than one international prefix is present, a preferred prefix can - // be specified here for out-of-country formatting purposes. If this field is - // not present, and multiple international prefixes are present, then "+" - // will be used instead. - PreferredInternationalPrefix *string `protobuf:"bytes,17,opt,name=preferred_international_prefix,json=preferredInternationalPrefix" json:"preferred_international_prefix,omitempty"` - // The national prefix of country A is the number that needs to be dialled - // before the national significant number when dialling internally. This - // would not be dialled when dialling internationally. For example, in New - // Zealand, the number that would be locally dialled as 09 345 3456 would be - // dialled from overseas as +64 9 345 3456. In this case, 0 is the national - // prefix. - NationalPrefix *string `protobuf:"bytes,12,opt,name=national_prefix,json=nationalPrefix" json:"national_prefix,omitempty"` - // The preferred prefix when specifying an extension in this country. This is - // used for formatting only, and if this is not specified, a suitable default - // should be used instead. For example, if you wanted extensions to be - // formatted in the following way: - // 1 (365) 345 445 ext. 2345 - // " ext. " should be the preferred extension prefix. - PreferredExtnPrefix *string `protobuf:"bytes,13,opt,name=preferred_extn_prefix,json=preferredExtnPrefix" json:"preferred_extn_prefix,omitempty"` - // This field is used for cases where the national prefix of a country - // contains a carrier selection code, and is written in the form of a - // regular expression. For example, to dial the number 2222-2222 in - // Fortaleza, Brazil (area code 85) using the long distance carrier Oi - // (selection code 31), one would dial 0 31 85 2222 2222. Assuming the - // only other possible carrier selection code is 32, the field will - // contain "03[12]". - // - // When it is missing from the XML file, this field inherits the value of - // national_prefix, if that is present. - NationalPrefixForParsing *string `protobuf:"bytes,15,opt,name=national_prefix_for_parsing,json=nationalPrefixForParsing" json:"national_prefix_for_parsing,omitempty"` - // This field is only populated and used under very rare situations. - // For example, mobile numbers in Argentina are written in two completely - // different ways when dialed in-country and out-of-country - // (e.g. 0343 15 555 1212 is exactly the same number as +54 9 343 555 1212). - // This field is used together with national_prefix_for_parsing to transform - // the number into a particular representation for storing in the phonenumber - // proto buffer in those rare cases. - NationalPrefixTransformRule *string `protobuf:"bytes,16,opt,name=national_prefix_transform_rule,json=nationalPrefixTransformRule" json:"national_prefix_transform_rule,omitempty"` - // Specifies whether the mobile and fixed-line patterns are the same or not. - // This is used to speed up determining phone number type in countries where - // these two types of phone numbers can never be distinguished. - SameMobileAndFixedLinePattern *bool `protobuf:"varint,18,opt,name=same_mobile_and_fixed_line_pattern,json=sameMobileAndFixedLinePattern,def=0" json:"same_mobile_and_fixed_line_pattern,omitempty"` - // Note that the number format here is used for formatting only, not parsing. - // Hence all the varied ways a user *may* write a number need not be recorded - // - just the ideal way we would like to format it for them. When this element - // is absent, the national significant number will be formatted as a whole - // without any formatting applied. - NumberFormat []*NumberFormat `protobuf:"bytes,19,rep,name=number_format,json=numberFormat" json:"number_format,omitempty"` - // This field is populated only when the national significant number is - // formatted differently when it forms part of the INTERNATIONAL format - // and NATIONAL format. A case in point is mobile numbers in Argentina: - // The number, which would be written in INTERNATIONAL format as - // +54 9 343 555 1212, will be written as 0343 15 555 1212 for NATIONAL - // format. In this case, the prefix 9 is inserted when dialling from - // overseas, but otherwise the prefix 0 and the carrier selection code - // 15 (inserted after the area code of 343) is used. - // Note: this field is populated by setting a value for inside - // the tag in the XML file. If is not set then it - // defaults to the same value as the tag. - // - // Examples: - // To set the to a different value than the : - // - // $1 $2 $3 - // $1-$2-$3 - // - // - // To have a format only used for national formatting, set to - // "NA": - // - // $1 $2 $3 - // NA - // - IntlNumberFormat []*NumberFormat `protobuf:"bytes,20,rep,name=intl_number_format,json=intlNumberFormat" json:"intl_number_format,omitempty"` - // This field is set when this country is considered to be the main country - // for a calling code. It may not be set by more than one country with the - // same calling code, and it should not be set by countries with a unique - // calling code. This can be used to indicate that "GB" is the main country - // for the calling code "44" for example, rather than Jersey or the Isle of - // Man. - MainCountryForCode *bool `protobuf:"varint,22,opt,name=main_country_for_code,json=mainCountryForCode,def=0" json:"main_country_for_code,omitempty"` - // This field is populated only for countries or regions that share a country - // calling code. If a number matches this pattern, it could belong to this - // region. This is not intended as a replacement for IsValidForRegion since a - // matching prefix is insufficient for a number to be valid. Furthermore, it - // does not contain all the prefixes valid for a region - for example, 800 - // numbers are valid for all NANPA countries and are hence not listed here. - // This field should be a regular expression of the expected prefix match. - // It is used merely as a short-cut for working out which region a number - // comes from in the case that there is only one, so leading_digit prefixes - // should not overlap. - LeadingDigits *string `protobuf:"bytes,23,opt,name=leading_digits,json=leadingDigits" json:"leading_digits,omitempty"` - // The leading zero in a phone number is meaningful in some countries (e.g. - // Italy). This means they cannot be dropped from the national number when - // converting into international format. If leading zeros are possible for - // valid international numbers for this region/country then set this to true. - // This only needs to be set for the region that is the main_country_for_code - // and all regions associated with that calling code will use the same - // setting. - LeadingZeroPossible *bool `protobuf:"varint,26,opt,name=leading_zero_possible,json=leadingZeroPossible,def=0" json:"leading_zero_possible,omitempty"` - // This field is set when this country has implemented mobile number - // portability. This means that transferring mobile numbers between carriers - // is allowed. A consequence of this is that phone prefix to carrier mapping - // is less reliable. - MobileNumberPortableRegion *bool `protobuf:"varint,32,opt,name=mobile_number_portable_region,json=mobileNumberPortableRegion,def=0" json:"mobile_number_portable_region,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PhoneMetadata) Reset() { *m = PhoneMetadata{} } -func (m *PhoneMetadata) String() string { return proto.CompactTextString(m) } -func (*PhoneMetadata) ProtoMessage() {} -func (*PhoneMetadata) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -const Default_PhoneMetadata_SameMobileAndFixedLinePattern bool = false -const Default_PhoneMetadata_MainCountryForCode bool = false -const Default_PhoneMetadata_LeadingZeroPossible bool = false -const Default_PhoneMetadata_MobileNumberPortableRegion bool = false - -func (m *PhoneMetadata) GetGeneralDesc() *PhoneNumberDesc { - if m != nil { - return m.GeneralDesc - } - return nil -} - -func (m *PhoneMetadata) GetFixedLine() *PhoneNumberDesc { - if m != nil { - return m.FixedLine - } - return nil -} - -func (m *PhoneMetadata) GetMobile() *PhoneNumberDesc { - if m != nil { - return m.Mobile - } - return nil -} - -func (m *PhoneMetadata) GetTollFree() *PhoneNumberDesc { - if m != nil { - return m.TollFree - } - return nil -} - -func (m *PhoneMetadata) GetPremiumRate() *PhoneNumberDesc { - if m != nil { - return m.PremiumRate - } - return nil -} - -func (m *PhoneMetadata) GetSharedCost() *PhoneNumberDesc { - if m != nil { - return m.SharedCost - } - return nil -} - -func (m *PhoneMetadata) GetPersonalNumber() *PhoneNumberDesc { - if m != nil { - return m.PersonalNumber - } - return nil -} - -func (m *PhoneMetadata) GetVoip() *PhoneNumberDesc { - if m != nil { - return m.Voip - } - return nil -} - -func (m *PhoneMetadata) GetPager() *PhoneNumberDesc { - if m != nil { - return m.Pager - } - return nil -} - -func (m *PhoneMetadata) GetUan() *PhoneNumberDesc { - if m != nil { - return m.Uan - } - return nil -} - -func (m *PhoneMetadata) GetEmergency() *PhoneNumberDesc { - if m != nil { - return m.Emergency - } - return nil -} - -func (m *PhoneMetadata) GetVoicemail() *PhoneNumberDesc { - if m != nil { - return m.Voicemail - } - return nil -} - -func (m *PhoneMetadata) GetShortCode() *PhoneNumberDesc { - if m != nil { - return m.ShortCode - } - return nil -} - -func (m *PhoneMetadata) GetStandardRate() *PhoneNumberDesc { - if m != nil { - return m.StandardRate - } - return nil -} - -func (m *PhoneMetadata) GetCarrierSpecific() *PhoneNumberDesc { - if m != nil { - return m.CarrierSpecific - } - return nil -} - -func (m *PhoneMetadata) GetNoInternationalDialling() *PhoneNumberDesc { - if m != nil { - return m.NoInternationalDialling - } - return nil -} - -func (m *PhoneMetadata) GetId() string { - if m != nil && m.Id != nil { - return *m.Id - } - return "" -} - -func (m *PhoneMetadata) GetCountryCode() int32 { - if m != nil && m.CountryCode != nil { - return *m.CountryCode - } - return 0 -} - -func (m *PhoneMetadata) GetInternationalPrefix() string { - if m != nil && m.InternationalPrefix != nil { - return *m.InternationalPrefix - } - return "" -} - -func (m *PhoneMetadata) GetPreferredInternationalPrefix() string { - if m != nil && m.PreferredInternationalPrefix != nil { - return *m.PreferredInternationalPrefix - } - return "" -} - -func (m *PhoneMetadata) GetNationalPrefix() string { - if m != nil && m.NationalPrefix != nil { - return *m.NationalPrefix - } - return "" -} - -func (m *PhoneMetadata) GetPreferredExtnPrefix() string { - if m != nil && m.PreferredExtnPrefix != nil { - return *m.PreferredExtnPrefix - } - return "" -} - -func (m *PhoneMetadata) GetNationalPrefixForParsing() string { - if m != nil && m.NationalPrefixForParsing != nil { - return *m.NationalPrefixForParsing - } - return "" -} - -func (m *PhoneMetadata) GetNationalPrefixTransformRule() string { - if m != nil && m.NationalPrefixTransformRule != nil { - return *m.NationalPrefixTransformRule - } - return "" -} - -func (m *PhoneMetadata) GetSameMobileAndFixedLinePattern() bool { - if m != nil && m.SameMobileAndFixedLinePattern != nil { - return *m.SameMobileAndFixedLinePattern - } - return Default_PhoneMetadata_SameMobileAndFixedLinePattern -} - -func (m *PhoneMetadata) GetNumberFormat() []*NumberFormat { - if m != nil { - return m.NumberFormat - } - return nil -} - -func (m *PhoneMetadata) GetIntlNumberFormat() []*NumberFormat { - if m != nil { - return m.IntlNumberFormat - } - return nil -} - -func (m *PhoneMetadata) GetMainCountryForCode() bool { - if m != nil && m.MainCountryForCode != nil { - return *m.MainCountryForCode - } - return Default_PhoneMetadata_MainCountryForCode -} - -func (m *PhoneMetadata) GetLeadingDigits() string { - if m != nil && m.LeadingDigits != nil { - return *m.LeadingDigits - } - return "" -} - -func (m *PhoneMetadata) GetLeadingZeroPossible() bool { - if m != nil && m.LeadingZeroPossible != nil { - return *m.LeadingZeroPossible - } - return Default_PhoneMetadata_LeadingZeroPossible -} - -func (m *PhoneMetadata) GetMobileNumberPortableRegion() bool { - if m != nil && m.MobileNumberPortableRegion != nil { - return *m.MobileNumberPortableRegion - } - return Default_PhoneMetadata_MobileNumberPortableRegion -} - -type PhoneMetadataCollection struct { - Metadata []*PhoneMetadata `protobuf:"bytes,1,rep,name=metadata" json:"metadata,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PhoneMetadataCollection) Reset() { *m = PhoneMetadataCollection{} } -func (m *PhoneMetadataCollection) String() string { return proto.CompactTextString(m) } -func (*PhoneMetadataCollection) ProtoMessage() {} -func (*PhoneMetadataCollection) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *PhoneMetadataCollection) GetMetadata() []*PhoneMetadata { - if m != nil { - return m.Metadata - } - return nil -} - -func init() { - proto.RegisterType((*NumberFormat)(nil), "i18n.phonenumbers.NumberFormat") - proto.RegisterType((*PhoneNumberDesc)(nil), "i18n.phonenumbers.PhoneNumberDesc") - proto.RegisterType((*PhoneMetadata)(nil), "i18n.phonenumbers.PhoneMetadata") - proto.RegisterType((*PhoneMetadataCollection)(nil), "i18n.phonenumbers.PhoneMetadataCollection") -} - -func init() { proto.RegisterFile("phonemetadata.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 1033 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0xeb, 0x6e, 0xdb, 0x46, - 0x13, 0x86, 0x21, 0x29, 0x4e, 0xac, 0x91, 0x6c, 0x39, 0xeb, 0x83, 0x36, 0x3e, 0x2a, 0xc2, 0x17, - 0x44, 0xbf, 0x0c, 0xc4, 0x08, 0x0c, 0x7f, 0x69, 0x8b, 0x36, 0x95, 0xed, 0x26, 0xa8, 0xdd, 0x08, - 0x6c, 0x81, 0x00, 0x05, 0x5a, 0x62, 0x4d, 0x8e, 0xa4, 0x05, 0xc8, 0x5d, 0x62, 0xb9, 0x4a, 0xed, - 0x5e, 0x44, 0xaf, 0xa5, 0x57, 0xd6, 0x6b, 0x28, 0xb8, 0x07, 0x5a, 0x92, 0x5d, 0x80, 0xff, 0x4c, - 0xce, 0xfb, 0xbc, 0x5c, 0xcf, 0x8e, 0x66, 0x06, 0x36, 0xb3, 0xa9, 0x14, 0x98, 0xa2, 0x66, 0x31, - 0xd3, 0xec, 0x38, 0x53, 0x52, 0x4b, 0xf2, 0x9c, 0xbf, 0x39, 0x13, 0xc7, 0x26, 0x22, 0x66, 0xe9, - 0x0d, 0xaa, 0xbc, 0xff, 0x4f, 0x1d, 0xda, 0x3f, 0x99, 0xbf, 0x2f, 0xa5, 0x4a, 0x99, 0x26, 0x14, - 0x9e, 0x65, 0x4c, 0x6b, 0x54, 0x82, 0xd6, 0x7a, 0xf5, 0x41, 0x33, 0xf0, 0x8f, 0x64, 0x07, 0x9e, - 0x8e, 0x8d, 0x86, 0xd6, 0x4d, 0xc0, 0x3d, 0x91, 0xb7, 0xb0, 0x93, 0x20, 0x8b, 0xb9, 0x98, 0x84, - 0x31, 0x9f, 0x70, 0x9d, 0x87, 0xde, 0xa0, 0xd1, 0x6b, 0x0c, 0x9a, 0xc1, 0x96, 0x8b, 0x9e, 0x9b, - 0xe0, 0xc8, 0xb9, 0x5d, 0xc0, 0x91, 0x60, 0x9a, 0x4b, 0xc1, 0x92, 0x30, 0x53, 0x38, 0xe6, 0xb7, - 0xa1, 0xf5, 0xd3, 0x85, 0x91, 0x9a, 0x25, 0x48, 0x9f, 0xf4, 0x6a, 0x83, 0x66, 0xb0, 0xef, 0x65, - 0x23, 0xa3, 0xba, 0x2c, 0x45, 0xc1, 0x2c, 0x41, 0xf2, 0x1b, 0x0c, 0x96, 0x6d, 0x64, 0xe6, 0x9e, - 0xff, 0x98, 0xa2, 0x98, 0x33, 0xa5, 0x4f, 0x7b, 0xb5, 0xc1, 0xea, 0xbb, 0x95, 0x31, 0x4b, 0x72, - 0x0c, 0xfe, 0xb7, 0x68, 0xfb, 0xc9, 0x41, 0x9f, 0xa7, 0x28, 0xee, 0x3f, 0x41, 0x46, 0xf0, 0x2a, - 0x96, 0x29, 0xe6, 0x9a, 0x47, 0x61, 0xc4, 0x94, 0xe2, 0xa8, 0xc2, 0x48, 0xc6, 0xf8, 0xe0, 0xac, - 0x2b, 0xe6, 0xac, 0x2f, 0xbd, 0x78, 0x68, 0xb5, 0x43, 0x19, 0xe3, 0xe2, 0x81, 0xfb, 0x7f, 0xd5, - 0xa1, 0x33, 0x2a, 0x6e, 0xc0, 0x66, 0xfd, 0x1c, 0xf3, 0x88, 0x9c, 0x42, 0xb7, 0xfc, 0x27, 0xec, - 0xc5, 0x94, 0x29, 0xac, 0x1b, 0xdf, 0x6d, 0x1f, 0xb6, 0x90, 0xcf, 0xe1, 0x29, 0x74, 0x33, 0x99, - 0xe7, 0xfc, 0x26, 0xc1, 0x65, 0xae, 0x61, 0x39, 0x1f, 0x5e, 0xe4, 0x5e, 0x43, 0xa7, 0xe4, 0x12, - 0x14, 0x13, 0x3d, 0xa5, 0xcd, 0x5e, 0x63, 0xb0, 0x12, 0xac, 0xfb, 0xd7, 0x57, 0xe6, 0x2d, 0xf9, - 0x0a, 0x76, 0x97, 0x84, 0x61, 0x22, 0x23, 0x96, 0x84, 0x52, 0x24, 0x77, 0x14, 0x0c, 0xd3, 0x5d, - 0x64, 0xae, 0x8a, 0xf8, 0x27, 0x91, 0xdc, 0x91, 0x57, 0xb0, 0x8e, 0xb7, 0x2c, 0xcd, 0xca, 0xc3, - 0x99, 0x0b, 0x68, 0x06, 0x6b, 0xee, 0xad, 0x3d, 0x53, 0xff, 0xef, 0x0e, 0xac, 0x99, 0x84, 0x5c, - 0xbb, 0x62, 0x25, 0x17, 0xd0, 0x9e, 0xa0, 0x40, 0xc5, 0x92, 0x30, 0xc6, 0x3c, 0xa2, 0xb5, 0x5e, - 0x6d, 0xd0, 0x3a, 0xe9, 0x1f, 0x3f, 0xa8, 0xde, 0xe3, 0xa5, 0x44, 0x06, 0x2d, 0xc7, 0x99, 0xac, - 0xbe, 0x07, 0x18, 0xf3, 0x5b, 0x8c, 0xc3, 0x84, 0x0b, 0x34, 0x89, 0xac, 0x66, 0xd2, 0x34, 0xd4, - 0x15, 0x17, 0x48, 0xde, 0xc1, 0xd3, 0x54, 0xde, 0xf0, 0x04, 0x4d, 0x3e, 0xab, 0xe1, 0x8e, 0x20, - 0xdf, 0x42, 0x53, 0xcb, 0x24, 0x09, 0xc7, 0x0a, 0x6d, 0x29, 0x57, 0xc3, 0x57, 0x0b, 0xe8, 0x52, - 0x21, 0x16, 0x69, 0xc8, 0x14, 0xa6, 0x7c, 0x96, 0x86, 0x8a, 0x69, 0x5b, 0x62, 0x15, 0xd3, 0xe0, - 0xb8, 0x80, 0x69, 0x24, 0x43, 0x68, 0xe5, 0x53, 0xa6, 0x30, 0x0e, 0x23, 0x99, 0x6b, 0x73, 0x07, - 0xd5, 0x5c, 0xc0, 0x62, 0x43, 0x99, 0x6b, 0xf2, 0x23, 0x74, 0x32, 0x54, 0xf9, 0x5c, 0x85, 0xd2, - 0x67, 0x95, 0x8d, 0xd6, 0x3d, 0x6a, 0xdf, 0x91, 0x53, 0x78, 0xf2, 0x45, 0xf2, 0x8c, 0xae, 0x56, - 0x76, 0x30, 0x7a, 0x72, 0x06, 0x2b, 0x19, 0x9b, 0xa0, 0xa2, 0xdb, 0x95, 0x41, 0x0b, 0x90, 0xb7, - 0xd0, 0x98, 0x31, 0x41, 0x5f, 0x54, 0xe6, 0x0a, 0x39, 0xf9, 0x0e, 0x9a, 0x98, 0xa2, 0x9a, 0xa0, - 0x88, 0xee, 0xe8, 0x5e, 0xf5, 0xfa, 0x29, 0xa1, 0xc2, 0xe1, 0x8b, 0xe4, 0x11, 0xa6, 0x8c, 0x27, - 0x74, 0xbf, 0xba, 0x43, 0x09, 0x15, 0x45, 0x9c, 0x4f, 0xa5, 0xd2, 0xa6, 0xeb, 0xd0, 0x83, 0xea, - 0x16, 0x86, 0x2a, 0xfa, 0x0f, 0xf9, 0x01, 0xd6, 0x72, 0xcd, 0x44, 0xcc, 0x54, 0x6c, 0x0b, 0xe9, - 0xb0, 0xb2, 0x4b, 0xdb, 0x83, 0xa6, 0x92, 0xae, 0x61, 0xc3, 0xf7, 0xc0, 0x3c, 0xc3, 0x88, 0x8f, - 0x79, 0x44, 0x8f, 0x2a, 0x7b, 0x75, 0x1c, 0xfb, 0xb3, 0x43, 0xc9, 0xef, 0xf0, 0x42, 0xc8, 0x90, - 0x8b, 0xa2, 0x25, 0xf9, 0xee, 0x17, 0x73, 0x96, 0x24, 0x45, 0xaf, 0xa6, 0x95, 0x7d, 0xbb, 0x42, - 0x7e, 0x9c, 0xf7, 0x38, 0x77, 0x16, 0x64, 0x1d, 0xea, 0x3c, 0xa6, 0x4d, 0x33, 0xab, 0xea, 0x3c, - 0x26, 0x2f, 0xa1, 0x1d, 0xc9, 0x99, 0xd0, 0xea, 0xce, 0x26, 0x13, 0x7a, 0xb5, 0xc1, 0x4a, 0xd0, - 0x72, 0xef, 0x4c, 0xaa, 0xde, 0xc0, 0xd6, 0xe2, 0x79, 0xec, 0x48, 0xa1, 0x2d, 0xd3, 0xb8, 0x36, - 0x17, 0x62, 0x76, 0x6e, 0x90, 0x73, 0x38, 0x2c, 0x44, 0xa8, 0x8a, 0x5f, 0xd8, 0xa3, 0xf0, 0x73, - 0x3b, 0xc6, 0x4a, 0xd5, 0xc7, 0x47, 0x5c, 0x5e, 0x43, 0x67, 0x19, 0x6b, 0x1b, 0x6c, 0x7d, 0x49, - 0x78, 0x02, 0xdb, 0xf7, 0x9f, 0xc3, 0x5b, 0x2d, 0xbc, 0x7c, 0xcd, 0x1e, 0xb1, 0x0c, 0x5e, 0xdc, - 0x6a, 0xe1, 0x98, 0x6f, 0x60, 0xef, 0x91, 0x51, 0x1b, 0x66, 0x4c, 0xe5, 0x45, 0xaa, 0x3b, 0x86, - 0xa4, 0x0f, 0xc6, 0xec, 0xc8, 0xc6, 0xc9, 0x10, 0x0e, 0x97, 0x71, 0xad, 0x98, 0xc8, 0x8b, 0x11, - 0x68, 0x87, 0xdf, 0x86, 0x71, 0xd8, 0x5b, 0x74, 0xf8, 0xc5, 0x6b, 0xcc, 0x9c, 0x1e, 0x41, 0x3f, - 0x67, 0x29, 0x86, 0xb6, 0x39, 0x86, 0x4c, 0xc4, 0xe1, 0x7d, 0x73, 0x2e, 0xa7, 0x16, 0x99, 0x9f, - 0xd0, 0x07, 0x05, 0x70, 0x6d, 0xf4, 0xef, 0x45, 0x7c, 0xe9, 0x9b, 0xb2, 0x1f, 0x62, 0xe7, 0xb0, - 0xe6, 0x66, 0x9e, 0xdb, 0x4a, 0x36, 0x7b, 0x8d, 0x41, 0xeb, 0xe4, 0xe8, 0x91, 0x92, 0x99, 0x5f, - 0x70, 0x82, 0xb6, 0x98, 0x5f, 0x77, 0xae, 0x81, 0x70, 0xa1, 0xcb, 0xb1, 0xeb, 0xac, 0xb6, 0xaa, - 0x59, 0x6d, 0x14, 0xe8, 0xc2, 0xf6, 0x74, 0x06, 0xdb, 0x29, 0xe3, 0x22, 0xf4, 0x85, 0x56, 0xe4, - 0xd9, 0x14, 0xdb, 0xce, 0xfc, 0x7f, 0x46, 0x0a, 0xcd, 0xd0, 0x4a, 0x2e, 0xa5, 0xd9, 0x12, 0x8a, - 0x69, 0xb9, 0xb8, 0x45, 0xd1, 0xae, 0x9d, 0x96, 0x0b, 0xdb, 0x13, 0xf9, 0x3f, 0x6c, 0x7b, 0xd9, - 0x9f, 0xa8, 0x64, 0xe8, 0x87, 0x2f, 0xdd, 0x9d, 0xff, 0xc0, 0xa6, 0xd3, 0xfc, 0x8a, 0x4a, 0x8e, - 0x9c, 0x82, 0x7c, 0x80, 0x03, 0x97, 0x7d, 0xbf, 0x2b, 0x48, 0xa5, 0x59, 0x31, 0xda, 0x15, 0x4e, - 0xb8, 0x14, 0xb4, 0x37, 0x6f, 0xb1, 0x6b, 0xb5, 0x6e, 0x71, 0x70, 0xca, 0xc0, 0x08, 0xfb, 0x9f, - 0xa1, 0xbb, 0x30, 0xb1, 0x87, 0x32, 0x49, 0x30, 0x2a, 0x2e, 0x9f, 0x7c, 0x0d, 0xab, 0x7e, 0xe9, - 0xa4, 0x35, 0x93, 0xc5, 0xde, 0x7f, 0xfd, 0x86, 0x3d, 0x1d, 0x94, 0xc4, 0xf7, 0x3d, 0xd8, 0x8f, - 0x64, 0x7a, 0x3c, 0x91, 0x72, 0x92, 0xe0, 0x43, 0xee, 0x43, 0xe3, 0xdf, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xe7, 0x95, 0xf6, 0xa7, 0xd8, 0x0a, 0x00, 0x00, -} diff --git a/vendor/github.com/nyaruka/phonenumbers/phonemetadata.proto b/vendor/github.com/nyaruka/phonenumbers/phonemetadata.proto deleted file mode 100644 index ba7596a..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/phonemetadata.proto +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2009 The Libphonenumber 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. - */ - -// Definition of protocol buffer for holding metadata for international -// telephone numbers. The fields here correspond exactly to those in -// resources/PhoneNumberMetadata.xml. -// @author Shaopeng Jia - -syntax = "proto2"; - -option optimize_for = LITE_RUNTIME; - -option java_package = "com.google.i18n.phonenumbers"; -package i18n.phonenumbers; - -message NumberFormat { - // pattern is a regex that is used to match the national (significant) - // number. For example, the pattern "(20)(\d{4})(\d{4})" will match number - // "2070313000", which is the national (significant) number for Google London. - // Note the presence of the parentheses, which are capturing groups what - // specifies the grouping of numbers. - required string pattern = 1; - - // format specifies how the national (significant) number matched by - // pattern should be formatted. - // Using the same example as above, format could contain "$1 $2 $3", - // meaning that the number should be formatted as "20 7031 3000". - // Each $x are replaced by the numbers captured by group x in the - // regex specified by pattern. - required string format = 2; - - // This field is a regex that is used to match a certain number of digits - // at the beginning of the national (significant) number. When the match is - // successful, the accompanying pattern and format should be used to format - // this number. For example, if leading_digits="[1-3]|44", then all the - // national numbers starting with 1, 2, 3 or 44 should be formatted using the - // accompanying pattern and format. - // - // The first leadingDigitsPattern matches up to the first three digits of the - // national (significant) number; the next one matches the first four digits, - // then the first five and so on, until the leadingDigitsPattern can uniquely - // identify one pattern and format to be used to format the number. - // - // In the case when only one formatting pattern exists, no - // leading_digits_pattern is needed. - repeated string leading_digits_pattern = 3; - - // This field specifies how the national prefix ($NP) together with the first - // group ($FG) in the national significant number should be formatted in - // the NATIONAL format when a national prefix exists for a certain country. - // For example, when this field contains "($NP$FG)", a number from Beijing, - // China (whose $NP = 0), which would by default be formatted without - // national prefix as 10 1234 5678 in NATIONAL format, will instead be - // formatted as (010) 1234 5678; to format it as (0)10 1234 5678, the field - // would contain "($NP)$FG". Note $FG should always be present in this field, - // but $NP can be omitted. For example, having "$FG" could indicate the - // number should be formatted in NATIONAL format without the national prefix. - // This is commonly used to override the rule specified for the territory in - // the XML file. - // - // When this field is missing, a number will be formatted without national - // prefix in NATIONAL format. This field does not affect how a number - // is formatted in other formats, such as INTERNATIONAL. - optional string national_prefix_formatting_rule = 4; - - // This field specifies whether the $NP can be omitted when formatting a - // number in national format, even though it usually wouldn't be. For example, - // a UK number would be formatted by our library as 020 XXXX XXXX. If we have - // commonly seen this number written by people without the leading 0, for - // example as (20) XXXX XXXX, this field would be set to true. This will be - // inherited from the value set for the territory in the XML file, unless a - // national_prefix_optional_when_formatting is defined specifically for this - // NumberFormat. - optional bool national_prefix_optional_when_formatting = 6 [default=false]; - - // This field specifies how any carrier code ($CC) together with the first - // group ($FG) in the national significant number should be formatted - // when formatWithCarrierCode is called, if carrier codes are used for a - // certain country. - optional string domestic_carrier_code_formatting_rule = 5; -} - -// If you add, remove, or rename fields, or change their semantics, check if you -// should change the excludable field sets or the behavior in MetadataFilter. -message PhoneNumberDesc { - // The national_number_pattern is the pattern that a valid national - // significant number would match. This specifies information such as its - // total length and leading digits. - optional string national_number_pattern = 2; - - // The possible_number_pattern represents what a potentially valid phone - // number for this region may be written as. This is a superset of the - // national_number_pattern above and includes numbers that have the area code - // omitted. Typically the only restrictions here are in the number of digits. - // This could be used to highlight tokens in a text that may be a phone - // number, or to quickly prune numbers that could not possibly be a phone - // number for this locale. - optional string possible_number_pattern = 3; - - // These represent the lengths a phone number from this region can be. They - // will be sorted from smallest to biggest. Note that these lengths are for - // the full number, without country calling code or national prefix. For - // example, for the Swiss number +41789270000, in local format 0789270000, - // this would be 9. - // This could be used to highlight tokens in a text that may be a phone - // number, or to quickly prune numbers that could not possibly be a phone - // number for this locale. - repeated int32 possible_length = 9; - - // These represent the lengths that only local phone numbers (without an area - // code) from this region can be. They will be sorted from smallest to - // biggest. For example, since the American number 456-1234 may be locally - // diallable, although not diallable from outside the area, 7 could be a - // possible value. - // This could be used to highlight tokens in a text that may be a phone - // number. - // To our knowledge, area codes are usually only relevant for some fixed-line - // and mobile numbers, so this field should only be set for those types of - // numbers (and the general description) - however there are exceptions for - // NANPA countries. - // This data is used to calculate whether a number could be a possible number - // for a particular type. - repeated int32 possible_length_local_only = 10; - - // An example national significant number for the specific type. It should - // not contain any formatting information. - optional string example_number = 6; -} - -// If you add, remove, or rename fields, or change their semantics, check if you -// should change the excludable field sets or the behavior in MetadataFilter. -message PhoneMetadata { - // The general_desc contains information which is a superset of descriptions - // for all types of phone numbers. If any element is missing in the - // description of a specific type in the XML file, the element will inherit - // from its counterpart in the general_desc. Every locale is assumed to have - // fixed line and mobile numbers - if these types are missing in the - // PhoneNumberMetadata XML file, they will inherit all fields from the - // general_desc. For all other types that are generally relevant to normal - // phone numbers, if the whole type is missing in the PhoneNumberMetadata XML - // file, it will be given a national_number_pattern of "NA" and a - // possible_number_pattern of "NA". - optional PhoneNumberDesc general_desc = 1; - optional PhoneNumberDesc fixed_line = 2; - optional PhoneNumberDesc mobile = 3; - optional PhoneNumberDesc toll_free = 4; - optional PhoneNumberDesc premium_rate = 5; - optional PhoneNumberDesc shared_cost = 6; - optional PhoneNumberDesc personal_number = 7; - optional PhoneNumberDesc voip = 8; - optional PhoneNumberDesc pager = 21; - optional PhoneNumberDesc uan = 25; - optional PhoneNumberDesc emergency = 27; - optional PhoneNumberDesc voicemail = 28; - optional PhoneNumberDesc short_code = 29; - optional PhoneNumberDesc standard_rate = 30; - optional PhoneNumberDesc carrier_specific = 31; - - // The rules here distinguish the numbers that are only able to be dialled - // nationally. - optional PhoneNumberDesc no_international_dialling = 24; - - // The CLDR 2-letter representation of a country/region, with the exception of - // "country calling codes" used for non-geographical entities, such as - // Universal International Toll Free Number (+800). These are all given the ID - // "001", since this is the numeric region code for the world according to UN - // M.49: http://en.wikipedia.org/wiki/UN_M.49 - required string id = 9; - - // The country calling code that one would dial from overseas when trying to - // dial a phone number in this country. For example, this would be "64" for - // New Zealand. - optional int32 country_code = 10; - - // The international_prefix of country A is the number that needs to be - // dialled from country A to another country (country B). This is followed - // by the country code for country B. Note that some countries may have more - // than one international prefix, and for those cases, a regular expression - // matching the international prefixes will be stored in this field. - optional string international_prefix = 11; - - // If more than one international prefix is present, a preferred prefix can - // be specified here for out-of-country formatting purposes. If this field is - // not present, and multiple international prefixes are present, then "+" - // will be used instead. - optional string preferred_international_prefix = 17; - - // The national prefix of country A is the number that needs to be dialled - // before the national significant number when dialling internally. This - // would not be dialled when dialling internationally. For example, in New - // Zealand, the number that would be locally dialled as 09 345 3456 would be - // dialled from overseas as +64 9 345 3456. In this case, 0 is the national - // prefix. - optional string national_prefix = 12; - - // The preferred prefix when specifying an extension in this country. This is - // used for formatting only, and if this is not specified, a suitable default - // should be used instead. For example, if you wanted extensions to be - // formatted in the following way: - // 1 (365) 345 445 ext. 2345 - // " ext. " should be the preferred extension prefix. - optional string preferred_extn_prefix = 13; - - // This field is used for cases where the national prefix of a country - // contains a carrier selection code, and is written in the form of a - // regular expression. For example, to dial the number 2222-2222 in - // Fortaleza, Brazil (area code 85) using the long distance carrier Oi - // (selection code 31), one would dial 0 31 85 2222 2222. Assuming the - // only other possible carrier selection code is 32, the field will - // contain "03[12]". - // - // When it is missing from the XML file, this field inherits the value of - // national_prefix, if that is present. - optional string national_prefix_for_parsing = 15; - - // This field is only populated and used under very rare situations. - // For example, mobile numbers in Argentina are written in two completely - // different ways when dialed in-country and out-of-country - // (e.g. 0343 15 555 1212 is exactly the same number as +54 9 343 555 1212). - // This field is used together with national_prefix_for_parsing to transform - // the number into a particular representation for storing in the phonenumber - // proto buffer in those rare cases. - optional string national_prefix_transform_rule = 16; - - // Specifies whether the mobile and fixed-line patterns are the same or not. - // This is used to speed up determining phone number type in countries where - // these two types of phone numbers can never be distinguished. - optional bool same_mobile_and_fixed_line_pattern = 18 [default=false]; - - // Note that the number format here is used for formatting only, not parsing. - // Hence all the varied ways a user *may* write a number need not be recorded - // - just the ideal way we would like to format it for them. When this element - // is absent, the national significant number will be formatted as a whole - // without any formatting applied. - repeated NumberFormat number_format = 19; - - // This field is populated only when the national significant number is - // formatted differently when it forms part of the INTERNATIONAL format - // and NATIONAL format. A case in point is mobile numbers in Argentina: - // The number, which would be written in INTERNATIONAL format as - // +54 9 343 555 1212, will be written as 0343 15 555 1212 for NATIONAL - // format. In this case, the prefix 9 is inserted when dialling from - // overseas, but otherwise the prefix 0 and the carrier selection code - // 15 (inserted after the area code of 343) is used. - // Note: this field is populated by setting a value for inside - // the tag in the XML file. If is not set then it - // defaults to the same value as the tag. - // - // Examples: - // To set the to a different value than the : - // - // $1 $2 $3 - // $1-$2-$3 - // - // - // To have a format only used for national formatting, set to - // "NA": - // - // $1 $2 $3 - // NA - // - repeated NumberFormat intl_number_format = 20; - - // This field is set when this country is considered to be the main country - // for a calling code. It may not be set by more than one country with the - // same calling code, and it should not be set by countries with a unique - // calling code. This can be used to indicate that "GB" is the main country - // for the calling code "44" for example, rather than Jersey or the Isle of - // Man. - optional bool main_country_for_code = 22 [default=false]; - - // This field is populated only for countries or regions that share a country - // calling code. If a number matches this pattern, it could belong to this - // region. This is not intended as a replacement for IsValidForRegion since a - // matching prefix is insufficient for a number to be valid. Furthermore, it - // does not contain all the prefixes valid for a region - for example, 800 - // numbers are valid for all NANPA countries and are hence not listed here. - // This field should be a regular expression of the expected prefix match. - // It is used merely as a short-cut for working out which region a number - // comes from in the case that there is only one, so leading_digit prefixes - // should not overlap. - optional string leading_digits = 23; - - // The leading zero in a phone number is meaningful in some countries (e.g. - // Italy). This means they cannot be dropped from the national number when - // converting into international format. If leading zeros are possible for - // valid international numbers for this region/country then set this to true. - // This only needs to be set for the region that is the main_country_for_code - // and all regions associated with that calling code will use the same - // setting. - optional bool leading_zero_possible = 26 [default=false]; - - // This field is set when this country has implemented mobile number - // portability. This means that transferring mobile numbers between carriers - // is allowed. A consequence of this is that phone prefix to carrier mapping - // is less reliable. - optional bool mobile_number_portable_region = 32 [default=false]; -} - -message PhoneMetadataCollection { - repeated PhoneMetadata metadata = 1; -} diff --git a/vendor/github.com/nyaruka/phonenumbers/phonenumber.pb.go b/vendor/github.com/nyaruka/phonenumbers/phonenumber.pb.go deleted file mode 100644 index cfdaf93..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/phonenumber.pb.go +++ /dev/null @@ -1,216 +0,0 @@ -// Code generated by protoc-gen-go. -// source: phonenumber.proto -// DO NOT EDIT! - -package phonenumbers - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// The source from which the country_code is derived. This is not set in the general parsing method, -// but in the method that parses and keeps raw_input. New fields could be added upon request. -type PhoneNumber_CountryCodeSource int32 - -const ( - // The country_code is derived based on a phone number with a leading "+", e.g. the French - // number "+33 1 42 68 53 00". - PhoneNumber_FROM_NUMBER_WITH_PLUS_SIGN PhoneNumber_CountryCodeSource = 1 - // The country_code is derived based on a phone number with a leading IDD, e.g. the French - // number "011 33 1 42 68 53 00", as it is dialled from US. - PhoneNumber_FROM_NUMBER_WITH_IDD PhoneNumber_CountryCodeSource = 5 - // The country_code is derived based on a phone number without a leading "+", e.g. the French - // number "33 1 42 68 53 00" when defaultCountry is supplied as France. - PhoneNumber_FROM_NUMBER_WITHOUT_PLUS_SIGN PhoneNumber_CountryCodeSource = 10 - // The country_code is derived NOT based on the phone number itself, but from the defaultCountry - // parameter provided in the parsing function by the clients. This happens mostly for numbers - // written in the national format (without country code). For example, this would be set when - // parsing the French number "01 42 68 53 00", when defaultCountry is supplied as France. - PhoneNumber_FROM_DEFAULT_COUNTRY PhoneNumber_CountryCodeSource = 20 -) - -var PhoneNumber_CountryCodeSource_name = map[int32]string{ - 1: "FROM_NUMBER_WITH_PLUS_SIGN", - 5: "FROM_NUMBER_WITH_IDD", - 10: "FROM_NUMBER_WITHOUT_PLUS_SIGN", - 20: "FROM_DEFAULT_COUNTRY", -} -var PhoneNumber_CountryCodeSource_value = map[string]int32{ - "FROM_NUMBER_WITH_PLUS_SIGN": 1, - "FROM_NUMBER_WITH_IDD": 5, - "FROM_NUMBER_WITHOUT_PLUS_SIGN": 10, - "FROM_DEFAULT_COUNTRY": 20, -} - -func (x PhoneNumber_CountryCodeSource) Enum() *PhoneNumber_CountryCodeSource { - p := new(PhoneNumber_CountryCodeSource) - *p = x - return p -} -func (x PhoneNumber_CountryCodeSource) String() string { - return proto.EnumName(PhoneNumber_CountryCodeSource_name, int32(x)) -} -func (x *PhoneNumber_CountryCodeSource) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PhoneNumber_CountryCodeSource_value, data, "PhoneNumber_CountryCodeSource") - if err != nil { - return err - } - *x = PhoneNumber_CountryCodeSource(value) - return nil -} -func (PhoneNumber_CountryCodeSource) EnumDescriptor() ([]byte, []int) { - return fileDescriptor1, []int{0, 0} -} - -type PhoneNumber struct { - // The country calling code for this number, as defined by the International Telecommunication Union - // (ITU). For example, this would be 1 for NANPA countries, and 33 for France. - CountryCode *int32 `protobuf:"varint,1,req,name=country_code,json=countryCode" json:"country_code,omitempty"` - // National (significant) Number is defined in International Telecommunication Union (ITU) - // Recommendation E.164. It is a language/country-neutral representation of a phone number at a - // country level. For countries which have the concept of an "area code" or "national destination - // code", this is included in the National (significant) Number. Although the ITU says the maximum - // length should be 15, we have found longer numbers in some countries e.g. Germany. - // Note that the National (significant) Number does not contain the National(trunk) prefix. - // Obviously, as a uint64, it will never contain any formatting (hyphens, spaces, parentheses), nor - // any alphanumeric spellings. - NationalNumber *uint64 `protobuf:"varint,2,req,name=national_number,json=nationalNumber" json:"national_number,omitempty"` - // Extension is not standardized in ITU recommendations, except for being defined as a series of - // numbers with a maximum length of 40 digits. It is defined as a string here to accommodate for the - // possible use of a leading zero in the extension (organizations have complete freedom to do so, - // as there is no standard defined). However, only ASCII digits should be stored here. - Extension *string `protobuf:"bytes,3,opt,name=extension" json:"extension,omitempty"` - // In some countries, the national (significant) number starts with one or more "0"s without this - // being a national prefix or trunk code of some kind. For example, the leading zero in the national - // (significant) number of an Italian phone number indicates the number is a fixed-line number. - // There have been plans to migrate fixed-line numbers to start with the digit two since December - // 2000, but it has not happened yet. See http://en.wikipedia.org/wiki/%2B39 for more details. - // - // These fields can be safely ignored (there is no need to set them) for most countries. Some - // limited number of countries behave like Italy - for these cases, if the leading zero(s) of a - // number would be retained even when dialling internationally, set this flag to true, and also - // set the number of leading zeros. - // - // Clients who use the parsing functionality of the i18n phone number libraries - // will have these fields set if necessary automatically. - ItalianLeadingZero *bool `protobuf:"varint,4,opt,name=italian_leading_zero,json=italianLeadingZero" json:"italian_leading_zero,omitempty"` - NumberOfLeadingZeros *int32 `protobuf:"varint,8,opt,name=number_of_leading_zeros,json=numberOfLeadingZeros,def=1" json:"number_of_leading_zeros,omitempty"` - // This field is used to store the raw input string containing phone numbers before it was - // canonicalized by the library. For example, it could be used to store alphanumerical numbers - // such as "1-800-GOOG-411". - RawInput *string `protobuf:"bytes,5,opt,name=raw_input,json=rawInput" json:"raw_input,omitempty"` - // The source from which the country_code is derived. - CountryCodeSource *PhoneNumber_CountryCodeSource `protobuf:"varint,6,opt,name=country_code_source,json=countryCodeSource,enum=i18n.phonenumbers.PhoneNumber_CountryCodeSource" json:"country_code_source,omitempty"` - // The carrier selection code that is preferred when calling this phone number domestically. This - // also includes codes that need to be dialed in some countries when calling from landlines to - // mobiles or vice versa. For example, in Columbia, a "3" needs to be dialed before the phone number - // itself when calling from a mobile phone to a domestic landline phone and vice versa. - // - // Note this is the "preferred" code, which means other codes may work as well. - PreferredDomesticCarrierCode *string `protobuf:"bytes,7,opt,name=preferred_domestic_carrier_code,json=preferredDomesticCarrierCode" json:"preferred_domestic_carrier_code,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *PhoneNumber) Reset() { *m = PhoneNumber{} } -func (m *PhoneNumber) String() string { return proto.CompactTextString(m) } -func (*PhoneNumber) ProtoMessage() {} -func (*PhoneNumber) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } - -const Default_PhoneNumber_NumberOfLeadingZeros int32 = 1 - -func (m *PhoneNumber) GetCountryCode() int32 { - if m != nil && m.CountryCode != nil { - return *m.CountryCode - } - return 0 -} - -func (m *PhoneNumber) GetNationalNumber() uint64 { - if m != nil && m.NationalNumber != nil { - return *m.NationalNumber - } - return 0 -} - -func (m *PhoneNumber) GetExtension() string { - if m != nil && m.Extension != nil { - return *m.Extension - } - return "" -} - -func (m *PhoneNumber) GetItalianLeadingZero() bool { - if m != nil && m.ItalianLeadingZero != nil { - return *m.ItalianLeadingZero - } - return false -} - -func (m *PhoneNumber) GetNumberOfLeadingZeros() int32 { - if m != nil && m.NumberOfLeadingZeros != nil { - return *m.NumberOfLeadingZeros - } - return Default_PhoneNumber_NumberOfLeadingZeros -} - -func (m *PhoneNumber) GetRawInput() string { - if m != nil && m.RawInput != nil { - return *m.RawInput - } - return "" -} - -func (m *PhoneNumber) GetCountryCodeSource() PhoneNumber_CountryCodeSource { - if m != nil && m.CountryCodeSource != nil { - return *m.CountryCodeSource - } - return PhoneNumber_FROM_NUMBER_WITH_PLUS_SIGN -} - -func (m *PhoneNumber) GetPreferredDomesticCarrierCode() string { - if m != nil && m.PreferredDomesticCarrierCode != nil { - return *m.PreferredDomesticCarrierCode - } - return "" -} - -func init() { - proto.RegisterType((*PhoneNumber)(nil), "i18n.phonenumbers.PhoneNumber") - proto.RegisterEnum("i18n.phonenumbers.PhoneNumber_CountryCodeSource", PhoneNumber_CountryCodeSource_name, PhoneNumber_CountryCodeSource_value) -} - -func init() { proto.RegisterFile("phonenumber.proto", fileDescriptor1) } - -var fileDescriptor1 = []byte{ - // 400 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0x41, 0x6f, 0xd3, 0x40, - 0x10, 0x85, 0xb5, 0x69, 0x02, 0xc9, 0x14, 0x95, 0x64, 0x89, 0xc4, 0x0a, 0x02, 0xb8, 0xbd, 0xe0, - 0x93, 0xd5, 0x72, 0xaa, 0xb8, 0xd1, 0x24, 0xa5, 0x91, 0xd2, 0xa4, 0xda, 0xc4, 0x42, 0x70, 0x59, - 0x16, 0x7b, 0x12, 0x56, 0x4a, 0x76, 0xa2, 0xb5, 0xad, 0x02, 0x3f, 0x81, 0x1f, 0xc4, 0xef, 0x43, - 0xb1, 0x4d, 0x6b, 0xea, 0xe3, 0x7e, 0xef, 0xbd, 0x99, 0xd9, 0x07, 0xbd, 0xdd, 0x77, 0xb2, 0x68, - 0xb3, 0xed, 0x37, 0x74, 0xc1, 0xce, 0x51, 0x4a, 0xbc, 0x67, 0xce, 0xce, 0x6d, 0x50, 0xe1, 0xc9, - 0xc9, 0x9f, 0x26, 0x1c, 0xde, 0xec, 0xc1, 0x2c, 0x07, 0xfc, 0x18, 0x9e, 0x44, 0x94, 0xd9, 0xd4, - 0xfd, 0x54, 0x11, 0xc5, 0x28, 0x98, 0xd7, 0xf0, 0x5b, 0xf2, 0xb0, 0x64, 0x43, 0x8a, 0x91, 0xbf, - 0x85, 0xa7, 0x56, 0xa7, 0x86, 0xac, 0xde, 0xa8, 0x62, 0x8c, 0x68, 0x78, 0x0d, 0xbf, 0x29, 0x8f, - 0xfe, 0xe1, 0x72, 0xd6, 0x00, 0x3a, 0xf8, 0x23, 0x45, 0x9b, 0x18, 0xb2, 0xe2, 0xc0, 0x63, 0x7e, - 0x47, 0xde, 0x03, 0x7e, 0x0a, 0x7d, 0x93, 0xea, 0x8d, 0xd1, 0x56, 0x6d, 0x50, 0xc7, 0xc6, 0xae, - 0xd5, 0x2f, 0x74, 0x24, 0x9a, 0x1e, 0xf3, 0xdb, 0x92, 0x97, 0xda, 0xb4, 0x90, 0xbe, 0xa0, 0x23, - 0x7e, 0x0e, 0xcf, 0x8b, 0x7d, 0x8a, 0x56, 0xff, 0x65, 0x12, 0xd1, 0xf6, 0x98, 0xdf, 0x7a, 0xcf, - 0xce, 0x64, 0xbf, 0x70, 0xcc, 0x57, 0x95, 0x60, 0xc2, 0x5f, 0x42, 0xc7, 0xe9, 0x5b, 0x65, 0xec, - 0x2e, 0x4b, 0x45, 0x2b, 0xbf, 0xa4, 0xed, 0xf4, 0xed, 0x64, 0xff, 0xe6, 0x5f, 0xe1, 0x59, 0xf5, - 0xcb, 0x2a, 0xa1, 0xcc, 0x45, 0x28, 0x1e, 0x79, 0xcc, 0x3f, 0x7a, 0x77, 0x1a, 0xd4, 0x3a, 0x0b, - 0x2a, 0x7d, 0x05, 0xc3, 0xfb, 0x62, 0x16, 0x79, 0x4e, 0xf6, 0xa2, 0x87, 0x88, 0x8f, 0xe1, 0xcd, - 0xce, 0xe1, 0x0a, 0x9d, 0xc3, 0x58, 0xc5, 0xb4, 0xc5, 0x24, 0x35, 0x91, 0x8a, 0xb4, 0x73, 0x06, - 0x5d, 0xd1, 0xf3, 0xe3, 0xfc, 0xa8, 0xc1, 0x9d, 0x6d, 0x54, 0xba, 0x86, 0x85, 0x69, 0x3f, 0xec, - 0xe4, 0x37, 0x83, 0x5e, 0x6d, 0x1f, 0x7f, 0x0d, 0x2f, 0x2e, 0xe5, 0xfc, 0x5a, 0xcd, 0xc2, 0xeb, - 0x8b, 0xb1, 0x54, 0x9f, 0x26, 0xcb, 0x2b, 0x75, 0x33, 0x0d, 0x17, 0x6a, 0x31, 0xf9, 0x38, 0xeb, - 0x32, 0x2e, 0xa0, 0x5f, 0xd3, 0x27, 0xa3, 0x51, 0xb7, 0xc5, 0x8f, 0xe1, 0xd5, 0x43, 0x65, 0x1e, - 0x2e, 0x2b, 0x61, 0xb8, 0x0b, 0x8f, 0xc6, 0x97, 0x1f, 0xc2, 0xe9, 0x52, 0x0d, 0xe7, 0xe1, 0x6c, - 0x29, 0x3f, 0x77, 0xfb, 0x17, 0x1e, 0x0c, 0x22, 0xda, 0x06, 0x6b, 0xa2, 0xf5, 0x06, 0xeb, 0x25, - 0x5d, 0x1d, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x99, 0xed, 0xea, 0xc1, 0x81, 0x02, 0x00, 0x00, -} diff --git a/vendor/github.com/nyaruka/phonenumbers/phonenumber.proto b/vendor/github.com/nyaruka/phonenumbers/phonenumber.proto deleted file mode 100644 index 12c9062..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/phonenumber.proto +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2009 The Libphonenumber 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. - */ - -// Definition of protocol buffer for representing international telephone numbers. -// @author Shaopeng Jia - -syntax = "proto2"; - -option java_package = "com.google.i18n.phonenumbers"; -option optimize_for = LITE_RUNTIME; - -package i18n.phonenumbers; - -message PhoneNumber { -// The country calling code for this number, as defined by the International Telecommunication Union -// (ITU). For example, this would be 1 for NANPA countries, and 33 for France. - required int32 country_code = 1; - -// National (significant) Number is defined in International Telecommunication Union (ITU) -// Recommendation E.164. It is a language/country-neutral representation of a phone number at a -// country level. For countries which have the concept of an "area code" or "national destination -// code", this is included in the National (significant) Number. Although the ITU says the maximum -// length should be 15, we have found longer numbers in some countries e.g. Germany. -// Note that the National (significant) Number does not contain the National(trunk) prefix. -// Obviously, as a uint64, it will never contain any formatting (hyphens, spaces, parentheses), nor -// any alphanumeric spellings. - required uint64 national_number = 2; - -// Extension is not standardized in ITU recommendations, except for being defined as a series of -// numbers with a maximum length of 40 digits. It is defined as a string here to accommodate for the -// possible use of a leading zero in the extension (organizations have complete freedom to do so, -// as there is no standard defined). However, only ASCII digits should be stored here. - optional string extension = 3; - -// In some countries, the national (significant) number starts with one or more "0"s without this -// being a national prefix or trunk code of some kind. For example, the leading zero in the national -// (significant) number of an Italian phone number indicates the number is a fixed-line number. -// There have been plans to migrate fixed-line numbers to start with the digit two since December -// 2000, but it has not happened yet. See http://en.wikipedia.org/wiki/%2B39 for more details. -// -// These fields can be safely ignored (there is no need to set them) for most countries. Some -// limited number of countries behave like Italy - for these cases, if the leading zero(s) of a -// number would be retained even when dialling internationally, set this flag to true, and also -// set the number of leading zeros. -// -// Clients who use the parsing functionality of the i18n phone number libraries -// will have these fields set if necessary automatically. - optional bool italian_leading_zero = 4; - optional int32 number_of_leading_zeros = 8 [ default = 1 ]; - -// The next few fields are non-essential fields for a phone number. They retain extra information -// about the form the phone number was in when it was provided to us to parse. They can be safely -// ignored by most clients. - -// This field is used to store the raw input string containing phone numbers before it was -// canonicalized by the library. For example, it could be used to store alphanumerical numbers -// such as "1-800-GOOG-411". - optional string raw_input = 5; - -// The source from which the country_code is derived. This is not set in the general parsing method, -// but in the method that parses and keeps raw_input. New fields could be added upon request. - enum CountryCodeSource { - // The country_code is derived based on a phone number with a leading "+", e.g. the French - // number "+33 1 42 68 53 00". - FROM_NUMBER_WITH_PLUS_SIGN = 1; - - // The country_code is derived based on a phone number with a leading IDD, e.g. the French - // number "011 33 1 42 68 53 00", as it is dialled from US. - FROM_NUMBER_WITH_IDD = 5; - - // The country_code is derived based on a phone number without a leading "+", e.g. the French - // number "33 1 42 68 53 00" when defaultCountry is supplied as France. - FROM_NUMBER_WITHOUT_PLUS_SIGN = 10; - - // The country_code is derived NOT based on the phone number itself, but from the defaultCountry - // parameter provided in the parsing function by the clients. This happens mostly for numbers - // written in the national format (without country code). For example, this would be set when - // parsing the French number "01 42 68 53 00", when defaultCountry is supplied as France. - FROM_DEFAULT_COUNTRY = 20; - } - -// The source from which the country_code is derived. - optional CountryCodeSource country_code_source = 6; - -// The carrier selection code that is preferred when calling this phone number domestically. This -// also includes codes that need to be dialed in some countries when calling from landlines to -// mobiles or vice versa. For example, in Columbia, a "3" needs to be dialed before the phone number -// itself when calling from a mobile phone to a domestic landline phone and vice versa. -// -// Note this is the "preferred" code, which means other codes may work as well. - optional string preferred_domestic_carrier_code = 7; -} - -// Examples -// -// Google MTV, +1 650-253-0000, (650) 253-0000 -// country_code: 1 -// national_number: 6502530000 -// -// Google Paris, +33 (0)1 42 68 53 00, 01 42 68 53 00 -// country_code: 33 -// national_number: 142685300 -// -// Google Beijing, +86-10-62503000, (010) 62503000 -// country_code: 86 -// national_number: 1062503000 -// -// Google Italy, +39 02-36618 300, 02-36618 300 -// country_code: 39 -// national_number: 236618300 -// italian_leading_zero: true diff --git a/vendor/github.com/nyaruka/phonenumbers/prefix_to_timezone.go b/vendor/github.com/nyaruka/phonenumbers/prefix_to_timezone.go deleted file mode 100644 index dbed853..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/prefix_to_timezone.go +++ /dev/null @@ -1,6844 +0,0 @@ -package phonenumbers - -// PrefixToTimezone maps a phone number prefix to a list of possible timezones -var PrefixToTimezone = map[int][]string{ - 1: []string{ - "America/Anguilla", "America/Antigua", "America/Barbados", "America/Cayman", "America/Chicago", - "America/Denver", "America/Dominica", "America/Edmonton", "America/Grand_Turk", "America/Grenada", - "America/Halifax", "America/Jamaica", "America/Juneau", "America/Los_Angeles", "America/Lower_Princes", - "America/Montserrat", "America/Nassau", "America/New_York", "America/Phoenix", "America/Port_of_Spain", - "America/Puerto_Rico", "America/Santo_Domingo", "America/St_Johns", "America/St_Kitts", "America/St_Lucia", - "America/St_Thomas", "America/St_Vincent", "America/Toronto", "America/Tortola", "America/Vancouver", - "America/Winnipeg", "Atlantic/Bermuda", "Pacific/Guam", "Pacific/Honolulu", "Pacific/Pago_Pago", - "Pacific/Saipan", - }, - 1201: []string{"America/New_York"}, - 1202: []string{"America/New_York"}, - 1203: []string{"America/New_York"}, - 1204: []string{"America/Winnipeg"}, - 1205: []string{"America/Chicago"}, - 1206: []string{"America/Los_Angeles"}, - 1207: []string{"America/New_York"}, - 1208201: []string{"America/Denver"}, - 1208221: []string{"America/Denver"}, - 1208226: []string{"America/Denver"}, - 1208227: []string{"America/Denver"}, - 1208232: []string{"America/Denver"}, - 1208233: []string{"America/Denver"}, - 1208234: []string{"America/Denver"}, - 1208236: []string{"America/Denver"}, - 1208237: []string{"America/Denver"}, - 1208238: []string{"America/Denver"}, - 1208239: []string{"America/Denver"}, - 1208241: []string{"America/Denver"}, - 1208242: []string{"America/Denver"}, - 1208245: []string{"America/Los_Angeles"}, - 1208250: []string{"America/Denver"}, - 1208251: []string{"America/Denver"}, - 1208253: []string{"America/Denver"}, - 1208254: []string{"America/Denver"}, - 1208255: []string{"America/Los_Angeles"}, - 1208258: []string{"America/Denver"}, - 1208262: []string{"America/Los_Angeles"}, - 1208263: []string{"America/Los_Angeles"}, - 1208265: []string{"America/Los_Angeles"}, - 1208267: []string{"America/Los_Angeles"}, - 1208278: []string{"America/Denver"}, - 1208282: []string{"America/Denver"}, - 1208283: []string{"America/Denver"}, - 1208284: []string{"America/Denver"}, - 1208286: []string{"America/Denver"}, - 1208287: []string{"America/Denver"}, - 1208288: []string{"America/Denver"}, - 1208290: []string{"America/Los_Angeles"}, - 1208292: []string{"America/Los_Angeles"}, - 1208297: []string{"America/Denver"}, - 1208302: []string{"America/Denver"}, - 1208304: []string{"America/Los_Angeles"}, - 1208308: []string{"America/Denver"}, - 1208313: []string{"America/Denver"}, - 1208315: []string{"America/Denver"}, - 1208317: []string{"America/Denver"}, - 1208319: []string{"America/Denver"}, - 1208321: []string{"America/Denver"}, - 1208322: []string{"America/Denver"}, - 1208323: []string{"America/Denver"}, - 1208324: []string{"America/Denver"}, - 1208326: []string{"America/Denver"}, - 1208327: []string{"America/Denver"}, - 1208331: []string{"America/Denver"}, - 1208333: []string{"America/Denver"}, - 1208334: []string{"America/Denver"}, - 1208336: []string{"America/Denver"}, - 1208337: []string{"America/Denver"}, - 1208338: []string{"America/Denver"}, - 1208340: []string{"America/Denver"}, - 1208342: []string{"America/Denver"}, - 1208343: []string{"America/Denver"}, - 1208344: []string{"America/Denver"}, - 1208345: []string{"America/Denver"}, - 1208346: []string{"America/Denver"}, - 1208350: []string{"America/Denver"}, - 1208351: []string{"America/Denver"}, - 1208352: []string{"America/Denver"}, - 1208353: []string{"America/Denver"}, - 1208354: []string{"America/Denver"}, - 1208356: []string{"America/Denver"}, - 1208357: []string{"America/Denver"}, - 1208359: []string{"America/Denver"}, - 1208360: []string{"America/Denver"}, - 1208362: []string{"America/Denver"}, - 1208365: []string{"America/Denver"}, - 1208366: []string{"America/Denver"}, - 1208367: []string{"America/Denver"}, - 1208371: []string{"America/Denver"}, - 1208373: []string{"America/Denver"}, - 1208375: []string{"America/Denver"}, - 1208376: []string{"America/Denver"}, - 1208377: []string{"America/Denver"}, - 1208378: []string{"America/Denver"}, - 1208381: []string{"America/Denver"}, - 1208382: []string{"America/Denver"}, - 1208383: []string{"America/Denver"}, - 1208384: []string{"America/Denver"}, - 1208385: []string{"America/Denver"}, - 1208388: []string{"America/Denver"}, - 1208389: []string{"America/Denver"}, - 1208390: []string{"America/Denver"}, - 1208391: []string{"America/Denver"}, - 1208392: []string{"America/Denver"}, - 1208397: []string{"America/Denver"}, - 1208398: []string{"America/Denver"}, - 1208401: []string{"America/Denver"}, - 1208402: []string{"America/Denver"}, - 1208403: []string{"America/Denver"}, - 1208407: []string{"America/Denver"}, - 1208409: []string{"America/Denver"}, - 1208412: []string{"America/Denver"}, - 1208414: []string{"America/Denver"}, - 1208420: []string{"America/Denver"}, - 1208422: []string{"America/Denver"}, - 1208423: []string{"America/Denver"}, - 1208424: []string{"America/Denver"}, - 1208426: []string{"America/Denver"}, - 1208429: []string{"America/Denver"}, - 1208431: []string{"America/Denver"}, - 1208433: []string{"America/Denver"}, - 1208436: []string{"America/Denver"}, - 1208437: []string{"America/Los_Angeles"}, - 1208438: []string{"America/Denver"}, - 1208440: []string{"America/Denver"}, - 1208442: []string{"America/Denver"}, - 1208443: []string{"America/Los_Angeles"}, - 1208446: []string{"America/Los_Angeles"}, - 1208448: []string{"America/Los_Angeles"}, - 1208452: []string{"America/Denver"}, - 1208453: []string{"America/Denver"}, - 1208454: []string{"America/Denver"}, - 1208455: []string{"America/Denver"}, - 1208457: []string{"America/Los_Angeles"}, - 1208459: []string{"America/Denver"}, - 1208461: []string{"America/Denver"}, - 1208462: []string{"America/Denver"}, - 1208463: []string{"America/Denver"}, - 1208465: []string{"America/Denver"}, - 1208466: []string{"America/Denver"}, - 1208467: []string{"America/Denver"}, - 1208468: []string{"America/Denver"}, - 1208473: []string{"America/Denver"}, - 1208475: []string{"America/Denver"}, - 1208476: []string{"America/Los_Angeles"}, - 1208478: []string{"America/Denver"}, - 1208484: []string{"America/Denver"}, - 1208489: []string{"America/Denver"}, - 1208495: []string{"America/Denver"}, - 1208514: []string{"America/Denver"}, - 1208515: []string{"America/Denver"}, - 1208520: []string{"America/Denver"}, - 1208521: []string{"America/Denver"}, - 1208522: []string{"America/Denver"}, - 1208523: []string{"America/Denver"}, - 1208524: []string{"America/Denver"}, - 1208525: []string{"America/Denver"}, - 1208527: []string{"America/Denver"}, - 1208528: []string{"America/Denver"}, - 1208529: []string{"America/Denver"}, - 1208535: []string{"America/Denver"}, - 1208536: []string{"America/Denver"}, - 1208538: []string{"America/Denver"}, - 1208542: []string{"America/Denver"}, - 1208543: []string{"America/Denver"}, - 1208546: []string{"America/Denver"}, - 1208547: []string{"America/Denver"}, - 1208549: []string{"America/Denver"}, - 1208552: []string{"America/Denver"}, - 1208556: []string{"America/Los_Angeles"}, - 1208557: []string{"America/Denver"}, - 1208558: []string{"America/Denver"}, - 1208559: []string{"America/Denver"}, - 1208562: []string{"America/Denver"}, - 1208569: []string{"America/Denver"}, - 1208570: []string{"America/Denver"}, - 1208571: []string{"America/Denver"}, - 1208573: []string{"America/Denver"}, - 1208577: []string{"America/Denver"}, - 1208578: []string{"America/Denver"}, - 1208585: []string{"America/Denver"}, - 1208587: []string{"America/Denver"}, - 1208588: []string{"America/Denver"}, - 1208589: []string{"America/Denver"}, - 1208595: []string{"America/Denver"}, - 1208596: []string{"America/Los_Angeles"}, - 1208602: []string{"America/Denver"}, - 1208608: []string{"America/Denver"}, - 1208610: []string{"America/Los_Angeles"}, - 1208622: []string{"America/Denver"}, - 1208623: []string{"America/Los_Angeles"}, - 1208624: []string{"America/Denver"}, - 1208625: []string{"America/Los_Angeles"}, - 1208628: []string{"America/Denver"}, - 1208629: []string{"America/Denver"}, - 1208631: []string{"America/Denver"}, - 1208634: []string{"America/Denver"}, - 1208637: []string{"America/Denver"}, - 1208639: []string{"America/Denver"}, - 1208642: []string{"America/Denver"}, - 1208652: []string{"America/Denver"}, - 1208656: []string{"America/Denver"}, - 1208658: []string{"America/Denver"}, - 1208659: []string{"America/Los_Angeles"}, - 1208660: []string{"America/Los_Angeles"}, - 1208661: []string{"America/Los_Angeles"}, - 1208664: []string{"America/Los_Angeles"}, - 1208665: []string{"America/Los_Angeles"}, - 1208666: []string{"America/Los_Angeles"}, - 1208667: []string{"America/Los_Angeles"}, - 1208672: []string{"America/Denver"}, - 1208676: []string{"America/Los_Angeles"}, - 1208677: []string{"America/Denver"}, - 1208678: []string{"America/Denver"}, - 1208681: []string{"America/Denver"}, - 1208682: []string{"America/Los_Angeles"}, - 1208683: []string{"America/Los_Angeles"}, - 1208684: []string{"America/Denver"}, - 1208686: []string{"America/Los_Angeles"}, - 1208687: []string{"America/Los_Angeles"}, - 1208691: []string{"America/Los_Angeles"}, - 1208695: []string{"America/Denver"}, - 1208697: []string{"America/Denver"}, - 1208699: []string{"America/Los_Angeles"}, - 1208703: []string{"America/Denver"}, - 1208704: []string{"America/Los_Angeles"}, - 1208706: []string{"America/Denver"}, - 1208709: []string{"America/Denver"}, - 1208713: []string{"America/Denver"}, - 1208720: []string{"America/Denver"}, - 1208722: []string{"America/Denver"}, - 1208724: []string{"America/Denver"}, - 1208725: []string{"America/Denver"}, - 1208726: []string{"America/Denver"}, - 1208727: []string{"America/Denver"}, - 1208731: []string{"America/Denver"}, - 1208732: []string{"America/Denver"}, - 1208733: []string{"America/Denver"}, - 1208734: []string{"America/Denver"}, - 1208735: []string{"America/Denver"}, - 1208736: []string{"America/Denver"}, - 1208737: []string{"America/Denver"}, - 1208743: []string{"America/Los_Angeles"}, - 1208745: []string{"America/Denver"}, - 1208746: []string{"America/Los_Angeles"}, - 1208755: []string{"America/Los_Angeles"}, - 1208756: []string{"America/Denver"}, - 1208761: []string{"America/Denver"}, - 1208762: []string{"America/Los_Angeles"}, - 1208765: []string{"America/Los_Angeles"}, - 1208766: []string{"America/Denver"}, - 1208769: []string{"America/Los_Angeles"}, - 1208772: []string{"America/Los_Angeles"}, - 1208773: []string{"America/Los_Angeles"}, - 1208777: []string{"America/Los_Angeles"}, - 1208782: []string{"America/Denver"}, - 1208783: []string{"America/Los_Angeles"}, - 1208784: []string{"America/Los_Angeles"}, - 1208785: []string{"America/Denver"}, - 1208787: []string{"America/Denver"}, - 1208788: []string{"America/Denver"}, - 1208789: []string{"America/Denver"}, - 1208794: []string{"America/Denver"}, - 1208798: []string{"America/Los_Angeles"}, - 1208799: []string{"America/Los_Angeles"}, - 1208814: []string{"America/Denver"}, - 1208818: []string{"America/Los_Angeles"}, - 1208819: []string{"America/Los_Angeles"}, - 1208830: []string{"America/Denver"}, - 1208835: []string{"America/Los_Angeles"}, - 1208837: []string{"America/Denver"}, - 1208841: []string{"America/Denver"}, - 1208846: []string{"America/Denver"}, - 1208847: []string{"America/Denver"}, - 1208850: []string{"America/Denver"}, - 1208852: []string{"America/Denver"}, - 1208853: []string{"America/Denver"}, - 1208854: []string{"America/Denver"}, - 1208855: []string{"America/Denver"}, - 1208859: []string{"America/Denver"}, - 1208860: []string{"America/Denver"}, - 1208861: []string{"America/Denver"}, - 1208863: []string{"America/Denver"}, - 1208866: []string{"America/Denver"}, - 1208867: []string{"America/Denver"}, - 1208869: []string{"America/Denver"}, - 1208870: []string{"America/Denver"}, - 1208871: []string{"America/Denver"}, - 1208875: []string{"America/Los_Angeles"}, - 1208878: []string{"America/Denver"}, - 1208879: []string{"America/Denver"}, - 1208880: []string{"America/Denver"}, - 1208881: []string{"America/Denver"}, - 1208882: []string{"America/Los_Angeles"}, - 1208883: []string{"America/Los_Angeles"}, - 1208884: []string{"America/Denver"}, - 1208885: []string{"America/Los_Angeles"}, - 1208886: []string{"America/Denver"}, - 1208887: []string{"America/Denver"}, - 1208888: []string{"America/Denver"}, - 1208890: []string{"America/Denver"}, - 1208891: []string{"America/Denver"}, - 1208895: []string{"America/Denver"}, - 1208896: []string{"America/Denver"}, - 1208898: []string{"America/Denver"}, - 1208899: []string{"America/Denver"}, - 1208904: []string{"America/Denver"}, - 1208906: []string{"America/Denver"}, - 1208908: []string{"America/Denver"}, - 1208917: []string{"America/Denver"}, - 1208918: []string{"America/Denver"}, - 1208921: []string{"America/Denver"}, - 1208922: []string{"America/Denver"}, - 1208926: []string{"America/Los_Angeles"}, - 1208928: []string{"America/Denver"}, - 1208934: []string{"America/Denver"}, - 1208935: []string{"America/Los_Angeles"}, - 1208936: []string{"America/Denver"}, - 1208938: []string{"America/Denver"}, - 1208939: []string{"America/Denver"}, - 1208941: []string{"America/Denver"}, - 1208946: []string{"America/Los_Angeles"}, - 1208947: []string{"America/Denver"}, - 1208949: []string{"America/Denver"}, - 1208955: []string{"America/Denver"}, - 1208962: []string{"America/Los_Angeles"}, - 1208983: []string{"America/Los_Angeles"}, - 1208989: []string{"America/Denver"}, - 1208991: []string{"America/Denver"}, - 1208994: []string{"America/Denver"}, - 1208996: []string{"America/Denver"}, - 1209: []string{"America/Los_Angeles"}, - 1210: []string{"America/Chicago"}, - 1212: []string{"America/New_York"}, - 1213: []string{"America/Los_Angeles"}, - 1214: []string{"America/Chicago"}, - 1215: []string{"America/New_York"}, - 1216: []string{"America/New_York"}, - 1217: []string{"America/Chicago"}, - 1218: []string{"America/Chicago"}, - 1219226: []string{"America/Chicago"}, - 1219227: []string{"America/Chicago"}, - 1219242: []string{"America/Chicago"}, - 1219253: []string{"America/New_York"}, - 1219261: []string{"America/Chicago"}, - 1219263: []string{"America/Chicago"}, - 1219279: []string{"America/New_York"}, - 1219285: []string{"America/Chicago"}, - 1219299: []string{"America/Chicago"}, - 1219322: []string{"America/Chicago"}, - 1219324: []string{"America/Chicago"}, - 1219325: []string{"America/Chicago"}, - 1219326: []string{"America/Chicago"}, - 1219345: []string{"America/Chicago"}, - 1219362: []string{"America/Chicago"}, - 1219365: []string{"America/Chicago"}, - 1219369: []string{"America/Chicago"}, - 1219374: []string{"America/Chicago"}, - 1219392: []string{"America/Chicago"}, - 1219393: []string{"America/Chicago"}, - 1219395: []string{"America/Chicago"}, - 1219397: []string{"America/Chicago"}, - 1219398: []string{"America/Chicago"}, - 1219427: []string{"America/Chicago"}, - 1219440: []string{"America/Chicago"}, - 1219462: []string{"America/Chicago"}, - 1219464: []string{"America/Chicago"}, - 1219465: []string{"America/Chicago"}, - 1219472: []string{"America/Chicago"}, - 1219473: []string{"America/Chicago"}, - 1219474: []string{"America/Chicago"}, - 1219476: []string{"America/Chicago"}, - 1219477: []string{"America/Chicago"}, - 1219513: []string{"America/Chicago"}, - 1219531: []string{"America/Chicago"}, - 1219548: []string{"America/Chicago"}, - 1219558: []string{"America/Chicago"}, - 1219595: []string{"America/Chicago"}, - 1219659: []string{"America/Chicago"}, - 1219661: []string{"America/Chicago"}, - 1219662: []string{"America/Chicago"}, - 1219663: []string{"America/Chicago"}, - 1219690: []string{"America/Chicago"}, - 1219696: []string{"America/Chicago"}, - 1219707: []string{"America/Chicago"}, - 1219728: []string{"America/Chicago"}, - 1219733: []string{"America/Chicago"}, - 1219736: []string{"America/Chicago"}, - 1219738: []string{"America/Chicago"}, - 1219755: []string{"America/Chicago"}, - 1219756: []string{"America/Chicago"}, - 1219757: []string{"America/Chicago"}, - 1219759: []string{"America/Chicago"}, - 1219762: []string{"America/Chicago"}, - 1219763: []string{"America/Chicago"}, - 1219764: []string{"America/Chicago"}, - 1219766: []string{"America/Chicago"}, - 1219769: []string{"America/Chicago"}, - 1219778: []string{"America/Chicago"}, - 1219779: []string{"America/Chicago"}, - 1219785: []string{"America/Chicago"}, - 1219787: []string{"America/Chicago"}, - 1219791: []string{"America/Chicago"}, - 1219803: []string{"America/Chicago"}, - 1219836: []string{"America/Chicago"}, - 1219838: []string{"America/Chicago"}, - 1219844: []string{"America/Chicago"}, - 1219845: []string{"America/Chicago"}, - 1219852: []string{"America/Chicago"}, - 1219853: []string{"America/Chicago"}, - 1219864: []string{"America/Chicago"}, - 1219865: []string{"America/Chicago"}, - 1219866: []string{"America/Chicago"}, - 1219872: []string{"America/Chicago"}, - 1219873: []string{"America/Chicago"}, - 1219874: []string{"America/Chicago"}, - 1219878: []string{"America/Chicago"}, - 1219879: []string{"America/Chicago"}, - 1219881: []string{"America/Chicago"}, - 1219882: []string{"America/Chicago"}, - 1219884: []string{"America/Chicago"}, - 1219885: []string{"America/Chicago"}, - 1219886: []string{"America/Chicago"}, - 1219887: []string{"America/Chicago"}, - 1219921: []string{"America/Chicago"}, - 1219922: []string{"America/Chicago"}, - 1219923: []string{"America/Chicago"}, - 1219924: []string{"America/Chicago"}, - 1219926: []string{"America/Chicago"}, - 1219929: []string{"America/Chicago"}, - 1219931: []string{"America/Chicago"}, - 1219932: []string{"America/Chicago"}, - 1219933: []string{"America/Chicago"}, - 1219934: []string{"America/Chicago"}, - 1219937: []string{"America/Chicago"}, - 1219938: []string{"America/Chicago"}, - 1219939: []string{"America/Chicago"}, - 1219940: []string{"America/Chicago"}, - 1219942: []string{"America/Chicago"}, - 1219944: []string{"America/Chicago"}, - 1219945: []string{"America/Chicago"}, - 1219947: []string{"America/Chicago"}, - 1219949: []string{"America/Chicago"}, - 1219956: []string{"America/Chicago"}, - 1219962: []string{"America/Chicago"}, - 1219963: []string{"America/Chicago"}, - 1219972: []string{"America/Chicago"}, - 1219977: []string{"America/Chicago"}, - 1219980: []string{"America/Chicago"}, - 1219983: []string{"America/Chicago"}, - 1219987: []string{"America/Chicago"}, - 1219989: []string{"America/Chicago"}, - 1219996: []string{"America/Chicago"}, - 1224: []string{"America/Chicago"}, - 1225: []string{"America/Chicago"}, - 1226: []string{"America/Toronto"}, - 1228: []string{"America/Chicago"}, - 1229: []string{"America/New_York"}, - 1231: []string{"America/New_York"}, - 1234: []string{"America/New_York"}, - 1236: []string{"America/Vancouver"}, - 1239: []string{"America/New_York"}, - 1240: []string{"America/New_York"}, - 1242: []string{"America/Nassau"}, - 1246: []string{"America/Barbados"}, - 1248: []string{"America/New_York"}, - 1250212: []string{"America/Vancouver"}, - 1250213: []string{"America/Vancouver"}, - 1250215: []string{"America/Vancouver"}, - 1250216: []string{"America/Vancouver"}, - 1250217: []string{"America/Vancouver"}, - 1250218: []string{"America/Vancouver"}, - 1250220: []string{"America/Vancouver"}, - 1250226: []string{"America/Vancouver"}, - 1250240: []string{"America/Vancouver"}, - 1250242: []string{"America/Edmonton"}, - 1250245: []string{"America/Vancouver"}, - 1250246: []string{"America/Vancouver"}, - 1250247: []string{"America/Vancouver"}, - 1250248: []string{"America/Vancouver"}, - 1250256: []string{"America/Vancouver"}, - 1250260: []string{"America/Vancouver"}, - 1250261: []string{"America/Edmonton"}, - 1250262: []string{"America/Edmonton"}, - 1250263: []string{"America/Edmonton"}, - 1250265: []string{"America/Vancouver"}, - 1250283: []string{"America/Vancouver"}, - 1250285: []string{"America/Vancouver"}, - 1250286: []string{"America/Vancouver"}, - 1250287: []string{"America/Vancouver"}, - 1250295: []string{"America/Vancouver"}, - 1250300: []string{"America/Vancouver"}, - 1250304: []string{"America/Vancouver"}, - 1250305: []string{"America/Vancouver"}, - 1250309: []string{"America/Vancouver"}, - 1250314: []string{"America/Vancouver"}, - 1250317: []string{"America/Vancouver"}, - 1250318: []string{"America/Vancouver"}, - 1250319: []string{"America/Vancouver"}, - 1250320: []string{"America/Vancouver"}, - 1250331: []string{"America/Vancouver"}, - 1250334: []string{"America/Vancouver"}, - 1250335: []string{"America/Vancouver"}, - 1250336: []string{"America/Vancouver"}, - 1250337: []string{"America/Vancouver"}, - 1250338: []string{"America/Vancouver"}, - 1250339: []string{"America/Vancouver"}, - 1250341: []string{"America/Edmonton"}, - 1250342: []string{"America/Edmonton"}, - 1250344: []string{"America/Edmonton"}, - 1250347: []string{"America/Edmonton"}, - 1250352: []string{"America/Vancouver"}, - 1250353: []string{"America/Vancouver"}, - 1250354: []string{"America/Vancouver"}, - 1250356: []string{"America/Vancouver"}, - 1250357: []string{"America/Vancouver"}, - 1250360: []string{"America/Vancouver"}, - 1250361: []string{"America/Vancouver"}, - 1250362: []string{"America/Vancouver"}, - 1250363: []string{"America/Vancouver"}, - 1250364: []string{"America/Vancouver"}, - 1250365: []string{"America/Vancouver"}, - 1250367: []string{"America/Vancouver"}, - 1250368: []string{"America/Vancouver"}, - 1250370: []string{"America/Vancouver"}, - 1250371: []string{"America/Vancouver"}, - 1250372: []string{"America/Vancouver"}, - 1250374: []string{"America/Vancouver"}, - 1250376: []string{"America/Vancouver"}, - 1250377: []string{"America/Vancouver"}, - 1250378: []string{"America/Vancouver"}, - 125038: []string{"America/Vancouver"}, - 1250390: []string{"America/Vancouver"}, - 1250391: []string{"America/Vancouver"}, - 1250392: []string{"America/Vancouver"}, - 1250395: []string{"America/Vancouver"}, - 1250398: []string{"America/Vancouver"}, - 1250412: []string{"America/Vancouver"}, - 1250417: []string{"America/Edmonton"}, - 1250423: []string{"America/Edmonton"}, - 1250425: []string{"America/Edmonton"}, - 1250426: []string{"America/Edmonton"}, - 1250427: []string{"America/Edmonton"}, - 1250428: []string{"America/Edmonton"}, - 1250434: []string{"America/Vancouver"}, - 1250442: []string{"America/Vancouver"}, - 1250448: []string{"America/Vancouver"}, - 1250453: []string{"America/Vancouver"}, - 1250457: []string{"America/Vancouver"}, - 1250468: []string{"America/Vancouver"}, - 1250469: []string{"America/Vancouver"}, - 1250470: []string{"America/Vancouver"}, - 1250472: []string{"America/Vancouver"}, - 1250474: []string{"America/Vancouver"}, - 1250475: []string{"America/Vancouver"}, - 1250477: []string{"America/Vancouver"}, - 1250478: []string{"America/Vancouver"}, - 1250479: []string{"America/Vancouver"}, - 1250480: []string{"America/Vancouver"}, - 1250483: []string{"America/Vancouver"}, - 1250486: []string{"America/Vancouver"}, - 1250487: []string{"America/Vancouver"}, - 1250488: []string{"America/Vancouver"}, - 1250489: []string{"America/Edmonton"}, - 1250490: []string{"America/Vancouver"}, - 1250491: []string{"America/Vancouver"}, - 1250492: []string{"America/Vancouver"}, - 1250493: []string{"America/Vancouver"}, - 1250494: []string{"America/Vancouver"}, - 1250495: []string{"America/Vancouver"}, - 1250497: []string{"America/Vancouver"}, - 1250498: []string{"America/Vancouver"}, - 1250499: []string{"America/Vancouver"}, - 1250503: []string{"America/Vancouver"}, - 1250505: []string{"America/Vancouver"}, - 1250507: []string{"America/Vancouver"}, - 1250514: []string{"America/Vancouver"}, - 1250516: []string{"America/Vancouver"}, - 1250537: []string{"America/Vancouver"}, - 1250539: []string{"America/Vancouver"}, - 1250542: []string{"America/Vancouver"}, - 1250544: []string{"America/Vancouver"}, - 1250545: []string{"America/Vancouver"}, - 1250546: []string{"America/Vancouver"}, - 1250547: []string{"America/Vancouver"}, - 1250549: []string{"America/Vancouver"}, - 1250550: []string{"America/Vancouver"}, - 1250551: []string{"America/Vancouver"}, - 1250554: []string{"America/Vancouver"}, - 1250558: []string{"America/Vancouver"}, - 1250559: []string{"America/Vancouver"}, - 1250561: []string{"America/Vancouver"}, - 1250562: []string{"America/Vancouver"}, - 1250563: []string{"America/Vancouver"}, - 1250564: []string{"America/Vancouver"}, - 1250565: []string{"America/Vancouver"}, - 1250566: []string{"America/Vancouver"}, - 1250567: []string{"America/Vancouver"}, - 1250569: []string{"America/Vancouver"}, - 1250573: []string{"America/Vancouver"}, - 1250575: []string{"America/Vancouver"}, - 1250578: []string{"America/Vancouver"}, - 1250579: []string{"America/Vancouver"}, - 1250585: []string{"America/Vancouver"}, - 1250586: []string{"America/Vancouver"}, - 1250588: []string{"America/Vancouver"}, - 1250589: []string{"America/Vancouver"}, - 1250590: []string{"America/Vancouver"}, - 1250591: []string{"America/Vancouver"}, - 1250592: []string{"America/Vancouver"}, - 1250594: []string{"America/Vancouver"}, - 1250595: []string{"America/Vancouver"}, - 1250596: []string{"America/Vancouver"}, - 1250597: []string{"America/Vancouver"}, - 1250598: []string{"America/Vancouver"}, - 1250612: []string{"America/Vancouver"}, - 1250614: []string{"America/Vancouver"}, - 1250615: []string{"America/Vancouver"}, - 1250618: []string{"America/Vancouver"}, - 1250619: []string{"America/Vancouver"}, - 1250624: []string{"America/Vancouver"}, - 1250626: []string{"America/Vancouver"}, - 1250627: []string{"America/Vancouver"}, - 1250629: []string{"America/Vancouver"}, - 1250632: []string{"America/Vancouver"}, - 1250635: []string{"America/Vancouver"}, - 1250638: []string{"America/Vancouver"}, - 1250642: []string{"America/Vancouver"}, - 1250650: []string{"America/Vancouver"}, - 1250652: []string{"America/Vancouver"}, - 1250655: []string{"America/Vancouver"}, - 1250656: []string{"America/Vancouver"}, - 1250658: []string{"America/Vancouver"}, - 1250661: []string{"America/Vancouver"}, - 1250672: []string{"America/Vancouver"}, - 1250674: []string{"America/Vancouver"}, - 1250675: []string{"America/Vancouver"}, - 1250679: []string{"America/Vancouver"}, - 1250686: []string{"America/Vancouver"}, - 1250692: []string{"America/Vancouver"}, - 1250699: []string{"America/Vancouver"}, - 1250701: []string{"America/Vancouver"}, - 1250702: []string{"America/Vancouver"}, - 1250703: []string{"America/Vancouver"}, - 1250707: []string{"America/Vancouver"}, - 1250709: []string{"America/Vancouver"}, - 1250710: []string{"America/Vancouver"}, - 1250712: []string{"America/Vancouver"}, - 1250714: []string{"America/Vancouver"}, - 1250715: []string{"America/Vancouver"}, - 1250716: []string{"America/Vancouver"}, - 1250717: []string{"America/Vancouver"}, - 1250718: []string{"America/Vancouver"}, - 1250719: []string{"America/Edmonton"}, - 1250720: []string{"America/Vancouver"}, - 1250721: []string{"America/Vancouver"}, - 1250722: []string{"America/Vancouver"}, - 1250723: []string{"America/Vancouver"}, - 1250724: []string{"America/Vancouver"}, - 1250725: []string{"America/Vancouver"}, - 1250726: []string{"America/Vancouver"}, - 1250727: []string{"America/Vancouver"}, - 1250729: []string{"America/Vancouver"}, - 1250740: []string{"America/Vancouver"}, - 1250741: []string{"America/Vancouver"}, - 1250743: []string{"America/Vancouver"}, - 1250744: []string{"America/Vancouver"}, - 1250746: []string{"America/Vancouver"}, - 1250747: []string{"America/Vancouver"}, - 1250748: []string{"America/Vancouver"}, - 1250749: []string{"America/Vancouver"}, - 1250751: []string{"America/Vancouver"}, - 1250752: []string{"America/Vancouver"}, - 1250753: []string{"America/Vancouver"}, - 1250754: []string{"America/Vancouver"}, - 1250755: []string{"America/Vancouver"}, - 1250756: []string{"America/Vancouver"}, - 1250758: []string{"America/Vancouver"}, - 1250762: []string{"America/Vancouver"}, - 1250763: []string{"America/Vancouver"}, - 1250764: []string{"America/Vancouver"}, - 1250765: []string{"America/Vancouver"}, - 1250766: []string{"America/Vancouver"}, - 1250767: []string{"America/Vancouver"}, - 1250768: []string{"America/Vancouver"}, - 1250769: []string{"America/Vancouver"}, - 1250770: []string{"America/Vancouver"}, - 1250774: []string{"America/Edmonton"}, - 1250782: []string{"America/Edmonton"}, - 1250784: []string{"America/Edmonton"}, - 1250785: []string{"America/Edmonton"}, - 1250787: []string{"America/Edmonton"}, - 1250788: []string{"America/Edmonton"}, - 1250801: []string{"America/Vancouver"}, - 1250803: []string{"America/Vancouver"}, - 1250804: []string{"America/Vancouver"}, - 1250807: []string{"America/Vancouver"}, - 1250808: []string{"America/Vancouver"}, - 1250809: []string{"America/Vancouver"}, - 1250812: []string{"America/Vancouver"}, - 1250814: []string{"America/Vancouver"}, - 1250818: []string{"America/Vancouver"}, - 1250819: []string{"America/Vancouver"}, - 1250826: []string{"America/Vancouver"}, - 1250828: []string{"America/Vancouver"}, - 1250830: []string{"America/Vancouver"}, - 1250832: []string{"America/Vancouver"}, - 1250833: []string{"America/Vancouver"}, - 1250836: []string{"America/Vancouver"}, - 1250837: []string{"America/Vancouver"}, - 1250838: []string{"America/Vancouver"}, - 1250842: []string{"America/Vancouver"}, - 1250845: []string{"America/Vancouver"}, - 1250847: []string{"America/Vancouver"}, - 1250851: []string{"America/Vancouver"}, - 1250857: []string{"America/Vancouver"}, - 1250858: []string{"America/Vancouver"}, - 1250859: []string{"America/Vancouver"}, - 1250860: []string{"America/Vancouver"}, - 1250861: []string{"America/Vancouver"}, - 1250862: []string{"America/Vancouver"}, - 1250863: []string{"America/Vancouver"}, - 1250864: []string{"America/Vancouver"}, - 1250868: []string{"America/Vancouver"}, - 1250869: []string{"America/Vancouver"}, - 1250870: []string{"America/Vancouver"}, - 1250871: []string{"America/Vancouver"}, - 1250877: []string{"America/Vancouver"}, - 1250878: []string{"America/Vancouver"}, - 1250881: []string{"America/Vancouver"}, - 1250882: []string{"America/Vancouver"}, - 1250884: []string{"America/Vancouver"}, - 1250885: []string{"America/Vancouver"}, - 1250886: []string{"America/Vancouver"}, - 1250888: []string{"America/Vancouver"}, - 1250889: []string{"America/Vancouver"}, - 1250893: []string{"America/Vancouver"}, - 1250896: []string{"America/Vancouver"}, - 1250897: []string{"America/Vancouver"}, - 1250898: []string{"America/Vancouver"}, - 1250920: []string{"America/Vancouver"}, - 1250923: []string{"America/Vancouver"}, - 1250929: []string{"America/Vancouver"}, - 1250933: []string{"America/Vancouver"}, - 1250941: []string{"America/Vancouver"}, - 1250949: []string{"America/Vancouver"}, - 1250951: []string{"America/Vancouver"}, - 1250952: []string{"America/Vancouver"}, - 1250954: []string{"America/Vancouver"}, - 1250956: []string{"America/Vancouver"}, - 1250960: []string{"America/Vancouver"}, - 1250961: []string{"America/Vancouver"}, - 1250962: []string{"America/Vancouver"}, - 1250963: []string{"America/Vancouver"}, - 1250964: []string{"America/Vancouver"}, - 1250974: []string{"America/Vancouver"}, - 1250979: []string{"America/Vancouver"}, - 1250991: []string{"America/Vancouver"}, - 1250992: []string{"America/Vancouver"}, - 1250996: []string{"America/Vancouver"}, - 1250997: []string{"America/Vancouver"}, - 1250999: []string{"America/Vancouver"}, - 1251: []string{"America/Chicago"}, - 1252: []string{"America/New_York"}, - 1253: []string{"America/Los_Angeles"}, - 1254: []string{"America/Chicago"}, - 1256: []string{"America/Chicago"}, - 1260: []string{"America/New_York"}, - 1262: []string{"America/Chicago"}, - 1264: []string{"America/Anguilla"}, - 1267: []string{"America/New_York"}, - 1268: []string{"America/Antigua"}, - 1269: []string{"America/New_York"}, - 1270202: []string{"America/Chicago"}, - 1270230: []string{"America/Chicago"}, - 1270234: []string{"America/New_York"}, - 1270236: []string{"America/Chicago"}, - 1270237: []string{"America/Chicago"}, - 1270240: []string{"America/Chicago"}, - 1270242: []string{"America/Chicago"}, - 1270247: []string{"America/Chicago"}, - 1270251: []string{"America/Chicago"}, - 1270259: []string{"America/Chicago"}, - 1270265: []string{"America/Chicago"}, - 1270273: []string{"America/Chicago"}, - 1270274: []string{"America/Chicago"}, - 1270282: []string{"America/Chicago"}, - 1270298: []string{"America/Chicago"}, - 1270333: []string{"America/Chicago"}, - 1270335: []string{"America/Chicago"}, - 1270338: []string{"America/Chicago"}, - 1270343: []string{"America/Chicago"}, - 1270351: []string{"America/New_York"}, - 1270352: []string{"America/New_York"}, - 1270354: []string{"America/Chicago"}, - 1270358: []string{"America/New_York"}, - 1270360: []string{"America/New_York"}, - 1270362: []string{"America/Chicago"}, - 1270365: []string{"America/Chicago"}, - 1270369: []string{"America/New_York"}, - 1270384: []string{"America/Chicago"}, - 1270388: []string{"America/Chicago"}, - 1270389: []string{"America/Chicago"}, - 1270393: []string{"America/Chicago"}, - 1270395: []string{"America/Chicago"}, - 1270415: []string{"America/Chicago"}, - 1270422: []string{"America/New_York"}, - 1270432: []string{"America/Chicago"}, - 1270439: []string{"America/Chicago"}, - 1270441: []string{"America/Chicago"}, - 1270442: []string{"America/Chicago"}, - 1270443: []string{"America/Chicago"}, - 1270444: []string{"America/Chicago"}, - 1270465: []string{"America/New_York"}, - 1270469: []string{"America/New_York"}, - 1270472: []string{"America/Chicago"}, - 1270475: []string{"America/Chicago"}, - 1270483: []string{"America/Chicago"}, - 1270487: []string{"America/Chicago"}, - 1270495: []string{"America/Chicago"}, - 1270522: []string{"America/Chicago"}, - 1270524: []string{"America/Chicago"}, - 1270526: []string{"America/Chicago"}, - 1270527: []string{"America/Chicago"}, - 1270528: []string{"America/Chicago"}, - 1270534: []string{"America/Chicago"}, - 1270538: []string{"America/Chicago"}, - 1270542: []string{"America/Chicago"}, - 1270547: []string{"America/Chicago"}, - 1270554: []string{"America/Chicago"}, - 1270563: []string{"America/Chicago"}, - 1270575: []string{"America/Chicago"}, - 1270586: []string{"America/Chicago"}, - 1270597: []string{"America/Chicago"}, - 1270598: []string{"America/Chicago"}, - 1270622: []string{"America/Chicago"}, - 1270628: []string{"America/Chicago"}, - 1270629: []string{"America/Chicago"}, - 1270639: []string{"America/Chicago"}, - 1270640: []string{"America/Chicago"}, - 1270646: []string{"America/Chicago"}, - 1270651: []string{"America/Chicago"}, - 1270653: []string{"America/Chicago"}, - 1270659: []string{"America/Chicago"}, - 1270665: []string{"America/Chicago"}, - 1270667: []string{"America/Chicago"}, - 1270678: []string{"America/Chicago"}, - 1270683: []string{"America/Chicago"}, - 1270684: []string{"America/Chicago"}, - 1270685: []string{"America/Chicago"}, - 1270686: []string{"America/Chicago"}, - 1270687: []string{"America/Chicago"}, - 1270688: []string{"America/Chicago"}, - 1270689: []string{"America/Chicago"}, - 1270691: []string{"America/Chicago"}, - 1270692: []string{"America/New_York"}, - 1270699: []string{"America/New_York"}, - 1270707: []string{"America/Chicago"}, - 1270725: []string{"America/Chicago"}, - 1270726: []string{"America/Chicago"}, - 1270735: []string{"America/New_York"}, - 1270737: []string{"America/New_York"}, - 1270745: []string{"America/Chicago"}, - 1270746: []string{"America/Chicago"}, - 1270753: []string{"America/Chicago"}, - 1270754: []string{"America/Chicago"}, - 1270755: []string{"America/Chicago"}, - 1270756: []string{"America/Chicago"}, - 1270759: []string{"America/Chicago"}, - 1270761: []string{"America/Chicago"}, - 1270762: []string{"America/Chicago"}, - 1270763: []string{"America/New_York"}, - 1270765: []string{"America/New_York"}, - 1270766: []string{"America/New_York"}, - 1270767: []string{"America/Chicago"}, - 1270769: []string{"America/New_York"}, - 1270773: []string{"America/Chicago"}, - 1270780: []string{"America/Chicago"}, - 1270781: []string{"America/Chicago"}, - 1270782: []string{"America/Chicago"}, - 1270783: []string{"America/Chicago"}, - 1270786: []string{"America/Chicago"}, - 1270789: []string{"America/New_York"}, - 1270793: []string{"America/Chicago"}, - 1270796: []string{"America/Chicago"}, - 1270797: []string{"America/Chicago"}, - 1270798: []string{"America/Chicago"}, - 1270821: []string{"America/Chicago"}, - 1270824: []string{"America/Chicago"}, - 1270825: []string{"America/Chicago"}, - 1270826: []string{"America/Chicago"}, - 1270827: []string{"America/Chicago"}, - 1270828: []string{"America/New_York"}, - 1270830: []string{"America/Chicago"}, - 1270831: []string{"America/Chicago"}, - 1270842: []string{"America/Chicago"}, - 1270843: []string{"America/Chicago"}, - 1270846: []string{"America/Chicago"}, - 1270852: []string{"America/Chicago"}, - 1270862: []string{"America/New_York"}, - 1270864: []string{"America/Chicago"}, - 1270866: []string{"America/Chicago"}, - 1270877: []string{"America/New_York"}, - 1270879: []string{"America/Chicago"}, - 1270881: []string{"America/Chicago"}, - 1270885: []string{"America/Chicago"}, - 1270886: []string{"America/Chicago"}, - 1270887: []string{"America/Chicago"}, - 1270889: []string{"America/Chicago"}, - 1270898: []string{"America/Chicago"}, - 1270901: []string{"America/Chicago"}, - 1270904: []string{"America/Chicago"}, - 1270924: []string{"America/Chicago"}, - 1270926: []string{"America/Chicago"}, - 1270927: []string{"America/Chicago"}, - 1270928: []string{"America/Chicago"}, - 1270929: []string{"America/Chicago"}, - 1270932: []string{"America/Chicago"}, - 1270965: []string{"America/Chicago"}, - 1270982: []string{"America/New_York"}, - 1270988: []string{"America/Chicago"}, - 1276: []string{"America/New_York"}, - 1281: []string{"America/Chicago"}, - 1284: []string{"America/Tortola"}, - 1289: []string{"America/Toronto"}, - 1301: []string{"America/New_York"}, - 1302: []string{"America/New_York"}, - 1303: []string{"America/Denver"}, - 1304: []string{"America/New_York"}, - 1305: []string{"America/New_York"}, - 1306: []string{"America/Winnipeg"}, - 1307: []string{"America/Denver"}, - 1308221: []string{"America/Chicago"}, - 1308233: []string{"America/Chicago"}, - 1308234: []string{"America/Chicago"}, - 1308235: []string{"America/Denver"}, - 1308236: []string{"America/Chicago"}, - 1308237: []string{"America/Chicago"}, - 130824: []string{"America/Denver"}, - 1308254: []string{"America/Denver"}, - 1308262: []string{"America/Denver"}, - 1308282: []string{"America/Denver"}, - 1308284: []string{"America/Denver"}, - 1308324: []string{"America/Chicago"}, - 1308327: []string{"America/Denver"}, - 1308345: []string{"America/Chicago"}, - 1308346: []string{"America/Chicago"}, - 1308352: []string{"America/Denver"}, - 1308367: []string{"America/Chicago"}, - 1308380: []string{"America/Chicago"}, - 1308381: []string{"America/Chicago"}, - 1308382: []string{"America/Chicago"}, - 1308384: []string{"America/Chicago"}, - 1308385: []string{"America/Chicago"}, - 1308389: []string{"America/Chicago"}, - 1308394: []string{"America/Denver"}, - 1308398: []string{"America/Chicago"}, - 1308423: []string{"America/Denver"}, - 1308425: []string{"America/Chicago"}, - 1308432: []string{"America/Denver"}, - 1308436: []string{"America/Denver"}, - 1308440: []string{"America/Chicago"}, - 1308452: []string{"America/Chicago"}, - 1308455: []string{"America/Chicago"}, - 1308468: []string{"America/Chicago"}, - 1308532: []string{"America/Chicago"}, - 1308534: []string{"America/Chicago"}, - 1308535: []string{"America/Chicago"}, - 1308536: []string{"America/Chicago"}, - 1308537: []string{"America/Chicago"}, - 1308583: []string{"America/Chicago"}, - 1308623: []string{"America/Denver"}, - 1308630: []string{"America/Denver"}, - 1308632: []string{"America/Denver"}, - 1308633: []string{"America/Denver"}, - 1308635: []string{"America/Denver"}, - 1308665: []string{"America/Denver"}, - 1308675: []string{"America/Chicago"}, - 1308696: []string{"America/Chicago"}, - 1308697: []string{"America/Chicago"}, - 1308728: []string{"America/Chicago"}, - 1308745: []string{"America/Chicago"}, - 1308754: []string{"America/Chicago"}, - 1308762: []string{"America/Denver"}, - 1308772: []string{"America/Denver"}, - 1308784: []string{"America/Chicago"}, - 1308785: []string{"America/Chicago"}, - 1308832: []string{"America/Chicago"}, - 1308865: []string{"America/Chicago"}, - 1308872: []string{"America/Chicago"}, - 1308874: []string{"America/Denver"}, - 1308882: []string{"America/Denver"}, - 1308928: []string{"America/Chicago"}, - 1308946: []string{"America/Chicago"}, - 1308962: []string{"America/Chicago"}, - 1308995: []string{"America/Chicago"}, - 1309: []string{"America/Chicago"}, - 1310: []string{"America/Los_Angeles"}, - 1312: []string{"America/Chicago"}, - 1313: []string{"America/New_York"}, - 1314: []string{"America/Chicago"}, - 1315: []string{"America/New_York"}, - 1316: []string{"America/Chicago"}, - 1317: []string{"America/New_York"}, - 1318: []string{"America/Chicago"}, - 1319: []string{"America/Chicago"}, - 1320: []string{"America/Chicago"}, - 1321: []string{"America/New_York"}, - 1323: []string{"America/Los_Angeles"}, - 1325: []string{"America/Chicago"}, - 1330: []string{"America/New_York"}, - 1331: []string{"America/Chicago"}, - 1334: []string{"America/Chicago"}, - 1336: []string{"America/New_York"}, - 1337: []string{"America/Chicago"}, - 1340: []string{"America/St_Thomas"}, - 1345: []string{"America/Cayman"}, - 1346: []string{"America/Chicago"}, - 1347: []string{"America/New_York"}, - 1351: []string{"America/New_York"}, - 1352: []string{"America/New_York"}, - 1360: []string{"America/Los_Angeles"}, - 1361: []string{"America/Chicago"}, - 1385: []string{"America/Denver"}, - 1386: []string{"America/New_York"}, - 1401: []string{"America/New_York"}, - 1402: []string{"America/Chicago"}, - 1403: []string{"America/Edmonton"}, - 1404: []string{"America/New_York"}, - 1405: []string{"America/Chicago"}, - 1406: []string{"America/Denver"}, - 1407: []string{"America/New_York"}, - 1408: []string{"America/Los_Angeles"}, - 1409: []string{"America/Chicago"}, - 1410: []string{"America/New_York"}, - 1412: []string{"America/New_York"}, - 1413: []string{"America/New_York"}, - 1414: []string{"America/Chicago"}, - 1415: []string{"America/Los_Angeles"}, - 1416: []string{"America/Toronto"}, - 1417: []string{"America/Chicago"}, - 1418221: []string{"America/Toronto"}, - 1418222: []string{"America/Toronto"}, - 1418226: []string{"America/Toronto"}, - 1418227: []string{"America/Toronto"}, - 1418228: []string{"America/Toronto"}, - 1418233: []string{"America/Toronto"}, - 1418235: []string{"America/Toronto"}, - 1418236: []string{"America/Toronto"}, - 1418247: []string{"America/Toronto"}, - 1418248: []string{"America/Toronto"}, - 1418253: []string{"America/Toronto"}, - 1418261: []string{"America/Toronto"}, - 1418262: []string{"America/Toronto"}, - 1418263: []string{"America/Toronto"}, - 1418264: []string{"America/Toronto"}, - 1418266: []string{"America/Toronto"}, - 1418268: []string{"America/Toronto"}, - 1418269: []string{"America/Toronto"}, - 1418272: []string{"America/Toronto"}, - 1418274: []string{"America/Toronto"}, - 1418275: []string{"America/Toronto"}, - 1418276: []string{"America/Toronto"}, - 1418285: []string{"America/Toronto"}, - 1418286: []string{"America/Toronto"}, - 1418287: []string{"America/Toronto"}, - 1418289: []string{"America/Toronto"}, - 1418295: []string{"America/Toronto"}, - 1418296: []string{"America/Toronto"}, - 1418325: []string{"America/Toronto"}, - 1418328: []string{"America/Toronto"}, - 1418332: []string{"America/Toronto"}, - 1418335: []string{"America/Toronto"}, - 1418337: []string{"America/Toronto"}, - 1418338: []string{"America/Toronto"}, - 1418343: []string{"America/Toronto"}, - 1418347: []string{"America/Toronto"}, - 1418349: []string{"America/Toronto"}, - 1418353: []string{"America/Toronto"}, - 1418356: []string{"America/Toronto"}, - 1418362: []string{"America/Toronto"}, - 1418364: []string{"America/Toronto"}, - 1418365: []string{"America/Toronto"}, - 1418368: []string{"America/Toronto"}, - 1418380: []string{"America/Toronto"}, - 1418383: []string{"America/Toronto"}, - 1418385: []string{"America/Toronto"}, - 1418386: []string{"America/Toronto"}, - 1418387: []string{"America/Toronto"}, - 1418388: []string{"America/Toronto"}, - 1418392: []string{"America/Toronto"}, - 1418397: []string{"America/Toronto"}, - 1418407: []string{"America/Toronto"}, - 1418423: []string{"America/Toronto"}, - 1418426: []string{"America/Toronto"}, - 1418427: []string{"America/Toronto"}, - 1418435: []string{"America/Toronto"}, - 1418439: []string{"America/Toronto"}, - 1418449: []string{"America/Toronto"}, - 1418459: []string{"America/Toronto"}, - 1418475: []string{"America/Toronto"}, - 1418476: []string{"America/Toronto"}, - 1418480: []string{"America/Toronto"}, - 1418484: []string{"America/Toronto"}, - 1418486: []string{"America/Toronto"}, - 1418492: []string{"America/Toronto"}, - 1418522: []string{"America/Toronto"}, - 1418523: []string{"America/Toronto"}, - 1418524: []string{"America/Toronto"}, - 1418525: []string{"America/Toronto"}, - 1418527: []string{"America/Toronto"}, - 1418529: []string{"America/Toronto"}, - 1418534: []string{"America/Toronto"}, - 1418538: []string{"America/Toronto"}, - 1418542: []string{"America/Toronto"}, - 1418543: []string{"America/Toronto"}, - 1418544: []string{"America/Toronto"}, - 1418545: []string{"America/Toronto"}, - 1418547: []string{"America/Toronto"}, - 1418548: []string{"America/Toronto"}, - 1418549: []string{"America/Toronto"}, - 1418561: []string{"America/Toronto"}, - 1418562: []string{"America/Toronto"}, - 1418563: []string{"America/Toronto"}, - 1418566: []string{"America/Toronto"}, - 1418567: []string{"America/Toronto"}, - 1418587: []string{"America/Toronto"}, - 1418588: []string{"America/Toronto"}, - 1418589: []string{"America/Toronto"}, - 1418594: []string{"America/Toronto"}, - 1418598: []string{"America/Toronto"}, - 1418602: []string{"America/Toronto"}, - 1418603: []string{"America/Toronto"}, - 1418614: []string{"America/Toronto"}, - 1418622: []string{"America/Toronto"}, - 1418623: []string{"America/Toronto"}, - 1418624: []string{"America/Toronto"}, - 1418625: []string{"America/Toronto"}, - 1418626: []string{"America/Toronto"}, - 1418627: []string{"America/Toronto"}, - 1418628: []string{"America/Toronto"}, - 1418629: []string{"America/Toronto"}, - 1418641: []string{"America/Toronto"}, - 1418643: []string{"America/Toronto"}, - 1418647: []string{"America/Toronto"}, - 1418648: []string{"America/Toronto"}, - 1418649: []string{"America/Toronto"}, - 141865: []string{"America/Toronto"}, - 1418660: []string{"America/Toronto"}, - 1418661: []string{"America/Toronto"}, - 1418662: []string{"America/Toronto"}, - 1418663: []string{"America/Toronto"}, - 1418665: []string{"America/Toronto"}, - 1418666: []string{"America/Toronto"}, - 1418667: []string{"America/Toronto"}, - 1418668: []string{"America/Toronto"}, - 1418669: []string{"America/Toronto"}, - 1418672: []string{"America/Toronto"}, - 1418673: []string{"America/Toronto"}, - 1418678: []string{"America/Toronto"}, - 1418679: []string{"America/Toronto"}, - 1418681: []string{"America/Toronto"}, - 1418682: []string{"America/Toronto"}, - 1418683: []string{"America/Toronto"}, - 1418686: []string{"America/Toronto"}, - 1418687: []string{"America/Toronto"}, - 1418688: []string{"America/Toronto"}, - 1418689: []string{"America/Toronto"}, - 1418690: []string{"America/Toronto"}, - 1418692: []string{"America/Toronto"}, - 1418693: []string{"America/Toronto"}, - 1418694: []string{"America/Toronto"}, - 1418695: []string{"America/Toronto"}, - 1418696: []string{"America/Toronto"}, - 1418698: []string{"America/Toronto"}, - 1418704: []string{"America/Toronto"}, - 1418721: []string{"America/Toronto"}, - 1418722: []string{"America/Toronto"}, - 1418723: []string{"America/Toronto"}, - 1418724: []string{"America/Toronto"}, - 1418725: []string{"America/Toronto"}, - 1418728: []string{"America/Toronto"}, - 1418732: []string{"America/Toronto"}, - 1418736: []string{"America/Toronto"}, - 1418739: []string{"America/Toronto"}, - 1418745: []string{"America/Toronto"}, - 1418748: []string{"America/Toronto"}, - 1418750: []string{"America/Toronto"}, - 1418752: []string{"America/Toronto"}, - 1418756: []string{"America/Toronto"}, - 1418759: []string{"America/Toronto"}, - 1418763: []string{"America/Toronto"}, - 1418766: []string{"America/Toronto"}, - 1418774: []string{"America/Toronto"}, - 1418775: []string{"America/Toronto"}, - 1418780: []string{"America/Toronto"}, - 1418781: []string{"America/Toronto"}, - 1418782: []string{"America/Toronto"}, - 1418788: []string{"America/Toronto"}, - 1418789: []string{"America/Toronto"}, - 1418800: []string{"America/Toronto"}, - 1418802: []string{"America/Toronto"}, - 1418822: []string{"America/Toronto"}, - 1418824: []string{"America/Toronto"}, - 1418827: []string{"America/Toronto"}, - 1418828: []string{"America/Toronto"}, - 1418829: []string{"America/Toronto"}, - 1418831: []string{"America/Toronto"}, - 1418832: []string{"America/Toronto"}, - 1418833: []string{"America/Toronto"}, - 1418834: []string{"America/Toronto"}, - 1418835: []string{"America/Toronto"}, - 1418836: []string{"America/Toronto"}, - 1418837: []string{"America/Toronto"}, - 1418838: []string{"America/Toronto"}, - 1418839: []string{"America/Toronto"}, - 1418840: []string{"America/Toronto"}, - 1418841: []string{"America/Toronto"}, - 1418842: []string{"America/Toronto"}, - 1418843: []string{"America/Toronto"}, - 1418844: []string{"America/Toronto"}, - 1418845: []string{"America/Toronto"}, - 1418847: []string{"America/Toronto"}, - 1418848: []string{"America/Toronto"}, - 1418849: []string{"America/Toronto"}, - 1418851: []string{"America/Toronto"}, - 1418853: []string{"America/Toronto"}, - 1418854: []string{"America/Toronto"}, - 1418856: []string{"America/Toronto"}, - 1418859: []string{"America/Toronto"}, - 1418860: []string{"America/Toronto"}, - 1418862: []string{"America/Toronto"}, - 1418863: []string{"America/Toronto"}, - 1418867: []string{"America/Toronto"}, - 1418868: []string{"America/Toronto"}, - 1418871: []string{"America/Toronto"}, - 1418872: []string{"America/Toronto"}, - 1418873: []string{"America/Toronto"}, - 1418875: []string{"America/Toronto"}, - 1418876: []string{"America/Toronto"}, - 1418877: []string{"America/Toronto"}, - 1418878: []string{"America/Toronto"}, - 1418881: []string{"America/Toronto"}, - 1418882: []string{"America/Toronto"}, - 1418883: []string{"America/Toronto"}, - 1418884: []string{"America/Toronto"}, - 1418885: []string{"America/Toronto"}, - 1418887: []string{"America/Toronto"}, - 1418888: []string{"America/Toronto"}, - 1418889: []string{"America/Toronto"}, - 1418893: []string{"America/Toronto"}, - 1418898: []string{"America/Toronto"}, - 1418899: []string{"America/Toronto"}, - 1418903: []string{"America/Toronto"}, - 1418907: []string{"America/Toronto"}, - 1418914: []string{"America/Toronto"}, - 1418915: []string{"America/Toronto"}, - 1418937: []string{"America/Halifax"}, - 1418948: []string{"America/Toronto"}, - 1418962: []string{"America/Toronto"}, - 1418963: []string{"America/Toronto"}, - 1418968: []string{"America/Toronto"}, - 1418973: []string{"America/Toronto"}, - 1418977: []string{"America/Toronto"}, - 1418986: []string{"America/Halifax"}, - 1418998: []string{"America/Toronto"}, - 1419: []string{"America/New_York"}, - 1423202: []string{"America/New_York"}, - 1423209: []string{"America/New_York"}, - 1423217: []string{"America/New_York"}, - 1423218: []string{"America/New_York"}, - 1423224: []string{"America/New_York"}, - 1423230: []string{"America/New_York"}, - 1423232: []string{"America/New_York"}, - 1423234: []string{"America/New_York"}, - 1423235: []string{"America/New_York"}, - 1423238: []string{"America/New_York"}, - 1423239: []string{"America/New_York"}, - 1423245: []string{"America/New_York"}, - 1423246: []string{"America/New_York"}, - 1423247: []string{"America/New_York"}, - 1423253: []string{"America/New_York"}, - 1423254: []string{"America/New_York"}, - 1423257: []string{"America/New_York"}, - 1423262: []string{"America/New_York"}, - 1423263: []string{"America/New_York"}, - 1423265: []string{"America/New_York"}, - 1423266: []string{"America/New_York"}, - 1423267: []string{"America/New_York"}, - 1423272: []string{"America/New_York"}, - 1423278: []string{"America/New_York"}, - 1423279: []string{"America/New_York"}, - 1423282: []string{"America/New_York"}, - 1423283: []string{"America/New_York"}, - 1423286: []string{"America/New_York"}, - 1423288: []string{"America/New_York"}, - 1423296: []string{"America/New_York"}, - 1423305: []string{"America/New_York"}, - 1423307: []string{"America/New_York"}, - 1423317: []string{"America/New_York"}, - 1423318: []string{"America/New_York"}, - 1423323: []string{"America/New_York"}, - 1423328: []string{"America/New_York"}, - 1423332: []string{"America/New_York"}, - 1423334: []string{"America/New_York"}, - 1423336: []string{"America/New_York"}, - 1423337: []string{"America/New_York"}, - 1423338: []string{"America/New_York"}, - 1423339: []string{"America/New_York"}, - 1423343: []string{"America/New_York"}, - 1423344: []string{"America/New_York"}, - 1423345: []string{"America/New_York"}, - 1423346: []string{"America/New_York"}, - 1423349: []string{"America/New_York"}, - 1423357: []string{"America/New_York"}, - 1423365: []string{"America/New_York"}, - 1423378: []string{"America/New_York"}, - 1423391: []string{"America/New_York"}, - 1423392: []string{"America/New_York"}, - 1423396: []string{"America/New_York"}, - 1423421: []string{"America/New_York"}, - 1423422: []string{"America/New_York"}, - 1423424: []string{"America/New_York"}, - 1423425: []string{"America/New_York"}, - 1423431: []string{"America/New_York"}, - 1423434: []string{"America/New_York"}, - 1423439: []string{"America/New_York"}, - 1423442: []string{"America/New_York"}, - 1423447: []string{"America/Chicago"}, - 1423451: []string{"America/New_York"}, - 1423453: []string{"America/New_York"}, - 1423467: []string{"America/New_York"}, - 1423468: []string{"America/New_York"}, - 1423472: []string{"America/New_York"}, - 1423473: []string{"America/New_York"}, - 1423475: []string{"America/New_York"}, - 1423476: []string{"America/New_York"}, - 1423477: []string{"America/New_York"}, - 1423478: []string{"America/New_York"}, - 1423479: []string{"America/New_York"}, - 1423485: []string{"America/New_York"}, - 1423487: []string{"America/New_York"}, - 1423490: []string{"America/New_York"}, - 1423493: []string{"America/New_York"}, - 1423495: []string{"America/New_York"}, - 1423496: []string{"America/New_York"}, - 1423499: []string{"America/New_York"}, - 1423503: []string{"America/New_York"}, - 1423507: []string{"America/New_York"}, - 1423508: []string{"America/New_York"}, - 1423510: []string{"America/New_York"}, - 1423521: []string{"America/New_York"}, - 1423525: []string{"America/New_York"}, - 1423531: []string{"America/New_York"}, - 1423538: []string{"America/New_York"}, - 1423542: []string{"America/New_York"}, - 1423543: []string{"America/New_York"}, - 1423547: []string{"America/New_York"}, - 1423553: []string{"America/New_York"}, - 1423559: []string{"America/New_York"}, - 1423562: []string{"America/New_York"}, - 1423566: []string{"America/New_York"}, - 1423569: []string{"America/New_York"}, - 1423570: []string{"America/New_York"}, - 1423573: []string{"America/New_York"}, - 1423578: []string{"America/New_York"}, - 1423581: []string{"America/New_York"}, - 1423585: []string{"America/New_York"}, - 1423586: []string{"America/New_York"}, - 1423587: []string{"America/New_York"}, - 1423595: []string{"America/New_York"}, - 1423602: []string{"America/New_York"}, - 1423610: []string{"America/New_York"}, - 1423613: []string{"America/New_York"}, - 1423614: []string{"America/New_York"}, - 1423622: []string{"America/New_York"}, - 1423623: []string{"America/New_York"}, - 1423624: []string{"America/New_York"}, - 1423625: []string{"America/New_York"}, - 1423626: []string{"America/New_York"}, - 1423629: []string{"America/New_York"}, - 1423634: []string{"America/New_York"}, - 1423636: []string{"America/New_York"}, - 1423638: []string{"America/New_York"}, - 1423639: []string{"America/New_York"}, - 1423643: []string{"America/New_York"}, - 1423648: []string{"America/New_York"}, - 1423652: []string{"America/New_York"}, - 1423658: []string{"America/Chicago"}, - 1423663: []string{"America/New_York"}, - 1423664: []string{"America/New_York"}, - 1423667: []string{"America/New_York"}, - 1423697: []string{"America/New_York"}, - 1423698: []string{"America/New_York"}, - 1423702: []string{"America/New_York"}, - 1423708: []string{"America/New_York"}, - 1423710: []string{"America/New_York"}, - 1423725: []string{"America/New_York"}, - 1423727: []string{"America/New_York"}, - 1423728: []string{"America/New_York"}, - 1423733: []string{"America/New_York"}, - 1423735: []string{"America/New_York"}, - 1423743: []string{"America/New_York"}, - 1423744: []string{"America/New_York"}, - 1423745: []string{"America/New_York"}, - 1423746: []string{"America/New_York"}, - 1423752: []string{"America/New_York"}, - 1423753: []string{"America/New_York"}, - 1423756: []string{"America/New_York"}, - 1423757: []string{"America/New_York"}, - 1423764: []string{"America/New_York"}, - 1423765: []string{"America/New_York"}, - 1423768: []string{"America/New_York"}, - 1423772: []string{"America/New_York"}, - 1423775: []string{"America/New_York"}, - 1423778: []string{"America/New_York"}, - 1423784: []string{"America/New_York"}, - 1423787: []string{"America/New_York"}, - 1423790: []string{"America/New_York"}, - 1423794: []string{"America/New_York"}, - 1423798: []string{"America/New_York"}, - 1423800: []string{"America/New_York"}, - 1423802: []string{"America/New_York"}, - 1423803: []string{"America/New_York"}, - 1423805: []string{"America/New_York"}, - 1423821: []string{"America/New_York"}, - 1423822: []string{"America/New_York"}, - 1423825: []string{"America/New_York"}, - 1423826: []string{"America/New_York"}, - 1423837: []string{"America/Chicago"}, - 1423839: []string{"America/New_York"}, - 1423842: []string{"America/New_York"}, - 1423843: []string{"America/New_York"}, - 1423844: []string{"America/New_York"}, - 1423847: []string{"America/New_York"}, - 1423854: []string{"America/New_York"}, - 1423855: []string{"America/New_York"}, - 1423857: []string{"America/New_York"}, - 1423867: []string{"America/New_York"}, - 1423869: []string{"America/New_York"}, - 1423870: []string{"America/New_York"}, - 1423875: []string{"America/New_York"}, - 1423876: []string{"America/New_York"}, - 1423877: []string{"America/New_York"}, - 1423878: []string{"America/New_York"}, - 1423881: []string{"America/Chicago"}, - 1423884: []string{"America/New_York"}, - 1423886: []string{"America/New_York"}, - 1423892: []string{"America/New_York"}, - 1423893: []string{"America/New_York"}, - 1423894: []string{"America/New_York"}, - 1423899: []string{"America/New_York"}, - 1423907: []string{"America/New_York"}, - 1423913: []string{"America/New_York"}, - 1423915: []string{"America/New_York"}, - 1423921: []string{"America/New_York"}, - 1423926: []string{"America/New_York"}, - 1423928: []string{"America/New_York"}, - 1423929: []string{"America/New_York"}, - 1423942: []string{"America/Chicago"}, - 1423949: []string{"America/Chicago"}, - 1423952: []string{"America/New_York"}, - 1423954: []string{"America/New_York"}, - 1423968: []string{"America/New_York"}, - 1423975: []string{"America/New_York"}, - 1423979: []string{"America/New_York"}, - 1423989: []string{"America/New_York"}, - 1424: []string{"America/Los_Angeles"}, - 1425: []string{"America/Los_Angeles"}, - 1432: []string{"America/Chicago"}, - 1434: []string{"America/New_York"}, - 1435: []string{"America/Denver"}, - 1438: []string{"America/Toronto"}, - 1440: []string{"America/New_York"}, - 1441: []string{"Atlantic/Bermuda"}, - 1443: []string{"America/New_York"}, - 1450: []string{"America/Toronto"}, - 1458: []string{"America/Los_Angeles"}, - 1463: []string{"America/New_York"}, - 1469: []string{"America/Chicago"}, - 1470: []string{"America/New_York"}, - 1473: []string{"America/Grenada"}, - 1478: []string{"America/New_York"}, - 1479: []string{"America/Chicago"}, - 1480: []string{"America/Denver"}, - 1484: []string{"America/New_York"}, - 1501: []string{"America/Chicago"}, - 1502: []string{"America/New_York"}, - 1503: []string{"America/Los_Angeles"}, - 1504: []string{"America/Chicago"}, - 1505: []string{"America/Denver"}, - 1506: []string{"America/Halifax"}, - 1507: []string{"America/Chicago"}, - 1508: []string{"America/New_York"}, - 1509: []string{"America/Los_Angeles"}, - 1510: []string{"America/Los_Angeles"}, - 1512: []string{"America/Chicago"}, - 1513: []string{"America/New_York"}, - 1514: []string{"America/Toronto"}, - 1515: []string{"America/Chicago"}, - 1516: []string{"America/New_York"}, - 1517: []string{"America/New_York"}, - 1518: []string{"America/New_York"}, - 1519: []string{"America/Toronto"}, - 1520: []string{"America/Denver"}, - 1530: []string{"America/Los_Angeles"}, - 1534: []string{"America/Chicago"}, - 1540: []string{"America/New_York"}, - 1541201: []string{"America/Los_Angeles"}, - 1541205: []string{"America/Los_Angeles"}, - 1541207: []string{"America/Los_Angeles"}, - 1541210: []string{"America/Los_Angeles"}, - 1541218: []string{"America/Los_Angeles"}, - 1541221: []string{"America/Los_Angeles"}, - 1541222: []string{"America/Los_Angeles"}, - 1541223: []string{"America/Los_Angeles"}, - 1541225: []string{"America/Los_Angeles"}, - 1541226: []string{"America/Los_Angeles"}, - 1541228: []string{"America/Los_Angeles"}, - 1541229: []string{"America/Los_Angeles"}, - 1541230: []string{"America/Los_Angeles"}, - 1541231: []string{"America/Los_Angeles"}, - 1541241: []string{"America/Los_Angeles"}, - 1541242: []string{"America/Los_Angeles"}, - 1541244: []string{"America/Los_Angeles"}, - 1541245: []string{"America/Los_Angeles"}, - 1541246: []string{"America/Los_Angeles"}, - 1541247: []string{"America/Los_Angeles"}, - 1541255: []string{"America/Los_Angeles"}, - 1541258: []string{"America/Los_Angeles"}, - 1541259: []string{"America/Los_Angeles"}, - 1541261: []string{"America/Los_Angeles"}, - 1541265: []string{"America/Los_Angeles"}, - 1541266: []string{"America/Los_Angeles"}, - 1541267: []string{"America/Los_Angeles"}, - 1541269: []string{"America/Los_Angeles"}, - 1541271: []string{"America/Los_Angeles"}, - 1541273: []string{"America/Los_Angeles"}, - 1541276: []string{"America/Los_Angeles"}, - 1541278: []string{"America/Los_Angeles"}, - 1541280: []string{"America/Los_Angeles"}, - 1541282: []string{"America/Los_Angeles"}, - 1541284: []string{"America/Los_Angeles"}, - 1541286: []string{"America/Los_Angeles"}, - 1541289: []string{"America/Los_Angeles"}, - 1541292: []string{"America/Los_Angeles"}, - 1541296: []string{"America/Los_Angeles"}, - 1541298: []string{"America/Los_Angeles"}, - 1541301: []string{"America/Los_Angeles"}, - 1541302: []string{"America/Los_Angeles"}, - 1541306: []string{"America/Los_Angeles"}, - 1541312: []string{"America/Los_Angeles"}, - 1541316: []string{"America/Los_Angeles"}, - 1541317: []string{"America/Los_Angeles"}, - 1541318: []string{"America/Los_Angeles"}, - 1541322: []string{"America/Los_Angeles"}, - 1541323: []string{"America/Los_Angeles"}, - 1541324: []string{"America/Los_Angeles"}, - 1541326: []string{"America/Los_Angeles"}, - 1541327: []string{"America/Los_Angeles"}, - 1541330: []string{"America/Los_Angeles"}, - 1541332: []string{"America/Los_Angeles"}, - 1541336: []string{"America/Los_Angeles"}, - 1541337: []string{"America/Los_Angeles"}, - 1541338: []string{"America/Los_Angeles"}, - 1541342: []string{"America/Los_Angeles"}, - 1541343: []string{"America/Los_Angeles"}, - 1541344: []string{"America/Los_Angeles"}, - 1541345: []string{"America/Los_Angeles"}, - 1541346: []string{"America/Los_Angeles"}, - 1541347: []string{"America/Los_Angeles"}, - 1541349: []string{"America/Los_Angeles"}, - 1541350: []string{"America/Los_Angeles"}, - 1541352: []string{"America/Los_Angeles"}, - 1541354: []string{"America/Los_Angeles"}, - 1541357: []string{"America/Los_Angeles"}, - 1541359: []string{"America/Los_Angeles"}, - 1541367: []string{"America/Los_Angeles"}, - 1541372: []string{"America/Denver"}, - 1541382: []string{"America/Los_Angeles"}, - 1541383: []string{"America/Los_Angeles"}, - 1541384: []string{"America/Los_Angeles"}, - 1541385: []string{"America/Los_Angeles"}, - 1541386: []string{"America/Los_Angeles"}, - 1541387: []string{"America/Los_Angeles"}, - 1541388: []string{"America/Los_Angeles"}, - 1541389: []string{"America/Los_Angeles"}, - 1541390: []string{"America/Los_Angeles"}, - 1541393: []string{"America/Los_Angeles"}, - 1541396: []string{"America/Los_Angeles"}, - 1541408: []string{"America/Los_Angeles"}, - 1541410: []string{"America/Los_Angeles"}, - 1541412: []string{"America/Los_Angeles"}, - 1541414: []string{"America/Los_Angeles"}, - 1541416: []string{"America/Los_Angeles"}, - 1541419: []string{"America/Los_Angeles"}, - 1541420: []string{"America/Los_Angeles"}, - 1541426: []string{"America/Los_Angeles"}, - 1541431: []string{"America/Los_Angeles"}, - 1541432: []string{"America/Los_Angeles"}, - 1541434: []string{"America/Los_Angeles"}, - 1541440: []string{"America/Los_Angeles"}, - 1541444: []string{"America/Los_Angeles"}, - 1541447: []string{"America/Los_Angeles"}, - 1541451: []string{"America/Los_Angeles"}, - 1541459: []string{"America/Los_Angeles"}, - 1541461: []string{"America/Los_Angeles"}, - 1541463: []string{"America/Los_Angeles"}, - 1541464: []string{"America/Los_Angeles"}, - 1541465: []string{"America/Los_Angeles"}, - 1541466: []string{"America/Los_Angeles"}, - 1541469: []string{"America/Los_Angeles"}, - 1541471: []string{"America/Los_Angeles"}, - 1541472: []string{"America/Los_Angeles"}, - 1541473: []string{"America/Denver"}, - 1541474: []string{"America/Los_Angeles"}, - 1541475: []string{"America/Los_Angeles"}, - 1541476: []string{"America/Los_Angeles"}, - 1541479: []string{"America/Los_Angeles"}, - 1541480: []string{"America/Los_Angeles"}, - 1541481: []string{"America/Los_Angeles"}, - 1541482: []string{"America/Los_Angeles"}, - 1541484: []string{"America/Los_Angeles"}, - 1541485: []string{"America/Los_Angeles"}, - 1541488: []string{"America/Los_Angeles"}, - 1541490: []string{"America/Los_Angeles"}, - 1541496: []string{"America/Los_Angeles"}, - 1541499: []string{"America/Los_Angeles"}, - 1541504: []string{"America/Los_Angeles"}, - 1541505: []string{"America/Los_Angeles"}, - 1541506: []string{"America/Los_Angeles"}, - 1541508: []string{"America/Los_Angeles"}, - 1541510: []string{"America/Los_Angeles"}, - 1541512: []string{"America/Los_Angeles"}, - 1541513: []string{"America/Los_Angeles"}, - 1541515: []string{"America/Los_Angeles"}, - 1541517: []string{"America/Los_Angeles"}, - 1541520: []string{"America/Los_Angeles"}, - 1541521: []string{"America/Los_Angeles"}, - 1541523: []string{"America/Los_Angeles"}, - 1541525: []string{"America/Los_Angeles"}, - 1541526: []string{"America/Los_Angeles"}, - 1541531: []string{"America/Los_Angeles"}, - 1541535: []string{"America/Los_Angeles"}, - 1541536: []string{"America/Los_Angeles"}, - 1541543: []string{"America/Los_Angeles"}, - 1541546: []string{"America/Los_Angeles"}, - 1541547: []string{"America/Los_Angeles"}, - 1541548: []string{"America/Los_Angeles"}, - 1541549: []string{"America/Los_Angeles"}, - 1541550: []string{"America/Los_Angeles"}, - 1541552: []string{"America/Los_Angeles"}, - 1541553: []string{"America/Los_Angeles"}, - 1541554: []string{"America/Los_Angeles"}, - 1541556: []string{"America/Los_Angeles"}, - 1541563: []string{"America/Los_Angeles"}, - 1541564: []string{"America/Los_Angeles"}, - 1541566: []string{"America/Los_Angeles"}, - 1541567: []string{"America/Los_Angeles"}, - 1541572: []string{"America/Los_Angeles"}, - 1541573: []string{"America/Los_Angeles"}, - 1541574: []string{"America/Los_Angeles"}, - 1541575: []string{"America/Los_Angeles"}, - 1541576: []string{"America/Los_Angeles"}, - 1541579: []string{"America/Los_Angeles"}, - 1541582: []string{"America/Los_Angeles"}, - 1541592: []string{"America/Los_Angeles"}, - 1541593: []string{"America/Los_Angeles"}, - 1541598: []string{"America/Los_Angeles"}, - 1541601: []string{"America/Los_Angeles"}, - 1541602: []string{"America/Los_Angeles"}, - 1541606: []string{"America/Los_Angeles"}, - 1541607: []string{"America/Los_Angeles"}, - 1541608: []string{"America/Los_Angeles"}, - 1541610: []string{"America/Los_Angeles"}, - 1541617: []string{"America/Los_Angeles"}, - 1541618: []string{"America/Los_Angeles"}, - 1541621: []string{"America/Los_Angeles"}, - 1541622: []string{"America/Los_Angeles"}, - 1541632: []string{"America/Los_Angeles"}, - 1541633: []string{"America/Los_Angeles"}, - 1541636: []string{"America/Los_Angeles"}, - 1541639: []string{"America/Los_Angeles"}, - 1541647: []string{"America/Los_Angeles"}, - 1541653: []string{"America/Los_Angeles"}, - 1541654: []string{"America/Los_Angeles"}, - 1541659: []string{"America/Los_Angeles"}, - 1541660: []string{"America/Los_Angeles"}, - 1541663: []string{"America/Los_Angeles"}, - 1541664: []string{"America/Los_Angeles"}, - 1541665: []string{"America/Los_Angeles"}, - 1541667: []string{"America/Los_Angeles"}, - 1541672: []string{"America/Los_Angeles"}, - 1541673: []string{"America/Los_Angeles"}, - 1541676: []string{"America/Los_Angeles"}, - 1541677: []string{"America/Los_Angeles"}, - 1541678: []string{"America/Los_Angeles"}, - 1541679: []string{"America/Los_Angeles"}, - 1541682: []string{"America/Los_Angeles"}, - 1541683: []string{"America/Los_Angeles"}, - 1541684: []string{"America/Los_Angeles"}, - 1541685: []string{"America/Los_Angeles"}, - 1541686: []string{"America/Los_Angeles"}, - 1541687: []string{"America/Los_Angeles"}, - 1541688: []string{"America/Los_Angeles"}, - 1541689: []string{"America/Los_Angeles"}, - 1541690: []string{"America/Los_Angeles"}, - 1541706: []string{"America/Los_Angeles"}, - 1541708: []string{"America/Los_Angeles"}, - 1541726: []string{"America/Los_Angeles"}, - 1541728: []string{"America/Los_Angeles"}, - 1541729: []string{"America/Los_Angeles"}, - 1541732: []string{"America/Los_Angeles"}, - 1541734: []string{"America/Los_Angeles"}, - 1541736: []string{"America/Los_Angeles"}, - 1541737: []string{"America/Los_Angeles"}, - 1541738: []string{"America/Los_Angeles"}, - 1541740: []string{"America/Los_Angeles"}, - 1541741: []string{"America/Los_Angeles"}, - 1541743: []string{"America/Los_Angeles"}, - 1541744: []string{"America/Los_Angeles"}, - 1541745: []string{"America/Los_Angeles"}, - 1541746: []string{"America/Los_Angeles"}, - 1541747: []string{"America/Los_Angeles"}, - 1541749: []string{"America/Los_Angeles"}, - 1541751: []string{"America/Los_Angeles"}, - 1541752: []string{"America/Los_Angeles"}, - 1541753: []string{"America/Los_Angeles"}, - 1541754: []string{"America/Los_Angeles"}, - 1541756: []string{"America/Los_Angeles"}, - 1541757: []string{"America/Los_Angeles"}, - 1541758: []string{"America/Los_Angeles"}, - 1541760: []string{"America/Los_Angeles"}, - 1541761: []string{"America/Los_Angeles"}, - 1541764: []string{"America/Los_Angeles"}, - 1541765: []string{"America/Los_Angeles"}, - 1541766: []string{"America/Los_Angeles"}, - 1541767: []string{"America/Los_Angeles"}, - 1541768: []string{"America/Los_Angeles"}, - 1541770: []string{"America/Los_Angeles"}, - 1541771: []string{"America/Los_Angeles"}, - 1541772: []string{"America/Los_Angeles"}, - 1541773: []string{"America/Los_Angeles"}, - 1541774: []string{"America/Los_Angeles"}, - 1541776: []string{"America/Los_Angeles"}, - 1541778: []string{"America/Los_Angeles"}, - 1541779: []string{"America/Los_Angeles"}, - 1541782: []string{"America/Los_Angeles"}, - 1541783: []string{"America/Los_Angeles"}, - 1541788: []string{"America/Los_Angeles"}, - 1541789: []string{"America/Los_Angeles"}, - 1541791: []string{"America/Los_Angeles"}, - 1541798: []string{"America/Los_Angeles"}, - 1541808: []string{"America/Los_Angeles"}, - 1541812: []string{"America/Los_Angeles"}, - 1541815: []string{"America/Los_Angeles"}, - 1541821: []string{"America/Los_Angeles"}, - 1541822: []string{"America/Los_Angeles"}, - 1541826: []string{"America/Los_Angeles"}, - 1541830: []string{"America/Los_Angeles"}, - 1541836: []string{"America/Los_Angeles"}, - 1541839: []string{"America/Los_Angeles"}, - 1541840: []string{"America/Los_Angeles"}, - 1541842: []string{"America/Los_Angeles"}, - 1541844: []string{"America/Los_Angeles"}, - 1541846: []string{"America/Los_Angeles"}, - 1541850: []string{"America/Los_Angeles"}, - 1541855: []string{"America/Los_Angeles"}, - 1541857: []string{"America/Los_Angeles"}, - 1541858: []string{"America/Los_Angeles"}, - 1541863: []string{"America/Los_Angeles"}, - 1541867: []string{"America/Los_Angeles"}, - 1541868: []string{"America/Los_Angeles"}, - 1541878: []string{"America/Los_Angeles"}, - 1541881: []string{"America/Denver"}, - 1541882: []string{"America/Los_Angeles"}, - 1541883: []string{"America/Los_Angeles"}, - 1541884: []string{"America/Los_Angeles"}, - 1541885: []string{"America/Los_Angeles"}, - 1541887: []string{"America/Los_Angeles"}, - 1541888: []string{"America/Los_Angeles"}, - 1541889: []string{"America/Denver"}, - 1541890: []string{"America/Los_Angeles"}, - 1541891: []string{"America/Los_Angeles"}, - 1541892: []string{"America/Los_Angeles"}, - 1541895: []string{"America/Los_Angeles"}, - 1541899: []string{"America/Los_Angeles"}, - 1541902: []string{"America/Los_Angeles"}, - 1541912: []string{"America/Los_Angeles"}, - 1541913: []string{"America/Los_Angeles"}, - 1541914: []string{"America/Los_Angeles"}, - 1541915: []string{"America/Los_Angeles"}, - 1541917: []string{"America/Los_Angeles"}, - 1541922: []string{"America/Los_Angeles"}, - 1541923: []string{"America/Los_Angeles"}, - 1541924: []string{"America/Los_Angeles"}, - 1541926: []string{"America/Los_Angeles"}, - 1541928: []string{"America/Los_Angeles"}, - 1541929: []string{"America/Los_Angeles"}, - 1541935: []string{"America/Los_Angeles"}, - 1541937: []string{"America/Los_Angeles"}, - 1541938: []string{"America/Los_Angeles"}, - 1541941: []string{"America/Los_Angeles"}, - 1541942: []string{"America/Los_Angeles"}, - 1541944: []string{"America/Los_Angeles"}, - 1541947: []string{"America/Los_Angeles"}, - 1541948: []string{"America/Los_Angeles"}, - 1541951: []string{"America/Los_Angeles"}, - 1541953: []string{"America/Los_Angeles"}, - 1541954: []string{"America/Los_Angeles"}, - 1541955: []string{"America/Los_Angeles"}, - 1541956: []string{"America/Los_Angeles"}, - 1541957: []string{"America/Los_Angeles"}, - 1541961: []string{"America/Los_Angeles"}, - 1541962: []string{"America/Los_Angeles"}, - 1541963: []string{"America/Los_Angeles"}, - 1541966: []string{"America/Los_Angeles"}, - 1541967: []string{"America/Los_Angeles"}, - 1541968: []string{"America/Los_Angeles"}, - 1541973: []string{"America/Los_Angeles"}, - 1541977: []string{"America/Los_Angeles"}, - 1541981: []string{"America/Los_Angeles"}, - 1541988: []string{"America/Los_Angeles"}, - 1541990: []string{"America/Los_Angeles"}, - 1541994: []string{"America/Los_Angeles"}, - 1541995: []string{"America/Los_Angeles"}, - 1541996: []string{"America/Los_Angeles"}, - 1541997: []string{"America/Los_Angeles"}, - 1541998: []string{"America/Los_Angeles"}, - 1541999: []string{"America/Los_Angeles"}, - 1551: []string{"America/New_York"}, - 1559: []string{"America/Los_Angeles"}, - 1561: []string{"America/New_York"}, - 1562: []string{"America/Los_Angeles"}, - 1563: []string{"America/Chicago"}, - 1567: []string{"America/New_York"}, - 1570: []string{"America/New_York"}, - 1571: []string{"America/New_York"}, - 1573: []string{"America/Chicago"}, - 1574206: []string{"America/New_York"}, - 1574217: []string{"America/New_York"}, - 1574223: []string{"America/New_York"}, - 1574231: []string{"America/New_York"}, - 1574232: []string{"America/New_York"}, - 1574233: []string{"America/New_York"}, - 1574234: []string{"America/New_York"}, - 1574235: []string{"America/New_York"}, - 1574237: []string{"America/New_York"}, - 1574243: []string{"America/New_York"}, - 1574246: []string{"America/New_York"}, - 1574247: []string{"America/New_York"}, - 1574252: []string{"America/New_York"}, - 1574254: []string{"America/New_York"}, - 1574255: []string{"America/New_York"}, - 1574256: []string{"America/New_York"}, - 1574257: []string{"America/New_York"}, - 1574258: []string{"America/New_York"}, - 1574259: []string{"America/New_York"}, - 1574262: []string{"America/New_York"}, - 1574264: []string{"America/New_York"}, - 1574266: []string{"America/New_York"}, - 1574267: []string{"America/New_York"}, - 1574268: []string{"America/New_York"}, - 1574269: []string{"America/New_York"}, - 1574271: []string{"America/New_York"}, - 1574272: []string{"America/New_York"}, - 1574273: []string{"America/New_York"}, - 1574277: []string{"America/New_York"}, - 1574282: []string{"America/New_York"}, - 1574283: []string{"America/New_York"}, - 1574287: []string{"America/New_York"}, - 1574288: []string{"America/New_York"}, - 1574289: []string{"America/New_York"}, - 1574291: []string{"America/New_York"}, - 1574293: []string{"America/New_York"}, - 1574294: []string{"America/New_York"}, - 1574295: []string{"America/New_York"}, - 1574296: []string{"America/New_York"}, - 1574299: []string{"America/New_York"}, - 1574333: []string{"America/New_York"}, - 1574335: []string{"America/New_York"}, - 1574372: []string{"America/New_York"}, - 1574387: []string{"America/New_York"}, - 1574389: []string{"America/New_York"}, - 1574400: []string{"America/New_York"}, - 1574453: []string{"America/New_York"}, - 1574457: []string{"America/New_York"}, - 1574522: []string{"America/New_York"}, - 1574523: []string{"America/New_York"}, - 1574533: []string{"America/New_York"}, - 1574534: []string{"America/New_York"}, - 1574535: []string{"America/New_York"}, - 1574537: []string{"America/New_York"}, - 1574546: []string{"America/New_York"}, - 1574551: []string{"America/New_York"}, - 1574583: []string{"America/New_York"}, - 1574586: []string{"America/New_York"}, - 1574594: []string{"America/New_York"}, - 1574631: []string{"America/New_York"}, - 1574642: []string{"America/New_York"}, - 1574647: []string{"America/New_York"}, - 1574656: []string{"America/New_York"}, - 1574658: []string{"America/New_York"}, - 1574674: []string{"America/New_York"}, - 1574675: []string{"America/New_York"}, - 1574699: []string{"America/New_York"}, - 1574722: []string{"America/New_York"}, - 1574753: []string{"America/New_York"}, - 1574772: []string{"America/Chicago"}, - 1574773: []string{"America/New_York"}, - 1574784: []string{"America/New_York"}, - 1574807: []string{"America/New_York"}, - 1574825: []string{"America/New_York"}, - 1574831: []string{"America/New_York"}, - 1574834: []string{"America/New_York"}, - 1574842: []string{"America/New_York"}, - 1574848: []string{"America/New_York"}, - 1574855: []string{"America/New_York"}, - 1574862: []string{"America/New_York"}, - 1574875: []string{"America/New_York"}, - 1574892: []string{"America/New_York"}, - 1574893: []string{"America/New_York"}, - 1574896: []string{"America/Chicago"}, - 1574935: []string{"America/New_York"}, - 1574936: []string{"America/New_York"}, - 1574946: []string{"America/New_York"}, - 1574967: []string{"America/New_York"}, - 1574968: []string{"America/New_York"}, - 1574970: []string{"America/New_York"}, - 1575: []string{"America/Denver"}, - 1580: []string{"America/Chicago"}, - 1581: []string{"America/Toronto"}, - 1585: []string{"America/New_York"}, - 1586: []string{"America/New_York"}, - 1587: []string{"America/Edmonton"}, - 1601: []string{"America/Chicago"}, - 1602: []string{"America/Denver"}, - 1603: []string{"America/New_York"}, - 1604: []string{"America/Vancouver"}, - 1605201: []string{"America/Chicago"}, - 1605209: []string{"America/Denver"}, - 1605217: []string{"America/Chicago"}, - 1605221: []string{"America/Chicago"}, - 1605223: []string{"America/Denver"}, - 1605224: []string{"America/Chicago"}, - 1605225: []string{"America/Chicago"}, - 1605226: []string{"America/Chicago"}, - 1605229: []string{"America/Chicago"}, - 1605232: []string{"America/Chicago"}, - 1605234: []string{"America/Chicago"}, - 1605256: []string{"America/Chicago"}, - 1605260: []string{"America/Chicago"}, - 1605262: []string{"America/Chicago"}, - 1605271: []string{"America/Chicago"}, - 1605274: []string{"America/Chicago"}, - 1605275: []string{"America/Chicago"}, - 1605279: []string{"America/Denver"}, - 1605284: []string{"America/Chicago"}, - 1605297: []string{"America/Chicago"}, - 1605310: []string{"America/Chicago"}, - 1605312: []string{"America/Chicago"}, - 1605321: []string{"America/Chicago"}, - 1605322: []string{"America/Chicago"}, - 1605323: []string{"America/Chicago"}, - 1605328: []string{"America/Chicago"}, - 160533: []string{"America/Chicago"}, - 1605341: []string{"America/Denver"}, - 1605342: []string{"America/Denver"}, - 1605343: []string{"America/Denver"}, - 1605345: []string{"America/Chicago"}, - 1605347: []string{"America/Denver"}, - 1605348: []string{"America/Denver"}, - 1605351: []string{"America/Chicago"}, - 1605352: []string{"America/Chicago"}, - 1605353: []string{"America/Chicago"}, - 1605355: []string{"America/Denver"}, - 1605356: []string{"America/Chicago"}, - 1605357: []string{"America/Chicago"}, - 1605359: []string{"America/Chicago"}, - 1605360: []string{"America/Chicago"}, - 1605361: []string{"America/Chicago"}, - 1605362: []string{"America/Chicago"}, - 1605363: []string{"America/Chicago"}, - 1605366: []string{"America/Chicago"}, - 1605367: []string{"America/Chicago"}, - 1605368: []string{"America/Chicago"}, - 1605370: []string{"America/Chicago"}, - 1605371: []string{"America/Chicago"}, - 1605373: []string{"America/Chicago"}, - 1605374: []string{"America/Denver"}, - 1605376: []string{"America/Chicago"}, - 1605381: []string{"America/Denver"}, - 1605384: []string{"America/Chicago"}, - 1605387: []string{"America/Chicago"}, - 1605388: []string{"America/Denver"}, - 1605390: []string{"America/Denver"}, - 1605391: []string{"America/Denver"}, - 1605393: []string{"America/Denver"}, - 1605394: []string{"America/Denver"}, - 1605397: []string{"America/Chicago"}, - 1605399: []string{"America/Denver"}, - 1605425: []string{"America/Chicago"}, - 1605426: []string{"America/Chicago"}, - 1605428: []string{"America/Chicago"}, - 1605430: []string{"America/Denver"}, - 1605432: []string{"America/Chicago"}, - 1605448: []string{"America/Chicago"}, - 1605455: []string{"America/Denver"}, - 1605472: []string{"America/Chicago"}, - 1605484: []string{"America/Denver"}, - 1605487: []string{"America/Chicago"}, - 1605498: []string{"America/Chicago"}, - 1605528: []string{"America/Chicago"}, - 1605532: []string{"America/Chicago"}, - 1605539: []string{"America/Chicago"}, - 1605543: []string{"America/Chicago"}, - 1605553: []string{"America/Chicago"}, - 1605574: []string{"America/Denver"}, - 1605578: []string{"America/Denver"}, - 1605582: []string{"America/Chicago"}, - 1605584: []string{"America/Denver"}, - 1605589: []string{"America/Chicago"}, - 1605594: []string{"America/Chicago"}, - 1605598: []string{"America/Chicago"}, - 1605610: []string{"America/Chicago"}, - 1605622: []string{"America/Chicago"}, - 1605624: []string{"America/Chicago"}, - 1605626: []string{"America/Chicago"}, - 1605627: []string{"America/Chicago"}, - 1605641: []string{"America/Denver"}, - 1605642: []string{"America/Denver"}, - 1605644: []string{"America/Denver"}, - 1605647: []string{"America/Chicago"}, - 1605649: []string{"America/Chicago"}, - 1605665: []string{"America/Chicago"}, - 1605666: []string{"America/Denver"}, - 1605668: []string{"America/Chicago"}, - 1605669: []string{"America/Chicago"}, - 1605673: []string{"America/Denver"}, - 1605677: []string{"America/Chicago"}, - 1605685: []string{"America/Denver"}, - 1605690: []string{"America/Chicago"}, - 1605692: []string{"America/Chicago"}, - 1605693: []string{"America/Chicago"}, - 1605695: []string{"America/Chicago"}, - 1605696: []string{"America/Chicago"}, - 1605697: []string{"America/Chicago"}, - 1605698: []string{"America/Chicago"}, - 1605716: []string{"America/Denver"}, - 1605717: []string{"America/Denver"}, - 1605718: []string{"America/Denver"}, - 1605719: []string{"America/Denver"}, - 1605720: []string{"America/Denver"}, - 1605721: []string{"America/Denver"}, - 1605722: []string{"America/Denver"}, - 1605723: []string{"America/Denver"}, - 1605724: []string{"America/Chicago"}, - 1605725: []string{"America/Chicago"}, - 1605728: []string{"America/Chicago"}, - 1605734: []string{"America/Chicago"}, - 1605745: []string{"America/Denver"}, - 1605747: []string{"America/Chicago"}, - 1605753: []string{"America/Chicago"}, - 1605763: []string{"America/Chicago"}, - 1605765: []string{"America/Chicago"}, - 1605772: []string{"America/Chicago"}, - 1605773: []string{"America/Chicago"}, - 1605775: []string{"America/Chicago"}, - 1605778: []string{"America/Chicago"}, - 1605787: []string{"America/Denver"}, - 1605791: []string{"America/Denver"}, - 1605796: []string{"America/Chicago"}, - 1605823: []string{"America/Denver"}, - 1605835: []string{"America/Chicago"}, - 1605837: []string{"America/Denver"}, - 1605842: []string{"America/Chicago"}, - 1605845: []string{"America/Chicago"}, - 1605852: []string{"America/Chicago"}, - 1605853: []string{"America/Chicago"}, - 1605854: []string{"America/Chicago"}, - 1605856: []string{"America/Chicago"}, - 1605859: []string{"America/Denver"}, - 1605867: []string{"America/Denver"}, - 1605874: []string{"America/Chicago"}, - 1605878: []string{"America/Chicago"}, - 1605881: []string{"America/Chicago"}, - 1605882: []string{"America/Chicago"}, - 1605886: []string{"America/Chicago"}, - 1605892: []string{"America/Denver"}, - 1605923: []string{"America/Denver"}, - 1605925: []string{"America/Chicago"}, - 1605928: []string{"America/Chicago"}, - 1605929: []string{"America/Chicago"}, - 1605940: []string{"America/Chicago"}, - 1605945: []string{"America/Chicago"}, - 1605946: []string{"America/Chicago"}, - 1605964: []string{"America/Denver"}, - 1605977: []string{"America/Chicago"}, - 1605983: []string{"America/Chicago"}, - 1605987: []string{"America/Chicago"}, - 1605990: []string{"America/Chicago"}, - 1605995: []string{"America/Chicago"}, - 1605996: []string{"America/Chicago"}, - 1605997: []string{"America/Chicago"}, - 1606218: []string{"America/New_York"}, - 1606237: []string{"America/New_York"}, - 1606242: []string{"America/New_York"}, - 1606248: []string{"America/New_York"}, - 1606256: []string{"America/New_York"}, - 1606258: []string{"America/New_York"}, - 1606285: []string{"America/New_York"}, - 1606286: []string{"America/New_York"}, - 1606287: []string{"America/New_York"}, - 1606297: []string{"America/New_York"}, - 1606298: []string{"America/New_York"}, - 1606324: []string{"America/New_York"}, - 1606325: []string{"America/New_York"}, - 1606326: []string{"America/New_York"}, - 1606327: []string{"America/New_York"}, - 1606329: []string{"America/New_York"}, - 1606330: []string{"America/New_York"}, - 1606337: []string{"America/New_York"}, - 1606340: []string{"America/New_York"}, - 1606346: []string{"America/New_York"}, - 1606348: []string{"America/New_York"}, - 1606349: []string{"America/New_York"}, - 1606353: []string{"America/New_York"}, - 1606354: []string{"America/New_York"}, - 1606364: []string{"America/New_York"}, - 1606365: []string{"America/New_York"}, - 1606376: []string{"America/New_York"}, - 1606377: []string{"America/New_York"}, - 1606379: []string{"America/New_York"}, - 1606387: []string{"America/Chicago"}, - 1606408: []string{"America/New_York"}, - 1606423: []string{"America/New_York"}, - 1606432: []string{"America/New_York"}, - 1606433: []string{"America/New_York"}, - 1606435: []string{"America/New_York"}, - 1606436: []string{"America/New_York"}, - 1606437: []string{"America/New_York"}, - 1606439: []string{"America/New_York"}, - 1606451: []string{"America/New_York"}, - 1606456: []string{"America/New_York"}, - 1606464: []string{"America/New_York"}, - 1606473: []string{"America/New_York"}, - 1606474: []string{"America/New_York"}, - 1606475: []string{"America/New_York"}, - 1606476: []string{"America/New_York"}, - 1606478: []string{"America/New_York"}, - 1606487: []string{"America/New_York"}, - 1606523: []string{"America/New_York"}, - 1606526: []string{"America/New_York"}, - 1606528: []string{"America/New_York"}, - 1606545: []string{"America/New_York"}, - 1606546: []string{"America/New_York"}, - 1606549: []string{"America/New_York"}, - 1606561: []string{"America/New_York"}, - 1606564: []string{"America/New_York"}, - 1606573: []string{"America/New_York"}, - 1606589: []string{"America/New_York"}, - 1606593: []string{"America/New_York"}, - 1606598: []string{"America/New_York"}, - 1606599: []string{"America/New_York"}, - 1606631: []string{"America/New_York"}, - 1606633: []string{"America/New_York"}, - 1606638: []string{"America/New_York"}, - 1606639: []string{"America/New_York"}, - 1606663: []string{"America/New_York"}, - 1606666: []string{"America/New_York"}, - 1606668: []string{"America/New_York"}, - 1606672: []string{"America/New_York"}, - 1606674: []string{"America/New_York"}, - 1606676: []string{"America/New_York"}, - 1606677: []string{"America/New_York"}, - 1606678: []string{"America/New_York"}, - 1606679: []string{"America/New_York"}, - 1606723: []string{"America/New_York"}, - 1606735: []string{"America/New_York"}, - 1606738: []string{"America/New_York"}, - 1606739: []string{"America/New_York"}, - 1606743: []string{"America/New_York"}, - 1606754: []string{"America/New_York"}, - 1606756: []string{"America/New_York"}, - 1606759: []string{"America/New_York"}, - 1606768: []string{"America/New_York"}, - 1606780: []string{"America/New_York"}, - 1606783: []string{"America/New_York"}, - 1606784: []string{"America/New_York"}, - 1606785: []string{"America/New_York"}, - 1606787: []string{"America/New_York"}, - 1606788: []string{"America/New_York"}, - 1606789: []string{"America/New_York"}, - 1606796: []string{"America/New_York"}, - 1606832: []string{"America/New_York"}, - 1606833: []string{"America/New_York"}, - 1606836: []string{"America/New_York"}, - 1606837: []string{"America/New_York"}, - 1606843: []string{"America/New_York"}, - 1606845: []string{"America/New_York"}, - 1606849: []string{"America/New_York"}, - 1606862: []string{"America/New_York"}, - 1606864: []string{"America/New_York"}, - 1606874: []string{"America/New_York"}, - 1606877: []string{"America/New_York"}, - 1606878: []string{"America/New_York"}, - 1606886: []string{"America/New_York"}, - 1606889: []string{"America/New_York"}, - 1606928: []string{"America/New_York"}, - 1606929: []string{"America/New_York"}, - 1606932: []string{"America/New_York"}, - 1607: []string{"America/New_York"}, - 1608: []string{"America/Chicago"}, - 1609: []string{"America/New_York"}, - 1610: []string{"America/New_York"}, - 1612: []string{"America/Chicago"}, - 1613: []string{"America/Toronto"}, - 1614: []string{"America/New_York"}, - 1615: []string{"America/Chicago"}, - 1616: []string{"America/New_York"}, - 1617: []string{"America/New_York"}, - 1618: []string{"America/Chicago"}, - 1619: []string{"America/Los_Angeles"}, - 1620221: []string{"America/Chicago"}, - 1620223: []string{"America/Chicago"}, - 1620225: []string{"America/Chicago"}, - 1620227: []string{"America/Chicago"}, - 1620229: []string{"America/Chicago"}, - 1620231: []string{"America/Chicago"}, - 1620232: []string{"America/Chicago"}, - 1620235: []string{"America/Chicago"}, - 1620241: []string{"America/Chicago"}, - 1620244: []string{"America/Chicago"}, - 1620245: []string{"America/Chicago"}, - 1620249: []string{"America/Chicago"}, - 1620251: []string{"America/Chicago"}, - 1620257: []string{"America/Chicago"}, - 1620259: []string{"America/Chicago"}, - 1620271: []string{"America/Chicago"}, - 1620272: []string{"America/Chicago"}, - 1620273: []string{"America/Chicago"}, - 1620275: []string{"America/Chicago"}, - 1620276: []string{"America/Chicago"}, - 1620277: []string{"America/Chicago"}, - 1620278: []string{"America/Chicago"}, - 1620285: []string{"America/Chicago"}, - 1620308: []string{"America/Chicago"}, - 1620325: []string{"America/Chicago"}, - 1620326: []string{"America/Chicago"}, - 1620327: []string{"America/Chicago"}, - 1620331: []string{"America/Chicago"}, - 1620332: []string{"America/Chicago"}, - 1620336: []string{"America/Chicago"}, - 1620340: []string{"America/Chicago"}, - 1620341: []string{"America/Chicago"}, - 1620342: []string{"America/Chicago"}, - 1620343: []string{"America/Chicago"}, - 1620345: []string{"America/Chicago"}, - 1620347: []string{"America/Chicago"}, - 1620355: []string{"America/Chicago"}, - 1620356: []string{"America/Chicago"}, - 1620357: []string{"America/Chicago"}, - 1620364: []string{"America/Chicago"}, - 1620365: []string{"America/Chicago"}, - 1620375: []string{"America/Chicago"}, - 1620376: []string{"America/Denver"}, - 1620378: []string{"America/Chicago"}, - 1620382: []string{"America/Chicago"}, - 1620384: []string{"America/Denver"}, - 1620397: []string{"America/Chicago"}, - 1620421: []string{"America/Chicago"}, - 1620423: []string{"America/Chicago"}, - 1620429: []string{"America/Chicago"}, - 1620431: []string{"America/Chicago"}, - 1620441: []string{"America/Chicago"}, - 1620442: []string{"America/Chicago"}, - 1620456: []string{"America/Chicago"}, - 1620465: []string{"America/Chicago"}, - 1620473: []string{"America/Chicago"}, - 1620488: []string{"America/Chicago"}, - 1620492: []string{"America/Chicago"}, - 1620532: []string{"America/Chicago"}, - 1620543: []string{"America/Chicago"}, - 1620544: []string{"America/Chicago"}, - 1620549: []string{"America/Chicago"}, - 1620563: []string{"America/Chicago"}, - 1620564: []string{"America/Chicago"}, - 1620582: []string{"America/Chicago"}, - 1620583: []string{"America/Chicago"}, - 1620584: []string{"America/Chicago"}, - 1620585: []string{"America/Chicago"}, - 1620624: []string{"America/Chicago"}, - 1620625: []string{"America/Chicago"}, - 1620626: []string{"America/Chicago"}, - 1620635: []string{"America/Chicago"}, - 1620649: []string{"America/Chicago"}, - 1620653: []string{"America/Chicago"}, - 1620659: []string{"America/Chicago"}, - 1620662: []string{"America/Chicago"}, - 1620663: []string{"America/Chicago"}, - 1620664: []string{"America/Chicago"}, - 1620665: []string{"America/Chicago"}, - 1620669: []string{"America/Chicago"}, - 1620672: []string{"America/Chicago"}, - 1620675: []string{"America/Chicago"}, - 1620694: []string{"America/Chicago"}, - 1620697: []string{"America/Chicago"}, - 1620723: []string{"America/Chicago"}, - 1620724: []string{"America/Chicago"}, - 1620725: []string{"America/Chicago"}, - 1620728: []string{"America/Chicago"}, - 1620767: []string{"America/Chicago"}, - 1620783: []string{"America/Chicago"}, - 1620792: []string{"America/Chicago"}, - 1620793: []string{"America/Chicago"}, - 1620795: []string{"America/Chicago"}, - 1620805: []string{"America/Chicago"}, - 1620825: []string{"America/Chicago"}, - 1620842: []string{"America/Chicago"}, - 1620845: []string{"America/Chicago"}, - 1620846: []string{"America/Chicago"}, - 1620855: []string{"America/Chicago"}, - 1620856: []string{"America/Chicago"}, - 1620872: []string{"America/Chicago"}, - 1620873: []string{"America/Chicago"}, - 1620879: []string{"America/Chicago"}, - 1620886: []string{"America/Chicago"}, - 1620896: []string{"America/Chicago"}, - 1620947: []string{"America/Chicago"}, - 1623: []string{"America/Phoenix"}, - 1626: []string{"America/Los_Angeles"}, - 1628: []string{"America/Los_Angeles"}, - 1629: []string{"America/Chicago"}, - 1630: []string{"America/Chicago"}, - 1631: []string{"America/New_York"}, - 1636: []string{"America/Chicago"}, - 1641: []string{"America/Chicago"}, - 1646: []string{"America/New_York"}, - 1647: []string{"America/Toronto"}, - 1649: []string{"America/Grand_Turk"}, - 1650: []string{"America/Los_Angeles"}, - 1651: []string{"America/Chicago"}, - 1657: []string{"America/Los_Angeles"}, - 1660: []string{"America/Chicago"}, - 1661: []string{"America/Los_Angeles"}, - 1662: []string{"America/Chicago"}, - 1664: []string{"America/Montserrat"}, - 1670: []string{"Pacific/Saipan"}, - 1671: []string{"Pacific/Guam"}, - 1678: []string{"America/New_York"}, - 1680: []string{"America/New_York"}, - 1681: []string{"America/New_York"}, - 1682: []string{"America/Chicago"}, - 1684: []string{"Pacific/Pago_Pago"}, - 1701200: []string{"America/Chicago"}, - 1701205: []string{"America/Chicago"}, - 1701212: []string{"America/Chicago"}, - 1701214: []string{"America/Chicago"}, - 1701220: []string{"America/Chicago"}, - 1701221: []string{"America/Chicago"}, - 1701222: []string{"America/Chicago"}, - 1701223: []string{"America/Chicago"}, - 1701224: []string{"America/Chicago"}, - 1701225: []string{"America/Denver"}, - 1701226: []string{"America/Chicago"}, - 1701227: []string{"America/Denver"}, - 1701228: []string{"America/Chicago"}, - 1701231: []string{"America/Chicago"}, - 1701232: []string{"America/Chicago"}, - 1701234: []string{"America/Chicago"}, - 1701235: []string{"America/Chicago"}, - 1701237: []string{"America/Chicago"}, - 1701238: []string{"America/Chicago"}, - 1701239: []string{"America/Chicago"}, - 1701241: []string{"America/Chicago"}, - 1701242: []string{"America/Chicago"}, - 1701250: []string{"America/Chicago"}, - 1701251: []string{"America/Chicago"}, - 1701252: []string{"America/Chicago"}, - 1701253: []string{"America/Chicago"}, - 1701254: []string{"America/Chicago"}, - 1701255: []string{"America/Chicago"}, - 1701256: []string{"America/Chicago"}, - 1701258: []string{"America/Chicago"}, - 1701261: []string{"America/Chicago"}, - 1701265: []string{"America/Chicago"}, - 1701271: []string{"America/Chicago"}, - 1701277: []string{"America/Chicago"}, - 1701280: []string{"America/Chicago"}, - 1701281: []string{"America/Chicago"}, - 1701282: []string{"America/Chicago"}, - 1701284: []string{"America/Chicago"}, - 1701288: []string{"America/Chicago"}, - 1701290: []string{"America/Denver"}, - 1701293: []string{"America/Chicago"}, - 1701297: []string{"America/Chicago"}, - 1701298: []string{"America/Chicago"}, - 1701306: []string{"America/Chicago"}, - 1701323: []string{"America/Chicago"}, - 1701324: []string{"America/Chicago"}, - 1701328: []string{"America/Chicago"}, - 1701343: []string{"America/Chicago"}, - 1701347: []string{"America/Chicago"}, - 1701349: []string{"America/Chicago"}, - 1701352: []string{"America/Chicago"}, - 1701355: []string{"America/Chicago"}, - 1701356: []string{"America/Chicago"}, - 1701361: []string{"America/Chicago"}, - 1701364: []string{"America/Chicago"}, - 1701365: []string{"America/Chicago"}, - 1701367: []string{"America/Chicago"}, - 1701371: []string{"America/Chicago"}, - 1701385: []string{"America/Chicago"}, - 1701388: []string{"America/Chicago"}, - 1701391: []string{"America/Chicago"}, - 1701400: []string{"America/Chicago"}, - 1701426: []string{"America/Chicago"}, - 1701428: []string{"America/Chicago"}, - 1701437: []string{"America/Chicago"}, - 1701444: []string{"America/Chicago"}, - 1701446: []string{"America/Chicago"}, - 1701448: []string{"America/Chicago"}, - 1701452: []string{"America/Chicago"}, - 1701456: []string{"America/Denver"}, - 1701462: []string{"America/Chicago"}, - 1701463: []string{"America/Chicago"}, - 1701471: []string{"America/Chicago"}, - 1701476: []string{"America/Chicago"}, - 1701477: []string{"America/Chicago"}, - 1701478: []string{"America/Chicago"}, - 1701483: []string{"America/Denver"}, - 1701492: []string{"America/Chicago"}, - 1701499: []string{"America/Chicago"}, - 1701523: []string{"America/Denver"}, - 1701527: []string{"America/Chicago"}, - 1701530: []string{"America/Chicago"}, - 1701540: []string{"America/Chicago"}, - 1701549: []string{"America/Chicago"}, - 1701566: []string{"America/Chicago"}, - 1701567: []string{"America/Denver"}, - 1701572: []string{"America/Chicago"}, - 1701575: []string{"America/Denver"}, - 1701577: []string{"America/Chicago"}, - 1701584: []string{"America/Denver"}, - 1701595: []string{"America/Chicago"}, - 1701609: []string{"America/Chicago"}, - 1701623: []string{"America/Denver"}, - 1701627: []string{"America/Chicago"}, - 1701628: []string{"America/Chicago"}, - 1701636: []string{"America/Chicago"}, - 1701642: []string{"America/Chicago"}, - 1701652: []string{"America/Chicago"}, - 1701662: []string{"America/Chicago"}, - 1701663: []string{"America/Chicago"}, - 1701664: []string{"America/Chicago"}, - 1701667: []string{"America/Chicago"}, - 1701683: []string{"America/Chicago"}, - 1701724: []string{"America/Chicago"}, - 1701738: []string{"America/Chicago"}, - 1701742: []string{"America/Chicago"}, - 1701746: []string{"America/Chicago"}, - 1701748: []string{"America/Chicago"}, - 1701751: []string{"America/Chicago"}, - 1701754: []string{"America/Chicago"}, - 1701756: []string{"America/Chicago"}, - 1701757: []string{"America/Chicago"}, - 1701764: []string{"America/Denver"}, - 1701766: []string{"America/Chicago"}, - 1701772: []string{"America/Chicago"}, - 1701774: []string{"America/Chicago"}, - 1701775: []string{"America/Chicago"}, - 1701776: []string{"America/Chicago"}, - 1701777: []string{"America/Chicago"}, - 1701780: []string{"America/Chicago"}, - 1701786: []string{"America/Chicago"}, - 1701787: []string{"America/Chicago"}, - 1701788: []string{"America/Chicago"}, - 1701793: []string{"America/Chicago"}, - 1701795: []string{"America/Chicago"}, - 1701797: []string{"America/Chicago"}, - 1701799: []string{"America/Chicago"}, - 1701824: []string{"America/Denver"}, - 1701833: []string{"America/Chicago"}, - 1701837: []string{"America/Chicago"}, - 1701838: []string{"America/Chicago"}, - 1701839: []string{"America/Chicago"}, - 1701842: []string{"America/Chicago"}, - 1701843: []string{"America/Chicago"}, - 1701845: []string{"America/Chicago"}, - 1701852: []string{"America/Chicago"}, - 1701854: []string{"America/Chicago"}, - 1701857: []string{"America/Chicago"}, - 1701858: []string{"America/Chicago"}, - 1701866: []string{"America/Chicago"}, - 1701872: []string{"America/Denver"}, - 1701873: []string{"America/Chicago"}, - 1701883: []string{"America/Chicago"}, - 1701893: []string{"America/Chicago"}, - 1701947: []string{"America/Chicago"}, - 1701952: []string{"America/Chicago"}, - 1701965: []string{"America/Chicago"}, - 1701968: []string{"America/Chicago"}, - 1702: []string{"America/Los_Angeles"}, - 1703: []string{"America/New_York"}, - 1704: []string{"America/New_York"}, - 1705: []string{"America/Toronto"}, - 1706: []string{"America/New_York"}, - 1707: []string{"America/Los_Angeles"}, - 1708: []string{"America/Chicago"}, - 1709227: []string{"America/St_Johns"}, - 1709229: []string{"America/St_Johns"}, - 1709237: []string{"America/St_Johns"}, - 1709256: []string{"America/St_Johns"}, - 1709257: []string{"America/St_Johns"}, - 1709279: []string{"America/St_Johns"}, - 1709282: []string{"America/Halifax"}, - 1709364: []string{"America/St_Johns"}, - 1709368: []string{"America/St_Johns"}, - 1709437: []string{"America/St_Johns"}, - 1709454: []string{"America/St_Johns"}, - 1709458: []string{"America/St_Johns"}, - 1709466: []string{"America/St_Johns"}, - 1709468: []string{"America/St_Johns"}, - 1709489: []string{"America/St_Johns"}, - 1709532: []string{"America/St_Johns"}, - 1709533: []string{"America/St_Johns"}, - 1709535: []string{"America/St_Johns"}, - 1709576: []string{"America/St_Johns"}, - 1709579: []string{"America/St_Johns"}, - 1709596: []string{"America/St_Johns"}, - 1709634: []string{"America/St_Johns"}, - 1709635: []string{"America/St_Johns"}, - 1709637: []string{"America/St_Johns"}, - 1709639: []string{"America/St_Johns"}, - 1709643: []string{"America/St_Johns"}, - 1709651: []string{"America/St_Johns"}, - 1709673: []string{"America/St_Johns"}, - 1709685: []string{"America/St_Johns"}, - 1709695: []string{"America/St_Johns"}, - 1709722: []string{"America/St_Johns"}, - 1709726: []string{"America/St_Johns"}, - 1709729: []string{"America/St_Johns"}, - 1709738: []string{"America/St_Johns"}, - 1709739: []string{"America/St_Johns"}, - 1709745: []string{"America/St_Johns"}, - 1709747: []string{"America/St_Johns"}, - 1709753: []string{"America/St_Johns"}, - 1709754: []string{"America/St_Johns"}, - 1709758: []string{"America/St_Johns"}, - 1709759: []string{"America/St_Johns"}, - 1709782: []string{"America/St_Johns"}, - 1709786: []string{"America/St_Johns"}, - 1709832: []string{"America/St_Johns"}, - 1709834: []string{"America/St_Johns"}, - 1709884: []string{"America/St_Johns"}, - 1709891: []string{"America/St_Johns"}, - 1709895: []string{"America/St_Johns"}, - 1709896: []string{"America/Halifax"}, - 1709944: []string{"America/Halifax"}, - 1712: []string{"America/Chicago"}, - 1713: []string{"America/Chicago"}, - 1714: []string{"America/Los_Angeles"}, - 1715: []string{"America/Chicago"}, - 1716: []string{"America/New_York"}, - 1717: []string{"America/New_York"}, - 1718: []string{"America/New_York"}, - 1719: []string{"America/Denver"}, - 1720: []string{"America/Denver"}, - 1721: []string{"America/Lower_Princes"}, - 1724: []string{"America/New_York"}, - 1726: []string{"America/Texas"}, - 1727: []string{"America/New_York"}, - 1731: []string{"America/Chicago"}, - 1732: []string{"America/New_York"}, - 1734: []string{"America/New_York"}, - 1740: []string{"America/New_York"}, - 1743: []string{"America/New_York"}, - 1747: []string{"America/Los_Angeles"}, - 1754: []string{"America/New_York"}, - 1757: []string{"America/New_York"}, - 1758: []string{"America/St_Lucia"}, - 1760: []string{"America/Los_Angeles"}, - 1762: []string{"America/New_York"}, - 1763: []string{"America/Chicago"}, - 1765: []string{"America/New_York"}, - 1767: []string{"America/Dominica"}, - 1769: []string{"America/Chicago"}, - 1770: []string{"America/New_York"}, - 1772: []string{"America/New_York"}, - 1773: []string{"America/Chicago"}, - 1774: []string{"America/New_York"}, - 1775: []string{ - "America/Boise", "America/Los_Angeles", - }, - 1775200: []string{"America/Los_Angeles"}, - 1775230: []string{"America/Los_Angeles"}, - 1775232: []string{"America/Los_Angeles"}, - 1775233: []string{"America/Los_Angeles"}, - 1775237: []string{"America/Los_Angeles"}, - 1775240: []string{"America/Los_Angeles"}, - 1775246: []string{"America/Los_Angeles"}, - 1775250: []string{"America/Los_Angeles"}, - 1775265: []string{"America/Los_Angeles"}, - 1775267: []string{"America/Los_Angeles"}, - 1775273: []string{"America/Los_Angeles"}, - 1775284: []string{"America/Los_Angeles"}, - 1775289: []string{"America/Los_Angeles"}, - 1775298: []string{"America/Los_Angeles"}, - 1775322: []string{"America/Los_Angeles"}, - 1775323: []string{"America/Los_Angeles"}, - 1775324: []string{"America/Los_Angeles"}, - 1775327: []string{"America/Los_Angeles"}, - 1775328: []string{"America/Los_Angeles"}, - 1775329: []string{"America/Los_Angeles"}, - 1775331: []string{"America/Los_Angeles"}, - 1775332: []string{"America/Los_Angeles"}, - 1775333: []string{"America/Los_Angeles"}, - 1775334: []string{"America/Los_Angeles"}, - 1775336: []string{"America/Los_Angeles"}, - 1775337: []string{"America/Los_Angeles"}, - 1775338: []string{"America/Los_Angeles"}, - 1775345: []string{"America/Los_Angeles"}, - 1775348: []string{"America/Los_Angeles"}, - 1775351: []string{"America/Los_Angeles"}, - 1775352: []string{"America/Los_Angeles"}, - 1775353: []string{"America/Los_Angeles"}, - 1775354: []string{"America/Los_Angeles"}, - 1775355: []string{"America/Los_Angeles"}, - 1775356: []string{"America/Los_Angeles"}, - 1775358: []string{"America/Los_Angeles"}, - 1775359: []string{"America/Los_Angeles"}, - 1775360: []string{"America/Los_Angeles"}, - 1775376: []string{"America/Los_Angeles"}, - 1775384: []string{"America/Los_Angeles"}, - 1775391: []string{"America/Los_Angeles"}, - 1775392: []string{"America/Los_Angeles"}, - 1775423: []string{"America/Los_Angeles"}, - 1775424: []string{"America/Los_Angeles"}, - 1775425: []string{"America/Los_Angeles"}, - 1775428: []string{"America/Los_Angeles"}, - 1775445: []string{"America/Los_Angeles"}, - 1775450: []string{"America/Los_Angeles"}, - 1775453: []string{"America/Los_Angeles"}, - 1775461: []string{"America/Los_Angeles"}, - 1775463: []string{"America/Los_Angeles"}, - 1775470: []string{"America/Los_Angeles"}, - 1775473: []string{"America/Los_Angeles"}, - 1775482: []string{"America/Los_Angeles"}, - 1775525: []string{"America/Los_Angeles"}, - 1775537: []string{"America/Los_Angeles"}, - 1775544: []string{"America/Los_Angeles"}, - 1775575: []string{"America/Los_Angeles"}, - 1775577: []string{"America/Los_Angeles"}, - 1775586: []string{"America/Los_Angeles"}, - 1775588: []string{"America/Los_Angeles"}, - 1775622: []string{"America/Los_Angeles"}, - 1775623: []string{"America/Los_Angeles"}, - 1775624: []string{"America/Los_Angeles"}, - 1775625: []string{"America/Los_Angeles"}, - 1775626: []string{"America/Los_Angeles"}, - 1775635: []string{"America/Los_Angeles"}, - 1775636: []string{"America/Los_Angeles"}, - 1775657: []string{"America/Los_Angeles"}, - 1775664: []string{"America/Denver"}, - 1775673: []string{"America/Los_Angeles"}, - 1775674: []string{"America/Los_Angeles"}, - 1775677: []string{"America/Los_Angeles"}, - 1775684: []string{"America/Los_Angeles"}, - 1775686: []string{"America/Los_Angeles"}, - 1775687: []string{"America/Los_Angeles"}, - 1775688: []string{"America/Los_Angeles"}, - 1775689: []string{"America/Los_Angeles"}, - 1775720: []string{"America/Los_Angeles"}, - 1775721: []string{"America/Los_Angeles"}, - 1775722: []string{"America/Los_Angeles"}, - 1775726: []string{"America/Los_Angeles"}, - 1775727: []string{"America/Los_Angeles"}, - 1775737: []string{"America/Los_Angeles"}, - 1775738: []string{"America/Los_Angeles"}, - 1775742: []string{"America/Los_Angeles"}, - 1775746: []string{"America/Los_Angeles"}, - 1775747: []string{"America/Los_Angeles"}, - 1775750: []string{"America/Los_Angeles"}, - 1775751: []string{"America/Los_Angeles"}, - 1775752: []string{"America/Los_Angeles"}, - 1775753: []string{"America/Los_Angeles"}, - 1775762: []string{"America/Los_Angeles"}, - 1775770: []string{"America/Los_Angeles"}, - 1775771: []string{"America/Los_Angeles"}, - 1775772: []string{"America/Los_Angeles"}, - 1775777: []string{"America/Los_Angeles"}, - 1775778: []string{"America/Los_Angeles"}, - 1775782: []string{"America/Los_Angeles"}, - 1775783: []string{"America/Los_Angeles"}, - 1775784: []string{"America/Los_Angeles"}, - 1775786: []string{"America/Los_Angeles"}, - 1775787: []string{"America/Los_Angeles"}, - 1775800: []string{"America/Los_Angeles"}, - 1775823: []string{"America/Los_Angeles"}, - 1775824: []string{"America/Los_Angeles"}, - 1775825: []string{"America/Los_Angeles"}, - 1775826: []string{"America/Los_Angeles"}, - 1775827: []string{"America/Los_Angeles"}, - 1775828: []string{"America/Los_Angeles"}, - 1775829: []string{"America/Los_Angeles"}, - 1775830: []string{"America/Los_Angeles"}, - 1775831: []string{"America/Los_Angeles"}, - 1775832: []string{"America/Los_Angeles"}, - 1775833: []string{"America/Los_Angeles"}, - 1775835: []string{"America/Los_Angeles"}, - 1775841: []string{"America/Los_Angeles"}, - 1775843: []string{"America/Los_Angeles"}, - 1775847: []string{"America/Los_Angeles"}, - 1775849: []string{"America/Los_Angeles"}, - 1775850: []string{"America/Los_Angeles"}, - 1775851: []string{"America/Los_Angeles"}, - 1775852: []string{"America/Los_Angeles"}, - 1775853: []string{"America/Los_Angeles"}, - 1775856: []string{"America/Los_Angeles"}, - 1775857: []string{"America/Los_Angeles"}, - 1775867: []string{"America/Los_Angeles"}, - 1775870: []string{"America/Los_Angeles"}, - 1775882: []string{"America/Los_Angeles"}, - 1775883: []string{"America/Los_Angeles"}, - 1775884: []string{"America/Los_Angeles"}, - 1775885: []string{"America/Los_Angeles"}, - 1775886: []string{"America/Los_Angeles"}, - 1775887: []string{"America/Los_Angeles"}, - 1775888: []string{"America/Los_Angeles"}, - 1775945: []string{"America/Los_Angeles"}, - 1775971: []string{"America/Los_Angeles"}, - 1775972: []string{"America/Los_Angeles"}, - 1775982: []string{"America/Los_Angeles"}, - 1778: []string{"America/Vancouver"}, - 1779: []string{"America/Chicago"}, - 1780: []string{"America/Edmonton"}, - 1781: []string{"America/New_York"}, - 1784: []string{"America/St_Vincent"}, - 1785215: []string{"America/Chicago"}, - 1785218: []string{"America/Chicago"}, - 1785222: []string{"America/Chicago"}, - 1785223: []string{"America/Chicago"}, - 1785227: []string{"America/Chicago"}, - 1785228: []string{"America/Chicago"}, - 1785229: []string{"America/Chicago"}, - 1785232: []string{"America/Chicago"}, - 1785233: []string{"America/Chicago"}, - 1785234: []string{"America/Chicago"}, - 1785235: []string{"America/Chicago"}, - 1785238: []string{"America/Chicago"}, - 1785239: []string{"America/Chicago"}, - 1785242: []string{"America/Chicago"}, - 1785243: []string{"America/Chicago"}, - 1785246: []string{"America/Chicago"}, - 1785256: []string{"America/Chicago"}, - 1785258: []string{"America/Chicago"}, - 1785263: []string{"America/Chicago"}, - 1785266: []string{"America/Chicago"}, - 1785267: []string{"America/Chicago"}, - 1785271: []string{"America/Chicago"}, - 1785272: []string{"America/Chicago"}, - 1785273: []string{"America/Chicago"}, - 1785282: []string{"America/Chicago"}, - 1785284: []string{"America/Chicago"}, - 1785286: []string{"America/Chicago"}, - 1785292: []string{"America/Chicago"}, - 1785295: []string{"America/Chicago"}, - 1785296: []string{"America/Chicago"}, - 1785309: []string{"America/Chicago"}, - 1785312: []string{"America/Chicago"}, - 1785320: []string{"America/Chicago"}, - 1785325: []string{"America/Chicago"}, - 1785331: []string{"America/Chicago"}, - 1785332: []string{"America/Chicago"}, - 1785336: []string{"America/Chicago"}, - 1785341: []string{"America/Chicago"}, - 1785346: []string{"America/Chicago"}, - 1785350: []string{"America/Chicago"}, - 1785354: []string{"America/Chicago"}, - 1785357: []string{"America/Chicago"}, - 1785363: []string{"America/Chicago"}, - 1785364: []string{"America/Chicago"}, - 1785368: []string{"America/Chicago"}, - 1785371: []string{"America/Chicago"}, - 1785378: []string{"America/Chicago"}, - 1785379: []string{"America/Chicago"}, - 1785380: []string{"America/Chicago"}, - 1785392: []string{"America/Chicago"}, - 1785393: []string{"America/Chicago"}, - 1785404: []string{"America/Chicago"}, - 1785408: []string{"America/Chicago"}, - 1785421: []string{"America/Chicago"}, - 1785425: []string{"America/Chicago"}, - 1785434: []string{"America/Chicago"}, - 1785437: []string{"America/Chicago"}, - 1785448: []string{"America/Chicago"}, - 1785452: []string{"America/Chicago"}, - 1785454: []string{"America/Chicago"}, - 1785456: []string{"America/Chicago"}, - 1785460: []string{"America/Chicago"}, - 1785462: []string{"America/Chicago"}, - 1785472: []string{"America/Chicago"}, - 1785475: []string{"America/Chicago"}, - 1785478: []string{"America/Chicago"}, - 1785483: []string{"America/Chicago"}, - 1785484: []string{"America/Chicago"}, - 1785486: []string{"America/Chicago"}, - 1785505: []string{"America/Chicago"}, - 1785524: []string{"America/Chicago"}, - 1785527: []string{"America/Chicago"}, - 1785528: []string{"America/Chicago"}, - 1785532: []string{"America/Chicago"}, - 1785537: []string{"America/Chicago"}, - 1785539: []string{"America/Chicago"}, - 1785542: []string{"America/Chicago"}, - 1785543: []string{"America/Chicago"}, - 1785550: []string{"America/Chicago"}, - 1785562: []string{"America/Chicago"}, - 1785587: []string{"America/Chicago"}, - 1785594: []string{"America/Chicago"}, - 1785597: []string{"America/Chicago"}, - 1785621: []string{"America/Chicago"}, - 1785623: []string{"America/Chicago"}, - 1785625: []string{"America/Chicago"}, - 1785626: []string{"America/Chicago"}, - 1785628: []string{"America/Chicago"}, - 1785632: []string{"America/Chicago"}, - 1785658: []string{"America/Chicago"}, - 1785665: []string{"America/Chicago"}, - 1785672: []string{"America/Chicago"}, - 1785675: []string{"America/Chicago"}, - 1785726: []string{"America/Chicago"}, - 1785727: []string{"America/Chicago"}, - 1785735: []string{"America/Chicago"}, - 1785738: []string{"America/Chicago"}, - 1785742: []string{"America/Chicago"}, - 1785743: []string{"America/Chicago"}, - 1785749: []string{"America/Chicago"}, - 1785754: []string{"America/Chicago"}, - 1785762: []string{"America/Chicago"}, - 1785765: []string{"America/Chicago"}, - 1785766: []string{"America/Chicago"}, - 1785776: []string{"America/Chicago"}, - 1785783: []string{"America/Chicago"}, - 1785798: []string{"America/Chicago"}, - 1785820: []string{"America/Chicago"}, - 1785823: []string{"America/Chicago"}, - 1785825: []string{"America/Chicago"}, - 1785826: []string{"America/Chicago"}, - 1785827: []string{"America/Chicago"}, - 1785828: []string{"America/Chicago"}, - 1785830: []string{"America/Chicago"}, - 1785832: []string{"America/Chicago"}, - 1785836: []string{"America/Chicago"}, - 1785838: []string{"America/Chicago"}, - 1785840: []string{"America/Chicago"}, - 1785841: []string{"America/Chicago"}, - 1785842: []string{"America/Chicago"}, - 1785843: []string{"America/Chicago"}, - 1785852: []string{"America/Denver"}, - 1785856: []string{"America/Chicago"}, - 1785862: []string{"America/Chicago"}, - 1785863: []string{"America/Chicago"}, - 1785864: []string{"America/Chicago"}, - 1785865: []string{"America/Chicago"}, - 1785877: []string{"America/Chicago"}, - 1785883: []string{"America/Chicago"}, - 1785889: []string{"America/Chicago"}, - 1785890: []string{"America/Denver"}, - 1785899: []string{"America/Denver"}, - 1785945: []string{"America/Chicago"}, - 1785969: []string{"America/Chicago"}, - 1785979: []string{"America/Chicago"}, - 1785985: []string{"America/Chicago"}, - 1785989: []string{"America/Chicago"}, - 1786: []string{"America/New_York"}, - 1787: []string{"America/Puerto_Rico"}, - 1801: []string{"America/Denver"}, - 1802: []string{"America/New_York"}, - 1803: []string{"America/New_York"}, - 1804: []string{"America/New_York"}, - 1805: []string{"America/Los_Angeles"}, - 1806: []string{"America/Chicago"}, - 1807: []string{"America/Toronto"}, - 1807223: []string{"America/Winnipeg"}, - 1807226: []string{"America/Winnipeg"}, - 1807274: []string{"America/Winnipeg"}, - 1807467: []string{"America/Winnipeg"}, - 1807468: []string{"America/Winnipeg"}, - 1807482: []string{"America/Winnipeg"}, - 1807548: []string{"America/Winnipeg"}, - 1807727: []string{"America/Winnipeg"}, - 1807737: []string{"America/Winnipeg"}, - 1807934: []string{"America/Winnipeg"}, - 1808: []string{"Pacific/Honolulu"}, - 1809: []string{"America/Halifax"}, - 1810: []string{"America/New_York"}, - 1812218: []string{"America/New_York"}, - 1812222: []string{"America/New_York"}, - 1812231: []string{"America/New_York"}, - 1812232: []string{"America/New_York"}, - 1812234: []string{"America/New_York"}, - 1812235: []string{"America/New_York"}, - 1812237: []string{"America/New_York"}, - 1812238: []string{"America/New_York"}, - 1812242: []string{"America/New_York"}, - 1812246: []string{"America/New_York"}, - 1812247: []string{"America/New_York"}, - 1812254: []string{"America/New_York"}, - 1812256: []string{"America/New_York"}, - 1812257: []string{"America/New_York"}, - 1812265: []string{"America/New_York"}, - 1812268: []string{"America/New_York"}, - 1812273: []string{"America/New_York"}, - 1812275: []string{"America/New_York"}, - 1812277: []string{"America/New_York"}, - 1812278: []string{"America/New_York"}, - 1812279: []string{"America/New_York"}, - 1812280: []string{"America/New_York"}, - 1812282: []string{"America/New_York"}, - 1812283: []string{"America/New_York"}, - 1812284: []string{"America/New_York"}, - 1812285: []string{"America/New_York"}, - 1812288: []string{"America/New_York"}, - 1812294: []string{"America/New_York"}, - 1812295: []string{"America/New_York"}, - 1812299: []string{"America/New_York"}, - 1812314: []string{"America/New_York"}, - 1812320: []string{"America/New_York"}, - 1812322: []string{"America/New_York"}, - 1812323: []string{"America/New_York"}, - 1812325: []string{"America/New_York"}, - 1812327: []string{"America/New_York"}, - 181233: []string{"America/New_York"}, - 1812342: []string{"America/New_York"}, - 1812345: []string{"America/New_York"}, - 1812346: []string{"America/New_York"}, - 1812347: []string{"America/New_York"}, - 1812349: []string{"America/New_York"}, - 1812352: []string{"America/New_York"}, - 1812353: []string{"America/New_York"}, - 1812354: []string{"America/New_York"}, - 1812355: []string{"America/New_York"}, - 1812358: []string{"America/New_York"}, - 1812364: []string{"America/New_York"}, - 1812365: []string{"America/New_York"}, - 1812367: []string{"America/New_York"}, - 1812372: []string{"America/New_York"}, - 1812373: []string{"America/New_York"}, - 1812375: []string{"America/New_York"}, - 1812376: []string{"America/New_York"}, - 1812378: []string{"America/New_York"}, - 1812379: []string{"America/New_York"}, - 1812384: []string{"America/New_York"}, - 1812385: []string{"America/Chicago"}, - 1812386: []string{"America/Chicago"}, - 1812401: []string{"America/Chicago"}, - 1812402: []string{"America/Chicago"}, - 1812421: []string{"America/Chicago"}, - 1812422: []string{"America/Chicago"}, - 1812423: []string{"America/Chicago"}, - 1812424: []string{"America/Chicago"}, - 1812425: []string{"America/Chicago"}, - 1812426: []string{"America/Chicago"}, - 1812427: []string{"America/New_York"}, - 1812428: []string{"America/Chicago"}, - 1812432: []string{"America/New_York"}, - 1812435: []string{"America/Chicago"}, - 1812437: []string{"America/Chicago"}, - 1812438: []string{"America/New_York"}, - 1812442: []string{"America/New_York"}, - 1812443: []string{"America/New_York"}, - 1812446: []string{"America/New_York"}, - 1812448: []string{"America/New_York"}, - 1812450: []string{"America/Chicago"}, - 1812462: []string{"America/New_York"}, - 1812464: []string{"America/Chicago"}, - 1812466: []string{"America/New_York"}, - 1812471: []string{"America/Chicago"}, - 1812473: []string{"America/Chicago"}, - 1812474: []string{"America/Chicago"}, - 1812475: []string{"America/Chicago"}, - 1812476: []string{"America/Chicago"}, - 1812477: []string{"America/Chicago"}, - 1812478: []string{"America/New_York"}, - 1812479: []string{"America/Chicago"}, - 1812481: []string{"America/New_York"}, - 1812482: []string{"America/New_York"}, - 1812485: []string{"America/Chicago"}, - 1812486: []string{"America/New_York"}, - 1812490: []string{"America/Chicago"}, - 1812491: []string{"America/Chicago"}, - 1812522: []string{"America/New_York"}, - 1812523: []string{"America/New_York"}, - 1812524: []string{"America/New_York"}, - 1812526: []string{"America/New_York"}, - 1812533: []string{"America/New_York"}, - 1812537: []string{"America/New_York"}, - 1812539: []string{"America/New_York"}, - 1812542: []string{"America/New_York"}, - 1812546: []string{"America/New_York"}, - 1812547: []string{"America/Chicago"}, - 1812590: []string{"America/New_York"}, - 1812591: []string{"America/New_York"}, - 1812597: []string{"America/New_York"}, - 1812618: []string{"America/Chicago"}, - 1812623: []string{"America/New_York"}, - 1812634: []string{"America/New_York"}, - 1812636: []string{"America/New_York"}, - 1812637: []string{"America/New_York"}, - 1812645: []string{"America/New_York"}, - 1812649: []string{"America/Chicago"}, - 1812654: []string{"America/New_York"}, - 1812659: []string{"America/New_York"}, - 1812662: []string{"America/New_York"}, - 1812663: []string{"America/New_York"}, - 1812665: []string{"America/New_York"}, - 1812682: []string{"America/Chicago"}, - 1812683: []string{"America/New_York"}, - 1812689: []string{"America/New_York"}, - 1812723: []string{"America/New_York"}, - 1812725: []string{"America/New_York"}, - 1812734: []string{"America/New_York"}, - 1812735: []string{"America/New_York"}, - 1812738: []string{"America/New_York"}, - 1812749: []string{"America/Chicago"}, - 1812752: []string{"America/New_York"}, - 1812753: []string{"America/Chicago"}, - 1812768: []string{"America/Chicago"}, - 1812794: []string{"America/New_York"}, - 1812822: []string{"America/New_York"}, - 1812824: []string{"America/New_York"}, - 1812825: []string{"America/New_York"}, - 1812829: []string{"America/New_York"}, - 1812838: []string{"America/Chicago"}, - 1812842: []string{"America/Chicago"}, - 1812847: []string{"America/New_York"}, - 1812849: []string{"America/New_York"}, - 1812853: []string{"America/Chicago"}, - 1812855: []string{"America/New_York"}, - 1812858: []string{"America/Chicago"}, - 1812865: []string{"America/New_York"}, - 1812866: []string{"America/New_York"}, - 1812867: []string{"America/Chicago"}, - 1812874: []string{"America/Chicago"}, - 1812875: []string{"America/New_York"}, - 1812876: []string{"America/New_York"}, - 1812877: []string{"America/New_York"}, - 1812882: []string{"America/New_York"}, - 1812883: []string{"America/New_York"}, - 1812885: []string{"America/New_York"}, - 1812886: []string{"America/New_York"}, - 1812897: []string{"America/Chicago"}, - 1812917: []string{"America/New_York"}, - 1812923: []string{"America/New_York"}, - 1812925: []string{"America/Chicago"}, - 1812926: []string{"America/New_York"}, - 1812932: []string{"America/New_York"}, - 1812933: []string{"America/New_York"}, - 1812934: []string{"America/New_York"}, - 1812936: []string{"America/New_York"}, - 1812937: []string{"America/Chicago"}, - 1812939: []string{"America/New_York"}, - 1812941: []string{"America/New_York"}, - 1812944: []string{"America/New_York"}, - 1812945: []string{"America/New_York"}, - 1812948: []string{"America/New_York"}, - 1812949: []string{"America/New_York"}, - 1812951: []string{"America/New_York"}, - 1812952: []string{"America/New_York"}, - 1812961: []string{"America/New_York"}, - 1812962: []string{"America/Chicago"}, - 1812963: []string{"America/Chicago"}, - 1812967: []string{"America/New_York"}, - 1812985: []string{"America/Chicago"}, - 1812988: []string{"America/New_York"}, - 1813: []string{"America/New_York"}, - 1814: []string{"America/New_York"}, - 1815: []string{"America/Chicago"}, - 1816: []string{"America/Chicago"}, - 1817: []string{"America/Chicago"}, - 1818: []string{"America/Los_Angeles"}, - 1819: []string{"America/Toronto"}, - 1825: []string{"America/Edmonton"}, - 1828: []string{"America/New_York"}, - 1829: []string{"America/Halifax"}, - 1830: []string{"America/Chicago"}, - 1831: []string{"America/Los_Angeles"}, - 1832: []string{"America/Chicago"}, - 1843: []string{"America/New_York"}, - 1845: []string{"America/New_York"}, - 1847: []string{"America/Chicago"}, - 1848: []string{"America/New_York"}, - 1849: []string{"America/Halifax"}, - 1850200: []string{"America/Chicago"}, - 1850201: []string{"America/New_York"}, - 1850206: []string{"America/Chicago"}, - 1850208: []string{"America/Chicago"}, - 1850210: []string{"America/New_York"}, - 1850212: []string{"America/New_York"}, - 1850213: []string{"America/Chicago"}, - 1850215: []string{"America/Chicago"}, - 1850216: []string{"America/New_York"}, - 1850217: []string{"America/Chicago"}, - 1850218: []string{"America/Chicago"}, - 1850219: []string{"America/New_York"}, - 1850222: []string{"America/New_York"}, - 1850223: []string{"America/New_York"}, - 1850224: []string{"America/New_York"}, - 1850225: []string{"America/Chicago"}, - 1850226: []string{"America/Chicago"}, - 1850227: []string{"America/Chicago"}, - 1850228: []string{"America/New_York"}, - 1850229: []string{"America/Chicago"}, - 1850230: []string{"America/Chicago"}, - 1850231: []string{"America/Chicago"}, - 1850232: []string{"America/Chicago"}, - 1850233: []string{"America/Chicago"}, - 1850234: []string{"America/Chicago"}, - 1850235: []string{"America/Chicago"}, - 1850236: []string{"America/Chicago"}, - 1850238: []string{"America/Chicago"}, - 1850240: []string{"America/Chicago"}, - 1850243: []string{"America/Chicago"}, - 1850244: []string{"America/Chicago"}, - 1850248: []string{"America/Chicago"}, - 1850249: []string{"America/Chicago"}, - 1850250: []string{"America/Chicago"}, - 1850251: []string{"America/New_York"}, - 1850256: []string{"America/Chicago"}, - 1850258: []string{"America/Chicago"}, - 1850259: []string{"America/Chicago"}, - 1850261: []string{"America/Chicago"}, - 1850263: []string{"America/Chicago"}, - 1850265: []string{"America/Chicago"}, - 1850267: []string{"America/Chicago"}, - 1850269: []string{"America/Chicago"}, - 1850271: []string{"America/Chicago"}, - 1850276: []string{"America/Chicago"}, - 1850279: []string{"America/Chicago"}, - 1850286: []string{"America/Chicago"}, - 1850294: []string{"America/New_York"}, - 1850297: []string{"America/New_York"}, - 1850301: []string{"America/Chicago"}, - 1850306: []string{"America/Chicago"}, - 1850309: []string{"America/New_York"}, - 1850314: []string{"America/Chicago"}, - 1850319: []string{"America/Chicago"}, - 1850320: []string{"America/New_York"}, - 1850321: []string{"America/New_York"}, - 1850322: []string{"America/New_York"}, - 1850324: []string{"America/Chicago"}, - 1850325: []string{"America/New_York"}, - 1850327: []string{"America/Chicago"}, - 1850329: []string{"America/New_York"}, - 1850332: []string{"America/Chicago"}, - 1850362: []string{"America/Chicago"}, - 1850368: []string{"America/Chicago"}, - 1850376: []string{"America/Chicago"}, - 1850377: []string{"America/Chicago"}, - 1850380: []string{"America/Chicago"}, - 1850383: []string{"America/New_York"}, - 1850384: []string{"America/Chicago"}, - 1850385: []string{"America/New_York"}, - 1850386: []string{"America/New_York"}, - 1850387: []string{"America/Chicago"}, - 1850391: []string{"America/New_York"}, - 1850393: []string{"America/Chicago"}, - 1850396: []string{"America/Chicago"}, - 1850398: []string{"America/Chicago"}, - 1850402: []string{"America/New_York"}, - 1850416: []string{"America/Chicago"}, - 1850417: []string{"America/Chicago"}, - 1850420: []string{"America/Chicago"}, - 1850421: []string{"America/New_York"}, - 1850422: []string{"America/New_York"}, - 1850423: []string{"America/Chicago"}, - 1850424: []string{"America/Chicago"}, - 1850425: []string{"America/New_York"}, - 1850429: []string{"America/Chicago"}, - 1850431: []string{"America/New_York"}, - 1850432: []string{"America/Chicago"}, - 1850433: []string{"America/Chicago"}, - 1850434: []string{"America/Chicago"}, - 1850435: []string{"America/Chicago"}, - 1850436: []string{"America/Chicago"}, - 1850437: []string{"America/Chicago"}, - 1850438: []string{"America/Chicago"}, - 1850439: []string{"America/Chicago"}, - 1850443: []string{"America/New_York"}, - 1850444: []string{"America/Chicago"}, - 1850445: []string{"America/New_York"}, - 1850450: []string{"America/Chicago"}, - 1850452: []string{"America/Chicago"}, - 1850453: []string{"America/Chicago"}, - 1850455: []string{"America/Chicago"}, - 1850456: []string{"America/Chicago"}, - 1850457: []string{"America/Chicago"}, - 1850458: []string{"America/Chicago"}, - 1850460: []string{"America/Chicago"}, - 1850462: []string{"America/Chicago"}, - 1850466: []string{"America/Chicago"}, - 1850469: []string{"America/Chicago"}, - 1850470: []string{"America/Chicago"}, - 1850471: []string{"America/Chicago"}, - 1850473: []string{"America/Chicago"}, - 1850474: []string{"America/Chicago"}, - 1850475: []string{"America/Chicago"}, - 1850476: []string{"America/Chicago"}, - 1850477: []string{"America/Chicago"}, - 1850478: []string{"America/Chicago"}, - 1850479: []string{"America/Chicago"}, - 1850481: []string{"America/Chicago"}, - 1850482: []string{"America/Chicago"}, - 1850484: []string{"America/Chicago"}, - 1850488: []string{"America/New_York"}, - 1850492: []string{"America/Chicago"}, - 1850494: []string{"America/Chicago"}, - 1850497: []string{"America/Chicago"}, - 1850499: []string{"America/Chicago"}, - 1850502: []string{"America/Chicago"}, - 1850505: []string{"America/Chicago"}, - 1850508: []string{"America/New_York"}, - 1850509: []string{"America/New_York"}, - 1850510: []string{"America/New_York"}, - 1850514: []string{"America/New_York"}, - 1850516: []string{"America/Chicago"}, - 1850522: []string{"America/Chicago"}, - 1850523: []string{"America/New_York"}, - 1850526: []string{"America/Chicago"}, - 1850527: []string{"America/Chicago"}, - 1850529: []string{"America/Chicago"}, - 1850535: []string{"America/Chicago"}, - 1850536: []string{"America/New_York"}, - 1850537: []string{"America/Chicago"}, - 1850539: []string{"America/New_York"}, - 1850543: []string{"America/Chicago"}, - 1850545: []string{"America/New_York"}, - 1850547: []string{"America/Chicago"}, - 1850556: []string{"America/New_York"}, - 1850561: []string{"America/New_York"}, - 1850562: []string{"America/New_York"}, - 1850566: []string{"America/New_York"}, - 1850567: []string{"America/New_York"}, - 1850570: []string{"America/New_York"}, - 1850572: []string{"America/Chicago"}, - 1850574: []string{"America/New_York"}, - 1850575: []string{"America/New_York"}, - 1850576: []string{"America/New_York"}, - 1850577: []string{"America/New_York"}, - 1850580: []string{"America/New_York"}, - 1850581: []string{"America/Chicago"}, - 1850584: []string{"America/New_York"}, - 1850585: []string{"America/Chicago"}, - 1850586: []string{"America/Chicago"}, - 1850587: []string{"America/Chicago"}, - 1850588: []string{"America/Chicago"}, - 1850592: []string{"America/Chicago"}, - 1850593: []string{"America/Chicago"}, - 1850595: []string{"America/Chicago"}, - 1850596: []string{"America/Chicago"}, - 1850597: []string{"America/New_York"}, - 1850607: []string{"America/Chicago"}, - 1850622: []string{"America/Chicago"}, - 1850623: []string{"America/Chicago"}, - 1850624: []string{"America/Chicago"}, - 1850626: []string{"America/Chicago"}, - 1850627: []string{"America/New_York"}, - 1850637: []string{"America/Chicago"}, - 1850638: []string{"America/Chicago"}, - 1850639: []string{"America/Chicago"}, - 1850640: []string{"America/Chicago"}, - 1850643: []string{"America/New_York"}, - 1850644: []string{"America/New_York"}, - 1850650: []string{"America/Chicago"}, - 1850651: []string{"America/Chicago"}, - 1850653: []string{"America/New_York"}, - 1850654: []string{"America/Chicago"}, - 1850656: []string{"America/New_York"}, - 1850659: []string{"America/Chicago"}, - 1850663: []string{"America/New_York"}, - 1850664: []string{"America/Chicago"}, - 1850668: []string{"America/New_York"}, - 1850670: []string{"America/New_York"}, - 1850671: []string{"America/New_York"}, - 1850674: []string{"America/Chicago"}, - 1850675: []string{"America/Chicago"}, - 1850677: []string{"America/Chicago"}, - 1850678: []string{"America/Chicago"}, - 1850681: []string{"America/New_York"}, - 1850682: []string{"America/Chicago"}, - 1850683: []string{"America/Chicago"}, - 1850684: []string{"America/Chicago"}, - 1850685: []string{"America/Chicago"}, - 1850687: []string{"America/Chicago"}, - 1850689: []string{"America/Chicago"}, - 1850692: []string{"America/New_York"}, - 1850696: []string{"America/Chicago"}, - 1850697: []string{"America/New_York"}, - 1850708: []string{"America/Chicago"}, - 1850712: []string{"America/Chicago"}, - 1850722: []string{"America/Chicago"}, - 1850723: []string{"America/Chicago"}, - 1850727: []string{"America/New_York"}, - 1850729: []string{"America/Chicago"}, - 1850733: []string{"America/Chicago"}, - 1850745: []string{"America/New_York"}, - 1850747: []string{"America/Chicago"}, - 1850763: []string{"America/Chicago"}, - 1850765: []string{"America/New_York"}, - 1850766: []string{"America/New_York"}, - 1850769: []string{"America/Chicago"}, - 1850784: []string{"America/Chicago"}, - 1850785: []string{"America/Chicago"}, - 1850791: []string{"America/Chicago"}, - 1850796: []string{"America/Chicago"}, - 1850797: []string{"America/Chicago"}, - 1850814: []string{"America/Chicago"}, - 1850819: []string{"America/Chicago"}, - 1850830: []string{"America/Chicago"}, - 1850832: []string{"America/Chicago"}, - 1850833: []string{"America/Chicago"}, - 1850835: []string{"America/Chicago"}, - 1850837: []string{"America/Chicago"}, - 1850838: []string{"America/New_York"}, - 1850857: []string{"America/Chicago"}, - 1850862: []string{"America/Chicago"}, - 1850863: []string{"America/Chicago"}, - 1850864: []string{"America/Chicago"}, - 1850865: []string{"America/Chicago"}, - 1850866: []string{"America/Chicago"}, - 1850871: []string{"America/Chicago"}, - 1850872: []string{"America/Chicago"}, - 1850874: []string{"America/Chicago"}, - 1850875: []string{"America/New_York"}, - 1850877: []string{"America/New_York"}, - 1850878: []string{"America/New_York"}, - 1850883: []string{"America/Chicago"}, - 1850890: []string{"America/Chicago"}, - 1850891: []string{"America/New_York"}, - 1850892: []string{"America/Chicago"}, - 1850893: []string{"America/New_York"}, - 1850894: []string{"America/New_York"}, - 1850897: []string{"America/Chicago"}, - 1850907: []string{"America/New_York"}, - 1850912: []string{"America/Chicago"}, - 1850913: []string{"America/Chicago"}, - 1850914: []string{"America/Chicago"}, - 1850916: []string{"America/Chicago"}, - 1850926: []string{"America/New_York"}, - 1850932: []string{"America/Chicago"}, - 1850933: []string{"America/New_York"}, - 1850934: []string{"America/Chicago"}, - 1850936: []string{"America/Chicago"}, - 1850937: []string{"America/Chicago"}, - 1850939: []string{"America/Chicago"}, - 1850941: []string{"America/Chicago"}, - 1850942: []string{"America/New_York"}, - 1850944: []string{"America/Chicago"}, - 1850951: []string{"America/Chicago"}, - 1850968: []string{"America/Chicago"}, - 1850969: []string{"America/Chicago"}, - 1850973: []string{"America/New_York"}, - 1850974: []string{"America/Chicago"}, - 1850981: []string{"America/Chicago"}, - 1850982: []string{"America/Chicago"}, - 1850983: []string{"America/Chicago"}, - 1850994: []string{"America/Chicago"}, - 1850995: []string{"America/Chicago"}, - 1850997: []string{"America/New_York"}, - 1850999: []string{"America/New_York"}, - 1856: []string{"America/New_York"}, - 1857: []string{"America/New_York"}, - 1858: []string{"America/Los_Angeles"}, - 1859: []string{"America/New_York"}, - 1860: []string{"America/New_York"}, - 1862: []string{"America/New_York"}, - 1863: []string{"America/New_York"}, - 1864: []string{"America/New_York"}, - 1865: []string{"America/New_York"}, - 1867393: []string{"America/Vancouver"}, - 1867456: []string{"America/Vancouver"}, - 1867536: []string{"America/Vancouver"}, - 1867587: []string{"America/Edmonton"}, - 1867633: []string{"America/Vancouver"}, - 1867645: []string{"America/Winnipeg"}, - 1867667: []string{"America/Vancouver"}, - 1867668: []string{"America/Vancouver"}, - 1867669: []string{"America/Edmonton"}, - 1867695: []string{"America/Edmonton"}, - 1867777: []string{"America/Edmonton"}, - 1867872: []string{"America/Edmonton"}, - 1867873: []string{"America/Edmonton"}, - 1867874: []string{"America/Edmonton"}, - 1867920: []string{"America/Edmonton"}, - 1867979: []string{"America/Toronto"}, - 1867983: []string{"America/Edmonton"}, - 1867993: []string{"America/Vancouver"}, - 1868: []string{"America/Port_of_Spain"}, - 1869: []string{"America/St_Kitts"}, - 1870: []string{"America/Chicago"}, - 1872: []string{"America/Chicago"}, - 1876: []string{"America/Jamaica"}, - 1901: []string{"America/Chicago"}, - 1902: []string{"America/Halifax"}, - 1903: []string{"America/Chicago"}, - 1904: []string{"America/New_York"}, - 1905: []string{"America/Toronto"}, - 1906225: []string{"America/New_York"}, - 1906226: []string{"America/New_York"}, - 1906227: []string{"America/New_York"}, - 1906228: []string{"America/New_York"}, - 1906233: []string{"America/New_York"}, - 1906248: []string{"America/New_York"}, - 1906249: []string{"America/New_York"}, - 1906253: []string{"America/New_York"}, - 1906265: []string{"America/Chicago"}, - 1906273: []string{"America/New_York"}, - 1906293: []string{"America/New_York"}, - 1906296: []string{"America/New_York"}, - 1906337: []string{"America/New_York"}, - 1906341: []string{"America/New_York"}, - 1906346: []string{"America/New_York"}, - 1906353: []string{"America/New_York"}, - 1906370: []string{"America/New_York"}, - 1906387: []string{"America/New_York"}, - 1906428: []string{"America/New_York"}, - 1906475: []string{"America/New_York"}, - 1906482: []string{"America/New_York"}, - 1906483: []string{"America/New_York"}, - 1906484: []string{"America/New_York"}, - 1906485: []string{"America/New_York"}, - 1906486: []string{"America/New_York"}, - 1906487: []string{"America/New_York"}, - 1906493: []string{"America/New_York"}, - 1906495: []string{"America/New_York"}, - 1906523: []string{"America/New_York"}, - 1906524: []string{"America/New_York"}, - 1906553: []string{"America/New_York"}, - 1906563: []string{"America/Chicago"}, - 1906586: []string{"America/New_York"}, - 1906632: []string{"America/New_York"}, - 1906635: []string{"America/New_York"}, - 1906643: []string{"America/New_York"}, - 1906647: []string{"America/New_York"}, - 1906663: []string{"America/Chicago"}, - 1906753: []string{"America/Chicago"}, - 1906774: []string{"America/Chicago"}, - 1906776: []string{"America/Chicago"}, - 1906779: []string{"America/Chicago"}, - 1906786: []string{"America/New_York"}, - 1906789: []string{"America/New_York"}, - 1906847: []string{"America/New_York"}, - 1906863: []string{"America/Chicago"}, - 1906864: []string{"America/Chicago"}, - 1906875: []string{"America/Chicago"}, - 1906884: []string{"America/New_York"}, - 1906932: []string{"America/Chicago"}, - 1907209: []string{"America/Juneau"}, - 1907212: []string{"America/Juneau"}, - 1907222: []string{"America/Juneau"}, - 1907223: []string{"America/Juneau"}, - 1907224: []string{"America/Juneau"}, - 1907225: []string{"America/Juneau"}, - 1907227: []string{"America/Juneau"}, - 1907228: []string{"America/Juneau"}, - 1907229: []string{"America/Juneau"}, - 1907230: []string{"America/Juneau"}, - 1907232: []string{"America/Juneau"}, - 1907235: []string{"America/Juneau"}, - 1907243: []string{"America/Juneau"}, - 1907244: []string{"America/Juneau"}, - 1907245: []string{"America/Juneau"}, - 1907246: []string{"America/Juneau"}, - 1907247: []string{"America/Juneau"}, - 1907248: []string{"America/Juneau"}, - 1907250: []string{"America/Juneau"}, - 1907252: []string{"America/Juneau"}, - 1907257: []string{"America/Juneau"}, - 1907258: []string{"America/Juneau"}, - 1907260: []string{"America/Juneau"}, - 1907261: []string{"America/Juneau"}, - 1907262: []string{"America/Juneau"}, - 1907264: []string{"America/Juneau"}, - 1907269: []string{"America/Juneau"}, - 1907271: []string{"America/Juneau"}, - 1907272: []string{"America/Juneau"}, - 1907274: []string{"America/Juneau"}, - 1907276: []string{"America/Juneau"}, - 1907277: []string{"America/Juneau"}, - 1907278: []string{"America/Juneau"}, - 1907279: []string{"America/Juneau"}, - 1907283: []string{"America/Juneau"}, - 1907299: []string{"America/Juneau"}, - 1907301: []string{"America/Juneau"}, - 1907317: []string{"America/Juneau"}, - 1907332: []string{"America/Juneau"}, - 1907333: []string{"America/Juneau"}, - 1907334: []string{"America/Juneau"}, - 1907335: []string{"America/Juneau"}, - 1907336: []string{"America/Juneau"}, - 1907337: []string{"America/Juneau"}, - 1907338: []string{"America/Juneau"}, - 1907339: []string{"America/Juneau"}, - 1907343: []string{"America/Juneau"}, - 1907344: []string{"America/Juneau"}, - 1907345: []string{"America/Juneau"}, - 1907346: []string{"America/Juneau"}, - 1907349: []string{"America/Juneau"}, - 1907350: []string{"America/Juneau"}, - 1907351: []string{"America/Juneau"}, - 1907352: []string{"America/Juneau"}, - 1907357: []string{"America/Juneau"}, - 1907360: []string{"America/Juneau"}, - 1907373: []string{"America/Juneau"}, - 1907374: []string{"America/Juneau"}, - 1907375: []string{"America/Juneau"}, - 1907376: []string{"America/Juneau"}, - 1907378: []string{"America/Juneau"}, - 1907388: []string{"America/Juneau"}, - 1907424: []string{"America/Juneau"}, - 1907442: []string{"America/Juneau"}, - 1907443: []string{"America/Juneau"}, - 1907451: []string{"America/Juneau"}, - 1907452: []string{"America/Juneau"}, - 1907455: []string{"America/Juneau"}, - 1907456: []string{"America/Juneau"}, - 1907457: []string{"America/Juneau"}, - 1907458: []string{"America/Juneau"}, - 1907459: []string{"America/Juneau"}, - 1907463: []string{"America/Juneau"}, - 1907465: []string{"America/Juneau"}, - 1907474: []string{"America/Juneau"}, - 1907479: []string{"America/Juneau"}, - 1907486: []string{"America/Juneau"}, - 1907487: []string{"America/Juneau"}, - 1907488: []string{"America/Juneau"}, - 1907490: []string{"America/Juneau"}, - 1907495: []string{"America/Juneau"}, - 1907522: []string{"America/Juneau"}, - 1907523: []string{"America/Juneau"}, - 1907543: []string{"America/Juneau"}, - 1907561: []string{"America/Juneau"}, - 1907562: []string{"America/Juneau"}, - 1907563: []string{"America/Juneau"}, - 1907567: []string{"America/Juneau"}, - 1907569: []string{"America/Juneau"}, - 1907580: []string{"America/Juneau"}, - 1907581: []string{"Pacific/Honolulu"}, - 1907586: []string{"America/Juneau"}, - 1907622: []string{"America/Juneau"}, - 1907631: []string{"America/Juneau"}, - 1907644: []string{"America/Juneau"}, - 1907646: []string{"America/Juneau"}, - 1907677: []string{"America/Juneau"}, - 1907683: []string{"America/Juneau"}, - 1907688: []string{"America/Juneau"}, - 1907694: []string{"America/Juneau"}, - 1907696: []string{"America/Juneau"}, - 1907714: []string{"America/Juneau"}, - 1907723: []string{"America/Juneau"}, - 1907727: []string{"America/Juneau"}, - 1907729: []string{"America/Juneau"}, - 1907733: []string{"America/Juneau"}, - 1907742: []string{"America/Juneau"}, - 1907743: []string{"America/Juneau"}, - 1907745: []string{"America/Juneau"}, - 1907746: []string{"America/Juneau"}, - 1907747: []string{"America/Juneau"}, - 1907766: []string{"America/Juneau"}, - 1907770: []string{"America/Juneau"}, - 1907772: []string{"America/Juneau"}, - 1907776: []string{"America/Juneau"}, - 1907780: []string{"America/Juneau"}, - 1907783: []string{"America/Juneau"}, - 1907786: []string{"America/Juneau"}, - 1907789: []string{"America/Juneau"}, - 1907790: []string{"America/Juneau"}, - 1907822: []string{"America/Juneau"}, - 1907826: []string{"America/Juneau"}, - 1907830: []string{"America/Juneau"}, - 1907835: []string{"America/Juneau"}, - 1907841: []string{"America/Juneau"}, - 1907842: []string{"America/Juneau"}, - 1907852: []string{"America/Juneau"}, - 1907868: []string{"America/Juneau"}, - 1907874: []string{"America/Juneau"}, - 1907883: []string{"America/Juneau"}, - 1907892: []string{"America/Juneau"}, - 1907895: []string{"America/Juneau"}, - 1907929: []string{"America/Juneau"}, - 1907966: []string{"America/Juneau"}, - 1907983: []string{"America/Juneau"}, - 1908: []string{"America/New_York"}, - 1909: []string{"America/Los_Angeles"}, - 1910: []string{"America/New_York"}, - 1912: []string{"America/New_York"}, - 1913: []string{"America/Chicago"}, - 1914: []string{"America/New_York"}, - 1915: []string{"America/Denver"}, - 1916: []string{"America/Los_Angeles"}, - 1917: []string{"America/New_York"}, - 1918: []string{"America/Chicago"}, - 1919: []string{"America/New_York"}, - 1920: []string{"America/Chicago"}, - 1925: []string{"America/Los_Angeles"}, - 1928: []string{"America/Denver"}, - 1931: []string{"America/Chicago"}, - 1936: []string{"America/Chicago"}, - 1937: []string{"America/New_York"}, - 1939: []string{"America/Puerto_Rico"}, - 1940: []string{"America/Chicago"}, - 1941: []string{"America/New_York"}, - 1949: []string{"America/Los_Angeles"}, - 1951: []string{"America/Los_Angeles"}, - 1952: []string{"America/Chicago"}, - 1954: []string{"America/New_York"}, - 1956: []string{"America/Chicago"}, - 1970: []string{"America/Denver"}, - 1971: []string{"America/Los_Angeles"}, - 1972: []string{"America/Chicago"}, - 1973: []string{"America/New_York"}, - 1978: []string{"America/New_York"}, - 1979: []string{"America/Chicago"}, - 1980: []string{"America/New_York"}, - 1984: []string{"America/New_York"}, - 1985: []string{"America/Chicago"}, - 1989: []string{"America/New_York"}, - 20: []string{"Africa/Cairo"}, - 211: []string{"Africa/Nairobi"}, - 212: []string{"Atlantic/Canary"}, - 213: []string{"Europe/Paris"}, - 216: []string{"Africa/Tunis"}, - 218: []string{"Europe/Bucharest"}, - 220: []string{"Africa/Banjul"}, - 221: []string{"Africa/Dakar"}, - 222: []string{"Africa/Nouakchott"}, - 223: []string{"Africa/Bamako"}, - 224: []string{"Africa/Conakry"}, - 225: []string{"Africa/Abidjan"}, - 226: []string{"Africa/Ouagadougou"}, - 227: []string{"Africa/Niamey"}, - 228: []string{"Africa/Lome"}, - 229: []string{"Africa/Porto-Novo"}, - 230: []string{"Indian/Mauritius"}, - 231: []string{"Atlantic/Reykjavik"}, - 232: []string{"Africa/Freetown"}, - 233: []string{"Africa/Accra"}, - 234: []string{"Africa/Lagos"}, - 235: []string{"Africa/Ndjamena"}, - 236: []string{"Africa/Bangui"}, - 237: []string{"Africa/Douala"}, - 238: []string{"Atlantic/Cape_Verde"}, - 239: []string{"Africa/Sao_Tome"}, - 240: []string{"Africa/Malabo"}, - 241: []string{"Africa/Libreville"}, - 242: []string{"Africa/Brazzaville"}, - 243: []string{ - "Africa/Kinshasa", "Africa/Lubumbashi", - }, - 2431: []string{"Africa/Kinshasa"}, - 2432: []string{"Africa/Lubumbashi"}, - 2435: []string{"Africa/Kinshasa"}, - 2436: []string{"Africa/Kinshasa"}, - 244: []string{"Africa/Luanda"}, - 245: []string{"Atlantic/Reykjavik"}, - 246: []string{"Indian/Chagos"}, - 247: []string{"Atlantic/St_Helena"}, - 248: []string{"Indian/Mahe"}, - 249: []string{"Africa/Khartoum"}, - 250: []string{"Africa/Kigali"}, - 251: []string{"Africa/Addis_Ababa"}, - 252: []string{"Africa/Mogadishu"}, - 253: []string{"Africa/Djibouti"}, - 254: []string{"Africa/Nairobi"}, - 255: []string{"Africa/Dar_es_Salaam"}, - 256: []string{"Africa/Kampala"}, - 257: []string{"Africa/Bujumbura"}, - 258: []string{"Africa/Maputo"}, - 260: []string{"Africa/Lusaka"}, - 261: []string{"Indian/Antananarivo"}, - 262: []string{ - "Indian/Mayotte", "Indian/Reunion", - }, - 262262: []string{"Indian/Reunion"}, - 262269: []string{"Indian/Mayotte"}, - 263: []string{"Africa/Harare"}, - 264: []string{"Africa/Windhoek"}, - 265: []string{"Africa/Blantyre"}, - 266: []string{"Africa/Maseru"}, - 267: []string{"Africa/Gaborone"}, - 268: []string{"Africa/Mbabane"}, - 269: []string{"Indian/Comoro"}, - 27: []string{"Africa/Johannesburg"}, - 290: []string{"Atlantic/St_Helena"}, - 291: []string{"Africa/Asmera"}, - 297: []string{"America/Aruba"}, - 298: []string{"Atlantic/Faeroe"}, - 299: []string{ - "America/Godthab", "America/Scoresbysund", "America/Thule", "Atlantic/Reykjavik", - }, - 2993: []string{"America/Godthab"}, - 2996: []string{"America/Godthab"}, - 2998: []string{"America/Godthab"}, - 29991: []string{"America/Godthab"}, - 29992: []string{"America/Godthab"}, - 29994: []string{"America/Godthab"}, - 29995: []string{"America/Godthab"}, - 29996: []string{"America/Godthab"}, - 29997: []string{"America/Thule"}, - 29998: []string{"America/Godthab"}, - 29999: []string{"America/Scoresbysund"}, - 30: []string{"Europe/Athens"}, - 31: []string{"Europe/Amsterdam"}, - 32: []string{"Europe/Brussels"}, - 33: []string{"Europe/Paris"}, - 34: []string{ - "Atlantic/Canary", "Europe/Madrid", - }, - 34810: []string{"Europe/Madrid"}, - 34812: []string{"Europe/Madrid"}, - 34821: []string{"Europe/Madrid"}, - 34822: []string{"Atlantic/Canary"}, - 34823: []string{"Europe/Madrid"}, - 34824: []string{"Europe/Madrid"}, - 34825: []string{"Europe/Madrid"}, - 34826: []string{"Europe/Madrid"}, - 34828: []string{"Atlantic/Canary"}, - 34830: []string{"Europe/Madrid"}, - 34835: []string{"Europe/Madrid"}, - 34837: []string{"Europe/Madrid"}, - 34841: []string{"Europe/Madrid"}, - 34843: []string{"Europe/Madrid"}, - 34845: []string{"Europe/Madrid"}, - 34846: []string{"Europe/Madrid"}, - 34847: []string{"Europe/Madrid"}, - 34848: []string{"Europe/Madrid"}, - 34849: []string{"Europe/Madrid"}, - 34850: []string{"Europe/Madrid"}, - 34851: []string{"Europe/Madrid"}, - 34853: []string{"Europe/Madrid"}, - 34854: []string{"Europe/Madrid"}, - 34855: []string{"Europe/Madrid"}, - 34856: []string{"Europe/Madrid"}, - 34857: []string{"Europe/Madrid"}, - 34858: []string{"Europe/Madrid"}, - 34859: []string{"Europe/Madrid"}, - 34860: []string{"Europe/Madrid"}, - 34863: []string{"Europe/Madrid"}, - 34864: []string{"Europe/Madrid"}, - 34865: []string{"Europe/Madrid"}, - 34867: []string{"Europe/Madrid"}, - 34868: []string{"Europe/Madrid"}, - 3487: []string{"Europe/Madrid"}, - 34880: []string{"Europe/Madrid"}, - 34881: []string{"Europe/Madrid"}, - 34882: []string{"Europe/Madrid"}, - 34883: []string{"Europe/Madrid"}, - 34884: []string{"Europe/Madrid"}, - 34886: []string{"Europe/Madrid"}, - 34887: []string{"Europe/Madrid"}, - 34888: []string{"Europe/Madrid"}, - 3491: []string{"Europe/Madrid"}, - 34920: []string{"Europe/Madrid"}, - 34921: []string{"Europe/Madrid"}, - 34922: []string{"Atlantic/Canary"}, - 34923: []string{"Europe/Madrid"}, - 34924: []string{"Europe/Madrid"}, - 34925: []string{"Europe/Madrid"}, - 34926: []string{"Europe/Madrid"}, - 34927: []string{"Europe/Madrid"}, - 34928: []string{"Atlantic/Canary"}, - 3493: []string{"Europe/Madrid"}, - 34941: []string{"Europe/Madrid"}, - 34942: []string{"Europe/Madrid"}, - 34943: []string{"Europe/Madrid"}, - 34944: []string{"Europe/Madrid"}, - 34945: []string{"Europe/Madrid"}, - 34946: []string{"Europe/Madrid"}, - 34947: []string{"Europe/Madrid"}, - 34948: []string{"Europe/Madrid"}, - 34949: []string{"Europe/Madrid"}, - 3495: []string{"Europe/Madrid"}, - 3496: []string{"Europe/Madrid"}, - 34971: []string{"Europe/Madrid"}, - 34972: []string{"Europe/Madrid"}, - 34973: []string{"Europe/Madrid"}, - 34974: []string{"Europe/Madrid"}, - 34975: []string{"Europe/Madrid"}, - 34976: []string{"Europe/Madrid"}, - 34977: []string{"Europe/Madrid"}, - 34978: []string{"Europe/Madrid"}, - 34979: []string{"Europe/Madrid"}, - 34980: []string{"Europe/Madrid"}, - 34981: []string{"Europe/Madrid"}, - 34982: []string{"Europe/Madrid"}, - 34983: []string{"Europe/Madrid"}, - 34984: []string{"Europe/Madrid"}, - 34985: []string{"Europe/Madrid"}, - 34986: []string{"Europe/Madrid"}, - 34987: []string{"Europe/Madrid"}, - 34988: []string{"Europe/Madrid"}, - 350: []string{"Europe/Gibraltar"}, - 351: []string{ - "Atlantic/Azores", "Europe/Lisbon", - }, - 35121: []string{"Europe/Lisbon"}, - 35122: []string{"Europe/Lisbon"}, - 351231: []string{"Europe/Lisbon"}, - 351232: []string{"Europe/Lisbon"}, - 351233: []string{"Europe/Lisbon"}, - 351234: []string{"Europe/Lisbon"}, - 351235: []string{"Europe/Lisbon"}, - 351236: []string{"Europe/Lisbon"}, - 351238: []string{"Europe/Lisbon"}, - 351239: []string{"Europe/Lisbon"}, - 351241: []string{"Europe/Lisbon"}, - 351242: []string{"Europe/Lisbon"}, - 351243: []string{"Europe/Lisbon"}, - 351244: []string{"Europe/Lisbon"}, - 351245: []string{"Europe/Lisbon"}, - 351249: []string{"Europe/Lisbon"}, - 351251: []string{"Europe/Lisbon"}, - 351252: []string{"Europe/Lisbon"}, - 351253: []string{"Europe/Lisbon"}, - 351254: []string{"Europe/Lisbon"}, - 351255: []string{"Europe/Lisbon"}, - 351256: []string{"Europe/Lisbon"}, - 351258: []string{"Europe/Lisbon"}, - 351259: []string{"Europe/Lisbon"}, - 351261: []string{"Europe/Lisbon"}, - 351262: []string{"Europe/Lisbon"}, - 351263: []string{"Europe/Lisbon"}, - 351265: []string{"Europe/Lisbon"}, - 351266: []string{"Europe/Lisbon"}, - 351268: []string{"Europe/Lisbon"}, - 351269: []string{"Europe/Lisbon"}, - 351271: []string{"Europe/Lisbon"}, - 351272: []string{"Europe/Lisbon"}, - 351273: []string{"Europe/Lisbon"}, - 351274: []string{"Europe/Lisbon"}, - 351275: []string{"Europe/Lisbon"}, - 351276: []string{"Europe/Lisbon"}, - 351277: []string{"Europe/Lisbon"}, - 351278: []string{"Europe/Lisbon"}, - 351279: []string{"Europe/Lisbon"}, - 351281: []string{"Europe/Lisbon"}, - 351282: []string{"Europe/Lisbon"}, - 351283: []string{"Europe/Lisbon"}, - 351284: []string{"Europe/Lisbon"}, - 351285: []string{"Europe/Lisbon"}, - 351286: []string{"Europe/Lisbon"}, - 351289: []string{"Europe/Lisbon"}, - 351291: []string{"Europe/Lisbon"}, - 351292: []string{"Atlantic/Azores"}, - 351295: []string{"Atlantic/Azores"}, - 351296: []string{"Atlantic/Azores"}, - 352: []string{"Europe/Luxembourg"}, - 353: []string{"Europe/Dublin"}, - 354: []string{"Atlantic/Reykjavik"}, - 355: []string{"Europe/Tirane"}, - 356: []string{"Europe/Malta"}, - 357: []string{"Asia/Nicosia"}, - 358: []string{ - "Europe/Helsinki", "Europe/Mariehamn", - }, - 35813: []string{"Europe/Helsinki"}, - 35814: []string{"Europe/Helsinki"}, - 35815: []string{"Europe/Helsinki"}, - 35816: []string{"Europe/Helsinki"}, - 35817: []string{"Europe/Helsinki"}, - 35818: []string{"Europe/Mariehamn"}, - 35819: []string{"Europe/Helsinki"}, - 3582: []string{"Europe/Helsinki"}, - 3583: []string{"Europe/Helsinki"}, - 3585: []string{"Europe/Helsinki"}, - 3586: []string{"Europe/Helsinki"}, - 3588: []string{"Europe/Helsinki"}, - 3589: []string{"Europe/Helsinki"}, - 359: []string{"Europe/Sofia"}, - 36: []string{"Europe/Budapest"}, - 370: []string{"Europe/Bucharest"}, - 371: []string{"Europe/Bucharest"}, - 372: []string{"Europe/Bucharest"}, - 373: []string{"Europe/Bucharest"}, - 374: []string{"Asia/Yerevan"}, - 375: []string{"Europe/Moscow"}, - 376: []string{"Europe/Andorra"}, - 377: []string{"Europe/Monaco"}, - 378: []string{"Europe/San_Marino"}, - 380: []string{"Europe/Bucharest"}, - 381: []string{"Europe/Belgrade"}, - 382: []string{"Europe/Podgorica"}, - 385: []string{"Europe/Zagreb"}, - 386: []string{"Europe/Ljubljana"}, - 387: []string{"Europe/Sarajevo"}, - 389: []string{"Europe/Skopje"}, - 39: []string{ - "Europe/Rome", "Europe/Vatican", - }, - 39010: []string{"Europe/Rome"}, - 39011: []string{"Europe/Rome"}, - 390121: []string{"Europe/Rome"}, - 390122: []string{"Europe/Rome"}, - 390123: []string{"Europe/Rome"}, - 390124: []string{"Europe/Rome"}, - 390125: []string{"Europe/Rome"}, - 390131: []string{"Europe/Rome"}, - 390141: []string{"Europe/Rome"}, - 390142: []string{"Europe/Rome"}, - 390143: []string{"Europe/Rome"}, - 390144: []string{"Europe/Rome"}, - 39015: []string{"Europe/Rome"}, - 390161: []string{"Europe/Rome"}, - 390163: []string{"Europe/Rome"}, - 390165: []string{"Europe/Rome"}, - 390166: []string{"Europe/Rome"}, - 390171: []string{"Europe/Rome"}, - 390172: []string{"Europe/Rome"}, - 390173: []string{"Europe/Rome"}, - 390174: []string{"Europe/Rome"}, - 390175: []string{"Europe/Rome"}, - 390182: []string{"Europe/Rome"}, - 390183: []string{"Europe/Rome"}, - 390184: []string{"Europe/Rome"}, - 390185: []string{"Europe/Rome"}, - 390187: []string{"Europe/Rome"}, - 39019: []string{"Europe/Rome"}, - 3902: []string{"Europe/Rome"}, - 39030: []string{"Europe/Rome"}, - 39031: []string{"Europe/Rome"}, - 390321: []string{"Europe/Rome"}, - 390322: []string{"Europe/Rome"}, - 390323: []string{"Europe/Rome"}, - 390324: []string{"Europe/Rome"}, - 390331: []string{"Europe/Rome"}, - 390332: []string{"Europe/Rome"}, - 390341: []string{"Europe/Rome"}, - 390342: []string{"Europe/Rome"}, - 390343: []string{"Europe/Rome"}, - 390344: []string{"Europe/Rome"}, - 390345: []string{"Europe/Rome"}, - 390346: []string{"Europe/Rome"}, - 39035: []string{"Europe/Rome"}, - 390362: []string{"Europe/Rome"}, - 390363: []string{"Europe/Rome"}, - 390364: []string{"Europe/Rome"}, - 390365: []string{"Europe/Rome"}, - 390369: []string{"Europe/Rome"}, - 390371: []string{"Europe/Rome"}, - 390372: []string{"Europe/Rome"}, - 390373: []string{"Europe/Rome"}, - 390374: []string{"Europe/Rome"}, - 390375: []string{"Europe/Rome"}, - 390376: []string{"Europe/Rome"}, - 390377: []string{"Europe/Rome"}, - 390381: []string{"Europe/Rome"}, - 390382: []string{"Europe/Rome"}, - 390383: []string{"Europe/Rome"}, - 390384: []string{"Europe/Rome"}, - 390385: []string{"Europe/Rome"}, - 390386: []string{"Europe/Rome"}, - 39039: []string{"Europe/Rome"}, - 39040: []string{"Europe/Rome"}, - 39041: []string{"Europe/Rome"}, - 390421: []string{"Europe/Rome"}, - 390422: []string{"Europe/Rome"}, - 390423: []string{"Europe/Rome"}, - 390424: []string{"Europe/Rome"}, - 390425: []string{"Europe/Rome"}, - 390426: []string{"Europe/Rome"}, - 390427: []string{"Europe/Rome"}, - 390428: []string{"Europe/Rome"}, - 390429: []string{"Europe/Rome"}, - 390431: []string{"Europe/Rome"}, - 390432: []string{"Europe/Rome"}, - 390433: []string{"Europe/Rome"}, - 390434: []string{"Europe/Rome"}, - 390435: []string{"Europe/Rome"}, - 390436: []string{"Europe/Rome"}, - 390437: []string{"Europe/Rome"}, - 390438: []string{"Europe/Rome"}, - 390439: []string{"Europe/Rome"}, - 390442: []string{"Europe/Rome"}, - 390444: []string{"Europe/Rome"}, - 390445: []string{"Europe/Rome"}, - 39045: []string{"Europe/Rome"}, - 390461: []string{"Europe/Rome"}, - 390462: []string{"Europe/Rome"}, - 390463: []string{"Europe/Rome"}, - 390464: []string{"Europe/Rome"}, - 390465: []string{"Europe/Rome"}, - 390471: []string{"Europe/Rome"}, - 390472: []string{"Europe/Rome"}, - 390473: []string{"Europe/Rome"}, - 390474: []string{"Europe/Rome"}, - 390481: []string{"Europe/Rome"}, - 39049: []string{"Europe/Rome"}, - 39050: []string{"Europe/Rome"}, - 39051: []string{"Europe/Rome"}, - 390521: []string{"Europe/Rome"}, - 390522: []string{"Europe/Rome"}, - 390523: []string{"Europe/Rome"}, - 390524: []string{"Europe/Rome"}, - 390525: []string{"Europe/Rome"}, - 390532: []string{"Europe/Rome"}, - 390533: []string{"Europe/Rome"}, - 390534: []string{"Europe/Rome"}, - 390535: []string{"Europe/Rome"}, - 390536: []string{"Europe/Rome"}, - 390541: []string{"Europe/Rome"}, - 390542: []string{"Europe/Rome"}, - 390543: []string{"Europe/Rome"}, - 390544: []string{"Europe/Rome"}, - 390545: []string{"Europe/Rome"}, - 390546: []string{"Europe/Rome"}, - 390547: []string{"Europe/Rome"}, - 390549: []string{"Europe/Rome"}, - 39055: []string{"Europe/Rome"}, - 390564: []string{"Europe/Rome"}, - 390565: []string{"Europe/Rome"}, - 390566: []string{"Europe/Rome"}, - 390571: []string{"Europe/Rome"}, - 390572: []string{"Europe/Rome"}, - 390573: []string{"Europe/Rome"}, - 390574: []string{"Europe/Rome"}, - 390575: []string{"Europe/Rome"}, - 390577: []string{"Europe/Rome"}, - 390578: []string{"Europe/Rome"}, - 390583: []string{"Europe/Rome"}, - 390584: []string{"Europe/Rome"}, - 390585: []string{"Europe/Rome"}, - 390586: []string{"Europe/Rome"}, - 390587: []string{"Europe/Rome"}, - 390588: []string{"Europe/Rome"}, - 39059: []string{"Europe/Rome"}, - 3906: []string{"Europe/Rome"}, - 3906698: []string{"Europe/Vatican"}, - 39070: []string{"Europe/Rome"}, - 39071: []string{"Europe/Rome"}, - 390721: []string{"Europe/Rome"}, - 390722: []string{"Europe/Rome"}, - 390731: []string{"Europe/Rome"}, - 390732: []string{"Europe/Rome"}, - 390733: []string{"Europe/Rome"}, - 390734: []string{"Europe/Rome"}, - 390735: []string{"Europe/Rome"}, - 390736: []string{"Europe/Rome"}, - 390737: []string{"Europe/Rome"}, - 390742: []string{"Europe/Rome"}, - 390743: []string{"Europe/Rome"}, - 390744: []string{"Europe/Rome"}, - 390746: []string{"Europe/Rome"}, - 39075: []string{"Europe/Rome"}, - 390761: []string{"Europe/Rome"}, - 390763: []string{"Europe/Rome"}, - 390765: []string{"Europe/Rome"}, - 390766: []string{"Europe/Rome"}, - 390769: []string{"Europe/Rome"}, - 390771: []string{"Europe/Rome"}, - 390773: []string{"Europe/Rome"}, - 390774: []string{"Europe/Rome"}, - 390775: []string{"Europe/Rome"}, - 390776: []string{"Europe/Rome"}, - 390781: []string{"Europe/Rome"}, - 390782: []string{"Europe/Rome"}, - 390783: []string{"Europe/Rome"}, - 390784: []string{"Europe/Rome"}, - 390785: []string{"Europe/Rome"}, - 390789: []string{"Europe/Rome"}, - 39079: []string{"Europe/Rome"}, - 39080: []string{"Europe/Rome"}, - 39081: []string{"Europe/Rome"}, - 390823: []string{"Europe/Rome"}, - 390824: []string{"Europe/Rome"}, - 390825: []string{"Europe/Rome"}, - 390827: []string{"Europe/Rome"}, - 390828: []string{"Europe/Rome"}, - 390831: []string{"Europe/Rome"}, - 390832: []string{"Europe/Rome"}, - 390833: []string{"Europe/Rome"}, - 390835: []string{"Europe/Rome"}, - 390836: []string{"Europe/Rome"}, - 39085: []string{"Europe/Rome"}, - 390861: []string{"Europe/Rome"}, - 390862: []string{"Europe/Rome"}, - 390863: []string{"Europe/Rome"}, - 390864: []string{"Europe/Rome"}, - 390865: []string{"Europe/Rome"}, - 390871: []string{"Europe/Rome"}, - 390872: []string{"Europe/Rome"}, - 390873: []string{"Europe/Rome"}, - 390874: []string{"Europe/Rome"}, - 390875: []string{"Europe/Rome"}, - 390881: []string{"Europe/Rome"}, - 390882: []string{"Europe/Rome"}, - 390883: []string{"Europe/Rome"}, - 390884: []string{"Europe/Rome"}, - 390885: []string{"Europe/Rome"}, - 39089: []string{"Europe/Rome"}, - 39090: []string{"Europe/Rome"}, - 39091: []string{"Europe/Rome"}, - 390921: []string{"Europe/Rome"}, - 390922: []string{"Europe/Rome"}, - 390923: []string{"Europe/Rome"}, - 390924: []string{"Europe/Rome"}, - 390925: []string{"Europe/Rome"}, - 390931: []string{"Europe/Rome"}, - 390932: []string{"Europe/Rome"}, - 390933: []string{"Europe/Rome"}, - 390934: []string{"Europe/Rome"}, - 390935: []string{"Europe/Rome"}, - 390941: []string{"Europe/Rome"}, - 390942: []string{"Europe/Rome"}, - 39095: []string{"Europe/Rome"}, - 390961: []string{"Europe/Rome"}, - 390962: []string{"Europe/Rome"}, - 390963: []string{"Europe/Rome"}, - 390964: []string{"Europe/Rome"}, - 390965: []string{"Europe/Rome"}, - 390966: []string{"Europe/Rome"}, - 390967: []string{"Europe/Rome"}, - 390968: []string{"Europe/Rome"}, - 390971: []string{"Europe/Rome"}, - 390972: []string{"Europe/Rome"}, - 390973: []string{"Europe/Rome"}, - 390974: []string{"Europe/Rome"}, - 390975: []string{"Europe/Rome"}, - 390976: []string{"Europe/Rome"}, - 390981: []string{"Europe/Rome"}, - 390982: []string{"Europe/Rome"}, - 390983: []string{"Europe/Rome"}, - 390984: []string{"Europe/Rome"}, - 390985: []string{"Europe/Rome"}, - 39099: []string{"Europe/Rome"}, - 40: []string{"Europe/Bucharest"}, - 41: []string{"Europe/Zurich"}, - 420: []string{"Europe/Prague"}, - 421: []string{"Europe/Bratislava"}, - 423: []string{"Europe/Vaduz"}, - 43: []string{"Europe/Vienna"}, - 44: []string{"Europe/London"}, - 45: []string{"Europe/Copenhagen"}, - 46: []string{"Europe/Stockholm"}, - 47: []string{"Europe/Oslo"}, - 48: []string{"Europe/Warsaw"}, - 49: []string{"Europe/Berlin"}, - 500: []string{"Atlantic/Stanley"}, - 501: []string{"America/Belize"}, - 502: []string{"America/Guatemala"}, - 503: []string{"America/El_Salvador"}, - 504: []string{"America/Tegucigalpa"}, - 505: []string{"America/Chicago"}, - 506: []string{"America/Costa_Rica"}, - 507: []string{"America/Panama"}, - 508: []string{"America/Miquelon"}, - 509: []string{"America/Port-au-Prince"}, - 51: []string{"America/Lima"}, - 52: []string{ - "America/Hermosillo", "America/Mazatlan", "America/Mexico_City", "America/New_York", "America/Santa_Isabel", - "America/Tijuana", - }, - 521221: []string{"America/Mexico_City"}, - 521222: []string{"America/Mexico_City"}, - 521223: []string{"America/Mexico_City"}, - 521224: []string{"America/Mexico_City"}, - 521225: []string{"America/Mexico_City"}, - 521226: []string{"America/Mexico_City"}, - 521227: []string{"America/Mexico_City"}, - 521228: []string{"America/Mexico_City"}, - 521229: []string{"America/Mexico_City"}, - 521231: []string{"America/Mexico_City"}, - 521232: []string{"America/Mexico_City"}, - 521233: []string{"America/Mexico_City"}, - 521235: []string{"America/Mexico_City"}, - 521236: []string{"America/Mexico_City"}, - 521237: []string{"America/Mexico_City"}, - 521238: []string{"America/Mexico_City"}, - 521241: []string{"America/Mexico_City"}, - 521243: []string{"America/Mexico_City"}, - 521244: []string{"America/Mexico_City"}, - 521245: []string{"America/Mexico_City"}, - 521246: []string{"America/Mexico_City"}, - 521247: []string{"America/Mexico_City"}, - 521248: []string{"America/Mexico_City"}, - 521249: []string{"America/Mexico_City"}, - 521271: []string{"America/Mexico_City"}, - 521272: []string{"America/Mexico_City"}, - 521273: []string{"America/Mexico_City"}, - 521274: []string{"America/Mexico_City"}, - 521275: []string{"America/Mexico_City"}, - 521276: []string{"America/Mexico_City"}, - 521278: []string{"America/Mexico_City"}, - 521279: []string{"America/Mexico_City"}, - 521281: []string{"America/Mexico_City"}, - 521282: []string{"America/Mexico_City"}, - 521283: []string{"America/Mexico_City"}, - 521284: []string{"America/Mexico_City"}, - 521285: []string{"America/Mexico_City"}, - 521287: []string{"America/Mexico_City"}, - 521288: []string{"America/Mexico_City"}, - 521294: []string{"America/Mexico_City"}, - 521296: []string{"America/Mexico_City"}, - 521297: []string{"America/Mexico_City"}, - 521311: []string{"America/Mazatlan"}, - 521312: []string{"America/Mexico_City"}, - 521313: []string{"America/Mexico_City"}, - 521314: []string{"America/Mexico_City"}, - 521315: []string{"America/Mexico_City"}, - 521316: []string{"America/Mexico_City"}, - 521317: []string{"America/Mexico_City"}, - 521319: []string{"America/Mazatlan"}, - 521321: []string{"America/Mexico_City"}, - 521322: []string{"America/Mexico_City"}, - 521323: []string{ - "America/Mazatlan", "America/Mexico_City", - }, - 521324: []string{"America/Mazatlan"}, - 521325: []string{"America/Mazatlan"}, - 521327: []string{"America/Mazatlan"}, - 521328: []string{"America/Mexico_City"}, - 521329: []string{"America/Mexico_City"}, - 52133: []string{"America/Mexico_City"}, - 521341: []string{"America/Mexico_City"}, - 521342: []string{"America/Mexico_City"}, - 521343: []string{"America/Mexico_City"}, - 521344: []string{"America/Mexico_City"}, - 521345: []string{"America/Mexico_City"}, - 521346: []string{"America/Mexico_City"}, - 521347: []string{"America/Mexico_City"}, - 521348: []string{"America/Mexico_City"}, - 521351: []string{"America/Mexico_City"}, - 521352: []string{"America/Mexico_City"}, - 521353: []string{"America/Mexico_City"}, - 521354: []string{"America/Mexico_City"}, - 521355: []string{"America/Mexico_City"}, - 521356: []string{"America/Mexico_City"}, - 521357: []string{"America/Mexico_City"}, - 521358: []string{"America/Mexico_City"}, - 521359: []string{"America/Mexico_City"}, - 521371: []string{"America/Mexico_City"}, - 521372: []string{"America/Mexico_City"}, - 521373: []string{"America/Mexico_City"}, - 521374: []string{"America/Mexico_City"}, - 521375: []string{"America/Mexico_City"}, - 521376: []string{"America/Mexico_City"}, - 521377: []string{"America/Mexico_City"}, - 521378: []string{"America/Mexico_City"}, - 521381: []string{"America/Mexico_City"}, - 521382: []string{"America/Mexico_City"}, - 521383: []string{"America/Mexico_City"}, - 521384: []string{"America/Mexico_City"}, - 521385: []string{"America/Mexico_City"}, - 521386: []string{"America/Mexico_City"}, - 521387: []string{"America/Mexico_City"}, - 521388: []string{"America/Mexico_City"}, - 521389: []string{"America/Mazatlan"}, - 521391: []string{"America/Mexico_City"}, - 521392: []string{"America/Mexico_City"}, - 521393: []string{"America/Mexico_City"}, - 521394: []string{"America/Mexico_City"}, - 521395: []string{"America/Mexico_City"}, - 521411: []string{"America/Mexico_City"}, - 521412: []string{"America/Mexico_City"}, - 521413: []string{"America/Mexico_City"}, - 521414: []string{"America/Mexico_City"}, - 521415: []string{"America/Mexico_City"}, - 521417: []string{"America/Mexico_City"}, - 521418: []string{"America/Mexico_City"}, - 521419: []string{"America/Mexico_City"}, - 521421: []string{"America/Mexico_City"}, - 521422: []string{"America/Mexico_City"}, - 521423: []string{"America/Mexico_City"}, - 521424: []string{"America/Mexico_City"}, - 521425: []string{"America/Mexico_City"}, - 521426: []string{"America/Mexico_City"}, - 521427: []string{"America/Mexico_City"}, - 521428: []string{"America/Mexico_City"}, - 521429: []string{"America/Mexico_City"}, - 521431: []string{"America/Mexico_City"}, - 521432: []string{"America/Mexico_City"}, - 521433: []string{"America/Mexico_City"}, - 521434: []string{"America/Mexico_City"}, - 521435: []string{"America/Mexico_City"}, - 521436: []string{"America/Mexico_City"}, - 521437: []string{"America/Mexico_City"}, - 521438: []string{"America/Mexico_City"}, - 521441: []string{"America/Mexico_City"}, - 521442: []string{"America/Mexico_City"}, - 521443: []string{"America/Mexico_City"}, - 521444: []string{"America/Mexico_City"}, - 521445: []string{"America/Mexico_City"}, - 521447: []string{"America/Mexico_City"}, - 521448: []string{"America/Mexico_City"}, - 521449: []string{"America/Mexico_City"}, - 521451: []string{"America/Mexico_City"}, - 521452: []string{"America/Mexico_City"}, - 521453: []string{"America/Mexico_City"}, - 521454: []string{"America/Mexico_City"}, - 521455: []string{"America/Mexico_City"}, - 521456: []string{"America/Mexico_City"}, - 521457: []string{"America/Mexico_City"}, - 521458: []string{"America/Mexico_City"}, - 521459: []string{"America/Mexico_City"}, - 521461: []string{"America/Mexico_City"}, - 521462: []string{"America/Mexico_City"}, - 521463: []string{"America/Mexico_City"}, - 521464: []string{"America/Mexico_City"}, - 521465: []string{"America/Mexico_City"}, - 521466: []string{"America/Mexico_City"}, - 521467: []string{"America/Mexico_City"}, - 521468: []string{"America/Mexico_City"}, - 521469: []string{"America/Mexico_City"}, - 521471: []string{"America/Mexico_City"}, - 521472: []string{"America/Mexico_City"}, - 521473: []string{"America/Mexico_City"}, - 521474: []string{"America/Mexico_City"}, - 521475: []string{"America/Mexico_City"}, - 521476: []string{"America/Mexico_City"}, - 521477: []string{"America/Mexico_City"}, - 521478: []string{"America/Mexico_City"}, - 521481: []string{"America/Mexico_City"}, - 521482: []string{"America/Mexico_City"}, - 521483: []string{"America/Mexico_City"}, - 521485: []string{"America/Mexico_City"}, - 521486: []string{"America/Mexico_City"}, - 521487: []string{"America/Mexico_City"}, - 521488: []string{"America/Mexico_City"}, - 521489: []string{"America/Mexico_City"}, - 521492: []string{"America/Mexico_City"}, - 521493: []string{"America/Mexico_City"}, - 521494: []string{"America/Mexico_City"}, - 521495: []string{"America/Mexico_City"}, - 521496: []string{"America/Mexico_City"}, - 521498: []string{"America/Mexico_City"}, - 521499: []string{"America/Mexico_City"}, - 52155: []string{"America/Mexico_City"}, - 521591: []string{"America/Mexico_City"}, - 521592: []string{"America/Mexico_City"}, - 521593: []string{"America/Mexico_City"}, - 521594: []string{"America/Mexico_City"}, - 521595: []string{"America/Mexico_City"}, - 521596: []string{"America/Mexico_City"}, - 521597: []string{"America/Mexico_City"}, - 521599: []string{"America/Mexico_City"}, - 521612: []string{"America/Mazatlan"}, - 521613: []string{"America/Mazatlan"}, - 521614: []string{"America/Mazatlan"}, - 521615: []string{"America/Mazatlan"}, - 521616: []string{"America/Tijuana"}, - 521618: []string{"America/Mexico_City"}, - 521621: []string{"America/Mazatlan"}, - 521622: []string{"America/Mazatlan"}, - 521623: []string{"America/Mazatlan"}, - 521624: []string{"America/Mazatlan"}, - 521625: []string{"America/Mazatlan"}, - 521626: []string{ - "America/Hermosillo", "America/Tijuana", - }, - 521627: []string{"America/Mazatlan"}, - 521629: []string{ - "America/Mazatlan", "America/Mexico_City", - }, - 521631: []string{"America/Mazatlan"}, - 521632: []string{"America/Mazatlan"}, - 521633: []string{"America/Mazatlan"}, - 521634: []string{"America/Mazatlan"}, - 521635: []string{"America/Mazatlan"}, - 521636: []string{ - "America/Mazatlan", "America/Mexico_City", - }, - 521637: []string{"America/Mazatlan"}, - 521638: []string{"America/Mazatlan"}, - 521639: []string{"America/Mazatlan"}, - 521641: []string{"America/Mazatlan"}, - 521642: []string{"America/Mazatlan"}, - 521643: []string{"America/Mazatlan"}, - 521644: []string{"America/Mazatlan"}, - 521645: []string{"America/Mazatlan"}, - 521646: []string{"America/Tijuana"}, - 521647: []string{ - "America/Mazatlan", "America/Mexico_City", - }, - 521648: []string{"America/Mazatlan"}, - 521649: []string{"America/Mazatlan"}, - 521652: []string{"America/Mazatlan"}, - 521653: []string{"America/Mazatlan"}, - 521656: []string{"America/Hermosillo"}, - 521658: []string{"America/Tijuana"}, - 521659: []string{"America/Mazatlan"}, - 521661: []string{"America/Tijuana"}, - 521662: []string{"America/Mazatlan"}, - 521664: []string{"America/Tijuana"}, - 521665: []string{"America/Tijuana"}, - 521667: []string{"America/Mazatlan"}, - 521668: []string{"America/Mazatlan"}, - 521669: []string{"America/Mazatlan"}, - 521671: []string{"America/Mexico_City"}, - 521672: []string{"America/Mazatlan"}, - 521673: []string{"America/Mazatlan"}, - 521674: []string{"America/Mexico_City"}, - 521675: []string{"America/Mexico_City"}, - 521676: []string{"America/Mexico_City"}, - 521677: []string{"America/Mexico_City"}, - 521686: []string{"America/Tijuana"}, - 521687: []string{"America/Mazatlan"}, - 521694: []string{"America/Mazatlan"}, - 521695: []string{"America/Mazatlan"}, - 521696: []string{"America/Mazatlan"}, - 521697: []string{"America/Mazatlan"}, - 521698: []string{"America/Mazatlan"}, - 521711: []string{"America/Mexico_City"}, - 521712: []string{"America/Mexico_City"}, - 521713: []string{"America/Mexico_City"}, - 521714: []string{ - "America/Mexico_City", "America/Tijuana", - }, - 521715: []string{"America/Mexico_City"}, - 521716: []string{"America/Mexico_City"}, - 521717: []string{"America/Mexico_City"}, - 521718: []string{"America/Mexico_City"}, - 521719: []string{"America/Mexico_City"}, - 521721: []string{"America/Mexico_City"}, - 521722: []string{"America/Mexico_City"}, - 521723: []string{"America/Mexico_City"}, - 521724: []string{"America/Mexico_City"}, - 521725: []string{"America/Mexico_City"}, - 521726: []string{"America/Mexico_City"}, - 521727: []string{"America/Mexico_City"}, - 521728: []string{"America/Mexico_City"}, - 521731: []string{"America/Mexico_City"}, - 521732: []string{"America/Mexico_City"}, - 521733: []string{"America/Mexico_City"}, - 521734: []string{"America/Mexico_City"}, - 521735: []string{"America/Mexico_City"}, - 521736: []string{"America/Mexico_City"}, - 521737: []string{"America/Mexico_City"}, - 521738: []string{"America/Mexico_City"}, - 521739: []string{"America/Mexico_City"}, - 521741: []string{"America/Mexico_City"}, - 521742: []string{"America/Mexico_City"}, - 521744: []string{"America/Mexico_City"}, - 521745: []string{"America/Mexico_City"}, - 521746: []string{"America/Mexico_City"}, - 521747: []string{"America/Mexico_City"}, - 521748: []string{"America/Mexico_City"}, - 521749: []string{"America/Mexico_City"}, - 521751: []string{"America/Mexico_City"}, - 521753: []string{"America/Mexico_City"}, - 521754: []string{"America/Mexico_City"}, - 521755: []string{"America/Mexico_City"}, - 521756: []string{"America/Mexico_City"}, - 521757: []string{"America/Mexico_City"}, - 521758: []string{"America/Mexico_City"}, - 521759: []string{"America/Mexico_City"}, - 521761: []string{"America/Mexico_City"}, - 521762: []string{"America/Mexico_City"}, - 521763: []string{"America/Mexico_City"}, - 521764: []string{"America/Mexico_City"}, - 521765: []string{"America/Mexico_City"}, - 521766: []string{"America/Mexico_City"}, - 521767: []string{"America/Mexico_City"}, - 521768: []string{"America/Mexico_City"}, - 521769: []string{"America/Mexico_City"}, - 521771: []string{"America/Mexico_City"}, - 521772: []string{"America/Mexico_City"}, - 521773: []string{"America/Mexico_City"}, - 521774: []string{"America/Mexico_City"}, - 521775: []string{"America/Mexico_City"}, - 521776: []string{"America/Mexico_City"}, - 521777: []string{"America/Mexico_City"}, - 521778: []string{"America/Mexico_City"}, - 521779: []string{"America/Mexico_City"}, - 521782: []string{"America/Mexico_City"}, - 521783: []string{"America/Mexico_City"}, - 521784: []string{"America/Mexico_City"}, - 521785: []string{"America/Mexico_City"}, - 521786: []string{"America/Mexico_City"}, - 521789: []string{"America/Mexico_City"}, - 521791: []string{"America/Mexico_City"}, - 521797: []string{"America/Mexico_City"}, - 52181: []string{"America/Mexico_City"}, - 521821: []string{"America/Mexico_City"}, - 521823: []string{"America/Mexico_City"}, - 521824: []string{"America/Mexico_City"}, - 521825: []string{"America/Mexico_City"}, - 521826: []string{"America/Mexico_City"}, - 521828: []string{"America/Mexico_City"}, - 521831: []string{"America/Mexico_City"}, - 521832: []string{"America/Mexico_City"}, - 521833: []string{"America/Mexico_City"}, - 521834: []string{"America/Mexico_City"}, - 521836: []string{"America/Mexico_City"}, - 521841: []string{"America/Mexico_City"}, - 521842: []string{"America/Mexico_City"}, - 521844: []string{"America/Mexico_City"}, - 521845: []string{"America/Mexico_City"}, - 521846: []string{"America/Mexico_City"}, - 521861: []string{"America/Mexico_City"}, - 521862: []string{"America/Mexico_City"}, - 521864: []string{"America/Mexico_City"}, - 521866: []string{"America/Mexico_City"}, - 521867: []string{"America/Mexico_City"}, - 521868: []string{"America/Mexico_City"}, - 521869: []string{"America/Mexico_City"}, - 521871: []string{"America/Mexico_City"}, - 521872: []string{"America/Mexico_City"}, - 521873: []string{"America/Mexico_City"}, - 521877: []string{ - "America/Mexico_City", "America/Tijuana", - }, - 521878: []string{"America/Mexico_City"}, - 521891: []string{"America/Mexico_City"}, - 521892: []string{"America/Mexico_City"}, - 521894: []string{"America/Mexico_City"}, - 521897: []string{"America/Mexico_City"}, - 521899: []string{"America/Mexico_City"}, - 521913: []string{"America/Mexico_City"}, - 521914: []string{"America/Mexico_City"}, - 521916: []string{"America/Mexico_City"}, - 521917: []string{"America/Mexico_City"}, - 521918: []string{"America/Mexico_City"}, - 521919: []string{"America/Mexico_City"}, - 521921: []string{"America/Mexico_City"}, - 521922: []string{"America/Mexico_City"}, - 521923: []string{"America/Mexico_City"}, - 521924: []string{"America/Mexico_City"}, - 521932: []string{"America/Mexico_City"}, - 521933: []string{"America/Mexico_City"}, - 521934: []string{"America/Mexico_City"}, - 521936: []string{"America/Mexico_City"}, - 521937: []string{"America/Mexico_City"}, - 521938: []string{"America/Mexico_City"}, - 521951: []string{"America/Mexico_City"}, - 521953: []string{"America/Mexico_City"}, - 521954: []string{"America/Mexico_City"}, - 521958: []string{"America/Mexico_City"}, - 521961: []string{"America/Mexico_City"}, - 521962: []string{"America/Mexico_City"}, - 521963: []string{"America/Mexico_City"}, - 521964: []string{"America/Mexico_City"}, - 521965: []string{"America/Mexico_City"}, - 521966: []string{"America/Mexico_City"}, - 521967: []string{"America/Mexico_City"}, - 521968: []string{"America/Mexico_City"}, - 521969: []string{"America/Mexico_City"}, - 521971: []string{"America/Mexico_City"}, - 521972: []string{"America/Mexico_City"}, - 521981: []string{"America/Mexico_City"}, - 521982: []string{"America/Mexico_City"}, - 521983: []string{"America/New_York"}, - 521984: []string{"America/New_York"}, - 521985: []string{"America/Mexico_City"}, - 521986: []string{"America/Mexico_City"}, - 521987: []string{"America/New_York"}, - 521988: []string{"America/Mexico_City"}, - 521991: []string{"America/Mexico_City"}, - 521992: []string{"America/Mexico_City"}, - 521993: []string{"America/Mexico_City"}, - 521994: []string{"America/Mexico_City"}, - 521995: []string{"America/Mexico_City"}, - 521996: []string{"America/Mexico_City"}, - 521997: []string{"America/Mexico_City"}, - 521998: []string{"America/New_York"}, - 521999: []string{"America/Mexico_City"}, - 52200: []string{ - "America/Mexico_City", "America/Tijuana", - }, - 52201: []string{ - "America/Mexico_City", "America/New_York", - }, - 52221: []string{"America/Mexico_City"}, - 52222: []string{"America/Mexico_City"}, - 52223: []string{"America/Mexico_City"}, - 52224: []string{"America/Mexico_City"}, - 52225: []string{"America/Mexico_City"}, - 52226: []string{"America/Mexico_City"}, - 52227: []string{"America/Mexico_City"}, - 52228: []string{"America/Mexico_City"}, - 52229: []string{"America/Mexico_City"}, - 52231: []string{"America/Mexico_City"}, - 52232: []string{"America/Mexico_City"}, - 52233: []string{"America/Mexico_City"}, - 52235: []string{"America/Mexico_City"}, - 52236: []string{"America/Mexico_City"}, - 52237: []string{"America/Mexico_City"}, - 52238: []string{"America/Mexico_City"}, - 52241: []string{"America/Mexico_City"}, - 52243: []string{"America/Mexico_City"}, - 52244: []string{"America/Mexico_City"}, - 52245: []string{"America/Mexico_City"}, - 52246: []string{"America/Mexico_City"}, - 52247: []string{"America/Mexico_City"}, - 52248: []string{"America/Mexico_City"}, - 52249: []string{"America/Mexico_City"}, - 52271: []string{"America/Mexico_City"}, - 52272: []string{"America/Mexico_City"}, - 52273: []string{"America/Mexico_City"}, - 52274: []string{"America/Mexico_City"}, - 52275: []string{"America/Mexico_City"}, - 52276: []string{"America/Mexico_City"}, - 52278: []string{"America/Mexico_City"}, - 52279: []string{"America/Mexico_City"}, - 52281: []string{"America/Mexico_City"}, - 52282: []string{"America/Mexico_City"}, - 52283: []string{"America/Mexico_City"}, - 52284: []string{"America/Mexico_City"}, - 52285: []string{"America/Mexico_City"}, - 52287: []string{"America/Mexico_City"}, - 52288: []string{"America/Mexico_City"}, - 52294: []string{"America/Mexico_City"}, - 52296: []string{"America/Mexico_City"}, - 52297: []string{"America/Mexico_City"}, - 52311: []string{"America/Mazatlan"}, - 52312: []string{"America/Mexico_City"}, - 52313: []string{"America/Mexico_City"}, - 52314: []string{"America/Mexico_City"}, - 52315: []string{"America/Mexico_City"}, - 52316: []string{"America/Mexico_City"}, - 52317: []string{"America/Mexico_City"}, - 52319: []string{"America/Mazatlan"}, - 52321: []string{"America/Mexico_City"}, - 52322: []string{"America/Mexico_City"}, - 52323: []string{"America/Mazatlan"}, - 52324: []string{"America/Mazatlan"}, - 52325: []string{"America/Mazatlan"}, - 52326: []string{"America/Mexico_City"}, - 52327: []string{"America/Mazatlan"}, - 52328: []string{"America/Mexico_City"}, - 52329: []string{"America/Mexico_City"}, - 5233: []string{"America/Mexico_City"}, - 52341: []string{"America/Mexico_City"}, - 52342: []string{"America/Mexico_City"}, - 52343: []string{"America/Mexico_City"}, - 52344: []string{"America/Mexico_City"}, - 52345: []string{"America/Mexico_City"}, - 52346: []string{"America/Mexico_City"}, - 52347: []string{"America/Mexico_City"}, - 52348: []string{"America/Mexico_City"}, - 52349: []string{"America/Mexico_City"}, - 52351: []string{"America/Mexico_City"}, - 52352: []string{"America/Mexico_City"}, - 52353: []string{"America/Mexico_City"}, - 52354: []string{"America/Mexico_City"}, - 52355: []string{"America/Mexico_City"}, - 52356: []string{"America/Mexico_City"}, - 52357: []string{"America/Mexico_City"}, - 52358: []string{"America/Mexico_City"}, - 52359: []string{"America/Mexico_City"}, - 52371: []string{"America/Mexico_City"}, - 52372: []string{"America/Mexico_City"}, - 52373: []string{"America/Mexico_City"}, - 52374: []string{"America/Mexico_City"}, - 52375: []string{"America/Mexico_City"}, - 52376: []string{"America/Mexico_City"}, - 52377: []string{"America/Mexico_City"}, - 52378: []string{"America/Mexico_City"}, - 52381: []string{"America/Mexico_City"}, - 52382: []string{"America/Mexico_City"}, - 52383: []string{"America/Mexico_City"}, - 52384: []string{"America/Mexico_City"}, - 52385: []string{"America/Mexico_City"}, - 52386: []string{"America/Mexico_City"}, - 52387: []string{"America/Mexico_City"}, - 52388: []string{"America/Mexico_City"}, - 52389: []string{"America/Mazatlan"}, - 52391: []string{"America/Mexico_City"}, - 52392: []string{"America/Mexico_City"}, - 52393: []string{"America/Mexico_City"}, - 52394: []string{"America/Mexico_City"}, - 52395: []string{"America/Mexico_City"}, - 52411: []string{"America/Mexico_City"}, - 52412: []string{"America/Mexico_City"}, - 52413: []string{"America/Mexico_City"}, - 52414: []string{"America/Mexico_City"}, - 52415: []string{"America/Mexico_City"}, - 52417: []string{"America/Mexico_City"}, - 52418: []string{"America/Mexico_City"}, - 52419: []string{"America/Mexico_City"}, - 52421: []string{"America/Mexico_City"}, - 52422: []string{"America/Mexico_City"}, - 52423: []string{"America/Mexico_City"}, - 52424: []string{"America/Mexico_City"}, - 52425: []string{"America/Mexico_City"}, - 52426: []string{"America/Mexico_City"}, - 52427: []string{"America/Mexico_City"}, - 52428: []string{"America/Mexico_City"}, - 52429: []string{"America/Mexico_City"}, - 52431: []string{"America/Mexico_City"}, - 52432: []string{"America/Mexico_City"}, - 52433: []string{"America/Mexico_City"}, - 52434: []string{"America/Mexico_City"}, - 52435: []string{"America/Mexico_City"}, - 52436: []string{"America/Mexico_City"}, - 52437: []string{"America/Mexico_City"}, - 52438: []string{"America/Mexico_City"}, - 52441: []string{"America/Mexico_City"}, - 52442: []string{"America/Mexico_City"}, - 52443: []string{"America/Mexico_City"}, - 52444: []string{"America/Mexico_City"}, - 52445: []string{"America/Mexico_City"}, - 52446: []string{"America/Mexico_City"}, - 52447: []string{"America/Mexico_City"}, - 52448: []string{"America/Mexico_City"}, - 52449: []string{"America/Mexico_City"}, - 52451: []string{"America/Mexico_City"}, - 52452: []string{"America/Mexico_City"}, - 52453: []string{"America/Mexico_City"}, - 52454: []string{"America/Mexico_City"}, - 52455: []string{"America/Mexico_City"}, - 52456: []string{"America/Mexico_City"}, - 52457: []string{"America/Mexico_City"}, - 52458: []string{"America/Mexico_City"}, - 52459: []string{"America/Mexico_City"}, - 52461: []string{"America/Mexico_City"}, - 52462: []string{"America/Mexico_City"}, - 52463: []string{"America/Mexico_City"}, - 52464: []string{"America/Mexico_City"}, - 52465: []string{"America/Mexico_City"}, - 52466: []string{"America/Mexico_City"}, - 52467: []string{"America/Mexico_City"}, - 52468: []string{"America/Mexico_City"}, - 52469: []string{"America/Mexico_City"}, - 52471: []string{"America/Mexico_City"}, - 52472: []string{"America/Mexico_City"}, - 52473: []string{"America/Mexico_City"}, - 52474: []string{"America/Mexico_City"}, - 52475: []string{"America/Mexico_City"}, - 52476: []string{"America/Mexico_City"}, - 52477: []string{"America/Mexico_City"}, - 52478: []string{"America/Mexico_City"}, - 52481: []string{"America/Mexico_City"}, - 52482: []string{"America/Mexico_City"}, - 52483: []string{"America/Mexico_City"}, - 52485: []string{"America/Mexico_City"}, - 52486: []string{"America/Mexico_City"}, - 52487: []string{"America/Mexico_City"}, - 52488: []string{"America/Mexico_City"}, - 52489: []string{"America/Mexico_City"}, - 52492: []string{"America/Mexico_City"}, - 52493: []string{"America/Mexico_City"}, - 52494: []string{"America/Mexico_City"}, - 52495: []string{"America/Mexico_City"}, - 52496: []string{"America/Mexico_City"}, - 52498: []string{"America/Mexico_City"}, - 52499: []string{"America/Mexico_City"}, - 5255: []string{"America/Mexico_City"}, - 52588: []string{"America/Mexico_City"}, - 52591: []string{"America/Mexico_City"}, - 52592: []string{"America/Mexico_City"}, - 52593: []string{"America/Mexico_City"}, - 52594: []string{"America/Mexico_City"}, - 52595: []string{"America/Mexico_City"}, - 52596: []string{"America/Mexico_City"}, - 52597: []string{"America/Mexico_City"}, - 52599: []string{"America/Mexico_City"}, - 52612: []string{"America/Mazatlan"}, - 52613: []string{"America/Mazatlan"}, - 52614: []string{"America/Mazatlan"}, - 52615: []string{"America/Mazatlan"}, - 52616: []string{ - "America/Mazatlan", "America/Tijuana", - }, - 52618: []string{"America/Mexico_City"}, - 52621: []string{"America/Mazatlan"}, - 52622: []string{"America/Mazatlan"}, - 52623: []string{"America/Mazatlan"}, - 52624: []string{"America/Mazatlan"}, - 52625: []string{"America/Mazatlan"}, - 52626: []string{ - "America/Hermosillo", "America/Mazatlan", - }, - 52627: []string{"America/Mazatlan"}, - 52628: []string{"America/Mazatlan"}, - 52629: []string{"America/Mazatlan"}, - 52631: []string{"America/Mazatlan"}, - 52632: []string{"America/Mazatlan"}, - 52633: []string{"America/Mazatlan"}, - 52634: []string{"America/Mazatlan"}, - 52635: []string{"America/Mazatlan"}, - 52636: []string{"America/Mazatlan"}, - 52637: []string{"America/Mazatlan"}, - 52638: []string{"America/Mazatlan"}, - 52639: []string{"America/Mazatlan"}, - 52641: []string{"America/Mazatlan"}, - 52642: []string{"America/Mazatlan"}, - 52643: []string{"America/Mazatlan"}, - 52644: []string{"America/Mazatlan"}, - 52645: []string{"America/Mazatlan"}, - 52646: []string{"America/Tijuana"}, - 52647: []string{"America/Mazatlan"}, - 52648: []string{"America/Mazatlan"}, - 52649: []string{ - "America/Mazatlan", "America/Mexico_City", - }, - 52651: []string{"America/Mazatlan"}, - 52652: []string{"America/Mazatlan"}, - 52653: []string{"America/Mazatlan"}, - 52656: []string{"America/Hermosillo"}, - 52658: []string{"America/Tijuana"}, - 52659: []string{"America/Mazatlan"}, - 52661: []string{"America/Tijuana"}, - 52662: []string{"America/Mazatlan"}, - 52664: []string{"America/Tijuana"}, - 52665: []string{"America/Tijuana"}, - 52667: []string{"America/Mazatlan"}, - 52668: []string{"America/Mazatlan"}, - 52669: []string{"America/Mazatlan"}, - 52671: []string{"America/Mexico_City"}, - 52672: []string{"America/Mazatlan"}, - 52673: []string{"America/Mazatlan"}, - 52674: []string{"America/Mexico_City"}, - 52675: []string{"America/Mexico_City"}, - 52676: []string{"America/Mexico_City"}, - 52677: []string{"America/Mexico_City"}, - 52686: []string{"America/Tijuana"}, - 52687: []string{"America/Mazatlan"}, - 52694: []string{"America/Mazatlan"}, - 52695: []string{"America/Mazatlan"}, - 52696: []string{"America/Mazatlan"}, - 52697: []string{"America/Mazatlan"}, - 52698: []string{"America/Mazatlan"}, - 52711: []string{"America/Mexico_City"}, - 52712: []string{"America/Mexico_City"}, - 52713: []string{"America/Mexico_City"}, - 52714: []string{"America/Mexico_City"}, - 52715: []string{"America/Mexico_City"}, - 52716: []string{"America/Mexico_City"}, - 52717: []string{"America/Mexico_City"}, - 52718: []string{"America/Mexico_City"}, - 52719: []string{"America/Mexico_City"}, - 52721: []string{"America/Mexico_City"}, - 52722: []string{"America/Mexico_City"}, - 52723: []string{"America/Mexico_City"}, - 52724: []string{"America/Mexico_City"}, - 52725: []string{"America/Mexico_City"}, - 52726: []string{"America/Mexico_City"}, - 52727: []string{"America/Mexico_City"}, - 52728: []string{"America/Mexico_City"}, - 52731: []string{"America/Mexico_City"}, - 52732: []string{"America/Mexico_City"}, - 52733: []string{"America/Mexico_City"}, - 52734: []string{"America/Mexico_City"}, - 52735: []string{"America/Mexico_City"}, - 52736: []string{"America/Mexico_City"}, - 52737: []string{"America/Mexico_City"}, - 52738: []string{"America/Mexico_City"}, - 52739: []string{"America/Mexico_City"}, - 52741: []string{"America/Mexico_City"}, - 52742: []string{"America/Mexico_City"}, - 52743: []string{"America/Mexico_City"}, - 52744: []string{"America/Mexico_City"}, - 52745: []string{"America/Mexico_City"}, - 52746: []string{"America/Mexico_City"}, - 52747: []string{"America/Mexico_City"}, - 52748: []string{"America/Mexico_City"}, - 52749: []string{"America/Mexico_City"}, - 52751: []string{"America/Mexico_City"}, - 52753: []string{"America/Mexico_City"}, - 52754: []string{"America/Mexico_City"}, - 52755: []string{"America/Mexico_City"}, - 52756: []string{"America/Mexico_City"}, - 52757: []string{"America/Mexico_City"}, - 52758: []string{"America/Mexico_City"}, - 52759: []string{"America/Mexico_City"}, - 52761: []string{"America/Mexico_City"}, - 52762: []string{"America/Mexico_City"}, - 52763: []string{"America/Mexico_City"}, - 52764: []string{"America/Mexico_City"}, - 52765: []string{"America/Mexico_City"}, - 52766: []string{"America/Mexico_City"}, - 52767: []string{"America/Mexico_City"}, - 52768: []string{"America/Mexico_City"}, - 52769: []string{"America/Mexico_City"}, - 52771: []string{"America/Mexico_City"}, - 52772: []string{"America/Mexico_City"}, - 52773: []string{"America/Mexico_City"}, - 52774: []string{"America/Mexico_City"}, - 52775: []string{"America/Mexico_City"}, - 52776: []string{"America/Mexico_City"}, - 52777: []string{"America/Mexico_City"}, - 52778: []string{"America/Mexico_City"}, - 52779: []string{"America/Mexico_City"}, - 52781: []string{"America/Mexico_City"}, - 52782: []string{"America/Mexico_City"}, - 52783: []string{"America/Mexico_City"}, - 52784: []string{"America/Mexico_City"}, - 52785: []string{"America/Mexico_City"}, - 52786: []string{"America/Mexico_City"}, - 52789: []string{"America/Mexico_City"}, - 52791: []string{"America/Mexico_City"}, - 52797: []string{"America/Mexico_City"}, - 5281: []string{"America/Mexico_City"}, - 52821: []string{"America/Mexico_City"}, - 52823: []string{"America/Mexico_City"}, - 52824: []string{"America/Mexico_City"}, - 52825: []string{"America/Mexico_City"}, - 52826: []string{"America/Mexico_City"}, - 52828: []string{"America/Mexico_City"}, - 52829: []string{"America/Mexico_City"}, - 52831: []string{"America/Mexico_City"}, - 52832: []string{"America/Mexico_City"}, - 52833: []string{"America/Mexico_City"}, - 52834: []string{"America/Mexico_City"}, - 52835: []string{"America/Mexico_City"}, - 52836: []string{"America/Mexico_City"}, - 52841: []string{"America/Mexico_City"}, - 52842: []string{"America/Mexico_City"}, - 52844: []string{"America/Mexico_City"}, - 52845: []string{"America/Mexico_City"}, - 52846: []string{"America/Mexico_City"}, - 52861: []string{"America/Mexico_City"}, - 52862: []string{"America/Mexico_City"}, - 52864: []string{"America/Mexico_City"}, - 52866: []string{"America/Mexico_City"}, - 52867: []string{"America/Mexico_City"}, - 52868: []string{"America/Mexico_City"}, - 52869: []string{"America/Mexico_City"}, - 52871: []string{"America/Mexico_City"}, - 52872: []string{"America/Mexico_City"}, - 52873: []string{"America/Mexico_City"}, - 52877: []string{"America/Mexico_City"}, - 52878: []string{"America/Mexico_City"}, - 52891: []string{"America/Mexico_City"}, - 52892: []string{"America/Mexico_City"}, - 52894: []string{"America/Mexico_City"}, - 52897: []string{"America/Mexico_City"}, - 52899: []string{"America/Mexico_City"}, - 52913: []string{"America/Mexico_City"}, - 52914: []string{"America/Mexico_City"}, - 52916: []string{"America/Mexico_City"}, - 52917: []string{"America/Mexico_City"}, - 52918: []string{"America/Mexico_City"}, - 52919: []string{"America/Mexico_City"}, - 52921: []string{"America/Mexico_City"}, - 52922: []string{"America/Mexico_City"}, - 52923: []string{"America/Mexico_City"}, - 52924: []string{"America/Mexico_City"}, - 52932: []string{"America/Mexico_City"}, - 52933: []string{"America/Mexico_City"}, - 52934: []string{"America/Mexico_City"}, - 52936: []string{"America/Mexico_City"}, - 52937: []string{"America/Mexico_City"}, - 52938: []string{"America/Mexico_City"}, - 52951: []string{"America/Mexico_City"}, - 52953: []string{"America/Mexico_City"}, - 52954: []string{"America/Mexico_City"}, - 52958: []string{"America/Mexico_City"}, - 52961: []string{"America/Mexico_City"}, - 52962: []string{"America/Mexico_City"}, - 52963: []string{"America/Mexico_City"}, - 52964: []string{"America/Mexico_City"}, - 52965: []string{"America/Mexico_City"}, - 52966: []string{"America/Mexico_City"}, - 52967: []string{"America/Mexico_City"}, - 52968: []string{"America/Mexico_City"}, - 52969: []string{"America/Mexico_City"}, - 52971: []string{"America/Mexico_City"}, - 52972: []string{"America/Mexico_City"}, - 52981: []string{"America/Mexico_City"}, - 52982: []string{"America/Mexico_City"}, - 52983: []string{"America/New_York"}, - 52984: []string{"America/New_York"}, - 52985: []string{"America/Mexico_City"}, - 52986: []string{"America/Mexico_City"}, - 52987: []string{"America/New_York"}, - 52988: []string{"America/Mexico_City"}, - 52991: []string{"America/Mexico_City"}, - 52992: []string{"America/Mexico_City"}, - 52993: []string{"America/Mexico_City"}, - 52994: []string{"America/Mexico_City"}, - 52995: []string{"America/Mexico_City"}, - 52996: []string{"America/Mexico_City"}, - 52997: []string{"America/Mexico_City"}, - 52998: []string{"America/New_York"}, - 52999: []string{"America/Mexico_City"}, - 53: []string{"America/Havana"}, - 54: []string{"America/Buenos_Aires"}, - 55: []string{ - "America/Manaus", "America/Noronha", "America/Rio_Branco", "America/Sao_Paulo", - }, - 551: []string{"America/Sao_Paulo"}, - 55153245: []string{"America/Manaus"}, - 552: []string{"America/Sao_Paulo"}, - 553: []string{"America/Sao_Paulo"}, - 554: []string{"America/Sao_Paulo"}, - 555: []string{"America/Sao_Paulo"}, - 55553682: []string{"America/Manaus"}, - 5561: []string{"America/Sao_Paulo"}, - 5562: []string{"America/Sao_Paulo"}, - 5563: []string{"America/Sao_Paulo"}, - 5564: []string{"America/Sao_Paulo"}, - 5565: []string{"America/Manaus"}, - 5566: []string{"America/Manaus"}, - 5567: []string{"America/Manaus"}, - 55673480: []string{"America/Sao_Paulo"}, - 5568: []string{"America/Rio_Branco"}, - 5569: []string{"America/Manaus"}, - 55693527: []string{"America/Sao_Paulo"}, - 557: []string{"America/Sao_Paulo"}, - 5581: []string{"America/Noronha"}, - 55812011: []string{"America/Sao_Paulo"}, - 55812101: []string{"America/Sao_Paulo"}, - 55812102: []string{"America/Sao_Paulo"}, - 55812103: []string{"America/Sao_Paulo"}, - 55812104: []string{"America/Sao_Paulo"}, - 55812119: []string{"America/Sao_Paulo"}, - 55812121: []string{"America/Sao_Paulo"}, - 55812122: []string{"America/Sao_Paulo"}, - 55812123: []string{"America/Sao_Paulo"}, - 55812125: []string{"America/Sao_Paulo"}, - 55812126: []string{"America/Sao_Paulo"}, - 55812127: []string{"America/Sao_Paulo"}, - 55812128: []string{"America/Sao_Paulo"}, - 55812129: []string{"America/Sao_Paulo"}, - 55812137: []string{"America/Sao_Paulo"}, - 55812138: []string{"America/Sao_Paulo"}, - 55812626: []string{"America/Sao_Paulo"}, - 55813000: []string{"America/Sao_Paulo"}, - 55813003: []string{"America/Sao_Paulo"}, - 55813004: []string{"America/Sao_Paulo"}, - 55813010: []string{"America/Sao_Paulo"}, - 55813011: []string{"America/Sao_Paulo"}, - 55813012: []string{"America/Sao_Paulo"}, - 55813014: []string{"America/Sao_Paulo"}, - 55813015: []string{"America/Sao_Paulo"}, - 55813019: []string{"America/Sao_Paulo"}, - 55813020: []string{"America/Sao_Paulo"}, - 55813021: []string{"America/Sao_Paulo"}, - 55813023: []string{"America/Sao_Paulo"}, - 55813025: []string{"America/Sao_Paulo"}, - 55813028: []string{"America/Sao_Paulo"}, - 5581303: []string{"America/Sao_Paulo"}, - 55813040: []string{"America/Sao_Paulo"}, - 55813041: []string{"America/Sao_Paulo"}, - 55813045: []string{"America/Sao_Paulo"}, - 55813046: []string{"America/Sao_Paulo"}, - 55813048: []string{"America/Sao_Paulo"}, - 55813049: []string{"America/Sao_Paulo"}, - 55813050: []string{"America/Sao_Paulo"}, - 55813051: []string{"America/Sao_Paulo"}, - 55813052: []string{"America/Sao_Paulo"}, - 55813053: []string{"America/Sao_Paulo"}, - 55813055: []string{"America/Sao_Paulo"}, - 55813059: []string{"America/Sao_Paulo"}, - 55813061: []string{"America/Sao_Paulo"}, - 55813062: []string{"America/Sao_Paulo"}, - 55813064: []string{"America/Sao_Paulo"}, - 55813066: []string{"America/Sao_Paulo"}, - 55813071: []string{"America/Sao_Paulo"}, - 55813072: []string{"America/Sao_Paulo"}, - 55813073: []string{"America/Sao_Paulo"}, - 55813074: []string{"America/Sao_Paulo"}, - 55813075: []string{"America/Sao_Paulo"}, - 55813076: []string{"America/Sao_Paulo"}, - 55813077: []string{"America/Sao_Paulo"}, - 55813078: []string{"America/Sao_Paulo"}, - 55813079: []string{"America/Sao_Paulo"}, - 55813080: []string{"America/Sao_Paulo"}, - 55813081: []string{"America/Sao_Paulo"}, - 55813082: []string{"America/Sao_Paulo"}, - 55813083: []string{"America/Sao_Paulo"}, - 55813084: []string{"America/Sao_Paulo"}, - 55813086: []string{"America/Sao_Paulo"}, - 55813087: []string{"America/Sao_Paulo"}, - 55813088: []string{"America/Sao_Paulo"}, - 55813089: []string{"America/Sao_Paulo"}, - 55813090: []string{"America/Sao_Paulo"}, - 55813091: []string{"America/Sao_Paulo"}, - 55813092: []string{"America/Sao_Paulo"}, - 55813093: []string{"America/Sao_Paulo"}, - 55813094: []string{"America/Sao_Paulo"}, - 55813095: []string{"America/Sao_Paulo"}, - 55813096: []string{"America/Sao_Paulo"}, - 55813097: []string{"America/Sao_Paulo"}, - 55813099: []string{"America/Sao_Paulo"}, - 55813101: []string{"America/Sao_Paulo"}, - 55813102: []string{"America/Sao_Paulo"}, - 55813103: []string{"America/Sao_Paulo"}, - 55813104: []string{"America/Sao_Paulo"}, - 55813105: []string{"America/Sao_Paulo"}, - 55813106: []string{"America/Sao_Paulo"}, - 55813107: []string{"America/Sao_Paulo"}, - 55813108: []string{"America/Sao_Paulo"}, - 55813110: []string{"America/Sao_Paulo"}, - 55813114: []string{"America/Sao_Paulo"}, - 55813115: []string{"America/Sao_Paulo"}, - 55813117: []string{"America/Sao_Paulo"}, - 55813118: []string{"America/Sao_Paulo"}, - 55813125: []string{"America/Sao_Paulo"}, - 55813126: []string{"America/Sao_Paulo"}, - 55813127: []string{"America/Sao_Paulo"}, - 55813128: []string{"America/Sao_Paulo"}, - 55813129: []string{"America/Sao_Paulo"}, - 55813130: []string{"America/Sao_Paulo"}, - 55813131: []string{"America/Sao_Paulo"}, - 55813132: []string{"America/Sao_Paulo"}, - 55813134: []string{"America/Sao_Paulo"}, - 55813136: []string{"America/Sao_Paulo"}, - 55813137: []string{"America/Sao_Paulo"}, - 55813138: []string{"America/Sao_Paulo"}, - 55813145: []string{"America/Sao_Paulo"}, - 55813155: []string{"America/Sao_Paulo"}, - 55813181: []string{"America/Sao_Paulo"}, - 55813182: []string{"America/Sao_Paulo"}, - 55813183: []string{"America/Sao_Paulo"}, - 55813184: []string{"America/Sao_Paulo"}, - 55813194: []string{"America/Sao_Paulo"}, - 55813198: []string{"America/Sao_Paulo"}, - 55813201: []string{"America/Sao_Paulo"}, - 55813202: []string{"America/Sao_Paulo"}, - 55813203: []string{"America/Sao_Paulo"}, - 55813204: []string{"America/Sao_Paulo"}, - 55813205: []string{"America/Sao_Paulo"}, - 55813207: []string{"America/Sao_Paulo"}, - 55813212: []string{"America/Sao_Paulo"}, - 55813213: []string{"America/Sao_Paulo"}, - 55813216: []string{"America/Sao_Paulo"}, - 55813217: []string{"America/Sao_Paulo"}, - 55813221: []string{"America/Sao_Paulo"}, - 55813222: []string{"America/Sao_Paulo"}, - 55813223: []string{"America/Sao_Paulo"}, - 55813224: []string{"America/Sao_Paulo"}, - 55813225: []string{"America/Sao_Paulo"}, - 55813226: []string{"America/Sao_Paulo"}, - 55813227: []string{"America/Sao_Paulo"}, - 55813228: []string{"America/Sao_Paulo"}, - 55813229: []string{"America/Sao_Paulo"}, - 55813231: []string{"America/Sao_Paulo"}, - 55813232: []string{"America/Sao_Paulo"}, - 55813233: []string{"America/Sao_Paulo"}, - 55813236: []string{"America/Sao_Paulo"}, - 55813241: []string{"America/Sao_Paulo"}, - 55813242: []string{"America/Sao_Paulo"}, - 55813243: []string{"America/Sao_Paulo"}, - 55813244: []string{"America/Sao_Paulo"}, - 55813249: []string{"America/Sao_Paulo"}, - 55813251: []string{"America/Sao_Paulo"}, - 55813252: []string{"America/Sao_Paulo"}, - 55813253: []string{"America/Sao_Paulo"}, - 55813254: []string{"America/Sao_Paulo"}, - 55813255: []string{"America/Sao_Paulo"}, - 55813256: []string{"America/Sao_Paulo"}, - 55813257: []string{"America/Sao_Paulo"}, - 55813265: []string{"America/Sao_Paulo"}, - 55813266: []string{"America/Sao_Paulo"}, - 55813267: []string{"America/Sao_Paulo"}, - 55813268: []string{"America/Sao_Paulo"}, - 55813269: []string{"America/Sao_Paulo"}, - 55813271: []string{"America/Sao_Paulo"}, - 55813272: []string{"America/Sao_Paulo"}, - 55813273: []string{"America/Sao_Paulo"}, - 55813274: []string{"America/Sao_Paulo"}, - 55813301: []string{"America/Sao_Paulo"}, - 55813302: []string{"America/Sao_Paulo"}, - 55813303: []string{"America/Sao_Paulo"}, - 55813304: []string{"America/Sao_Paulo"}, - 55813305: []string{"America/Sao_Paulo"}, - 55813311: []string{"America/Sao_Paulo"}, - 55813312: []string{"America/Sao_Paulo"}, - 55813314: []string{"America/Sao_Paulo"}, - 55813316: []string{"America/Sao_Paulo"}, - 55813317: []string{"America/Sao_Paulo"}, - 55813318: []string{"America/Sao_Paulo"}, - 55813319: []string{"America/Sao_Paulo"}, - 55813320: []string{"America/Sao_Paulo"}, - 55813321: []string{"America/Sao_Paulo"}, - 55813322: []string{"America/Sao_Paulo"}, - 55813323: []string{"America/Sao_Paulo"}, - 55813325: []string{"America/Sao_Paulo"}, - 55813326: []string{"America/Sao_Paulo"}, - 55813327: []string{"America/Sao_Paulo"}, - 55813328: []string{"America/Sao_Paulo"}, - 55813333: []string{"America/Sao_Paulo"}, - 55813334: []string{"America/Sao_Paulo"}, - 55813338: []string{"America/Sao_Paulo"}, - 55813339: []string{"America/Sao_Paulo"}, - 55813341: []string{"America/Sao_Paulo"}, - 55813342: []string{"America/Sao_Paulo"}, - 55813343: []string{"America/Sao_Paulo"}, - 55813344: []string{"America/Sao_Paulo"}, - 55813345: []string{"America/Sao_Paulo"}, - 55813351: []string{"America/Sao_Paulo"}, - 55813352: []string{"America/Sao_Paulo"}, - 55813355: []string{"America/Sao_Paulo"}, - 55813361: []string{"America/Sao_Paulo"}, - 55813362: []string{"America/Sao_Paulo"}, - 55813363: []string{"America/Sao_Paulo"}, - 55813366: []string{"America/Sao_Paulo"}, - 55813371: []string{"America/Sao_Paulo"}, - 55813372: []string{"America/Sao_Paulo"}, - 55813375: []string{"America/Sao_Paulo"}, - 55813376: []string{"America/Sao_Paulo"}, - 55813377: []string{"America/Sao_Paulo"}, - 55813378: []string{"America/Sao_Paulo"}, - 55813379: []string{"America/Sao_Paulo"}, - 55813411: []string{"America/Sao_Paulo"}, - 55813412: []string{"America/Sao_Paulo"}, - 55813413: []string{"America/Sao_Paulo"}, - 55813414: []string{"America/Sao_Paulo"}, - 55813416: []string{"America/Sao_Paulo"}, - 55813419: []string{"America/Sao_Paulo"}, - 55813421: []string{"America/Sao_Paulo"}, - 55813422: []string{"America/Sao_Paulo"}, - 55813423: []string{"America/Sao_Paulo"}, - 55813424: []string{"America/Sao_Paulo"}, - 55813425: []string{"America/Sao_Paulo"}, - 55813426: []string{"America/Sao_Paulo"}, - 55813427: []string{"America/Sao_Paulo"}, - 55813428: []string{"America/Sao_Paulo"}, - 55813429: []string{"America/Sao_Paulo"}, - 55813431: []string{"America/Sao_Paulo"}, - 55813432: []string{"America/Sao_Paulo"}, - 55813433: []string{"America/Sao_Paulo"}, - 55813434: []string{"America/Sao_Paulo"}, - 55813435: []string{"America/Sao_Paulo"}, - 55813436: []string{"America/Sao_Paulo"}, - 55813437: []string{"America/Sao_Paulo"}, - 55813438: []string{"America/Sao_Paulo"}, - 55813439: []string{"America/Sao_Paulo"}, - 55813441: []string{"America/Sao_Paulo"}, - 55813442: []string{"America/Sao_Paulo"}, - 55813443: []string{"America/Sao_Paulo"}, - 55813444: []string{"America/Sao_Paulo"}, - 55813445: []string{"America/Sao_Paulo"}, - 55813446: []string{"America/Sao_Paulo"}, - 55813447: []string{"America/Sao_Paulo"}, - 55813448: []string{"America/Sao_Paulo"}, - 55813449: []string{"America/Sao_Paulo"}, - 55813451: []string{"America/Sao_Paulo"}, - 55813452: []string{"America/Sao_Paulo"}, - 55813453: []string{"America/Sao_Paulo"}, - 55813454: []string{"America/Sao_Paulo"}, - 55813455: []string{"America/Sao_Paulo"}, - 55813456: []string{"America/Sao_Paulo"}, - 55813457: []string{"America/Sao_Paulo"}, - 55813458: []string{"America/Sao_Paulo"}, - 55813459: []string{"America/Sao_Paulo"}, - 55813461: []string{"America/Sao_Paulo"}, - 55813462: []string{"America/Sao_Paulo"}, - 55813463: []string{"America/Sao_Paulo"}, - 55813464: []string{"America/Sao_Paulo"}, - 55813465: []string{"America/Sao_Paulo"}, - 55813466: []string{"America/Sao_Paulo"}, - 55813467: []string{"America/Sao_Paulo"}, - 55813468: []string{"America/Sao_Paulo"}, - 55813469: []string{"America/Sao_Paulo"}, - 55813471: []string{"America/Sao_Paulo"}, - 55813472: []string{"America/Sao_Paulo"}, - 55813473: []string{"America/Sao_Paulo"}, - 55813474: []string{"America/Sao_Paulo"}, - 55813475: []string{"America/Sao_Paulo"}, - 55813476: []string{"America/Sao_Paulo"}, - 55813477: []string{"America/Sao_Paulo"}, - 55813478: []string{"America/Sao_Paulo"}, - 55813479: []string{"America/Sao_Paulo"}, - 55813481: []string{"America/Sao_Paulo"}, - 55813482: []string{"America/Sao_Paulo"}, - 55813484: []string{"America/Sao_Paulo"}, - 55813486: []string{"America/Sao_Paulo"}, - 55813487: []string{"America/Sao_Paulo"}, - 55813491: []string{"America/Sao_Paulo"}, - 55813492: []string{"America/Sao_Paulo"}, - 55813493: []string{"America/Sao_Paulo"}, - 55813494: []string{"America/Sao_Paulo"}, - 55813495: []string{"America/Sao_Paulo"}, - 55813497: []string{"America/Sao_Paulo"}, - 55813498: []string{"America/Sao_Paulo"}, - 55813499: []string{"America/Sao_Paulo"}, - 55813501: []string{"America/Sao_Paulo"}, - 55813510: []string{"America/Sao_Paulo"}, - 55813512: []string{"America/Sao_Paulo"}, - 55813516: []string{"America/Sao_Paulo"}, - 55813517: []string{"America/Sao_Paulo"}, - 55813518: []string{"America/Sao_Paulo"}, - 55813519: []string{"America/Sao_Paulo"}, - 55813521: []string{"America/Sao_Paulo"}, - 55813522: []string{"America/Sao_Paulo"}, - 55813523: []string{"America/Sao_Paulo"}, - 55813524: []string{"America/Sao_Paulo"}, - 55813525: []string{"America/Sao_Paulo"}, - 55813526: []string{"America/Sao_Paulo"}, - 55813527: []string{"America/Sao_Paulo"}, - 55813533: []string{"America/Sao_Paulo"}, - 55813534: []string{"America/Sao_Paulo"}, - 55813535: []string{"America/Sao_Paulo"}, - 55813536: []string{"America/Sao_Paulo"}, - 55813537: []string{"America/Sao_Paulo"}, - 55813538: []string{"America/Sao_Paulo"}, - 55813541: []string{"America/Sao_Paulo"}, - 55813542: []string{"America/Sao_Paulo"}, - 55813543: []string{"America/Sao_Paulo"}, - 55813544: []string{"America/Sao_Paulo"}, - 55813545: []string{"America/Sao_Paulo"}, - 55813548: []string{"America/Sao_Paulo"}, - 55813551: []string{"America/Sao_Paulo"}, - 55813552: []string{"America/Sao_Paulo"}, - 55813553: []string{"America/Sao_Paulo"}, - 55813559: []string{"America/Sao_Paulo"}, - 55813561: []string{"America/Sao_Paulo"}, - 55813562: []string{"America/Sao_Paulo"}, - 55813563: []string{"America/Sao_Paulo"}, - 55813576: []string{"America/Sao_Paulo"}, - 55813577: []string{"America/Sao_Paulo"}, - 55813581: []string{"America/Sao_Paulo"}, - 55813601: []string{"America/Sao_Paulo"}, - 55813604: []string{"America/Sao_Paulo"}, - 55813607: []string{"America/Sao_Paulo"}, - 55813610: []string{"America/Sao_Paulo"}, - 55813613: []string{"America/Sao_Paulo"}, - 55813616: []string{"America/Sao_Paulo"}, - 55813621: []string{"America/Sao_Paulo"}, - 55813622: []string{"America/Sao_Paulo"}, - 55813624: []string{"America/Sao_Paulo"}, - 55813625: []string{"America/Sao_Paulo"}, - 55813626: []string{"America/Sao_Paulo"}, - 55813627: []string{"America/Sao_Paulo"}, - 55813628: []string{"America/Sao_Paulo"}, - 55813629: []string{"America/Sao_Paulo"}, - 55813631: []string{"America/Sao_Paulo"}, - 55813633: []string{"America/Sao_Paulo"}, - 55813634: []string{"America/Sao_Paulo"}, - 55813635: []string{"America/Sao_Paulo"}, - 55813636: []string{"America/Sao_Paulo"}, - 55813637: []string{"America/Sao_Paulo"}, - 55813638: []string{"America/Sao_Paulo"}, - 55813639: []string{"America/Sao_Paulo"}, - 55813641: []string{"America/Sao_Paulo"}, - 55813642: []string{"America/Sao_Paulo"}, - 55813643: []string{"America/Sao_Paulo"}, - 55813644: []string{"America/Sao_Paulo"}, - 55813645: []string{"America/Sao_Paulo"}, - 55813646: []string{"America/Sao_Paulo"}, - 55813647: []string{"America/Sao_Paulo"}, - 55813648: []string{"America/Sao_Paulo"}, - 55813649: []string{"America/Sao_Paulo"}, - 55813651: []string{"America/Sao_Paulo"}, - 55813652: []string{"America/Sao_Paulo"}, - 55813653: []string{"America/Sao_Paulo"}, - 55813654: []string{"America/Sao_Paulo"}, - 55813655: []string{"America/Sao_Paulo"}, - 55813656: []string{"America/Sao_Paulo"}, - 55813657: []string{"America/Sao_Paulo"}, - 55813658: []string{"America/Sao_Paulo"}, - 55813661: []string{"America/Sao_Paulo"}, - 55813662: []string{"America/Sao_Paulo"}, - 55813671: []string{"America/Sao_Paulo"}, - 55813673: []string{"America/Sao_Paulo"}, - 55813675: []string{"America/Sao_Paulo"}, - 55813676: []string{"America/Sao_Paulo"}, - 55813678: []string{"America/Sao_Paulo"}, - 55813679: []string{"America/Sao_Paulo"}, - 55813681: []string{"America/Sao_Paulo"}, - 55813682: []string{"America/Sao_Paulo"}, - 55813683: []string{"America/Sao_Paulo"}, - 55813684: []string{"America/Sao_Paulo"}, - 55813685: []string{"America/Sao_Paulo"}, - 55813686: []string{"America/Sao_Paulo"}, - 55813687: []string{"America/Sao_Paulo"}, - 55813688: []string{"America/Sao_Paulo"}, - 55813689: []string{"America/Sao_Paulo"}, - 55813691: []string{"America/Sao_Paulo"}, - 55813692: []string{"America/Sao_Paulo"}, - 55813693: []string{"America/Sao_Paulo"}, - 55813694: []string{"America/Sao_Paulo"}, - 55813695: []string{"America/Sao_Paulo"}, - 55813699: []string{"America/Sao_Paulo"}, - 55813701: []string{"America/Sao_Paulo"}, - 55813705: []string{"America/Sao_Paulo"}, - 55813707: []string{"America/Sao_Paulo"}, - 55813708: []string{"America/Sao_Paulo"}, - 55813709: []string{"America/Sao_Paulo"}, - 55813711: []string{"America/Sao_Paulo"}, - 55813712: []string{"America/Sao_Paulo"}, - 55813719: []string{"America/Sao_Paulo"}, - 55813721: []string{"America/Sao_Paulo"}, - 55813722: []string{"America/Sao_Paulo"}, - 55813723: []string{"America/Sao_Paulo"}, - 55813724: []string{"America/Sao_Paulo"}, - 55813725: []string{"America/Sao_Paulo"}, - 55813726: []string{"America/Sao_Paulo"}, - 55813727: []string{"America/Sao_Paulo"}, - 55813728: []string{"America/Sao_Paulo"}, - 55813731: []string{"America/Sao_Paulo"}, - 55813732: []string{"America/Sao_Paulo"}, - 55813733: []string{"America/Sao_Paulo"}, - 55813734: []string{"America/Sao_Paulo"}, - 55813735: []string{"America/Sao_Paulo"}, - 55813736: []string{"America/Sao_Paulo"}, - 55813737: []string{"America/Sao_Paulo"}, - 55813738: []string{"America/Sao_Paulo"}, - 55813739: []string{"America/Sao_Paulo"}, - 55813741: []string{"America/Sao_Paulo"}, - 55813742: []string{"America/Sao_Paulo"}, - 55813743: []string{"America/Sao_Paulo"}, - 55813744: []string{"America/Sao_Paulo"}, - 55813745: []string{"America/Sao_Paulo"}, - 55813746: []string{"America/Sao_Paulo"}, - 55813747: []string{"America/Sao_Paulo"}, - 55813748: []string{"America/Sao_Paulo"}, - 55813751: []string{"America/Sao_Paulo"}, - 55813753: []string{"America/Sao_Paulo"}, - 55813755: []string{"America/Sao_Paulo"}, - 55813757: []string{"America/Sao_Paulo"}, - 55813758: []string{"America/Sao_Paulo"}, - 55813759: []string{"America/Sao_Paulo"}, - 55813761: []string{"America/Sao_Paulo"}, - 55813762: []string{"America/Sao_Paulo"}, - 55813771: []string{"America/Sao_Paulo"}, - 55813797: []string{"America/Sao_Paulo"}, - 55813821: []string{"America/Sao_Paulo"}, - 55813822: []string{"America/Sao_Paulo"}, - 55813823: []string{"America/Sao_Paulo"}, - 55813831: []string{"America/Sao_Paulo"}, - 55813835: []string{"America/Sao_Paulo"}, - 55813861: []string{"America/Sao_Paulo"}, - 55813862: []string{"America/Sao_Paulo"}, - 55813863: []string{"America/Sao_Paulo"}, - 55813869: []string{"America/Sao_Paulo"}, - 55813873: []string{"America/Sao_Paulo"}, - 55813874: []string{"America/Sao_Paulo"}, - 55813877: []string{"America/Sao_Paulo"}, - 55813878: []string{"America/Sao_Paulo"}, - 55813879: []string{"America/Sao_Paulo"}, - 55813887: []string{"America/Sao_Paulo"}, - 55813912: []string{"America/Sao_Paulo"}, - 55813915: []string{"America/Sao_Paulo"}, - 55813972: []string{"America/Sao_Paulo"}, - 55813974: []string{"America/Sao_Paulo"}, - 55814001: []string{"America/Sao_Paulo"}, - 55814002: []string{"America/Sao_Paulo"}, - 55814003: []string{"America/Sao_Paulo"}, - 55814004: []string{"America/Sao_Paulo"}, - 55814007: []string{"America/Sao_Paulo"}, - 55814009: []string{"America/Sao_Paulo"}, - 55814020: []string{"America/Sao_Paulo"}, - 55814042: []string{"America/Sao_Paulo"}, - 55814062: []string{"America/Sao_Paulo"}, - 55814100: []string{"America/Sao_Paulo"}, - 55814101: []string{"America/Sao_Paulo"}, - 55814102: []string{"America/Sao_Paulo"}, - 55814104: []string{"America/Sao_Paulo"}, - 55814105: []string{"America/Sao_Paulo"}, - 55814106: []string{"America/Sao_Paulo"}, - 55814107: []string{"America/Sao_Paulo"}, - 55814108: []string{"America/Sao_Paulo"}, - 55814109: []string{"America/Sao_Paulo"}, - 55814112: []string{"America/Sao_Paulo"}, - 55814115: []string{"America/Sao_Paulo"}, - 55814116: []string{"America/Sao_Paulo"}, - 55814121: []string{"America/Sao_Paulo"}, - 55814123: []string{"America/Sao_Paulo"}, - 55814131: []string{"America/Sao_Paulo"}, - 55814137: []string{"America/Sao_Paulo"}, - 55814141: []string{"America/Sao_Paulo"}, - 55817811: []string{"America/Sao_Paulo"}, - 55817904: []string{"America/Sao_Paulo"}, - 55817908: []string{"America/Sao_Paulo"}, - 55817916: []string{"America/Sao_Paulo"}, - 55819000: []string{"America/Sao_Paulo"}, - 55819710: []string{"America/Sao_Paulo"}, - 55819711: []string{"America/Sao_Paulo"}, - 55819712: []string{"America/Sao_Paulo"}, - 55819730: []string{"America/Sao_Paulo"}, - 55819731: []string{"America/Sao_Paulo"}, - 55819732: []string{"America/Sao_Paulo"}, - 55819790: []string{"America/Sao_Paulo"}, - 55819791: []string{"America/Sao_Paulo"}, - 5581981: []string{"America/Sao_Paulo"}, - 5581982: []string{"America/Sao_Paulo"}, - 55819830: []string{"America/Sao_Paulo"}, - 55819831: []string{"America/Sao_Paulo"}, - 55819832: []string{"America/Sao_Paulo"}, - 55819833: []string{"America/Sao_Paulo"}, - 55819834: []string{"America/Sao_Paulo"}, - 55819835: []string{"America/Sao_Paulo"}, - 55819836: []string{"America/Sao_Paulo"}, - 55819837: []string{"America/Sao_Paulo"}, - 5581984: []string{"America/Sao_Paulo"}, - 5581985: []string{"America/Sao_Paulo"}, - 5581986: []string{"America/Sao_Paulo"}, - 5581987: []string{"America/Sao_Paulo"}, - 5581988: []string{"America/Sao_Paulo"}, - 5581989: []string{"America/Sao_Paulo"}, - 5581991: []string{"America/Sao_Paulo"}, - 5581992: []string{"America/Sao_Paulo"}, - 5581993: []string{"America/Sao_Paulo"}, - 5581994: []string{"America/Sao_Paulo"}, - 5581995: []string{"America/Sao_Paulo"}, - 5581996: []string{"America/Sao_Paulo"}, - 5581997: []string{"America/Sao_Paulo"}, - 5581998: []string{"America/Sao_Paulo"}, - 5581999: []string{"America/Sao_Paulo"}, - 5582: []string{"America/Sao_Paulo"}, - 5583: []string{"America/Sao_Paulo"}, - 5584: []string{"America/Sao_Paulo"}, - 5585: []string{"America/Sao_Paulo"}, - 5586: []string{"America/Sao_Paulo"}, - 5587: []string{"America/Sao_Paulo"}, - 5588: []string{"America/Sao_Paulo"}, - 5589: []string{"America/Sao_Paulo"}, - 5591: []string{"America/Manaus"}, - 55912121: []string{"America/Sao_Paulo"}, - 55912122: []string{"America/Sao_Paulo"}, - 55912123: []string{"America/Sao_Paulo"}, - 55912992: []string{"America/Sao_Paulo"}, - 55913003: []string{"America/Sao_Paulo"}, - 55913004: []string{"America/Sao_Paulo"}, - 55913011: []string{"America/Sao_Paulo"}, - 55913013: []string{"America/Sao_Paulo"}, - 55913014: []string{"America/Sao_Paulo"}, - 55913015: []string{"America/Sao_Paulo"}, - 55913017: []string{"America/Sao_Paulo"}, - 55913018: []string{"America/Sao_Paulo"}, - 55913019: []string{"America/Sao_Paulo"}, - 55913028: []string{"America/Sao_Paulo"}, - 55913031: []string{"America/Sao_Paulo"}, - 55913032: []string{"America/Sao_Paulo"}, - 55913033: []string{"America/Sao_Paulo"}, - 55913038: []string{"America/Sao_Paulo"}, - 55913039: []string{"America/Sao_Paulo"}, - 55913072: []string{"America/Sao_Paulo"}, - 55913073: []string{"America/Sao_Paulo"}, - 55913075: []string{"America/Sao_Paulo"}, - 55913081: []string{"America/Sao_Paulo"}, - 55913082: []string{"America/Sao_Paulo"}, - 55913083: []string{"America/Sao_Paulo"}, - 55913084: []string{"America/Sao_Paulo"}, - 55913085: []string{"America/Sao_Paulo"}, - 55913086: []string{"America/Sao_Paulo"}, - 55913087: []string{"America/Sao_Paulo"}, - 55913088: []string{"America/Sao_Paulo"}, - 55913089: []string{"America/Sao_Paulo"}, - 55913110: []string{"America/Sao_Paulo"}, - 55913115: []string{"America/Sao_Paulo"}, - 55913116: []string{"America/Sao_Paulo"}, - 55913117: []string{"America/Sao_Paulo"}, - 55913118: []string{"America/Sao_Paulo"}, - 55913119: []string{"America/Sao_Paulo"}, - 55913120: []string{"America/Sao_Paulo"}, - 55913121: []string{"America/Sao_Paulo"}, - 55913131: []string{"America/Sao_Paulo"}, - 55913181: []string{"America/Sao_Paulo"}, - 55913182: []string{"America/Sao_Paulo"}, - 55913184: []string{"America/Sao_Paulo"}, - 55913194: []string{"America/Sao_Paulo"}, - 55913199: []string{"America/Sao_Paulo"}, - 55913201: []string{"America/Sao_Paulo"}, - 55913202: []string{"America/Sao_Paulo"}, - 55913204: []string{"America/Sao_Paulo"}, - 55913205: []string{"America/Sao_Paulo"}, - 55913207: []string{"America/Sao_Paulo"}, - 5591321: []string{"America/Sao_Paulo"}, - 55913221: []string{"America/Sao_Paulo"}, - 55913222: []string{"America/Sao_Paulo"}, - 55913223: []string{"America/Sao_Paulo"}, - 55913224: []string{"America/Sao_Paulo"}, - 55913225: []string{"America/Sao_Paulo"}, - 55913226: []string{"America/Sao_Paulo"}, - 55913227: []string{"America/Sao_Paulo"}, - 55913228: []string{"America/Sao_Paulo"}, - 55913229: []string{"America/Sao_Paulo"}, - 5591323: []string{"America/Sao_Paulo"}, - 55913241: []string{"America/Sao_Paulo"}, - 55913242: []string{"America/Sao_Paulo"}, - 55913243: []string{"America/Sao_Paulo"}, - 55913244: []string{"America/Sao_Paulo"}, - 55913245: []string{"America/Sao_Paulo"}, - 55913246: []string{"America/Sao_Paulo"}, - 55913247: []string{"America/Sao_Paulo"}, - 55913248: []string{"America/Sao_Paulo"}, - 55913249: []string{"America/Sao_Paulo"}, - 5591325: []string{"America/Sao_Paulo"}, - 55913261: []string{"America/Sao_Paulo"}, - 55913262: []string{"America/Sao_Paulo"}, - 55913263: []string{"America/Sao_Paulo"}, - 55913264: []string{"America/Sao_Paulo"}, - 55913265: []string{"America/Sao_Paulo"}, - 55913266: []string{"America/Sao_Paulo"}, - 55913267: []string{"America/Sao_Paulo"}, - 55913268: []string{"America/Sao_Paulo"}, - 55913269: []string{"America/Sao_Paulo"}, - 55913271: []string{"America/Sao_Paulo"}, - 55913272: []string{"America/Sao_Paulo"}, - 55913273: []string{"America/Sao_Paulo"}, - 55913274: []string{"America/Sao_Paulo"}, - 55913275: []string{"America/Sao_Paulo"}, - 55913276: []string{"America/Sao_Paulo"}, - 55913277: []string{"America/Sao_Paulo"}, - 55913278: []string{"America/Sao_Paulo"}, - 55913279: []string{"America/Sao_Paulo"}, - 55913281: []string{"America/Sao_Paulo"}, - 55913282: []string{"America/Sao_Paulo"}, - 55913283: []string{"America/Sao_Paulo"}, - 55913284: []string{"America/Sao_Paulo"}, - 55913285: []string{"America/Sao_Paulo"}, - 55913286: []string{"America/Sao_Paulo"}, - 55913287: []string{"America/Sao_Paulo"}, - 55913288: []string{"America/Sao_Paulo"}, - 55913289: []string{"America/Sao_Paulo"}, - 55913292: []string{"America/Sao_Paulo"}, - 55913295: []string{"America/Sao_Paulo"}, - 55913297: []string{"America/Sao_Paulo"}, - 55913298: []string{"America/Sao_Paulo"}, - 55913299: []string{"America/Sao_Paulo"}, - 55913311: []string{"America/Sao_Paulo"}, - 55913321: []string{"America/Sao_Paulo"}, - 55913322: []string{"America/Sao_Paulo"}, - 55913323: []string{"America/Sao_Paulo"}, - 55913342: []string{"America/Sao_Paulo"}, - 55913343: []string{"America/Sao_Paulo"}, - 55913344: []string{"America/Sao_Paulo"}, - 55913345: []string{"America/Sao_Paulo"}, - 55913346: []string{"America/Sao_Paulo"}, - 55913347: []string{"America/Sao_Paulo"}, - 55913348: []string{"America/Sao_Paulo"}, - 55913349: []string{"America/Sao_Paulo"}, - 55913351: []string{"America/Sao_Paulo"}, - 55913352: []string{"America/Sao_Paulo"}, - 55913353: []string{"America/Sao_Paulo"}, - 55913355: []string{"America/Sao_Paulo"}, - 55913366: []string{"America/Sao_Paulo"}, - 55913397: []string{"America/Sao_Paulo"}, - 55913411: []string{"America/Sao_Paulo"}, - 55913412: []string{"America/Sao_Paulo"}, - 55913423: []string{"America/Sao_Paulo"}, - 55913424: []string{"America/Sao_Paulo"}, - 55913425: []string{"America/Sao_Paulo"}, - 55913429: []string{"America/Sao_Paulo"}, - 55913434: []string{"America/Sao_Paulo"}, - 55913441: []string{"America/Sao_Paulo"}, - 55913442: []string{"America/Sao_Paulo"}, - 55913443: []string{"America/Sao_Paulo"}, - 55913444: []string{"America/Sao_Paulo"}, - 55913445: []string{"America/Sao_Paulo"}, - 55913446: []string{"America/Sao_Paulo"}, - 55913447: []string{"America/Sao_Paulo"}, - 55913448: []string{"America/Sao_Paulo"}, - 55913449: []string{"America/Sao_Paulo"}, - 55913456: []string{"America/Sao_Paulo"}, - 55913461: []string{"America/Sao_Paulo"}, - 55913462: []string{"America/Sao_Paulo"}, - 55913464: []string{"America/Sao_Paulo"}, - 55913466: []string{"America/Sao_Paulo"}, - 55913467: []string{"America/Sao_Paulo"}, - 55913468: []string{"America/Sao_Paulo"}, - 55913469: []string{"America/Sao_Paulo"}, - 55913481: []string{"America/Sao_Paulo"}, - 55913482: []string{"America/Sao_Paulo"}, - 55913483: []string{"America/Sao_Paulo"}, - 55913484: []string{"America/Sao_Paulo"}, - 55913485: []string{"America/Sao_Paulo"}, - 55913494: []string{"America/Sao_Paulo"}, - 55913521: []string{"America/Sao_Paulo"}, - 55913528: []string{"America/Sao_Paulo"}, - 55913544: []string{"America/Sao_Paulo"}, - 55913556: []string{"America/Sao_Paulo"}, - 55913605: []string{"America/Sao_Paulo"}, - 55913606: []string{"America/Sao_Paulo"}, - 55913617: []string{"America/Sao_Paulo"}, - 55913621: []string{"America/Sao_Paulo"}, - 55913623: []string{"America/Sao_Paulo"}, - 55913633: []string{"America/Sao_Paulo"}, - 55913636: []string{"America/Sao_Paulo"}, - 55913637: []string{"America/Sao_Paulo"}, - 55913638: []string{"America/Sao_Paulo"}, - 55913646: []string{"America/Sao_Paulo"}, - 55913656: []string{"America/Sao_Paulo"}, - 55913658: []string{"America/Sao_Paulo"}, - 55913661: []string{"America/Sao_Paulo"}, - 55913662: []string{"America/Sao_Paulo"}, - 55913665: []string{"America/Sao_Paulo"}, - 55913667: []string{"America/Sao_Paulo"}, - 55913692: []string{"America/Sao_Paulo"}, - 55913694: []string{"America/Sao_Paulo"}, - 55913711: []string{"America/Sao_Paulo"}, - 55913712: []string{"America/Sao_Paulo"}, - 55913721: []string{"America/Sao_Paulo"}, - 55913722: []string{"America/Sao_Paulo"}, - 55913723: []string{"America/Sao_Paulo"}, - 55913724: []string{"America/Sao_Paulo"}, - 55913725: []string{"America/Sao_Paulo"}, - 55913726: []string{"America/Sao_Paulo"}, - 55913727: []string{"America/Sao_Paulo"}, - 55913728: []string{"America/Sao_Paulo"}, - 55913729: []string{"America/Sao_Paulo"}, - 55913731: []string{"America/Sao_Paulo"}, - 55913732: []string{"America/Sao_Paulo"}, - 55913733: []string{"America/Sao_Paulo"}, - 55913734: []string{"America/Sao_Paulo"}, - 55913738: []string{"America/Sao_Paulo"}, - 55913739: []string{"America/Sao_Paulo"}, - 55913741: []string{"America/Sao_Paulo"}, - 55913744: []string{"America/Sao_Paulo"}, - 55913746: []string{"America/Sao_Paulo"}, - 55913751: []string{"America/Sao_Paulo"}, - 55913752: []string{"America/Sao_Paulo"}, - 55913753: []string{"America/Sao_Paulo"}, - 55913754: []string{"America/Sao_Paulo"}, - 55913755: []string{"America/Sao_Paulo"}, - 55913756: []string{"America/Sao_Paulo"}, - 55913758: []string{"America/Sao_Paulo"}, - 55913764: []string{"America/Sao_Paulo"}, - 55913765: []string{"America/Sao_Paulo"}, - 55913767: []string{"America/Sao_Paulo"}, - 55913771: []string{"America/Sao_Paulo"}, - 55913772: []string{"America/Sao_Paulo"}, - 55913774: []string{"America/Sao_Paulo"}, - 55913775: []string{"America/Sao_Paulo"}, - 55913776: []string{"America/Sao_Paulo"}, - 55913777: []string{"America/Sao_Paulo"}, - 55913781: []string{"America/Sao_Paulo"}, - 55913783: []string{"America/Sao_Paulo"}, - 55913784: []string{"America/Sao_Paulo"}, - 55913795: []string{"America/Sao_Paulo"}, - 55913796: []string{"America/Sao_Paulo"}, - 55913798: []string{"America/Sao_Paulo"}, - 55913802: []string{"America/Sao_Paulo"}, - 55913803: []string{"America/Sao_Paulo"}, - 55913809: []string{"America/Sao_Paulo"}, - 55913811: []string{"America/Sao_Paulo"}, - 55913812: []string{"America/Sao_Paulo"}, - 55913817: []string{"America/Sao_Paulo"}, - 55913821: []string{"America/Sao_Paulo"}, - 55913822: []string{"America/Sao_Paulo"}, - 55913823: []string{"America/Sao_Paulo"}, - 55913829: []string{"America/Sao_Paulo"}, - 55913854: []string{"America/Sao_Paulo"}, - 55913859: []string{"America/Sao_Paulo"}, - 55914002: []string{"America/Sao_Paulo"}, - 55914003: []string{"America/Sao_Paulo"}, - 55914004: []string{"America/Sao_Paulo"}, - 55914005: []string{"America/Sao_Paulo"}, - 55914006: []string{"America/Sao_Paulo"}, - 55914008: []string{"America/Sao_Paulo"}, - 55914009: []string{"America/Sao_Paulo"}, - 55914040: []string{"America/Sao_Paulo"}, - 55914042: []string{"America/Sao_Paulo"}, - 55914103: []string{"America/Sao_Paulo"}, - 55914104: []string{"America/Sao_Paulo"}, - 55914107: []string{"America/Sao_Paulo"}, - 55914141: []string{"America/Sao_Paulo"}, - 55914400: []string{"America/Sao_Paulo"}, - 55919801: []string{"America/Sao_Paulo"}, - 55919802: []string{"America/Sao_Paulo"}, - 55919803: []string{"America/Sao_Paulo"}, - 55919804: []string{"America/Sao_Paulo"}, - 55919805: []string{"America/Sao_Paulo"}, - 55919806: []string{"America/Sao_Paulo"}, - 55919807: []string{"America/Sao_Paulo"}, - 55919808: []string{"America/Sao_Paulo"}, - 55919809: []string{"America/Sao_Paulo"}, - 5591981: []string{"America/Sao_Paulo"}, - 5591982: []string{"America/Sao_Paulo"}, - 5591983: []string{"America/Sao_Paulo"}, - 5591984: []string{"America/Sao_Paulo"}, - 55919850: []string{"America/Sao_Paulo"}, - 55919851: []string{"America/Sao_Paulo"}, - 55919852: []string{"America/Sao_Paulo"}, - 55919853: []string{"America/Sao_Paulo"}, - 55919854: []string{"America/Sao_Paulo"}, - 55919856: []string{"America/Sao_Paulo"}, - 55919870: []string{"America/Sao_Paulo"}, - 55919871: []string{"America/Sao_Paulo"}, - 55919872: []string{"America/Sao_Paulo"}, - 55919873: []string{"America/Sao_Paulo"}, - 55919874: []string{"America/Sao_Paulo"}, - 55919875: []string{"America/Sao_Paulo"}, - 55919876: []string{"America/Sao_Paulo"}, - 5591988: []string{"America/Sao_Paulo"}, - 5591989: []string{"America/Sao_Paulo"}, - 5591991: []string{"America/Sao_Paulo"}, - 5591992: []string{"America/Sao_Paulo"}, - 5591993: []string{"America/Sao_Paulo"}, - 55919960: []string{"America/Sao_Paulo"}, - 55919961: []string{"America/Sao_Paulo"}, - 55919962: []string{"America/Sao_Paulo"}, - 55919963: []string{"America/Sao_Paulo"}, - 55919964: []string{"America/Sao_Paulo"}, - 55919980: []string{"America/Sao_Paulo"}, - 55919981: []string{"America/Sao_Paulo"}, - 55919982: []string{"America/Sao_Paulo"}, - 55919983: []string{"America/Sao_Paulo"}, - 55919984: []string{"America/Sao_Paulo"}, - 55919990: []string{"America/Sao_Paulo"}, - 55919991: []string{"America/Sao_Paulo"}, - 55919992: []string{"America/Sao_Paulo"}, - 55919993: []string{"America/Sao_Paulo"}, - 55919994: []string{"America/Sao_Paulo"}, - 55919996: []string{"America/Sao_Paulo"}, - 55919997: []string{"America/Sao_Paulo"}, - 55919998: []string{"America/Sao_Paulo"}, - 55919999: []string{"America/Sao_Paulo"}, - 5592: []string{"America/Manaus"}, - 55925009: []string{"America/Sao_Paulo"}, - 5593: []string{"America/Manaus"}, - 55932101: []string{"America/Sao_Paulo"}, - 55932122: []string{"America/Sao_Paulo"}, - 55933016: []string{"America/Sao_Paulo"}, - 55933017: []string{"America/Sao_Paulo"}, - 55933062: []string{"America/Sao_Paulo"}, - 55933063: []string{"America/Sao_Paulo"}, - 55933064: []string{"America/Sao_Paulo"}, - 55933067: []string{"America/Sao_Paulo"}, - 55933222: []string{"America/Sao_Paulo"}, - 55933502: []string{"America/Sao_Paulo"}, - 55933505: []string{"America/Sao_Paulo"}, - 55933512: []string{"America/Sao_Paulo"}, - 55933514: []string{"America/Sao_Paulo"}, - 55933515: []string{"America/Sao_Paulo"}, - 55933517: []string{"America/Sao_Paulo"}, - 55933518: []string{"America/Sao_Paulo"}, - 55933521: []string{"America/Sao_Paulo"}, - 55933522: []string{"America/Sao_Paulo"}, - 55933523: []string{"America/Sao_Paulo"}, - 55933524: []string{"America/Sao_Paulo"}, - 55933526: []string{"America/Sao_Paulo"}, - 55933527: []string{"America/Sao_Paulo"}, - 55933528: []string{"America/Sao_Paulo"}, - 55933529: []string{"America/Sao_Paulo"}, - 55933531: []string{"America/Sao_Paulo"}, - 55933532: []string{"America/Sao_Paulo"}, - 55933533: []string{"America/Sao_Paulo"}, - 55933534: []string{"America/Sao_Paulo"}, - 55933536: []string{"America/Sao_Paulo"}, - 55933537: []string{"America/Sao_Paulo"}, - 55933538: []string{"America/Sao_Paulo"}, - 55933541: []string{"America/Sao_Paulo"}, - 55933542: []string{"America/Sao_Paulo"}, - 55933543: []string{"America/Sao_Paulo"}, - 55933544: []string{"America/Sao_Paulo"}, - 55933547: []string{"America/Sao_Paulo"}, - 55933549: []string{"America/Sao_Paulo"}, - 55933552: []string{"America/Sao_Paulo"}, - 55933557: []string{"America/Sao_Paulo"}, - 55933558: []string{"America/Sao_Paulo"}, - 55933559: []string{"America/Sao_Paulo"}, - 55933563: []string{"America/Sao_Paulo"}, - 55933574: []string{"America/Sao_Paulo"}, - 55933582: []string{"America/Sao_Paulo"}, - 55933589: []string{"America/Sao_Paulo"}, - 55933593: []string{"America/Sao_Paulo"}, - 55933596: []string{"America/Sao_Paulo"}, - 55933597: []string{"America/Sao_Paulo"}, - 55933598: []string{"America/Sao_Paulo"}, - 55933603: []string{"America/Sao_Paulo"}, - 55933735: []string{"America/Sao_Paulo"}, - 55933736: []string{"America/Sao_Paulo"}, - 55933737: []string{"America/Sao_Paulo"}, - 55933793: []string{"America/Sao_Paulo"}, - 55939810: []string{"America/Sao_Paulo"}, - 55939811: []string{"America/Sao_Paulo"}, - 55939812: []string{"America/Sao_Paulo"}, - 55939813: []string{"America/Sao_Paulo"}, - 55939840: []string{"America/Sao_Paulo"}, - 55939841: []string{"America/Sao_Paulo"}, - 55939880: []string{"America/Sao_Paulo"}, - 55939881: []string{"America/Sao_Paulo"}, - 5593991: []string{"America/Sao_Paulo"}, - 55939920: []string{"America/Sao_Paulo"}, - 55939921: []string{"America/Sao_Paulo"}, - 55939922: []string{"America/Sao_Paulo"}, - 55939923: []string{"America/Sao_Paulo"}, - 55939924: []string{"America/Sao_Paulo"}, - 55939965: []string{"America/Sao_Paulo"}, - 55939990: []string{"America/Sao_Paulo"}, - 55939995: []string{"America/Sao_Paulo"}, - 55939997: []string{"America/Sao_Paulo"}, - 5594: []string{"America/Manaus"}, - 55942101: []string{"America/Sao_Paulo"}, - 55942103: []string{"America/Sao_Paulo"}, - 55943012: []string{"America/Sao_Paulo"}, - 55943013: []string{"America/Sao_Paulo"}, - 55943016: []string{"America/Sao_Paulo"}, - 55943018: []string{"America/Sao_Paulo"}, - 55943222: []string{"America/Sao_Paulo"}, - 55943301: []string{"America/Sao_Paulo"}, - 55943305: []string{"America/Sao_Paulo"}, - 55943309: []string{"America/Sao_Paulo"}, - 55943311: []string{"America/Sao_Paulo"}, - 55943312: []string{"America/Sao_Paulo"}, - 55943314: []string{"America/Sao_Paulo"}, - 55943315: []string{"America/Sao_Paulo"}, - 55943319: []string{"America/Sao_Paulo"}, - 55943321: []string{"America/Sao_Paulo"}, - 55943322: []string{"America/Sao_Paulo"}, - 55943323: []string{"America/Sao_Paulo"}, - 55943324: []string{"America/Sao_Paulo"}, - 55943326: []string{"America/Sao_Paulo"}, - 55943327: []string{"America/Sao_Paulo"}, - 55943328: []string{"America/Sao_Paulo"}, - 55943331: []string{"America/Sao_Paulo"}, - 55943332: []string{"America/Sao_Paulo"}, - 55943333: []string{"America/Sao_Paulo"}, - 55943335: []string{"America/Sao_Paulo"}, - 55943337: []string{"America/Sao_Paulo"}, - 55943341: []string{"America/Sao_Paulo"}, - 55943342: []string{"America/Sao_Paulo"}, - 55943344: []string{"America/Sao_Paulo"}, - 55943345: []string{"America/Sao_Paulo"}, - 55943346: []string{"America/Sao_Paulo"}, - 55943347: []string{"America/Sao_Paulo"}, - 55943348: []string{"America/Sao_Paulo"}, - 55943351: []string{"America/Sao_Paulo"}, - 55943352: []string{"America/Sao_Paulo"}, - 55943353: []string{"America/Sao_Paulo"}, - 55943355: []string{"America/Sao_Paulo"}, - 55943356: []string{"America/Sao_Paulo"}, - 55943358: []string{"America/Sao_Paulo"}, - 55943364: []string{"America/Sao_Paulo"}, - 55943365: []string{"America/Sao_Paulo"}, - 55943366: []string{"America/Sao_Paulo"}, - 55943369: []string{"America/Sao_Paulo"}, - 55943379: []string{"America/Sao_Paulo"}, - 55943382: []string{"America/Sao_Paulo"}, - 55943385: []string{"America/Sao_Paulo"}, - 55943386: []string{"America/Sao_Paulo"}, - 55943392: []string{"America/Sao_Paulo"}, - 55943421: []string{"America/Sao_Paulo"}, - 55943422: []string{"America/Sao_Paulo"}, - 55943424: []string{"America/Sao_Paulo"}, - 55943426: []string{"America/Sao_Paulo"}, - 55943427: []string{"America/Sao_Paulo"}, - 55943428: []string{"America/Sao_Paulo"}, - 55943431: []string{"America/Sao_Paulo"}, - 55943432: []string{"America/Sao_Paulo"}, - 55943433: []string{"America/Sao_Paulo"}, - 55943434: []string{"America/Sao_Paulo"}, - 55943435: []string{"America/Sao_Paulo"}, - 55943491: []string{"America/Sao_Paulo"}, - 55943778: []string{"America/Sao_Paulo"}, - 55943779: []string{"America/Sao_Paulo"}, - 55943785: []string{"America/Sao_Paulo"}, - 55943786: []string{"America/Sao_Paulo"}, - 55943787: []string{"America/Sao_Paulo"}, - 5594981: []string{"America/Sao_Paulo"}, - 55949840: []string{"America/Sao_Paulo"}, - 55949841: []string{"America/Sao_Paulo"}, - 55949842: []string{"America/Sao_Paulo"}, - 55949880: []string{"America/Sao_Paulo"}, - 55949881: []string{"America/Sao_Paulo"}, - 5594991: []string{"America/Sao_Paulo"}, - 5594992: []string{"America/Sao_Paulo"}, - 55949930: []string{"America/Sao_Paulo"}, - 55949966: []string{"America/Sao_Paulo"}, - 55949990: []string{"America/Sao_Paulo"}, - 55949995: []string{"America/Sao_Paulo"}, - 55949997: []string{"America/Sao_Paulo"}, - 5595: []string{"America/Manaus"}, - 5596: []string{"America/Sao_Paulo"}, - 5597: []string{"America/Manaus"}, - 5598: []string{"America/Sao_Paulo"}, - 5599: []string{"America/Sao_Paulo"}, - 56: []string{ - "America/Santiago", "Pacific/Easter", - }, - 562: []string{"America/Santiago"}, - 5632: []string{"Pacific/Easter"}, - 5633: []string{"America/Santiago"}, - 5634: []string{"America/Santiago"}, - 5635: []string{"America/Santiago"}, - 5641: []string{"America/Santiago"}, - 5642: []string{"America/Santiago"}, - 5643: []string{"America/Santiago"}, - 5645: []string{"America/Santiago"}, - 5651: []string{"America/Santiago"}, - 5652: []string{"America/Santiago"}, - 5653: []string{"America/Santiago"}, - 5655: []string{"America/Santiago"}, - 5657: []string{"America/Santiago"}, - 5658: []string{"America/Santiago"}, - 5663: []string{"America/Santiago"}, - 5664: []string{"America/Santiago"}, - 5665: []string{"America/Santiago"}, - 5667: []string{"America/Santiago"}, - 5671: []string{"America/Santiago"}, - 5672: []string{"America/Santiago"}, - 5673: []string{"America/Santiago"}, - 5675: []string{"America/Santiago"}, - 569: []string{"America/Santiago"}, - 57: []string{"America/Bogota"}, - 58: []string{"America/Caracas"}, - 590: []string{ - "America/Guadeloupe", "America/Halifax", "America/Marigot", - }, - 590590: []string{"America/Guadeloupe"}, - 591: []string{"America/La_Paz"}, - 592: []string{"America/Guyana"}, - 593: []string{ - "America/Guayaquil", "Pacific/Galapagos", - }, - 5932: []string{"America/Guayaquil"}, - 5933: []string{"America/Guayaquil"}, - 5934: []string{"America/Guayaquil"}, - 5935: []string{"America/Guayaquil"}, - 5936: []string{"America/Guayaquil"}, - 5937: []string{"America/Guayaquil"}, - 594: []string{"America/Cayenne"}, - 595: []string{"America/Asuncion"}, - 596: []string{"America/Martinique"}, - 597: []string{"America/Paramaribo"}, - 598: []string{"America/Montevideo"}, - 599: []string{ - "America/Curacao", "America/Kralendijk", - }, - 599318: []string{"America/Kralendijk"}, - 599416: []string{"America/Kralendijk"}, - 5997: []string{"America/Kralendijk"}, - 5999: []string{"America/Curacao"}, - 60: []string{"Asia/Kuching"}, - 61: []string{ - "Antarctica/Macquarie", "Australia/Adelaide", "Australia/Eucla", "Australia/Lord_Howe", "Australia/Perth", - "Australia/Sydney", "Indian/Christmas", "Indian/Cocos", - }, - 612: []string{"Australia/Sydney"}, - 613: []string{"Australia/Sydney"}, - 617: []string{"Australia/Sydney"}, - 618: []string{ - "Australia/Adelaide", "Australia/Perth", - }, - 62: []string{ - "Asia/Jakarta", "Asia/Jayapura", "Asia/Makassar", - }, - 6221: []string{"Asia/Jakarta"}, - 6222: []string{"Asia/Jakarta"}, - 62231: []string{"Asia/Jakarta"}, - 62232: []string{"Asia/Jakarta"}, - 62233: []string{"Asia/Jakarta"}, - 62234: []string{"Asia/Jakarta"}, - 6224: []string{"Asia/Jakarta"}, - 62251: []string{"Asia/Jakarta"}, - 62252: []string{"Asia/Jakarta"}, - 62253: []string{"Asia/Jakarta"}, - 62254: []string{"Asia/Jakarta"}, - 62260: []string{"Asia/Jakarta"}, - 62261: []string{"Asia/Jakarta"}, - 62262: []string{"Asia/Jakarta"}, - 62263: []string{"Asia/Jakarta"}, - 62264: []string{"Asia/Jakarta"}, - 62265: []string{"Asia/Jakarta"}, - 62266: []string{"Asia/Jakarta"}, - 62267: []string{"Asia/Jakarta"}, - 62268: []string{"Asia/Jakarta"}, - 62271: []string{"Asia/Jakarta"}, - 62272: []string{"Asia/Jakarta"}, - 62273: []string{"Asia/Jakarta"}, - 62274: []string{"Asia/Jakarta"}, - 62275: []string{"Asia/Jakarta"}, - 62276: []string{"Asia/Jakarta"}, - 6228: []string{"Asia/Jakarta"}, - 62291: []string{"Asia/Jakarta"}, - 62292: []string{"Asia/Jakarta"}, - 62293: []string{"Asia/Jakarta"}, - 62294: []string{"Asia/Jakarta"}, - 62295: []string{"Asia/Jakarta"}, - 62296: []string{"Asia/Jakarta"}, - 62297: []string{"Asia/Jakarta"}, - 62298: []string{"Asia/Jakarta"}, - 6231: []string{"Asia/Jakarta"}, - 62321: []string{"Asia/Jakarta"}, - 62322: []string{"Asia/Jakarta"}, - 62323: []string{"Asia/Jakarta"}, - 62324: []string{"Asia/Jakarta"}, - 62325: []string{"Asia/Jakarta"}, - 62326: []string{"Asia/Jakarta"}, - 62327: []string{"Asia/Jakarta"}, - 62328: []string{"Asia/Jakarta"}, - 62331: []string{"Asia/Jakarta"}, - 62332: []string{"Asia/Jakarta"}, - 62333: []string{"Asia/Jakarta"}, - 62334: []string{"Asia/Jakarta"}, - 62335: []string{"Asia/Jakarta"}, - 62336: []string{"Asia/Jakarta"}, - 62338: []string{"Asia/Jakarta"}, - 62341: []string{"Asia/Jakarta"}, - 62342: []string{"Asia/Jakarta"}, - 62343: []string{"Asia/Jakarta"}, - 62351: []string{"Asia/Jakarta"}, - 62352: []string{"Asia/Jakarta"}, - 62353: []string{"Asia/Jakarta"}, - 62354: []string{"Asia/Jakarta"}, - 62355: []string{"Asia/Jakarta"}, - 62356: []string{"Asia/Jakarta"}, - 62357: []string{"Asia/Jakarta"}, - 62358: []string{"Asia/Jakarta"}, - 62361: []string{"Asia/Makassar"}, - 62362: []string{"Asia/Makassar"}, - 62363: []string{"Asia/Makassar"}, - 62365: []string{"Asia/Makassar"}, - 62366: []string{"Asia/Makassar"}, - 62368: []string{"Asia/Makassar"}, - 62370: []string{"Asia/Makassar"}, - 62371: []string{"Asia/Makassar"}, - 62372: []string{"Asia/Makassar"}, - 62373: []string{"Asia/Makassar"}, - 62374: []string{"Asia/Makassar"}, - 62376: []string{"Asia/Makassar"}, - 6238: []string{"Asia/Makassar"}, - 62401: []string{"Asia/Makassar"}, - 62402: []string{"Asia/Makassar"}, - 62403: []string{ - "Asia/Jayapura", "Asia/Makassar", - }, - 62404: []string{"Asia/Makassar"}, - 62405: []string{"Asia/Makassar"}, - 62408: []string{"Asia/Makassar"}, - 62409: []string{"Asia/Makassar"}, - 62410: []string{"Asia/Makassar"}, - 62411: []string{"Asia/Makassar"}, - 62413: []string{"Asia/Makassar"}, - 62414: []string{"Asia/Makassar"}, - 62417: []string{"Asia/Makassar"}, - 62418: []string{"Asia/Makassar"}, - 62419: []string{"Asia/Makassar"}, - 62420: []string{"Asia/Makassar"}, - 62421: []string{"Asia/Makassar"}, - 62422: []string{"Asia/Makassar"}, - 62423: []string{"Asia/Makassar"}, - 62426: []string{"Asia/Makassar"}, - 62427: []string{"Asia/Makassar"}, - 62428: []string{"Asia/Makassar"}, - 62430: []string{"Asia/Makassar"}, - 62431: []string{"Asia/Makassar"}, - 62432: []string{"Asia/Makassar"}, - 62434: []string{"Asia/Makassar"}, - 62435: []string{"Asia/Makassar"}, - 62436: []string{"Asia/Makassar"}, - 62438: []string{"Asia/Makassar"}, - 62443: []string{"Asia/Makassar"}, - 62451: []string{"Asia/Makassar"}, - 62452: []string{"Asia/Makassar"}, - 62453: []string{"Asia/Makassar"}, - 62457: []string{"Asia/Makassar"}, - 62458: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62461: []string{"Asia/Makassar"}, - 62462: []string{"Asia/Makassar"}, - 62463: []string{"Asia/Makassar"}, - 62464: []string{"Asia/Makassar"}, - 62465: []string{"Asia/Makassar"}, - 62471: []string{"Asia/Makassar"}, - 62473: []string{"Asia/Makassar"}, - 62474: []string{"Asia/Makassar"}, - 62481: []string{"Asia/Makassar"}, - 62482: []string{"Asia/Makassar"}, - 62484: []string{"Asia/Makassar"}, - 62485: []string{"Asia/Makassar"}, - 62511: []string{"Asia/Makassar"}, - 62512: []string{"Asia/Makassar"}, - 62513: []string{"Asia/Jakarta"}, - 62515: []string{"Asia/Jakarta"}, - 62516: []string{"Asia/Jakarta"}, - 62517: []string{"Asia/Makassar"}, - 62518: []string{"Asia/Makassar"}, - 62519: []string{"Asia/Jakarta"}, - 62522: []string{"Asia/Jakarta"}, - 62525: []string{"Asia/Jakarta"}, - 62526: []string{"Asia/Makassar"}, - 62527: []string{"Asia/Makassar"}, - 62528: []string{"Asia/Jakarta"}, - 62531: []string{"Asia/Jakarta"}, - 62532: []string{"Asia/Jakarta"}, - 62534: []string{"Asia/Jakarta"}, - 62535: []string{"Asia/Jakarta"}, - 62536: []string{"Asia/Jakarta"}, - 62537: []string{"Asia/Jakarta"}, - 62538: []string{"Asia/Jakarta"}, - 62539: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62541: []string{"Asia/Makassar"}, - 62542: []string{"Asia/Makassar"}, - 62543: []string{"Asia/Makassar"}, - 62545: []string{"Asia/Makassar"}, - 62548: []string{"Asia/Makassar"}, - 62549: []string{"Asia/Makassar"}, - 62551: []string{"Asia/Makassar"}, - 62552: []string{"Asia/Makassar"}, - 62553: []string{"Asia/Makassar"}, - 62554: []string{"Asia/Makassar"}, - 62556: []string{"Asia/Makassar"}, - 62561: []string{"Asia/Jakarta"}, - 62562: []string{"Asia/Jakarta"}, - 62563: []string{"Asia/Jakarta"}, - 62564: []string{"Asia/Jakarta"}, - 62565: []string{"Asia/Jakarta"}, - 62566: []string{"Asia/Jakarta"}, - 62567: []string{"Asia/Jakarta"}, - 62568: []string{"Asia/Jakarta"}, - 6261: []string{"Asia/Jakarta"}, - 6262: []string{"Asia/Jakarta"}, - 62631: []string{"Asia/Jakarta"}, - 62632: []string{"Asia/Jakarta"}, - 62633: []string{"Asia/Jakarta"}, - 62634: []string{"Asia/Jakarta"}, - 62635: []string{"Asia/Jakarta"}, - 62636: []string{"Asia/Jakarta"}, - 62639: []string{"Asia/Jakarta"}, - 62641: []string{"Asia/Jakarta"}, - 62642: []string{"Asia/Jakarta"}, - 62643: []string{"Asia/Jakarta"}, - 62644: []string{"Asia/Jakarta"}, - 62645: []string{"Asia/Jakarta"}, - 62646: []string{"Asia/Jakarta"}, - 6265: []string{"Asia/Jakarta"}, - 62702: []string{"Asia/Jakarta"}, - 62711: []string{"Asia/Jakarta"}, - 62712: []string{"Asia/Jakarta"}, - 62713: []string{"Asia/Jakarta"}, - 62714: []string{"Asia/Jakarta"}, - 62715: []string{"Asia/Jakarta"}, - 62716: []string{"Asia/Jakarta"}, - 62717: []string{"Asia/Jakarta"}, - 62718: []string{"Asia/Jakarta"}, - 62719: []string{"Asia/Jakarta"}, - 62721: []string{"Asia/Jakarta"}, - 62722: []string{"Asia/Jakarta"}, - 62723: []string{"Asia/Jakarta"}, - 62724: []string{"Asia/Jakarta"}, - 62725: []string{"Asia/Jakarta"}, - 62726: []string{"Asia/Jakarta"}, - 62727: []string{"Asia/Jakarta"}, - 62728: []string{"Asia/Jakarta"}, - 62729: []string{"Asia/Jakarta"}, - 6273: []string{"Asia/Jakarta"}, - 62741: []string{"Asia/Jakarta"}, - 62742: []string{"Asia/Jakarta"}, - 62743: []string{"Asia/Jakarta"}, - 62744: []string{"Asia/Jakarta"}, - 62745: []string{"Asia/Jakarta"}, - 62746: []string{"Asia/Jakarta"}, - 62747: []string{"Asia/Jakarta"}, - 62748: []string{"Asia/Jakarta"}, - 62751: []string{"Asia/Jakarta"}, - 62752: []string{"Asia/Jakarta"}, - 62753: []string{"Asia/Jakarta"}, - 62754: []string{"Asia/Jakarta"}, - 62755: []string{"Asia/Jakarta"}, - 62756: []string{"Asia/Jakarta"}, - 62757: []string{"Asia/Jakarta"}, - 62758: []string{"Asia/Jakarta"}, - 62759: []string{"Asia/Jakarta"}, - 6276: []string{"Asia/Jakarta"}, - 62770: []string{"Asia/Jakarta"}, - 62771: []string{"Asia/Jakarta"}, - 62772: []string{"Asia/Jakarta"}, - 62773: []string{"Asia/Jakarta"}, - 62776: []string{"Asia/Jakarta"}, - 62777: []string{"Asia/Jakarta"}, - 62778: []string{"Asia/Jakarta"}, - 62779: []string{"Asia/Jakarta"}, - 62810: []string{"Asia/Jakarta"}, - 62811: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62812: []string{"Asia/Jakarta"}, - 62813: []string{"Asia/Jakarta"}, - 62814: []string{"Asia/Jakarta"}, - 62815: []string{"Asia/Jakarta"}, - 62816: []string{"Asia/Jakarta"}, - 62817: []string{"Asia/Jakarta"}, - 62818: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62819: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62820: []string{"Asia/Jakarta"}, - 62821: []string{"Asia/Jakarta"}, - 62822: []string{"Asia/Jakarta"}, - 62823: []string{"Asia/Jakarta"}, - 62824: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62825: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62826: []string{"Asia/Jakarta"}, - 62827: []string{"Asia/Jakarta"}, - 62828: []string{"Asia/Jakarta"}, - 62829: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62830: []string{"Asia/Jakarta"}, - 62831: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62832: []string{"Asia/Jakarta"}, - 62833: []string{"Asia/Jakarta"}, - 62834: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62835: []string{"Asia/Jakarta"}, - 62836: []string{"Asia/Jakarta"}, - 62837: []string{"Asia/Jakarta"}, - 62838: []string{"Asia/Jakarta"}, - 62839: []string{"Asia/Jakarta"}, - 62850: []string{"Asia/Jakarta"}, - 62851: []string{"Asia/Jakarta"}, - 62852: []string{"Asia/Jakarta"}, - 62853: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62854: []string{"Asia/Jakarta"}, - 62855: []string{"Asia/Jakarta"}, - 62856: []string{"Asia/Jakarta"}, - 62857: []string{"Asia/Jakarta"}, - 62858: []string{"Asia/Jakarta"}, - 62859: []string{"Asia/Jakarta"}, - 62860: []string{"Asia/Jakarta"}, - 62861: []string{"Asia/Jakarta"}, - 62862: []string{"Asia/Jakarta"}, - 62863: []string{"Asia/Jakarta"}, - 62864: []string{"Asia/Jakarta"}, - 62865: []string{"Asia/Jakarta"}, - 62866: []string{"Asia/Jakarta"}, - 62867: []string{"Asia/Jakarta"}, - 62868: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62869: []string{"Asia/Jakarta"}, - 62870: []string{"Asia/Jakarta"}, - 62871: []string{"Asia/Jakarta"}, - 62872: []string{"Asia/Jakarta"}, - 62873: []string{"Asia/Jakarta"}, - 62874: []string{"Asia/Jakarta"}, - 62875: []string{"Asia/Jakarta"}, - 62876: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62877: []string{"Asia/Jakarta"}, - 62878: []string{"Asia/Jakarta"}, - 62879: []string{"Asia/Jakarta"}, - 62880: []string{"Asia/Jakarta"}, - 62881: []string{"Asia/Jakarta"}, - 62882: []string{"Asia/Jakarta"}, - 62883: []string{"Asia/Jakarta"}, - 62884: []string{"Asia/Jakarta"}, - 62885: []string{"Asia/Jakarta"}, - 62886: []string{"Asia/Jakarta"}, - 62887: []string{ - "Asia/Jakarta", "Asia/Makassar", - }, - 62888: []string{"Asia/Jakarta"}, - 62889: []string{"Asia/Jakarta"}, - 6289: []string{"Asia/Jakarta"}, - 62901: []string{"Asia/Jayapura"}, - 62902: []string{"Asia/Jayapura"}, - 62910: []string{"Asia/Jayapura"}, - 62911: []string{"Asia/Jayapura"}, - 62913: []string{"Asia/Jayapura"}, - 62914: []string{"Asia/Jayapura"}, - 62915: []string{ - "Asia/Jakarta", "Asia/Jayapura", - }, - 62916: []string{"Asia/Jayapura"}, - 62917: []string{"Asia/Jayapura"}, - 62918: []string{"Asia/Jayapura"}, - 62920: []string{ - "Asia/Jakarta", "Asia/Jayapura", - }, - 62921: []string{"Asia/Jayapura"}, - 62922: []string{"Asia/Jayapura"}, - 62923: []string{"Asia/Jayapura"}, - 62924: []string{"Asia/Jayapura"}, - 62927: []string{"Asia/Jayapura"}, - 62929: []string{"Asia/Jayapura"}, - 62951: []string{"Asia/Jayapura"}, - 62952: []string{"Asia/Jayapura"}, - 62955: []string{"Asia/Jayapura"}, - 62956: []string{"Asia/Jayapura"}, - 62957: []string{"Asia/Jayapura"}, - 62958: []string{"Asia/Jakarta"}, - 62962: []string{"Asia/Jayapura"}, - 62963: []string{"Asia/Jakarta"}, - 62966: []string{"Asia/Jayapura"}, - 62967: []string{"Asia/Jayapura"}, - 62969: []string{"Asia/Jayapura"}, - 62971: []string{"Asia/Jayapura"}, - 62975: []string{ - "Asia/Jakarta", "Asia/Jayapura", - }, - 62979: []string{"Asia/Jakarta"}, - 62980: []string{"Asia/Jayapura"}, - 62981: []string{"Asia/Jayapura"}, - 62983: []string{"Asia/Jayapura"}, - 62984: []string{"Asia/Jayapura"}, - 62986: []string{"Asia/Jayapura"}, - 63: []string{"Asia/Manila"}, - 64: []string{ - "Pacific/Auckland", "Pacific/Chatham", - }, - 643: []string{"Pacific/Auckland"}, - 643305: []string{"Pacific/Chatham"}, - 644: []string{"Pacific/Auckland"}, - 646: []string{"Pacific/Auckland"}, - 647: []string{"Pacific/Auckland"}, - 649: []string{"Pacific/Auckland"}, - 65: []string{"Asia/Singapore"}, - 66: []string{"Asia/Bangkok"}, - 670: []string{"Asia/Dili"}, - 672: []string{"Pacific/Norfolk"}, - 673: []string{"Asia/Brunei"}, - 674: []string{"Pacific/Nauru"}, - 675: []string{"Pacific/Port_Moresby"}, - 676: []string{"Pacific/Tongatapu"}, - 677: []string{"Pacific/Guadalcanal"}, - 678: []string{"Pacific/Efate"}, - 679: []string{"Pacific/Fiji"}, - 680: []string{"Pacific/Palau"}, - 681: []string{"Pacific/Wallis"}, - 682: []string{"Pacific/Rarotonga"}, - 683: []string{"Pacific/Niue"}, - 685: []string{"Pacific/Apia"}, - 686: []string{ - "Pacific/Enderbury", "Pacific/Kiritimati", "Pacific/Tarawa", - }, - 687: []string{"Pacific/Noumea"}, - 688: []string{"Pacific/Funafuti"}, - 689: []string{ - "Pacific/Gambier", "Pacific/Marquesas", "Pacific/Tahiti", - }, - 6894: []string{"Pacific/Tahiti"}, - 6895: []string{"Pacific/Tahiti"}, - 6896: []string{"Pacific/Tahiti"}, - 6898: []string{"Pacific/Tahiti"}, - 68990: []string{"Pacific/Tahiti"}, - 68991: []string{"Pacific/Marquesas"}, - 68992: []string{"Pacific/Marquesas"}, - 68993: []string{"Pacific/Tahiti"}, - 68994: []string{"Pacific/Tahiti"}, - 68995: []string{"Pacific/Tahiti"}, - 68996: []string{"Pacific/Tahiti"}, - 68997: []string{"Pacific/Gambier"}, - 68998: []string{"Pacific/Tahiti"}, - 690: []string{"Pacific/Fakaofo"}, - 691: []string{ - "Pacific/Kosrae", "Pacific/Ponape", "Pacific/Truk", - }, - 691320: []string{"Pacific/Ponape"}, - 691330: []string{"Pacific/Truk"}, - 691350: []string{"Pacific/Truk"}, - 691370: []string{"Pacific/Kosrae"}, - 691920: []string{"Pacific/Ponape"}, - 691921: []string{"Pacific/Ponape"}, - 691924: []string{"Pacific/Ponape"}, - 691926: []string{"Pacific/Ponape"}, - 691933: []string{"Pacific/Truk"}, - 691950: []string{"Pacific/Truk"}, - 692: []string{"Pacific/Majuro"}, - 7: []string{ - "Asia/Almaty", "Asia/Anadyr", "Asia/Aqtobe", "Asia/Irkutsk", "Asia/Kamchatka", - "Asia/Krasnoyarsk", "Asia/Magadan", "Asia/Novosibirsk", "Asia/Omsk", "Asia/Sakhalin", - "Asia/Vladivostok", "Asia/Yakutsk", "Asia/Yekaterinburg", "Europe/Bucharest", "Europe/Moscow", - "Europe/Samara", - }, - 7301: []string{"Asia/Irkutsk"}, - 7302: []string{"Asia/Yakutsk"}, - 7336: []string{"Asia/Almaty"}, - 7341: []string{"Europe/Samara"}, - 7342: []string{"Asia/Yekaterinburg"}, - 7343: []string{"Asia/Yekaterinburg"}, - 7345: []string{"Asia/Yekaterinburg"}, - 7346: []string{"Asia/Yekaterinburg"}, - 7347: []string{"Asia/Yekaterinburg"}, - 7349: []string{"Asia/Yekaterinburg"}, - 7351: []string{"Asia/Yekaterinburg"}, - 7352: []string{"Asia/Yekaterinburg"}, - 7353: []string{"Asia/Yekaterinburg"}, - 7365: []string{"Europe/Moscow"}, - 7381: []string{"Asia/Omsk"}, - 7382: []string{"Asia/Novosibirsk"}, - 7383: []string{"Asia/Novosibirsk"}, - 7384: []string{"Asia/Krasnoyarsk"}, - 7385: []string{"Asia/Krasnoyarsk"}, - 7388: []string{"Asia/Krasnoyarsk"}, - 7390: []string{"Asia/Krasnoyarsk"}, - 7391: []string{"Asia/Krasnoyarsk"}, - 7394: []string{"Asia/Krasnoyarsk"}, - 7395: []string{"Asia/Irkutsk"}, - 7401: []string{"Europe/Bucharest"}, - 7411: []string{"Asia/Yakutsk"}, - 7413: []string{"Asia/Magadan"}, - 7415: []string{"Asia/Kamchatka"}, - 7416: []string{"Asia/Yakutsk"}, - 7421: []string{"Asia/Vladivostok"}, - 7423: []string{"Asia/Vladivostok"}, - 7424: []string{"Asia/Magadan"}, - 7426: []string{"Asia/Vladivostok"}, - 7427: []string{"Asia/Anadyr"}, - 7471: []string{"Europe/Moscow"}, - 7472: []string{"Europe/Moscow"}, - 7473: []string{"Europe/Moscow"}, - 7474: []string{"Europe/Moscow"}, - 7475: []string{"Europe/Moscow"}, - 7481: []string{"Europe/Moscow"}, - 7482: []string{"Europe/Moscow"}, - 7483: []string{"Europe/Moscow"}, - 7484: []string{"Europe/Moscow"}, - 7485: []string{"Europe/Moscow"}, - 7486: []string{"Europe/Moscow"}, - 7487: []string{"Europe/Moscow"}, - 7491: []string{"Europe/Moscow"}, - 7492: []string{"Europe/Moscow"}, - 7493: []string{"Europe/Moscow"}, - 7494: []string{"Europe/Moscow"}, - 7495: []string{"Europe/Moscow"}, - 7496: []string{"Europe/Moscow"}, - 7498: []string{"Europe/Moscow"}, - 7499: []string{"Europe/Moscow"}, - 7710: []string{"Asia/Almaty"}, - 7711: []string{"Asia/Aqtobe"}, - 7712: []string{"Asia/Aqtobe"}, - 7713: []string{"Asia/Aqtobe"}, - 7714: []string{"Asia/Almaty"}, - 7715: []string{"Asia/Almaty"}, - 7716: []string{"Asia/Almaty"}, - 7717: []string{"Asia/Almaty"}, - 7718: []string{"Asia/Almaty"}, - 7721: []string{"Asia/Almaty"}, - 7722: []string{"Asia/Almaty"}, - 7723: []string{"Asia/Almaty"}, - 7724: []string{"Asia/Almaty"}, - 7725: []string{"Asia/Almaty"}, - 7726: []string{"Asia/Almaty"}, - 7727: []string{"Asia/Almaty"}, - 7728: []string{"Asia/Almaty"}, - 7729: []string{"Asia/Aqtobe"}, - 7811: []string{"Europe/Moscow"}, - 7812: []string{"Europe/Moscow"}, - 7813: []string{"Europe/Moscow"}, - 7814: []string{"Europe/Moscow"}, - 7815: []string{"Europe/Moscow"}, - 7816: []string{"Europe/Moscow"}, - 7817: []string{"Europe/Moscow"}, - 7818: []string{"Europe/Moscow"}, - 7820: []string{"Europe/Moscow"}, - 7821: []string{"Europe/Moscow"}, - 7831: []string{"Europe/Moscow"}, - 7833: []string{"Europe/Moscow"}, - 7834: []string{"Europe/Moscow"}, - 7835: []string{"Europe/Moscow"}, - 7836: []string{"Europe/Moscow"}, - 7840: []string{ - "Europe/Bucharest", "Europe/Moscow", - }, - 7841: []string{"Europe/Moscow"}, - 7842: []string{"Europe/Samara"}, - 7843: []string{"Europe/Moscow"}, - 7844: []string{"Europe/Moscow"}, - 7845: []string{"Europe/Samara"}, - 7846: []string{"Europe/Samara"}, - 7847: []string{"Europe/Moscow"}, - 7848: []string{"Europe/Samara"}, - 7851: []string{"Europe/Samara"}, - 7855: []string{"Europe/Moscow"}, - 7861: []string{"Europe/Moscow"}, - 7862: []string{"Europe/Moscow"}, - 7863: []string{"Europe/Moscow"}, - 7865: []string{"Europe/Moscow"}, - 7866: []string{"Europe/Moscow"}, - 7867: []string{"Europe/Moscow"}, - 7869: []string{"Europe/Moscow"}, - 7871: []string{"Europe/Moscow"}, - 7872: []string{"Europe/Moscow"}, - 7873: []string{"Europe/Moscow"}, - 7877: []string{"Europe/Moscow"}, - 7878: []string{"Europe/Moscow"}, - 7879: []string{"Europe/Moscow"}, - 81: []string{"Asia/Tokyo"}, - 82: []string{"Asia/Seoul"}, - 84: []string{"Asia/Bangkok"}, - 850: []string{"Asia/Pyongyang"}, - 852: []string{"Asia/Hong_Kong"}, - 853: []string{"Asia/Shanghai"}, - 855: []string{"Asia/Phnom_Penh"}, - 856: []string{"Asia/Vientiane"}, - 86: []string{ - "Asia/Shanghai", "Asia/Urumqi", - }, - 8610: []string{"Asia/Shanghai"}, - 8613: []string{"Asia/Shanghai"}, - 86147: []string{"Asia/Shanghai"}, - 86150: []string{"Asia/Shanghai"}, - 86151: []string{"Asia/Shanghai"}, - 86152: []string{"Asia/Shanghai"}, - 86153: []string{"Asia/Shanghai"}, - 86155: []string{"Asia/Shanghai"}, - 86156: []string{"Asia/Shanghai"}, - 86157: []string{"Asia/Shanghai"}, - 86158: []string{"Asia/Shanghai"}, - 86159: []string{"Asia/Shanghai"}, - 86177: []string{"Asia/Shanghai"}, - 8618: []string{"Asia/Shanghai"}, - 8620: []string{"Asia/Shanghai"}, - 8621: []string{"Asia/Shanghai"}, - 8622: []string{"Asia/Shanghai"}, - 8623: []string{"Asia/Shanghai"}, - 8624: []string{"Asia/Shanghai"}, - 8625: []string{"Asia/Shanghai"}, - 8627: []string{"Asia/Shanghai"}, - 8628: []string{"Asia/Shanghai"}, - 8629: []string{"Asia/Shanghai"}, - 8631: []string{"Asia/Shanghai"}, - 86335: []string{"Asia/Shanghai"}, - 86349: []string{"Asia/Shanghai"}, - 8635: []string{"Asia/Shanghai"}, - 8637: []string{"Asia/Shanghai"}, - 86391: []string{"Asia/Shanghai"}, - 86392: []string{"Asia/Shanghai"}, - 86393: []string{"Asia/Shanghai"}, - 86394: []string{"Asia/Shanghai"}, - 86395: []string{"Asia/Shanghai"}, - 86396: []string{"Asia/Shanghai"}, - 86398: []string{"Asia/Shanghai"}, - 8641: []string{"Asia/Shanghai"}, - 86421: []string{"Asia/Shanghai"}, - 86427: []string{"Asia/Shanghai"}, - 86429: []string{"Asia/Shanghai"}, - 86431: []string{"Asia/Shanghai"}, - 86432: []string{"Asia/Shanghai"}, - 86433: []string{"Asia/Shanghai"}, - 86434: []string{"Asia/Shanghai"}, - 86435: []string{"Asia/Shanghai"}, - 86436: []string{"Asia/Shanghai"}, - 86437: []string{"Asia/Shanghai"}, - 86438: []string{"Asia/Shanghai"}, - 86439: []string{"Asia/Shanghai"}, - 86451: []string{"Asia/Shanghai"}, - 86452: []string{"Asia/Shanghai"}, - 86453: []string{"Asia/Shanghai"}, - 86454: []string{"Asia/Shanghai"}, - 86455: []string{"Asia/Shanghai"}, - 86456: []string{"Asia/Shanghai"}, - 86457: []string{"Asia/Shanghai"}, - 86458: []string{"Asia/Shanghai"}, - 86459: []string{"Asia/Shanghai"}, - 86464: []string{"Asia/Shanghai"}, - 86467: []string{"Asia/Shanghai"}, - 86468: []string{"Asia/Shanghai"}, - 86469: []string{"Asia/Shanghai"}, - 8647: []string{"Asia/Shanghai"}, - 86482: []string{"Asia/Shanghai"}, - 86483: []string{"Asia/Shanghai"}, - 8651: []string{"Asia/Shanghai"}, - 86523: []string{"Asia/Shanghai"}, - 86527: []string{"Asia/Shanghai"}, - 8653: []string{"Asia/Shanghai"}, - 86543: []string{"Asia/Shanghai"}, - 86546: []string{"Asia/Shanghai"}, - 8655: []string{"Asia/Shanghai"}, - 86561: []string{"Asia/Shanghai"}, - 86562: []string{"Asia/Shanghai"}, - 86563: []string{"Asia/Shanghai"}, - 86564: []string{"Asia/Shanghai"}, - 86566: []string{"Asia/Shanghai"}, - 8657: []string{"Asia/Shanghai"}, - 86580: []string{"Asia/Shanghai"}, - 86591: []string{"Asia/Shanghai"}, - 86592: []string{"Asia/Shanghai"}, - 86593: []string{"Asia/Shanghai"}, - 86594: []string{"Asia/Shanghai"}, - 86595: []string{"Asia/Shanghai"}, - 86596: []string{"Asia/Shanghai"}, - 86597: []string{"Asia/Shanghai"}, - 86598: []string{"Asia/Shanghai"}, - 86599: []string{"Asia/Shanghai"}, - 86631: []string{"Asia/Shanghai"}, - 86632: []string{"Asia/Shanghai"}, - 86633: []string{"Asia/Shanghai"}, - 86634: []string{"Asia/Shanghai"}, - 86635: []string{"Asia/Shanghai"}, - 86660: []string{"Asia/Shanghai"}, - 86662: []string{"Asia/Shanghai"}, - 86663: []string{"Asia/Shanghai"}, - 86668: []string{"Asia/Shanghai"}, - 86691: []string{"Asia/Shanghai"}, - 86692: []string{"Asia/Shanghai"}, - 86701: []string{"Asia/Shanghai"}, - 8671: []string{"Asia/Shanghai"}, - 86722: []string{"Asia/Shanghai"}, - 86724: []string{"Asia/Shanghai"}, - 86728: []string{"Asia/Shanghai"}, - 86730: []string{"Asia/Shanghai"}, - 86731: []string{"Asia/Shanghai"}, - 86734: []string{"Asia/Shanghai"}, - 86735: []string{"Asia/Shanghai"}, - 86736: []string{"Asia/Shanghai"}, - 86737: []string{"Asia/Shanghai"}, - 86738: []string{"Asia/Shanghai"}, - 86739: []string{"Asia/Shanghai"}, - 86743: []string{"Asia/Shanghai"}, - 86744: []string{"Asia/Shanghai"}, - 86745: []string{"Asia/Shanghai"}, - 86746: []string{"Asia/Shanghai"}, - 8675: []string{"Asia/Shanghai"}, - 86760: []string{"Asia/Shanghai"}, - 86762: []string{"Asia/Shanghai"}, - 86763: []string{"Asia/Shanghai"}, - 86766: []string{"Asia/Shanghai"}, - 86768: []string{"Asia/Shanghai"}, - 86769: []string{"Asia/Shanghai"}, - 8677: []string{"Asia/Shanghai"}, - 8679: []string{"Asia/Shanghai"}, - 868068: []string{"Asia/Shanghai"}, - 868070: []string{"Asia/Shanghai"}, - 868078: []string{"Asia/Shanghai"}, - 868081: []string{"Asia/Shanghai"}, - 86812: []string{"Asia/Shanghai"}, - 86813: []string{"Asia/Shanghai"}, - 86816: []string{"Asia/Shanghai"}, - 86817: []string{"Asia/Shanghai"}, - 86818: []string{"Asia/Shanghai"}, - 86825: []string{"Asia/Shanghai"}, - 86826: []string{"Asia/Shanghai"}, - 86827: []string{"Asia/Shanghai"}, - 8683: []string{"Asia/Shanghai"}, - 86851: []string{"Asia/Shanghai"}, - 86854: []string{"Asia/Shanghai"}, - 86855: []string{"Asia/Shanghai"}, - 86856: []string{"Asia/Shanghai"}, - 86857: []string{"Asia/Shanghai"}, - 86858: []string{"Asia/Shanghai"}, - 86859: []string{"Asia/Shanghai"}, - 8687: []string{"Asia/Shanghai"}, - 86883: []string{"Asia/Shanghai"}, - 86886: []string{"Asia/Shanghai"}, - 86887: []string{"Asia/Shanghai"}, - 86888: []string{"Asia/Shanghai"}, - 86891: []string{"Asia/Shanghai"}, - 86892: []string{"Asia/Shanghai"}, - 86893: []string{"Asia/Shanghai"}, - 86894: []string{"Asia/Shanghai"}, - 86895: []string{"Asia/Shanghai"}, - 86896: []string{"Asia/Shanghai"}, - 86897: []string{"Asia/Shanghai"}, - 86898: []string{"Asia/Shanghai"}, - 86901: []string{"Asia/Shanghai"}, - 86902: []string{"Asia/Shanghai"}, - 86903: []string{"Asia/Shanghai"}, - 86906: []string{"Asia/Shanghai"}, - 86908: []string{"Asia/Shanghai"}, - 86909: []string{"Asia/Shanghai"}, - 86911: []string{"Asia/Shanghai"}, - 86912: []string{"Asia/Shanghai"}, - 86913: []string{"Asia/Shanghai"}, - 86914: []string{"Asia/Shanghai"}, - 86915: []string{"Asia/Shanghai"}, - 86916: []string{"Asia/Shanghai"}, - 86917: []string{"Asia/Shanghai"}, - 86919: []string{"Asia/Shanghai"}, - 8693: []string{"Asia/Shanghai"}, - 86941: []string{"Asia/Shanghai"}, - 86943: []string{"Asia/Shanghai"}, - 86951: []string{"Asia/Shanghai"}, - 86952: []string{"Asia/Shanghai"}, - 86953: []string{"Asia/Shanghai"}, - 86954: []string{"Asia/Shanghai"}, - 86955: []string{"Asia/Shanghai"}, - 86970: []string{"Asia/Shanghai"}, - 86971: []string{"Asia/Shanghai"}, - 86972: []string{"Asia/Shanghai"}, - 86973: []string{"Asia/Shanghai"}, - 86974: []string{"Asia/Shanghai"}, - 86975: []string{"Asia/Shanghai"}, - 86976: []string{"Asia/Shanghai"}, - 86977: []string{"Asia/Shanghai"}, - 86979: []string{"Asia/Shanghai"}, - 8699: []string{"Asia/Shanghai"}, - 880: []string{"Asia/Dhaka"}, - 886: []string{"Asia/Taipei"}, - 90: []string{"Europe/Istanbul"}, - 91: []string{"Asia/Calcutta"}, - 92: []string{"Asia/Karachi"}, - 93: []string{"Asia/Kabul"}, - 94: []string{"Asia/Colombo"}, - 95: []string{"Asia/Rangoon"}, - 960: []string{"Indian/Maldives"}, - 961: []string{"Asia/Beirut"}, - 962: []string{"Asia/Amman"}, - 963: []string{"Asia/Damascus"}, - 964: []string{"Asia/Baghdad"}, - 965: []string{"Asia/Kuwait"}, - 966: []string{"Asia/Riyadh"}, - 967: []string{"Asia/Aden"}, - 968: []string{"Asia/Muscat"}, - 970: []string{"Europe/Bucharest"}, - 971: []string{"Asia/Dubai"}, - 972: []string{"Asia/Jerusalem"}, - 973: []string{"Asia/Bahrain"}, - 974: []string{"Asia/Qatar"}, - 975: []string{"Asia/Thimphu"}, - 976: []string{ - "Asia/Choibalsan", "Asia/Hovd", "Asia/Ulaanbaatar", - }, - 97611: []string{"Asia/Ulaanbaatar"}, - 97612: []string{"Asia/Ulaanbaatar"}, - 97613: []string{"Asia/Ulaanbaatar"}, - 9761362: []string{ - "Asia/Choibalsan", "Asia/Ulaanbaatar", - }, - 97614: []string{"Asia/Hovd"}, - 97615: []string{"Asia/Ulaanbaatar"}, - 976158: []string{"Asia/Choibalsan"}, - 9761582: []string{"Asia/Ulaanbaatar"}, - 97621: []string{"Asia/Ulaanbaatar"}, - 97622: []string{"Asia/Ulaanbaatar"}, - 97623: []string{"Asia/Ulaanbaatar"}, - 9762362: []string{ - "Asia/Choibalsan", "Asia/Ulaanbaatar", - }, - 97624: []string{"Asia/Hovd"}, - 97625: []string{"Asia/Ulaanbaatar"}, - 976258: []string{"Asia/Choibalsan"}, - 9765000: []string{"Asia/Ulaanbaatar"}, - 9765001: []string{"Asia/Ulaanbaatar"}, - 9765002: []string{"Asia/Ulaanbaatar"}, - 9765006: []string{"Asia/Ulaanbaatar"}, - 9765011: []string{"Asia/Ulaanbaatar"}, - 9765037: []string{"Asia/Ulaanbaatar"}, - 9765050: []string{"Asia/Ulaanbaatar"}, - 9765088: []string{"Asia/Ulaanbaatar"}, - 9765099: []string{"Asia/Ulaanbaatar"}, - 9765515: []string{"Asia/Ulaanbaatar"}, - 9765525: []string{"Asia/Ulaanbaatar"}, - 9765526: []string{"Asia/Ulaanbaatar"}, - 977: []string{"Asia/Katmandu"}, - 98: []string{"Asia/Tehran"}, - 992: []string{"Asia/Dushanbe"}, - 993: []string{"Asia/Ashgabat"}, - 994: []string{"Asia/Baku"}, - 995: []string{"Asia/Tbilisi"}, - 996: []string{"Asia/Bishkek"}, - 998: []string{"Asia/Tashkent"}, - -} -// MAX_PREFIX_LENGTH helps us optimize for prefixes that can't be contained in our table -var MAX_PREFIX_LENGTH = 8 diff --git a/vendor/github.com/nyaruka/phonenumbers/util.go b/vendor/github.com/nyaruka/phonenumbers/util.go deleted file mode 100644 index 24f3594..0000000 --- a/vendor/github.com/nyaruka/phonenumbers/util.go +++ /dev/null @@ -1,3282 +0,0 @@ -package phonenumbers - -import ( - "compress/gzip" - "errors" - "reflect" - "regexp" - "strconv" - "strings" - "sync" - "unicode" - - "bytes" - - "io/ioutil" - - "github.com/golang/protobuf/proto" -) - -const ( - // MIN_LENGTH_FOR_NSN is the minimum and maximum length of the national significant number. - MIN_LENGTH_FOR_NSN = 2 - // MAX_LENGTH_FOR_NSN: The ITU says the maximum length should be 15, but we have - // found longer numbers in Germany. - MAX_LENGTH_FOR_NSN = 17 - // MAX_LENGTH_COUNTRY_CODE is the maximum length of the country calling code. - MAX_LENGTH_COUNTRY_CODE = 3 - // MAX_INPUT_STRING_LENGTH caps input strings for parsing at 250 chars. - // This prevents malicious input from overflowing the regular-expression - // engine. - MAX_INPUT_STRING_LENGTH = 250 - - // UNKNOWN_REGION is the region-code for the unknown region. - UNKNOWN_REGION = "ZZ" - - NANPA_COUNTRY_CODE = 1 - - // The prefix that needs to be inserted in front of a Colombian - // landline number when dialed from a mobile phone in Colombia. - COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX = "3" - - // The PLUS_SIGN signifies the international prefix. - PLUS_SIGN = '+' - - STAR_SIGN = '*' - - RFC3966_EXTN_PREFIX = ";ext=" - RFC3966_PREFIX = "tel:" - RFC3966_PHONE_CONTEXT = ";phone-context=" - RFC3966_ISDN_SUBADDRESS = ";isub=" - - // Regular expression of acceptable punctuation found in phone - // numbers. This excludes punctuation found as a leading character - // only. This consists of dash characters, white space characters, - // full stops, slashes, square brackets, parentheses and tildes. It - // also includes the letter 'x' as that is found as a placeholder - // for carrier information in some phone numbers. Full-width variants - // are also present. - VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " + - "\u00A0\u00AD\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D." + - "\\[\\]/~\u2053\u223C\uFF5E" - - DIGITS = "\\p{Nd}" - - // We accept alpha characters in phone numbers, ASCII only, upper - // and lower case. - VALID_ALPHA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - PLUS_CHARS = "+\uFF0B" - - // This is defined by ICU as the unknown time zone. - UNKNOWN_TIMEZONE = "Etc/Unknown" -) - -var ( - // Map of country calling codes that use a mobile token before the - // area code. One example of when this is relevant is when determining - // the length of the national destination code, which should be the - // length of the area code plus the length of the mobile token. - MOBILE_TOKEN_MAPPINGS = map[int]string{ - 52: "1", - 54: "9", - } - - // A map that contains characters that are essential when dialling. - // That means any of the characters in this map must not be removed - // from a number when dialling, otherwise the call will not reach - // the intended destination. - DIALLABLE_CHAR_MAPPINGS = map[rune]rune{ - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0', - PLUS_SIGN: PLUS_SIGN, - '*': '*', - } - - // Only upper-case variants of alpha characters are stored. - ALPHA_MAPPINGS = map[rune]rune{ - 'A': '2', - 'B': '2', - 'C': '2', - 'D': '3', - 'E': '3', - 'F': '3', - 'G': '4', - 'H': '4', - 'I': '4', - 'J': '5', - 'K': '5', - 'L': '5', - 'M': '6', - 'N': '6', - 'O': '6', - 'P': '7', - 'Q': '7', - 'R': '7', - 'S': '7', - 'T': '8', - 'U': '8', - 'V': '8', - 'W': '9', - 'X': '9', - 'Y': '9', - 'Z': '9', - } - - // For performance reasons, amalgamate both into one map. - ALPHA_PHONE_MAPPINGS = map[rune]rune{ - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0', - PLUS_SIGN: PLUS_SIGN, - '*': '*', - 'A': '2', - 'B': '2', - 'C': '2', - 'D': '3', - 'E': '3', - 'F': '3', - 'G': '4', - 'H': '4', - 'I': '4', - 'J': '5', - 'K': '5', - 'L': '5', - 'M': '6', - 'N': '6', - 'O': '6', - 'P': '7', - 'Q': '7', - 'R': '7', - 'S': '7', - 'T': '8', - 'U': '8', - 'V': '8', - 'W': '9', - 'X': '9', - 'Y': '9', - 'Z': '9', - } - - // Separate map of all symbols that we wish to retain when formatting - // alpha numbers. This includes digits, ASCII letters and number - // grouping symbols such as "-" and " ". - ALL_PLUS_NUMBER_GROUPING_SYMBOLS = map[rune]rune{ - '1': '1', - '2': '2', - '3': '3', - '4': '4', - '5': '5', - '6': '6', - '7': '7', - '8': '8', - '9': '9', - '0': '0', - PLUS_SIGN: PLUS_SIGN, - '*': '*', - 'A': 'A', - 'B': 'B', - 'C': 'C', - 'D': 'D', - 'E': 'E', - 'F': 'F', - 'G': 'G', - 'H': 'H', - 'I': 'I', - 'J': 'J', - 'K': 'K', - 'L': 'L', - 'M': 'M', - 'N': 'N', - 'O': 'O', - 'P': 'P', - 'Q': 'Q', - 'R': 'R', - 'S': 'S', - 'T': 'T', - 'U': 'U', - 'V': 'V', - 'W': 'W', - 'X': 'X', - 'Y': 'Y', - 'Z': 'Z', - 'a': 'A', - 'b': 'B', - 'c': 'C', - 'd': 'D', - 'e': 'E', - 'f': 'F', - 'g': 'G', - 'h': 'H', - 'i': 'I', - 'j': 'J', - 'k': 'K', - 'l': 'L', - 'm': 'M', - 'n': 'N', - 'o': 'O', - 'p': 'P', - 'q': 'Q', - 'r': 'R', - 's': 'S', - 't': 'T', - 'u': 'U', - 'v': 'V', - 'w': 'W', - 'x': 'X', - 'y': 'Y', - 'z': 'Z', - '-': '-', - '\uFF0D': '-', - '\u2010': '-', - '\u2011': '-', - '\u2012': '-', - '\u2013': '-', - '\u2014': '-', - '\u2015': '-', - '\u2212': '-', - '/': '/', - '\uFF0F': '/', - ' ': ' ', - '\u3000': ' ', - '\u2060': ' ', - '.': '.', - '\uFF0E': '.', - } - - // Pattern that makes it easy to distinguish whether a region has a - // unique international dialing prefix or not. If a region has a - // unique international prefix (e.g. 011 in USA), it will be - // represented as a string that contains a sequence of ASCII digits. - // If there are multiple available international prefixes in a - // region, they will be represented as a regex string that always - // contains character(s) other than ASCII digits. - // Note this regex also includes tilde, which signals waiting for the tone. - UNIQUE_INTERNATIONAL_PREFIX = regexp.MustCompile("[\\d]+(?:[~\u2053\u223C\uFF5E][\\d]+)?") - - PLUS_CHARS_PATTERN = regexp.MustCompile("[" + PLUS_CHARS + "]+") - SEPARATOR_PATTERN = regexp.MustCompile("[" + VALID_PUNCTUATION + "]+") - NOT_SEPARATOR_PATTERN = regexp.MustCompile("[^" + VALID_PUNCTUATION + "]+") - CAPTURING_DIGIT_PATTERN = regexp.MustCompile("(" + DIGITS + ")") - - // Regular expression of acceptable characters that may start a - // phone number for the purposes of parsing. This allows us to - // strip away meaningless prefixes to phone numbers that may be - // mistakenly given to us. This consists of digits, the plus symbol - // and arabic-indic digits. This does not contain alpha characters, - // although they may be used later in the number. It also does not - // include other punctuation, as this will be stripped later during - // parsing and is of no information value when parsing a number. - VALID_START_CHAR = "[" + PLUS_CHARS + DIGITS + "]" - VALID_START_CHAR_PATTERN = regexp.MustCompile(VALID_START_CHAR) - - // Regular expression of characters typically used to start a second - // phone number for the purposes of parsing. This allows us to strip - // off parts of the number that are actually the start of another - // number, such as for: (530) 583-6985 x302/x2303 -> the second - // extension here makes this actually two phone numbers, - // (530) 583-6985 x302 and (530) 583-6985 x2303. We remove the second - // extension so that the first number is parsed correctly. - SECOND_NUMBER_START = "[\\\\/] *x" - SECOND_NUMBER_START_PATTERN = regexp.MustCompile(SECOND_NUMBER_START) - - // Regular expression of trailing characters that we want to remove. - // We remove all characters that are not alpha or numerical characters. - // The hash character is retained here, as it may signify the previous - // block was an extension. - UNWANTED_END_CHARS = "[[\\P{N}&&\\P{L}]&&[^#]]+$" - UNWANTED_END_CHAR_PATTERN = regexp.MustCompile(UNWANTED_END_CHARS) - - // We use this pattern to check if the phone number has at least three - // letters in it - if so, then we treat it as a number where some - // phone-number digits are represented by letters. - VALID_ALPHA_PHONE_PATTERN = regexp.MustCompile("(?:.*?[A-Za-z]){3}.*") - - // Regular expression of viable phone numbers. This is location - // independent. Checks we have at least three leading digits, and - // only valid punctuation, alpha characters and digits in the phone - // number. Does not include extension data. The symbol 'x' is allowed - // here as valid punctuation since it is often used as a placeholder - // for carrier codes, for example in Brazilian phone numbers. We also - // allow multiple "+" characters at the start. - // Corresponds to the following: - // [digits]{minLengthNsn}| - // plus_sign*( - // ([punctuation]|[star])*[digits] - // ){3,}([punctuation]|[star]|[digits]|[alpha])* - // - // The first reg-ex is to allow short numbers (two digits long) to be - // parsed if they are entered as "15" etc, but only if there is no - // punctuation in them. The second expression restricts the number of - // digits to three or more, but then allows them to be in - // international form, and to have alpha-characters and punctuation. - // - // Note VALID_PUNCTUATION starts with a -, so must be the first in the range. - VALID_PHONE_NUMBER = DIGITS + "{" + strconv.Itoa(MIN_LENGTH_FOR_NSN) + "}" + "|" + - "[" + PLUS_CHARS + "]*(?:[" + VALID_PUNCTUATION + string(STAR_SIGN) + - "]*" + DIGITS + "){3,}[" + - VALID_PUNCTUATION + string(STAR_SIGN) + VALID_ALPHA + DIGITS + "]*" - - // Default extension prefix to use when formatting. This will be put - // in front of any extension component of the number, after the main - // national number is formatted. For example, if you wish the default - // extension formatting to be " extn: 3456", then you should specify - // " extn: " here as the default extension prefix. This can be - // overridden by region-specific preferences. - DEFAULT_EXTN_PREFIX = " ext. " - - // Pattern to capture digits used in an extension. Places a maximum - // length of "7" for an extension. - CAPTURING_EXTN_DIGITS = "(" + DIGITS + "{1,7})" - - // Regexp of all possible ways to write extensions, for use when - // parsing. This will be run as a case-insensitive regexp match. - // Wide character versions are also provided after each ASCII version. - // There are three regular expressions here. The first covers RFC 3966 - // format, where the extension is added using ";ext=". The second more - // generic one starts with optional white space and ends with an - // optional full stop (.), followed by zero or more spaces/tabs and then - // the numbers themselves. The other one covers the special case of - // American numbers where the extension is written with a hash at the - // end, such as "- 503#". Note that the only capturing groups should - // be around the digits that you want to capture as part of the - // extension, or else parsing will fail! Canonical-equivalence doesn't - // seem to be an option with Android java, so we allow two options - // for representing the accented o - the character itself, and one in - // the unicode decomposed form with the combining acute accent. - EXTN_PATTERNS_FOR_PARSING = RFC3966_EXTN_PREFIX + CAPTURING_EXTN_DIGITS + "|" + "[ \u00A0\\t,]*" + - "(?:e?xt(?:ensi(?:o\u0301?|\u00F3))?n?|\uFF45?\uFF58\uFF54\uFF4E?|" + - "[,x\uFF58#\uFF03~\uFF5E]|int|anexo|\uFF49\uFF4E\uFF54)" + - "[:\\.\uFF0E]?[ \u00A0\\t,-]*" + CAPTURING_EXTN_DIGITS + "#?|" + - "[- ]+(" + DIGITS + "{1,5})#" - EXTN_PATTERNS_FOR_MATCHING = RFC3966_EXTN_PREFIX + CAPTURING_EXTN_DIGITS + "|" + "[ \u00A0\\t,]*" + - "(?:e?xt(?:ensi(?:o\u0301?|\u00F3))?n?|\uFF45?\uFF58\uFF54\uFF4E?|" + - "[x\uFF58#\uFF03~\uFF5E]|int|anexo|\uFF49\uFF4E\uFF54)" + - "[:\\.\uFF0E]?[ \u00A0\\t,-]*" + CAPTURING_EXTN_DIGITS + "#?|" + - "[- ]+(" + DIGITS + "{1,5})#" - - // Regexp of all known extension prefixes used by different regions - // followed by 1 or more valid digits, for use when parsing. - EXTN_PATTERN = regexp.MustCompile("(?:" + EXTN_PATTERNS_FOR_PARSING + ")$") - - // We append optionally the extension pattern to the end here, as a - // valid phone number may have an extension prefix appended, - // followed by 1 or more digits. - VALID_PHONE_NUMBER_PATTERN = regexp.MustCompile( - VALID_PHONE_NUMBER + "(?:" + EXTN_PATTERNS_FOR_PARSING + ")?") - - NON_DIGITS_PATTERN = regexp.MustCompile("(\\D+)") - DIGITS_PATTERN = regexp.MustCompile("(\\d+)") - - // The FIRST_GROUP_PATTERN was originally set to $1 but there are some - // countries for which the first group is not used in the national - // pattern (e.g. Argentina) so the $1 group does not match correctly. - // Therefore, we use \d, so that the first group actually used in the - // pattern will be matched. - FIRST_GROUP_PATTERN = regexp.MustCompile("(\\$\\d)") - NP_PATTERN = regexp.MustCompile("\\$NP") - FG_PATTERN = regexp.MustCompile("\\$FG") - CC_PATTERN = regexp.MustCompile("\\$CC") - - // A pattern that is used to determine if the national prefix - // formatting rule has the first group only, i.e., does not start - // with the national prefix. Note that the pattern explicitly allows - // for unbalanced parentheses. - FIRST_GROUP_ONLY_PREFIX_PATTERN = regexp.MustCompile("\\(?\\$1\\)?") - - REGION_CODE_FOR_NON_GEO_ENTITY = "001" -) - -// INTERNATIONAL and NATIONAL formats are consistent with the definition -// in ITU-T Recommendation E123. For example, the number of the Google -// Switzerland office will be written as "+41 44 668 1800" in -// INTERNATIONAL format, and as "044 668 1800" in NATIONAL format. E164 -// format is as per INTERNATIONAL format but with no formatting applied, -// e.g. "+41446681800". RFC3966 is as per INTERNATIONAL format, but with -// all spaces and other separating symbols replaced with a hyphen, and -// with any phone number extension appended with ";ext=". It also will -// have a prefix of "tel:" added, e.g. "tel:+41-44-668-1800". -// -// Note: If you are considering storing the number in a neutral format, -// you are highly advised to use the PhoneNumber class. - -type PhoneNumberFormat int - -const ( - E164 PhoneNumberFormat = iota - INTERNATIONAL - NATIONAL - RFC3966 -) - -type PhoneNumberType int - -const ( - // NOTES: - // - // FIXED_LINE_OR_MOBILE: - // In some regions (e.g. the USA), it is impossible to distinguish - // between fixed-line and mobile numbers by looking at the phone - // number itself. - // SHARED_COST: - // The cost of this call is shared between the caller and the - // recipient, and is hence typically less than PREMIUM_RATE calls. - // See // http://en.wikipedia.org/wiki/Shared_Cost_Service for - // more information. - // VOIP: - // Voice over IP numbers. This includes TSoIP (Telephony Service over IP). - // PERSONAL_NUMBER: - // A personal number is associated with a particular person, and may - // be routed to either a MOBILE or FIXED_LINE number. Some more - // information can be found here: - // http://en.wikipedia.org/wiki/Personal_Numbers - // UAN: - // Used for "Universal Access Numbers" or "Company Numbers". They - // may be further routed to specific offices, but allow one number - // to be used for a company. - // VOICEMAIL: - // Used for "Voice Mail Access Numbers". - // UNKNOWN: - // A phone number is of type UNKNOWN when it does not fit any of - // the known patterns for a specific region. - FIXED_LINE PhoneNumberType = iota - MOBILE - FIXED_LINE_OR_MOBILE - TOLL_FREE - PREMIUM_RATE - SHARED_COST - VOIP - PERSONAL_NUMBER - PAGER - UAN - VOICEMAIL - UNKNOWN -) - -type MatchType int - -const ( - NOT_A_NUMBER MatchType = iota - NO_MATCH - SHORT_NSN_MATCH - NSN_MATCH - EXACT_MATCH -) - -type ValidationResult int - -const ( - IS_POSSIBLE ValidationResult = iota - INVALID_COUNTRY_CODE - TOO_SHORT - TOO_LONG -) - -// TODO(ttacon): leniency comments? -type Leniency int - -const ( - POSSIBLE Leniency = iota - VALID - STRICT_GROUPING - EXACT_GROUPING -) - -func (l Leniency) Verify(number *PhoneNumber, candidate string) bool { - - switch l { - case POSSIBLE: - return IsPossibleNumber(number) - case VALID: - if !IsValidNumber(number) || - !ContainsOnlyValidXChars(number, candidate) { - return false - } - return IsNationalPrefixPresentIfRequired(number) - case STRICT_GROUPING: - if !IsValidNumber(number) || - !ContainsOnlyValidXChars(number, candidate) || - ContainsMoreThanOneSlashInNationalNumber(number, candidate) || - !IsNationalPrefixPresentIfRequired(number) { - return false - } - return CheckNumberGroupingIsValid(number, candidate, - func(number *PhoneNumber, - normalizedCandidate string, - expectedNumberGroups []string) bool { - return AllNumberGroupsRemainGrouped( - number, normalizedCandidate, expectedNumberGroups) - }) - case EXACT_GROUPING: - if !IsValidNumber(number) || - !ContainsOnlyValidXChars(number, candidate) || - ContainsMoreThanOneSlashInNationalNumber(number, candidate) || - !IsNationalPrefixPresentIfRequired(number) { - return false - } - return CheckNumberGroupingIsValid(number, candidate, - func(number *PhoneNumber, - normalizedCandidate string, - expectedNumberGroups []string) bool { - return AllNumberGroupsAreExactlyPresent( - number, normalizedCandidate, expectedNumberGroups) - }) - } - return false -} - -var ( - // golang map is not go routine safe. Sometimes process exiting - // because of panic. So adding mutex to synchronize the operation. - - // The set of regions that share country calling code 1. - // There are roughly 26 regions. - nanpaRegions = make(map[string]struct{}) - - // A mapping from a region code to the PhoneMetadata for that region. - // Note: Synchronization, though only needed for the Android version - // of the library, is used in all versions for consistency. - regionToMetadataMap = make(map[string]*PhoneMetadata) - - // A mapping from a country calling code for a non-geographical - // entity to the PhoneMetadata for that country calling code. - // Examples of the country calling codes include 800 (International - // Toll Free Service) and 808 (International Shared Cost Service). - // Note: Synchronization, though only needed for the Android version - // of the library, is used in all versions for consistency. - countryCodeToNonGeographicalMetadataMap = make(map[int]*PhoneMetadata) - - // A cache for frequently used region-specific regular expressions. - // The initial capacity is set to 100 as this seems to be an optimal - // value for Android, based on performance measurements. - regexCache = make(map[string]*regexp.Regexp) - regCacheMutex sync.RWMutex - - // The set of regions the library supports. - // There are roughly 240 of them and we set the initial capacity of - // the HashSet to 320 to offer a load factor of roughly 0.75. - supportedRegions = make(map[string]struct{}) - - // The set of county calling codes that map to the non-geo entity - // region ("001"). This set currently contains < 12 elements so the - // default capacity of 16 (load factor=0.75) is fine. - countryCodesForNonGeographicalRegion = make(map[int]struct{}) -) - -var ErrEmptyMetadata = errors.New("empty metadata") - -func readFromRegexCache(key string) (*regexp.Regexp, bool) { - regCacheMutex.RLock() - v, ok := regexCache[key] - regCacheMutex.RUnlock() - return v, ok -} - -func writeToRegexCache(key string, value *regexp.Regexp) { - regCacheMutex.Lock() - regexCache[key] = value - regCacheMutex.Unlock() -} - -func readFromNanpaRegions(key string) (struct{}, bool) { - v, ok := nanpaRegions[key] - return v, ok -} - -func writeToNanpaRegions(key string, val struct{}) { - nanpaRegions[key] = val -} - -func readFromRegionToMetadataMap(key string) (*PhoneMetadata, bool) { - v, ok := regionToMetadataMap[key] - return v, ok -} - -func writeToRegionToMetadataMap(key string, val *PhoneMetadata) { - regionToMetadataMap[key] = val -} - -func readFromCountryCodeToNonGeographicalMetadataMap(key int) (*PhoneMetadata, bool) { - v, ok := countryCodeToNonGeographicalMetadataMap[key] - return v, ok -} - -func writeToCountryCodeToNonGeographicalMetadataMap(key int, v *PhoneMetadata) { - countryCodeToNonGeographicalMetadataMap[key] = v -} - -func readFromSupportedRegions(key string) (struct{}, bool) { - v, ok := supportedRegions[key] - return v, ok -} - -func writeToSupportedRegions(key string, val struct{}) { - supportedRegions[key] = val -} - -func deleteFromSupportedRegions(key string) { - delete(supportedRegions, key) -} - -func readFromCCsForNonGeographicalRegion(key int) (struct{}, bool) { - v, ok := countryCodesForNonGeographicalRegion[key] - return v, ok -} - -func writeToCCsForNonGeographicalRegion(key int, val struct{}) { - countryCodesForNonGeographicalRegion[key] = val -} - -func loadMetadataFromFile( - regionCode string, - countryCallingCode int) error { - - metadataCollection, err := MetadataCollection() - if err != nil { - return err - } else if currMetadataColl == nil { - currMetadataColl = metadataCollection - } - - metadataList := metadataCollection.GetMetadata() - if len(metadataList) == 0 { - return ErrEmptyMetadata - } - - for _, meta := range metadataList { - region := meta.GetId() - if region == "001" { - // it's a non geographical entity - writeToCountryCodeToNonGeographicalMetadataMap(int(meta.GetCountryCode()), meta) - } else { - writeToRegionToMetadataMap(region, meta) - } - } - return nil -} - -var ( - currMetadataColl *PhoneMetadataCollection - reloadMetadata = true -) - -func MetadataCollection() (*PhoneMetadataCollection, error) { - if !reloadMetadata { - return currMetadataColl, nil - } - - var metadataCollection = &PhoneMetadataCollection{} - - reader, err := gzip.NewReader(bytes.NewReader(MetaData)) - if err != nil { - return metadataCollection, err - } - metaBytes, err := ioutil.ReadAll(reader) - - err = proto.Unmarshal(metaBytes, metadataCollection) - reloadMetadata = false - return metadataCollection, err -} - -// Attempts to extract a possible number from the string passed in. -// This currently strips all leading characters that cannot be used to -// start a phone number. Characters that can be used to start a phone -// number are defined in the VALID_START_CHAR_PATTERN. If none of these -// characters are found in the number passed in, an empty string is -// returned. This function also attempts to strip off any alternative -// extensions or endings if two or more are present, such as in the case -// of: (530) 583-6985 x302/x2303. The second extension here makes this -// actually two phone numbers, (530) 583-6985 x302 and (530) 583-6985 x2303. -// We remove the second extension so that the first number is parsed correctly. -func extractPossibleNumber(number string) string { - if VALID_START_CHAR_PATTERN.MatchString(number) { - start := VALID_START_CHAR_PATTERN.FindIndex([]byte(number))[0] - number = number[start:] - // Remove trailing non-alpha non-numerical characters. - indices := UNWANTED_END_CHAR_PATTERN.FindIndex([]byte(number)) - if len(indices) > 0 { - number = number[0:indices[0]] - } - // Check for extra numbers at the end. - indices = SECOND_NUMBER_START_PATTERN.FindIndex([]byte(number)) - if len(indices) > 0 { - number = number[0:indices[0]] - } - return number - } - return "" -} - -// Checks to see if the string of characters could possibly be a phone -// number at all. At the moment, checks to see that the string begins -// with at least 2 digits, ignoring any punctuation commonly found in -// phone numbers. This method does not require the number to be -// normalized in advance - but does assume that leading non-number symbols -// have been removed, such as by the method extractPossibleNumber. -// @VisibleForTesting -func isViablePhoneNumber(number string) bool { - if len(number) < MIN_LENGTH_FOR_NSN { - return false - } - return VALID_PHONE_NUMBER_PATTERN.MatchString(number) -} - -// Normalizes a string of characters representing a phone number. This -// performs the following conversions: -// - Punctuation is stripped. -// - For ALPHA/VANITY numbers: -// - Letters are converted to their numeric representation on a telephone -// keypad. The keypad used here is the one defined in ITU Recommendation -// E.161. This is only done if there are 3 or more letters in the -// number, to lessen the risk that such letters are typos. -// -// - For other numbers: -// - Wide-ascii digits are converted to normal ASCII (European) digits. -// - Arabic-Indic numerals are converted to European numerals. -// - Spurious alpha characters are stripped. -func normalize(number string) string { - if VALID_ALPHA_PHONE_PATTERN.MatchString(number) { - return normalizeHelper(number, ALPHA_PHONE_MAPPINGS, true) - } - return NormalizeDigitsOnly(number) -} - -// Normalizes a string of characters representing a phone number. This is -// a wrapper for normalize(String number) but does in-place normalization -// of the StringBuilder provided. -func normalizeBytes(number *Builder) *Builder { - normalizedNumber := normalize(number.String()) - b := number.Bytes() - copy(b[0:len(normalizedNumber)], []byte(normalizedNumber)) - return NewBuilder(b) -} - -// Normalizes a string of characters representing a phone number. This -// converts wide-ascii and arabic-indic numerals to European numerals, -// and strips punctuation and alpha characters. -func NormalizeDigitsOnly(number string) string { - return normalizeDigits(number, false /* strip non-digits */) -} - -// ugly hack still, but fills out the functionality (sort of) -// TODO(ttacon): more completely/elegantly solve this -var arabicIndicNumberals = map[rune]rune{ - 'Ù ': '0', - 'Û°': '0', - 'Ù¡': '1', - 'Û±': '1', - 'Ù¢': '2', - 'Û²': '2', - 'Ù£': '3', - 'Û³': '3', - 'Ù¤': '4', - 'Û´': '4', - 'Ù¥': '5', - 'Ûµ': '5', - 'Ù¦': '6', - 'Û¶': '6', - 'Ù§': '7', - 'Û·': '7', - 'Ù¨': '8', - 'Û¸': '8', - 'Ù©': '9', - 'Û¹': '9', - '\uFF10': '0', - '\uFF11': '1', - '\uFF12': '2', - '\uFF13': '3', - '\uFF14': '4', - '\uFF15': '5', - '\uFF16': '6', - '\uFF17': '7', - '\uFF18': '8', - '\uFF19': '9', -} - -func normalizeDigits(number string, keepNonDigits bool) string { - buf := number - var normalizedDigits = NewBuilder(nil) - for _, c := range buf { - if unicode.IsDigit(c) { - if v, ok := arabicIndicNumberals[c]; ok { - normalizedDigits.WriteRune(v) - } else { - normalizedDigits.WriteRune(c) - } - } else if keepNonDigits { - normalizedDigits.WriteRune(c) - } - } - return normalizedDigits.String() -} - -// Normalizes a string of characters representing a phone number. This -// strips all characters which are not diallable on a mobile phone -// keypad (including all non-ASCII digits). -func normalizeDiallableCharsOnly(number string) string { - return normalizeHelper( - number, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */) -} - -// Converts all alpha characters in a number to their respective digits -// on a keypad, but retains existing formatting. -func ConvertAlphaCharactersInNumber(number string) string { - return normalizeHelper(number, ALPHA_PHONE_MAPPINGS, false) -} - -// Gets the length of the geographical area code from the PhoneNumber -// object passed in, so that clients could use it to split a national -// significant number into geographical area code and subscriber number. It -// works in such a way that the resultant subscriber number should be -// diallable, at least on some devices. An example of how this could be used: -// -// number, err := Parse("16502530000", "US"); -// // ... deal with err appropriately ... -// nationalSignificantNumber := GetNationalSignificantNumber(number); -// var areaCode, subscriberNumber; -// -// int areaCodeLength = GetLengthOfGeographicalAreaCode(number); -// if (areaCodeLength > 0) { -// areaCode = nationalSignificantNumber[0:areaCodeLength]; -// subscriberNumber = nationalSignificantNumber[areaCodeLength:]; -// } else { -// areaCode = ""; -// subscriberNumber = nationalSignificantNumber; -// } -// -// N.B.: area code is a very ambiguous concept, so the I18N team generally -// recommends against using it for most purposes, but recommends using the -// more general national_number instead. Read the following carefully before -// deciding to use this method: -// -// - geographical area codes change over time, and this method honors those changes; -// therefore, it doesn't guarantee the stability of the result it produces. -// - subscriber numbers may not be diallable from all devices (notably mobile -// devices, which typically requires the full national_number to be dialled -// in most regions). -// - most non-geographical numbers have no area codes, including numbers from -// non-geographical entities -// - some geographical numbers have no area codes. -func GetLengthOfGeographicalAreaCode(number *PhoneNumber) int { - metadata := getMetadataForRegion(GetRegionCodeForNumber(number)) - if metadata == nil { - return 0 - } - - // If a country doesn't use a national prefix, and this number - // doesn't have an Italian leading zero, we assume it is a closed - // dialling plan with no area codes. - if len(metadata.GetNationalPrefix()) == 0 && !number.GetItalianLeadingZero() { - return 0 - } - - if !isNumberGeographical(number) { - return 0 - } - - return GetLengthOfNationalDestinationCode(number) -} - -// Gets the length of the national destination code (NDC) from the -// PhoneNumber object passed in, so that clients could use it to split a -// national significant number into NDC and subscriber number. The NDC of -// a phone number is normally the first group of digit(s) right after the -// country calling code when the number is formatted in the international -// format, if there is a subscriber number part that follows. An example -// of how this could be used: -// -// PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); -// PhoneNumber number = phoneUtil.parse("18002530000", "US"); -// String nationalSignificantNumber = phoneUtil.GetNationalSignificantNumber(number); -// String nationalDestinationCode; -// String subscriberNumber; -// -// int nationalDestinationCodeLength = -// phoneUtil.GetLengthOfNationalDestinationCode(number); -// if nationalDestinationCodeLength > 0 { -// nationalDestinationCode = nationalSignificantNumber.substring(0, -// nationalDestinationCodeLength); -// subscriberNumber = nationalSignificantNumber.substring( -// nationalDestinationCodeLength); -// } else { -// nationalDestinationCode = ""; -// subscriberNumber = nationalSignificantNumber; -// } -// -// Refer to the unittests to see the difference between this function and -// GetLengthOfGeographicalAreaCode(). -func GetLengthOfNationalDestinationCode(number *PhoneNumber) int { - var copiedProto *PhoneNumber - if len(number.GetExtension()) > 0 { - // We don't want to alter the proto given to us, but we don't - // want to include the extension when we format it, so we copy - // it and clear the extension here. - copiedProto = &PhoneNumber{} - proto.Merge(copiedProto, number) - copiedProto.Extension = nil - } else { - copiedProto = number - } - - nationalSignificantNumber := Format(copiedProto, INTERNATIONAL) - numberGroups := DIGITS_PATTERN.FindAllString(nationalSignificantNumber, -1) - - // The pattern will start with "+COUNTRY_CODE " so the first group - // will always be the empty string (before the + symbol) and the - // second group will be the country calling code. The third group - // will be area code if it is not the last group. - if len(numberGroups) <= 3 { - return 0 - } - if GetNumberType(number) == MOBILE { - // For example Argentinian mobile numbers, when formatted in - // the international format, are in the form of +54 9 NDC XXXX.... - // As a result, we take the length of the third group (NDC) and - // add the length of the second group (which is the mobile token), - // which also forms part of the national significant number. This - // assumes that the mobile token is always formatted separately - // from the rest of the phone number. - mobileToken := GetCountryMobileToken(int(number.GetCountryCode())) - if mobileToken != "" { - return len(numberGroups[1]) + len(numberGroups[2]) - } - } - return len(numberGroups[1]) -} - -// Returns the mobile token for the provided country calling code if it -// has one, otherwise returns an empty string. A mobile token is a number -// inserted before the area code when dialing a mobile number from that -// country from abroad. -func GetCountryMobileToken(countryCallingCode int) string { - if val, ok := MOBILE_TOKEN_MAPPINGS[countryCallingCode]; ok { - return val - } - return "" -} - -// Normalizes a string of characters representing a phone number by replacing -// all characters found in the accompanying map with the values therein, -// and stripping all other characters if removeNonMatches is true. -func normalizeHelper(number string, - normalizationReplacements map[rune]rune, - removeNonMatches bool) string { - - var normalizedNumber = NewBuilder(nil) - for _, character := range number { - newDigit, ok := normalizationReplacements[unicode.ToUpper(character)] - if ok { - normalizedNumber.WriteRune(newDigit) - } else if !removeNonMatches { - normalizedNumber.WriteRune(character) - } - // If neither of the above are true, we remove this character. - } - return normalizedNumber.String() -} - -// Convenience method to get a list of what regions the library has metadata for. -func GetSupportedRegions() map[string]struct{} { - return supportedRegions -} - -// Convenience method to get a list of what global network calling codes -// the library has metadata for. -func GetSupportedGlobalNetworkCallingCodes() map[int]struct{} { - return countryCodesForNonGeographicalRegion -} - -// Helper function to check if the national prefix formatting rule has the -// first group only, i.e., does not start with the national prefix. -func formattingRuleHasFirstGroupOnly(nationalPrefixFormattingRule string) bool { - return len(nationalPrefixFormattingRule) == 0 || - FIRST_GROUP_ONLY_PREFIX_PATTERN.MatchString(nationalPrefixFormattingRule) -} - -// Tests whether a phone number has a geographical association. It checks -// if the number is associated to a certain region in the country where it -// belongs to. Note that this doesn't verify if the number is actually in use. -// -// A similar method is implemented as PhoneNumberOfflineGeocoder.canBeGeocoded, -// which performs a looser check, since it only prevents cases where prefixes -// overlap for geocodable and non-geocodable numbers. Also, if new phone -// number types were added, we should check if this other method should be -// updated too. -func isNumberGeographical(phoneNumber *PhoneNumber) bool { - numberType := GetNumberType(phoneNumber) - // TODO: Include mobile phone numbers from countries like Indonesia, - // which has some mobile numbers that are geographical. - return numberType == FIXED_LINE || - numberType == FIXED_LINE_OR_MOBILE -} - -// Helper function to check region code is not unknown or null. -func isValidRegionCode(regionCode string) bool { - _, contains := readFromSupportedRegions(regionCode) - return len(regionCode) != 0 && contains -} - -// Helper function to check the country calling code is valid. -func hasValidCountryCallingCode(countryCallingCode int) bool { - _, containsKey := CountryCodeToRegion[countryCallingCode] - return containsKey -} - -// Formats a phone number in the specified format using default rules. Note -// that this does not promise to produce a phone number that the user can -// dial from where they are - although we do format in either 'national' or -// 'international' format depending on what the client asks for, we do not -// currently support a more abbreviated format, such as for users in the -// same "area" who could potentially dial the number without area code. -// Note that if the phone number has a country calling code of 0 or an -// otherwise invalid country calling code, we cannot work out which -// formatting rules to apply so we return the national significant number -// with no formatting applied. -func Format(number *PhoneNumber, numberFormat PhoneNumberFormat) string { - if number.GetNationalNumber() == 0 && len(number.GetRawInput()) > 0 { - // Unparseable numbers that kept their raw input just use that. - // This is the only case where a number can be formatted as E164 - // without a leading '+' symbol (but the original number wasn't - // parseable anyway). - // TODO: Consider removing the 'if' above so that unparseable - // strings without raw input format to the empty string instead of "+00" - rawInput := number.GetRawInput() - if len(rawInput) > 0 { - return rawInput - } - } - var formattedNumber = NewBuilder(nil) - FormatWithBuf(number, numberFormat, formattedNumber) - return formattedNumber.String() -} - -// Same as Format(PhoneNumber, PhoneNumberFormat), but accepts a mutable -// StringBuilder as a parameter to decrease object creation when invoked -// many times. -func FormatWithBuf(number *PhoneNumber, numberFormat PhoneNumberFormat, formattedNumber *Builder) { - // Clear the StringBuilder first. - formattedNumber.Reset() - countryCallingCode := int(number.GetCountryCode()) - nationalSignificantNumber := GetNationalSignificantNumber(number) - - if numberFormat == E164 { - // Early exit for E164 case (even if the country calling code - // is invalid) since no formatting of the national number needs - // to be applied. Extensions are not formatted. - formattedNumber.WriteString(nationalSignificantNumber) - prefixNumberWithCountryCallingCode(countryCallingCode, E164, formattedNumber) - return - } else if !hasValidCountryCallingCode(countryCallingCode) { - formattedNumber.WriteString(nationalSignificantNumber) - return - } - // Note GetRegionCodeForCountryCode() is used because formatting - // information for regions which share a country calling code is - // contained by only one region for performance reasons. For - // example, for NANPA regions it will be contained in the metadata for US. - regionCode := GetRegionCodeForCountryCode(countryCallingCode) - - // Metadata cannot be null because the country calling code is - // valid (which means that the region code cannot be ZZ and must - // be one of our supported region codes). - metadata := getMetadataForRegionOrCallingCode(countryCallingCode, regionCode) - - formattedNumber.WriteString(formatNsn(nationalSignificantNumber, metadata, numberFormat)) - maybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber) - prefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber) -} - -// Formats a phone number in the specified format using client-defined -// formatting rules. Note that if the phone number has a country calling -// code of zero or an otherwise invalid country calling code, we cannot -// work out things like whether there should be a national prefix applied, -// or how to format extensions, so we return the national significant -// number with no formatting applied. -func FormatByPattern(number *PhoneNumber, - numberFormat PhoneNumberFormat, - userDefinedFormats []*NumberFormat) string { - - countryCallingCode := int(number.GetCountryCode()) - nationalSignificantNumber := GetNationalSignificantNumber(number) - if !hasValidCountryCallingCode(countryCallingCode) { - return nationalSignificantNumber - } - // Note GetRegionCodeForCountryCode() is used because formatting - // information for regions which share a country calling code is - // contained by only one region for performance reasons. For example, - // for NANPA regions it will be contained in the metadata for US. - regionCode := GetRegionCodeForCountryCode(countryCallingCode) - // Metadata cannot be null because the country calling code is valid - metadata := getMetadataForRegionOrCallingCode(countryCallingCode, regionCode) - - formattedNumber := NewBuilder(nil) - - formattingPattern := chooseFormattingPatternForNumber( - userDefinedFormats, nationalSignificantNumber) - if formattingPattern == nil { - // If no pattern above is matched, we format the number as a whole. - formattedNumber.WriteString(nationalSignificantNumber) - } else { - var numFormatCopy *NumberFormat - // Before we do a replacement of the national prefix pattern - // $NP with the national prefix, we need to copy the rule so - // that subsequent replacements for different numbers have the - // appropriate national prefix. - proto.Merge(numFormatCopy, formattingPattern) - nationalPrefixFormattingRule := formattingPattern.GetNationalPrefixFormattingRule() - if len(nationalPrefixFormattingRule) > 0 { - nationalPrefix := metadata.GetNationalPrefix() - if len(nationalPrefix) > 0 { - // Replace $NP with national prefix and $FG with the - // first group ($1). - nationalPrefixFormattingRule = - NP_PATTERN.ReplaceAllString( - nationalPrefixFormattingRule, nationalPrefix) - nationalPrefixFormattingRule = - FG_PATTERN.ReplaceAllString( - nationalPrefixFormattingRule, "\\$1") - numFormatCopy.NationalPrefixFormattingRule = - &nationalPrefixFormattingRule - } else { - // We don't want to have a rule for how to format the - // national prefix if there isn't one. - numFormatCopy.NationalPrefixFormattingRule = nil - } - } - formattedNumber.WriteString( - formatNsnUsingPattern( - nationalSignificantNumber, numFormatCopy, numberFormat)) - } - maybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber) - prefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber) - return formattedNumber.String() -} - -// Formats a phone number in national format for dialing using the carrier -// as specified in the carrierCode. The carrierCode will always be used -// regardless of whether the phone number already has a preferred domestic -// carrier code stored. If carrierCode contains an empty string, returns -// the number in national format without any carrier code. -func FormatNationalNumberWithCarrierCode(number *PhoneNumber, carrierCode string) string { - countryCallingCode := int(number.GetCountryCode()) - nationalSignificantNumber := GetNationalSignificantNumber(number) - if !hasValidCountryCallingCode(countryCallingCode) { - return nationalSignificantNumber - } - // Note GetRegionCodeForCountryCode() is used because formatting - // information for regions which share a country calling code is - // contained by only one region for performance reasons. For - // example, for NANPA regions it will be contained in the metadata for US. - regionCode := GetRegionCodeForCountryCode(countryCallingCode) - // Metadata cannot be null because the country calling code is valid. - metadata := getMetadataForRegionOrCallingCode(countryCallingCode, regionCode) - - formattedNumber := NewBuilder(nil) - formattedNumber.WriteString( - formatNsnWithCarrier( - nationalSignificantNumber, - metadata, - NATIONAL, - carrierCode)) - maybeAppendFormattedExtension(number, metadata, NATIONAL, formattedNumber) - prefixNumberWithCountryCallingCode( - countryCallingCode, - NATIONAL, - formattedNumber) - return formattedNumber.String() -} - -func getMetadataForRegionOrCallingCode(countryCallingCode int, regionCode string) *PhoneMetadata { - if REGION_CODE_FOR_NON_GEO_ENTITY == regionCode { - return getMetadataForNonGeographicalRegion(countryCallingCode) - } - return getMetadataForRegion(regionCode) -} - -// Formats a phone number in national format for dialing using the carrier -// as specified in the preferredDomesticCarrierCode field of the PhoneNumber -// object passed in. If that is missing, use the fallbackCarrierCode passed -// in instead. If there is no preferredDomesticCarrierCode, and the -// fallbackCarrierCode contains an empty string, return the number in -// national format without any carrier code. -// -// Use formatNationalNumberWithCarrierCode instead if the carrier code -// passed in should take precedence over the number's -// preferredDomesticCarrierCode when formatting. -func FormatNationalNumberWithPreferredCarrierCode( - number *PhoneNumber, - fallbackCarrierCode string) string { - - pref := number.GetPreferredDomesticCarrierCode() - if number.GetPreferredDomesticCarrierCode() == "" { - pref = fallbackCarrierCode - } - return FormatNationalNumberWithCarrierCode(number, pref) -} - -// Returns a number formatted in such a way that it can be dialed from a -// mobile phone in a specific region. If the number cannot be reached from -// the region (e.g. some countries block toll-free numbers from being -// called outside of the country), the method returns an empty string. -func FormatNumberForMobileDialing( - number *PhoneNumber, - regionCallingFrom string, - withFormatting bool) string { - - countryCallingCode := int(number.GetCountryCode()) - if !hasValidCountryCallingCode(countryCallingCode) { - return number.GetRawInput() // go impl defaults to "" - } - - formattedNumber := "" - // Clear the extension, as that part cannot normally be dialed - // together with the main number. - var numberNoExt = &PhoneNumber{} - proto.Merge(numberNoExt, number) - numberNoExt.Extension = nil // can we assume this is safe? (no nil-pointer?) - regionCode := GetRegionCodeForCountryCode(countryCallingCode) - numberType := GetNumberType(numberNoExt) - isValidNumber := numberType != UNKNOWN - if regionCallingFrom == regionCode { - isFixedLineOrMobile := - numberType == FIXED_LINE || - numberType == MOBILE || - numberType == FIXED_LINE_OR_MOBILE - // Carrier codes may be needed in some countries. We handle this here. - if regionCode == "CO" && numberType == FIXED_LINE { - formattedNumber = - FormatNationalNumberWithCarrierCode( - numberNoExt, COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX) - } else if regionCode == "BR" && isFixedLineOrMobile { - if numberNoExt.GetPreferredDomesticCarrierCode() != "" { - formattedNumber = - FormatNationalNumberWithPreferredCarrierCode(numberNoExt, "") - } else { - // Brazilian fixed line and mobile numbers need to be dialed - // with a carrier code when called within Brazil. Without - // that, most of the carriers won't connect the call. - // Because of that, we return an empty string here. - formattedNumber = "" - } - } else if isValidNumber && regionCode == "HU" { - // The national format for HU numbers doesn't contain the - // national prefix, because that is how numbers are normally - // written down. However, the national prefix is obligatory when - // dialing from a mobile phone, except for short numbers. As a - // result, we add it back here - // if it is a valid regular length phone number. - formattedNumber = - GetNddPrefixForRegion(regionCode, true /* strip non-digits */) + - " " + Format(numberNoExt, NATIONAL) - } else if countryCallingCode == NANPA_COUNTRY_CODE { - // For NANPA countries, we output international format for - // numbers that can be dialed internationally, since that - // always works, except for numbers which might potentially be - // short numbers, which are always dialled in national format. - regionMetadata := getMetadataForRegion(regionCallingFrom) - if canBeInternationallyDialled(numberNoExt) && - !isShorterThanPossibleNormalNumber(regionMetadata, - GetNationalSignificantNumber(numberNoExt)) { - formattedNumber = Format(numberNoExt, INTERNATIONAL) - } else { - formattedNumber = Format(numberNoExt, NATIONAL) - } - } else { - // For non-geographical countries, and Mexican and Chilean fixed - // line and mobile numbers, we output international format for - // numbers that can be dialed internationally as that always - // works. - - // MX fixed line and mobile numbers should always be formatted - // in international format, even when dialed within MX. For - // national format to work, a carrier code needs to be used, - // and the correct carrier code depends on if the caller and - // callee are from the same local area. It is trickier to get - // that to work correctly than using international format, which - // is tested to work fine on all carriers. CL fixed line - // numbers need the national prefix when dialing in the national - // format, but don't have it when used for display. The reverse - // is true for mobile numbers. As a result, we output them in - // the international format to make it work. - if regionCode == REGION_CODE_FOR_NON_GEO_ENTITY || - ((regionCode == "MX" || - regionCode == "CL") && - isFixedLineOrMobile) && - canBeInternationallyDialled(numberNoExt) { - formattedNumber = Format(numberNoExt, INTERNATIONAL) - } else { - formattedNumber = Format(numberNoExt, NATIONAL) - } - } - } else if isValidNumber && canBeInternationallyDialled(numberNoExt) { - // We assume that short numbers are not diallable from outside - // their region, so if a number is not a valid regular length - // phone number, we treat it as if it cannot be internationally - // dialled. - if withFormatting { - return Format(numberNoExt, INTERNATIONAL) - } - return Format(numberNoExt, E164) - } - if withFormatting { - return formattedNumber - } - return normalizeDiallableCharsOnly(formattedNumber) -} - -// Formats a phone number for out-of-country dialing purposes. If no -// regionCallingFrom is supplied, we format the number in its -// INTERNATIONAL format. If the country calling code is the same as that -// of the region where the number is from, then NATIONAL formatting will -// be applied. -// -// If the number itself has a country calling code of zero or an otherwise -// invalid country calling code, then we return the number with no -// formatting applied. -// -// Note this function takes care of the case for calling inside of NANPA and -// between Russia and Kazakhstan (who share the same country calling code). -// In those cases, no international prefix is used. For regions which have -// multiple international prefixes, the number in its INTERNATIONAL format -// will be returned instead. -func FormatOutOfCountryCallingNumber( - number *PhoneNumber, - regionCallingFrom string) string { - - if !isValidRegionCode(regionCallingFrom) { - return Format(number, INTERNATIONAL) - } - countryCallingCode := int(number.GetCountryCode()) - nationalSignificantNumber := GetNationalSignificantNumber(number) - if !hasValidCountryCallingCode(countryCallingCode) { - return nationalSignificantNumber - } - if countryCallingCode == NANPA_COUNTRY_CODE { - if IsNANPACountry(regionCallingFrom) { - // For NANPA regions, return the national format for these - // regions but prefix it with the country calling code. - return strconv.Itoa(countryCallingCode) + " " + Format(number, NATIONAL) - } - } else if countryCallingCode == getCountryCodeForValidRegion(regionCallingFrom) { - // If regions share a country calling code, the country calling - // code need not be dialled. This also applies when dialling - // within a region, so this if clause covers both these cases. - // Technically this is the case for dialling from La Reunion to - // other overseas departments of France (French Guiana, Martinique, - // Guadeloupe), but not vice versa - so we don't cover this edge - // case for now and for those cases return the version including - // country calling code. - // Details here: http://www.petitfute.com/voyage/225-info-pratiques-reunion - return Format(number, NATIONAL) - } - // Metadata cannot be null because we checked 'isValidRegionCode()' above. - metadataForRegionCallingFrom := getMetadataForRegion(regionCallingFrom) - internationalPrefix := metadataForRegionCallingFrom.GetInternationalPrefix() - - // For regions that have multiple international prefixes, the - // international format of the number is returned, unless there is - // a preferred international prefix. - internationalPrefixForFormatting := "" - metPref := metadataForRegionCallingFrom.GetPreferredInternationalPrefix() - if UNIQUE_INTERNATIONAL_PREFIX.MatchString(internationalPrefix) { - internationalPrefixForFormatting = internationalPrefix - } else if metPref != "" { - internationalPrefixForFormatting = metPref - } - - regionCode := GetRegionCodeForCountryCode(countryCallingCode) - // Metadata cannot be null because the country calling code is valid. - metadataForRegion := - getMetadataForRegionOrCallingCode(countryCallingCode, regionCode) - formattedNationalNumber := - formatNsn( - nationalSignificantNumber, metadataForRegion, INTERNATIONAL) - formattedNumber := NewBuilder([]byte(formattedNationalNumber)) - maybeAppendFormattedExtension(number, metadataForRegion, INTERNATIONAL, - formattedNumber) - if len(internationalPrefixForFormatting) > 0 { - formattedBytes := formattedNumber.Bytes() - formattedBytes = append([]byte(" "), formattedBytes...) - // we know countryCallingCode is really an int32 - intBuf := []byte{ - byte(countryCallingCode >> 24), - byte(countryCallingCode >> 16), - byte(countryCallingCode >> 8), - byte(countryCallingCode), - } - formattedBytes = append(intBuf, formattedBytes...) - formattedBytes = append([]byte(" "), formattedBytes...) - formattedBytes = append( - []byte(internationalPrefixForFormatting), formattedBytes...) - return string(formattedBytes) - } else { - prefixNumberWithCountryCallingCode( - countryCallingCode, INTERNATIONAL, formattedNumber) - } - return formattedNumber.String() -} - -// Formats a phone number using the original phone number format that the -// number is parsed from. The original format is embedded in the -// country_code_source field of the PhoneNumber object passed in. If such -// information is missing, the number will be formatted into the NATIONAL -// format by default. When the number contains a leading zero and this is -// unexpected for this country, or we don't have a formatting pattern for -// the number, the method returns the raw input when it is available. -// -// Note this method guarantees no digit will be inserted, removed or -// modified as a result of formatting. -func FormatInOriginalFormat(number *PhoneNumber, regionCallingFrom string) string { - rawInput := number.GetRawInput() - if len(rawInput) == 0 && !hasFormattingPatternForNumber(number) { - // We check if we have the formatting pattern because without that, we might format the number - // as a group without national prefix. - return rawInput - } - if number.GetCountryCodeSource() == 0 { - return Format(number, NATIONAL) - } - var formattedNumber string - switch number.GetCountryCodeSource() { - case PhoneNumber_FROM_NUMBER_WITH_PLUS_SIGN: - formattedNumber = Format(number, INTERNATIONAL) - case PhoneNumber_FROM_NUMBER_WITH_IDD: - formattedNumber = FormatOutOfCountryCallingNumber(number, regionCallingFrom) - case PhoneNumber_FROM_NUMBER_WITHOUT_PLUS_SIGN: - formattedNumber = Format(number, INTERNATIONAL)[1:] - case PhoneNumber_FROM_DEFAULT_COUNTRY: - // Fall-through to default case. - fallthrough - default: - regionCode := GetRegionCodeForCountryCode(int(number.GetCountryCode())) - // We strip non-digits from the NDD here, and from the raw - // input later, so that we can compare them easily. - nationalPrefix := GetNddPrefixForRegion( - regionCode, true /* strip non-digits */) - nationalFormat := Format(number, NATIONAL) - if len(nationalPrefix) == 0 || len(nationalPrefix) == 0 { - // If the region doesn't have a national prefix at all, - // we can safely return the national format without worrying - // about a national prefix being added. - formattedNumber = nationalFormat - break - } - // Otherwise, we check if the original number was entered with - // a national prefix. - if rawInputContainsNationalPrefix(rawInput, nationalPrefix, regionCode) { - // If so, we can safely return the national format. - formattedNumber = nationalFormat - } - // Metadata cannot be null here because GetNddPrefixForRegion() - // (above) returns null if there is no metadata for the region. - metadata := getMetadataForRegion(regionCode) - nationalNumber := GetNationalSignificantNumber(number) - formatRule := - chooseFormattingPatternForNumber(metadata.GetNumberFormat(), nationalNumber) - // The format rule could still be null here if the national - // number was 0 and there was no raw input (this should not - // be possible for numbers generated by the phonenumber library - // as they would also not have a country calling code and we - // would have exited earlier). - if formatRule == nil { - formattedNumber = nationalFormat - break - } - // When the format we apply to this number doesn't contain - // national prefix, we can just return the national format. - // TODO: Refactor the code below with the code in - // isNationalPrefixPresentIfRequired. - candidateNationalPrefixRule := formatRule.GetNationalPrefixFormattingRule() - // We assume that the first-group symbol will never be _before_ - // the national prefix. - indexOfFirstGroup := strings.Index(candidateNationalPrefixRule, "$1") - if indexOfFirstGroup <= 0 { - formattedNumber = nationalFormat - break - } - candidateNationalPrefixRule = - candidateNationalPrefixRule[0:indexOfFirstGroup] - candidateNationalPrefixRule = NormalizeDigitsOnly(candidateNationalPrefixRule) - if len(candidateNationalPrefixRule) == 0 { - // National prefix not used when formatting this number. - formattedNumber = nationalFormat - break - } - // Otherwise, we need to remove the national prefix from our output. - var numFormatCopy *NumberFormat - proto.Merge(numFormatCopy, formatRule) - numFormatCopy.NationalPrefixFormattingRule = nil - var numberFormats = []*NumberFormat{numFormatCopy} - formattedNumber = FormatByPattern(number, NATIONAL, numberFormats) - break - } - rawInput = number.GetRawInput() - // If no digit is inserted/removed/modified as a result of our - // formatting, we return the formatted phone number; otherwise we - // return the raw input the user entered. - if len(formattedNumber) != 0 && len(rawInput) > 0 { - normalizedFormattedNumber := normalizeDiallableCharsOnly(formattedNumber) - normalizedRawInput := normalizeDiallableCharsOnly(rawInput) - if normalizedFormattedNumber != normalizedRawInput { - formattedNumber = rawInput - } - } - return formattedNumber -} - -// Check if rawInput, which is assumed to be in the national format, has -// a national prefix. The national prefix is assumed to be in digits-only -// form. -func rawInputContainsNationalPrefix(rawInput, nationalPrefix, regionCode string) bool { - normalizedNationalNumber := NormalizeDigitsOnly(rawInput) - if strings.HasPrefix(normalizedNationalNumber, nationalPrefix) { - // Some Japanese numbers (e.g. 00777123) might be mistaken to - // contain the national prefix when written without it - // (e.g. 0777123) if we just do prefix matching. To tackle that, - // we check the validity of the number if the assumed national - // prefix is removed (777123 won't be valid in Japan). - num, err := Parse(normalizedNationalNumber[len(nationalPrefix):], regionCode) - if err != nil { - return false - } - return IsValidNumber(num) - - } - return false -} - -func hasFormattingPatternForNumber(number *PhoneNumber) bool { - countryCallingCode := int(number.GetCountryCode()) - phoneNumberRegion := GetRegionCodeForCountryCode(countryCallingCode) - metadata := getMetadataForRegionOrCallingCode( - countryCallingCode, phoneNumberRegion) - if metadata == nil { - return false - } - nationalNumber := GetNationalSignificantNumber(number) - formatRule := chooseFormattingPatternForNumber( - metadata.GetNumberFormat(), nationalNumber) - return formatRule != nil -} - -// Formats a phone number for out-of-country dialing purposes. -// -// Note that in this version, if the number was entered originally using -// alpha characters and this version of the number is stored in raw_input, -// this representation of the number will be used rather than the digit -// representation. Grouping information, as specified by characters -// such as "-" and " ", will be retained. -// -// Caveats: -// -// - This will not produce good results if the country calling code is -// both present in the raw input _and_ is the start of the national -// number. This is not a problem in the regions which typically use -// alpha numbers. -// - This will also not produce good results if the raw input has any -// grouping information within the first three digits of the national -// number, and if the function needs to strip preceding digits/words -// in the raw input before these digits. Normally people group the -// first three digits together so this is not a huge problem - and will -// be fixed if it proves to be so. -func FormatOutOfCountryKeepingAlphaChars( - number *PhoneNumber, - regionCallingFrom string) string { - - rawInput := number.GetRawInput() - // If there is no raw input, then we can't keep alpha characters - // because there aren't any. In this case, we return - // formatOutOfCountryCallingNumber. - if len(rawInput) == 0 { - return FormatOutOfCountryCallingNumber(number, regionCallingFrom) - } - countryCode := int(number.GetCountryCode()) - if !hasValidCountryCallingCode(countryCode) { - return rawInput - } - // Strip any prefix such as country calling code, IDD, that was - // present. We do this by comparing the number in raw_input with - // the parsed number. To do this, first we normalize punctuation. - // We retain number grouping symbols such as " " only. - rawInput = normalizeHelper(rawInput, ALL_PLUS_NUMBER_GROUPING_SYMBOLS, true) - // Now we trim everything before the first three digits in the - // parsed number. We choose three because all valid alpha numbers - // have 3 digits at the start - if it does not, then we don't trim - // anything at all. Similarly, if the national number was less than - // three digits, we don't trim anything at all. - nationalNumber := GetNationalSignificantNumber(number) - if len(nationalNumber) > 3 { - firstNationalNumberDigit := strings.Index(rawInput, nationalNumber[0:3]) - if firstNationalNumberDigit > -1 { - rawInput = rawInput[firstNationalNumberDigit:] - } - } - metadataForRegionCallingFrom := getMetadataForRegion(regionCallingFrom) - if countryCode == NANPA_COUNTRY_CODE { - if IsNANPACountry(regionCallingFrom) { - return strconv.Itoa(countryCode) + " " + rawInput - } - } else if metadataForRegionCallingFrom != nil && - countryCode == getCountryCodeForValidRegion(regionCallingFrom) { - formattingPattern := - chooseFormattingPatternForNumber( - metadataForRegionCallingFrom.GetNumberFormat(), - nationalNumber) - if formattingPattern == nil { - // If no pattern above is matched, we format the original input. - return rawInput - } - var newFormat *NumberFormat - proto.Merge(newFormat, formattingPattern) - // The first group is the first group of digits that the user - // wrote together. - newFormat.Pattern = proto.String("(\\d+)(.*)") - // Here we just concatenate them back together after the national - // prefix has been fixed. - newFormat.Format = proto.String("$1$2") - // Now we format using this pattern instead of the default pattern, - // but with the national prefix prefixed if necessary. This will not - // work in the cases where the pattern (and not the leading digits) - // decide whether a national prefix needs to be used, since we - // have overridden the pattern to match anything, but that is not - // the case in the metadata to date. - return formatNsnUsingPattern(rawInput, newFormat, NATIONAL) - } - var internationalPrefixForFormatting = "" - // If an unsupported region-calling-from is entered, or a country - // with multiple international prefixes, the international format - // of the number is returned, unless there is a preferred international - // prefix. - if metadataForRegionCallingFrom != nil { - internationalPrefix := metadataForRegionCallingFrom.GetInternationalPrefix() - internationalPrefixForFormatting = internationalPrefix - if !UNIQUE_INTERNATIONAL_PREFIX.MatchString(internationalPrefix) { - internationalPrefixForFormatting = - metadataForRegionCallingFrom.GetPreferredInternationalPrefix() - } - } - var formattedNumber = NewBuilder([]byte(rawInput)) - regionCode := GetRegionCodeForCountryCode(countryCode) - // Metadata cannot be null because the country calling code is valid. - var metadataForRegion *PhoneMetadata = getMetadataForRegionOrCallingCode(countryCode, regionCode) - maybeAppendFormattedExtension(number, metadataForRegion, - INTERNATIONAL, formattedNumber) - if len(internationalPrefixForFormatting) > 0 { - formattedBytes := append([]byte(" "), formattedNumber.Bytes()...) - // we know countryCode is really an int32 - intBuf := []byte{ - byte(countryCode >> 24), - byte(countryCode >> 16), - byte(countryCode >> 8), - byte(countryCode), - } - formattedBytes = append(intBuf, formattedBytes...) - formattedBytes = append([]byte(" "), formattedBytes...) - formattedBytes = append( - []byte(internationalPrefixForFormatting), formattedBytes...) - - formattedNumber = NewBuilder(formattedBytes) - } else { - // Invalid region entered as country-calling-from (so no metadata - // was found for it) or the region chosen has multiple international - // dialling prefixes. - prefixNumberWithCountryCallingCode(countryCode, - INTERNATIONAL, - formattedNumber) - } - return formattedNumber.String() -} - -// Gets the national significant number of the a phone number. Note a -// national significant number doesn't contain a national prefix or -// any formatting. -func GetNationalSignificantNumber(number *PhoneNumber) string { - // If leading zero(s) have been set, we prefix this now. Note this - // is not a national prefix. - nationalNumber := NewBuilder(nil) - if number.GetItalianLeadingZero() { - zeros := make([]byte, number.GetNumberOfLeadingZeros()) - for i := range zeros { - zeros[i] = '0' - } - nationalNumber.Write(zeros) - } - asStr := strconv.FormatUint(number.GetNationalNumber(), 10) - nationalNumber.WriteString(asStr) - - return nationalNumber.String() -} - -// A helper function that is used by format and formatByPattern. -func prefixNumberWithCountryCallingCode( - countryCallingCode int, - numberFormat PhoneNumberFormat, - formattedNumber *Builder) { - - // TODO(ttacon): add some sort of BulkWrite builder to Builder - // also that name isn't too awesome...:) - newBuf := NewBuilder(nil) - switch numberFormat { - case E164: - newBuf.WriteString(string(PLUS_SIGN)) - newBuf.Write(strconv.AppendInt([]byte{}, int64(countryCallingCode), 10)) - newBuf.Write(formattedNumber.Bytes()) - case INTERNATIONAL: - newBuf.WriteString(string(PLUS_SIGN)) - newBuf.Write(strconv.AppendInt([]byte{}, int64(countryCallingCode), 10)) - newBuf.WriteString(" ") - newBuf.Write(formattedNumber.Bytes()) - case RFC3966: - newBuf.WriteString(RFC3966_PREFIX) - newBuf.WriteString(string(PLUS_SIGN)) - newBuf.Write(strconv.AppendInt([]byte{}, int64(countryCallingCode), 10)) - newBuf.WriteString("-") - newBuf.Write(formattedNumber.Bytes()) - case NATIONAL: - fallthrough - default: - newBuf.Write(formattedNumber.Bytes()) - } - formattedNumber.ResetWith(newBuf.Bytes()) -} - -// Simple wrapper of formatNsn for the common case of no carrier code. -func formatNsn( - number string, metadata *PhoneMetadata, numberFormat PhoneNumberFormat) string { - return formatNsnWithCarrier(number, metadata, numberFormat, "") -} - -// Note in some regions, the national number can be written in two -// completely different ways depending on whether it forms part of the -// NATIONAL format or INTERNATIONAL format. The numberFormat parameter -// here is used to specify which format to use for those cases. If a -// carrierCode is specified, this will be inserted into the formatted -// string to replace $CC. -func formatNsnWithCarrier(number string, metadata *PhoneMetadata, numberFormat PhoneNumberFormat, carrierCode string) string { - var intlNumberFormats []*NumberFormat = metadata.GetIntlNumberFormat() - // When the intlNumberFormats exists, we use that to format national - // number for the INTERNATIONAL format instead of using the - // numberDesc.numberFormats. - var availableFormats []*NumberFormat = metadata.GetIntlNumberFormat() - if len(intlNumberFormats) == 0 || numberFormat == NATIONAL { - availableFormats = metadata.GetNumberFormat() - } - var formattingPattern *NumberFormat = chooseFormattingPatternForNumber(availableFormats, number) - if formattingPattern == nil { - return number - } - return formatNsnUsingPatternWithCarrier( - number, formattingPattern, numberFormat, carrierCode) -} - -func chooseFormattingPatternForNumber( - availableFormats []*NumberFormat, - nationalNumber string) *NumberFormat { - - for _, numFormat := range availableFormats { - leadingDigitsPattern := numFormat.GetLeadingDigitsPattern() - size := len(leadingDigitsPattern) - - patP := `^(?:` + numFormat.GetPattern() + `)$` // Strictly match - m, ok := readFromRegexCache(numFormat.GetPattern()) - if !ok { - m = regexp.MustCompile(patP) - writeToRegexCache(patP, m) - } - - if size == 0 { - mat := m.FindString(nationalNumber) - if m.MatchString(nationalNumber) && len(mat) == len(nationalNumber) { - return numFormat - } else { - continue - } - } - - // We always use the last leading_digits_pattern, as it is the - // most detailed. - reg, ok := readFromRegexCache(leadingDigitsPattern[size-1]) - if !ok { - pat := leadingDigitsPattern[size-1] - reg = regexp.MustCompile(pat) - writeToRegexCache(pat, reg) - } - - inds := reg.FindStringIndex(nationalNumber) - if len(inds) > 0 && inds[0] == 0 && m.MatchString(nationalNumber) { // inds[0] == 0 ensures strict match of leading digits - return numFormat - } - } - return nil -} - -// Simple wrapper of formatNsnUsingPattern for the common case of no carrier code. -func formatNsnUsingPattern( - nationalNumber string, - formattingPattern *NumberFormat, - numberFormat PhoneNumberFormat) string { - return formatNsnUsingPatternWithCarrier( - nationalNumber, formattingPattern, numberFormat, "") -} - -// Note that carrierCode is optional - if null or an empty string, no -// carrier code replacement will take place. -func formatNsnUsingPatternWithCarrier( - nationalNumber string, - formattingPattern *NumberFormat, - numberFormat PhoneNumberFormat, - carrierCode string) string { - - numberFormatRule := formattingPattern.GetFormat() - m, ok := readFromRegexCache(formattingPattern.GetPattern()) - if !ok { - pat := formattingPattern.GetPattern() - m = regexp.MustCompile(pat) - writeToRegexCache(pat, m) - } - - formattedNationalNumber := "" - if numberFormat == NATIONAL && - len(carrierCode) > 0 && - len(formattingPattern.GetDomesticCarrierCodeFormattingRule()) > 0 { - // Replace the $CC in the formatting rule with the desired carrier code. - carrierCodeFormattingRule := formattingPattern.GetDomesticCarrierCodeFormattingRule() - i := 1 - carrierCodeFormattingRule = - CC_PATTERN.ReplaceAllStringFunc(carrierCodeFormattingRule, - func(s string) string { - if i > 0 { - i -= 1 - return carrierCode - } - return s - }) - // Now replace the $FG in the formatting rule with the first group - // and the carrier code combined in the appropriate way. - i = 1 - numberFormatRule = FIRST_GROUP_PATTERN.ReplaceAllStringFunc( - numberFormatRule, - func(s string) string { - if i > 0 { - i -= 1 - return carrierCodeFormattingRule - } - return s - }) - formattedNationalNumber = m.ReplaceAllString(numberFormatRule, nationalNumber) - } else { - // Use the national prefix formatting rule instead. - nationalPrefixFormattingRule := - formattingPattern.GetNationalPrefixFormattingRule() - if numberFormat == NATIONAL && - len(nationalPrefixFormattingRule) > 0 { - i := 1 - fgp := FIRST_GROUP_PATTERN.ReplaceAllStringFunc(numberFormatRule, - func(s string) string { - if i > 0 { - i -= 1 - return nationalPrefixFormattingRule - } - return s - }) - formattedNationalNumber = m.ReplaceAllString(nationalNumber, fgp) - } else { - formattedNationalNumber = m.ReplaceAllString( - nationalNumber, - numberFormatRule, - ) - } - } - if numberFormat == RFC3966 { - // Strip any leading punctuation. - inds := SEPARATOR_PATTERN.FindStringIndex(formattedNationalNumber) - if len(inds) > 0 && inds[0] == 0 { - formattedNationalNumber = formattedNationalNumber[inds[1]:] - } - allStr := NOT_SEPARATOR_PATTERN.FindAllString(formattedNationalNumber, -1) - formattedNationalNumber = strings.Join(allStr, "-") - } - return formattedNationalNumber -} - -// Gets a valid number for the specified region. -func GetExampleNumber(regionCode string) *PhoneNumber { - return GetExampleNumberForType(regionCode, FIXED_LINE) -} - -// Gets a valid number for the specified region and number type. -func GetExampleNumberForType(regionCode string, typ PhoneNumberType) *PhoneNumber { - // Check the region code is valid. - if !isValidRegionCode(regionCode) { - return nil - } - //PhoneNumberDesc (pointer?) - var desc = getNumberDescByType(getMetadataForRegion(regionCode), typ) - exNum := desc.GetExampleNumber() - if len(exNum) > 0 { - num, err := Parse(exNum, regionCode) - if err != nil { - return nil - } - return num - } - return nil -} - -// Gets a valid number for the specified country calling code for a non-geographical entity. -func GetExampleNumberForNonGeoEntity(countryCallingCode int) *PhoneNumber { - var metadata *PhoneMetadata = getMetadataForNonGeographicalRegion(countryCallingCode) - if metadata == nil { - return nil - } - - // For geographical entities, fixed-line data is always present. However, for non-geographical - // entities, this is not the case, so we have to go through different types to find the - // example number. - descPriority := []*PhoneNumberDesc{metadata.GetMobile(), metadata.GetTollFree(), - metadata.GetSharedCost(), metadata.GetVoip(), metadata.GetVoicemail(), metadata.GetUan(), metadata.GetPremiumRate()} - - for _, desc := range descPriority { - if desc != nil && desc.GetExampleNumber() != "" { - num, err := Parse("+"+strconv.Itoa(countryCallingCode)+desc.GetExampleNumber(), "ZZ") - if err != nil { - return nil - } - return num - } - } - return nil -} - -// Appends the formatted extension of a phone number to formattedNumber, -// if the phone number had an extension specified. -func maybeAppendFormattedExtension( - number *PhoneNumber, - metadata *PhoneMetadata, - numberFormat PhoneNumberFormat, - formattedNumber *Builder) { - - extension := number.GetExtension() - if len(extension) == 0 { - return - } - - prefExtn := metadata.GetPreferredExtnPrefix() - if numberFormat == RFC3966 { - formattedNumber.WriteString(RFC3966_EXTN_PREFIX) - } else if len(prefExtn) > 0 { - formattedNumber.WriteString(prefExtn) - } else { - formattedNumber.WriteString(DEFAULT_EXTN_PREFIX) - } - formattedNumber.WriteString(extension) -} - -func getNumberDescByType( - metadata *PhoneMetadata, - typ PhoneNumberType) *PhoneNumberDesc { - - switch typ { - case PREMIUM_RATE: - return metadata.GetPremiumRate() - case TOLL_FREE: - return metadata.GetTollFree() - case MOBILE: - return metadata.GetMobile() - case FIXED_LINE: - fallthrough - case FIXED_LINE_OR_MOBILE: - return metadata.GetFixedLine() - case SHARED_COST: - return metadata.GetSharedCost() - case VOIP: - return metadata.GetVoip() - case PERSONAL_NUMBER: - return metadata.GetPersonalNumber() - case PAGER: - return metadata.GetPager() - case UAN: - return metadata.GetUan() - case VOICEMAIL: - return metadata.GetVoicemail() - default: - return metadata.GetGeneralDesc() - } -} - -// Gets the type of a phone number. -func GetNumberType(number *PhoneNumber) PhoneNumberType { - var regionCode string = GetRegionCodeForNumber(number) - var metadata *PhoneMetadata = getMetadataForRegionOrCallingCode( - int(number.GetCountryCode()), regionCode) - if metadata == nil { - return UNKNOWN - } - var nationalSignificantNumber = GetNationalSignificantNumber(number) - return getNumberTypeHelper(nationalSignificantNumber, metadata) -} - -func getNumberTypeHelper( - nationalNumber string, - metadata *PhoneMetadata) PhoneNumberType { - - var generalNumberDesc *PhoneNumberDesc = metadata.GetGeneralDesc() - var natNumPat = generalNumberDesc.GetNationalNumberPattern() - if len(natNumPat) == 0 || - !isNumberMatchingDesc(nationalNumber, generalNumberDesc) { - return UNKNOWN - } - - if isNumberMatchingDesc(nationalNumber, metadata.GetPremiumRate()) { - return PREMIUM_RATE - } - if isNumberMatchingDesc(nationalNumber, metadata.GetTollFree()) { - return TOLL_FREE - } - if isNumberMatchingDesc(nationalNumber, metadata.GetSharedCost()) { - return SHARED_COST - } - if isNumberMatchingDesc(nationalNumber, metadata.GetVoip()) { - return VOIP - } - if isNumberMatchingDesc(nationalNumber, metadata.GetPersonalNumber()) { - return PERSONAL_NUMBER - } - if isNumberMatchingDesc(nationalNumber, metadata.GetPager()) { - return PAGER - } - if isNumberMatchingDesc(nationalNumber, metadata.GetUan()) { - return UAN - } - if isNumberMatchingDesc(nationalNumber, metadata.GetVoicemail()) { - return VOICEMAIL - } - - var isFixedLine = isNumberMatchingDesc( - nationalNumber, metadata.GetFixedLine()) - - if isFixedLine { - if metadata.GetSameMobileAndFixedLinePattern() { - return FIXED_LINE_OR_MOBILE - } else if isNumberMatchingDesc(nationalNumber, metadata.GetMobile()) { - return FIXED_LINE_OR_MOBILE - } - return FIXED_LINE - } - // Otherwise, test to see if the number is mobile. Only do this if - // certain that the patterns for mobile and fixed line aren't the same. - if !metadata.GetSameMobileAndFixedLinePattern() && - isNumberMatchingDesc(nationalNumber, metadata.GetMobile()) { - return MOBILE - } - return UNKNOWN -} - -// Returns the metadata for the given region code or nil if the region -// code is invalid or unknown. -func getMetadataForRegion(regionCode string) *PhoneMetadata { - if !isValidRegionCode(regionCode) { - return nil - } - val, _ := readFromRegionToMetadataMap(regionCode) - return val -} - -func getMetadataForNonGeographicalRegion(countryCallingCode int) *PhoneMetadata { - _, ok := CountryCodeToRegion[countryCallingCode] - if !ok { - return nil - } - val, _ := readFromCountryCodeToNonGeographicalMetadataMap(countryCallingCode) - return val -} - -func isNumberPossibleForDesc( - nationalNumber string, numberDesc *PhoneNumberDesc) bool { - - possiblePattern := "^(?:" + numberDesc.GetPossibleNumberPattern() + ")$" // Strictly match - pat, ok := readFromRegexCache(possiblePattern) - if !ok { - pat = regexp.MustCompile(possiblePattern) - writeToRegexCache(possiblePattern, pat) - } - return pat.MatchString(nationalNumber) -} - -func isNumberMatchingDesc(nationalNumber string, numberDesc *PhoneNumberDesc) bool { - patP := "^(?:" + numberDesc.GetNationalNumberPattern() + ")$" // Strictly match - pat, ok := readFromRegexCache(patP) - if !ok { - pat = regexp.MustCompile(patP) - writeToRegexCache(patP, pat) - } - return isNumberPossibleForDesc(nationalNumber, numberDesc) && - pat.MatchString(nationalNumber) - -} - -// Tests whether a phone number matches a valid pattern. Note this doesn't -// verify the number is actually in use, which is impossible to tell by -// just looking at a number itself. -func IsValidNumber(number *PhoneNumber) bool { - var regionCode string = GetRegionCodeForNumber(number) - return IsValidNumberForRegion(number, regionCode) -} - -// Tests whether a phone number is valid for a certain region. Note this -// doesn't verify the number is actually in use, which is impossible to -// tell by just looking at a number itself. If the country calling code is -// not the same as the country calling code for the region, this immediately -// exits with false. After this, the specific number pattern rules for the -// region are examined. This is useful for determining for example whether -// a particular number is valid for Canada, rather than just a valid NANPA -// number. -// Warning: In most cases, you want to use IsValidNumber() instead. For -// example, this method will mark numbers from British Crown dependencies -// such as the Isle of Man as invalid for the region "GB" (United Kingdom), -// since it has its own region code, "IM", which may be undesirable. -func IsValidNumberForRegion(number *PhoneNumber, regionCode string) bool { - var countryCode int = int(number.GetCountryCode()) - var metadata *PhoneMetadata = getMetadataForRegionOrCallingCode( - countryCode, regionCode) - if metadata == nil || - (REGION_CODE_FOR_NON_GEO_ENTITY != regionCode && - countryCode != getCountryCodeForValidRegion(regionCode)) { - // Either the region code was invalid, or the country calling - // code for this number does not match that of the region code. - return false - } - var generalNumDesc *PhoneNumberDesc = metadata.GetGeneralDesc() - var nationalSignificantNumber string = GetNationalSignificantNumber(number) - // For regions where we don't have metadata for PhoneNumberDesc, we - // treat any number passed in as a valid number if its national - // significant number is between the minimum and maximum lengths - // defined by ITU for a national significant number. - if len(generalNumDesc.GetNationalNumberPattern()) == 0 { - var numberLength int = len(nationalSignificantNumber) - return numberLength > MIN_LENGTH_FOR_NSN && - numberLength <= MAX_LENGTH_FOR_NSN - } - return getNumberTypeHelper(nationalSignificantNumber, metadata) != UNKNOWN -} - -// Returns the region where a phone number is from. This could be used for -// geocoding at the region level. -func GetRegionCodeForNumber(number *PhoneNumber) string { - var countryCode int = int(number.GetCountryCode()) - var regions []string = CountryCodeToRegion[countryCode] - if len(regions) == 0 { - return "" - } - if len(regions) == 1 { - return regions[0] - } - return getRegionCodeForNumberFromRegionList(number, regions) -} - -func getRegionCodeForNumberFromRegionList( - number *PhoneNumber, - regionCodes []string) string { - - var nationalNumber string = GetNationalSignificantNumber(number) - for _, regionCode := range regionCodes { - // If leadingDigits is present, use this. Otherwise, do - // full validation. Metadata cannot be null because the - // region codes come from the country calling code map. - var metadata *PhoneMetadata = getMetadataForRegion(regionCode) - if len(metadata.GetLeadingDigits()) > 0 { - patP := "^(?:" + metadata.GetLeadingDigits() + ")" // Non capturing grouping to support OR'ed alternatives (e.g. 555|1[78]|2) - pat, ok := readFromRegexCache(patP) - if !ok { - pat = regexp.MustCompile(patP) - writeToRegexCache(patP, pat) - } - if pat.MatchString(nationalNumber) { - return regionCode - } - } else if getNumberTypeHelper(nationalNumber, metadata) != UNKNOWN { - return regionCode - } - } - return "" -} - -// Returns the region code that matches the specific country calling code. -// In the case of no region code being found, ZZ will be returned. In the -// case of multiple regions, the one designated in the metadata as the -// "main" region for this calling code will be returned. If the -// countryCallingCode entered is valid but doesn't match a specific region -// (such as in the case of non-geographical calling codes like 800) the -// value "001" will be returned (corresponding to the value for World in -// the UN M.49 schema). -func GetRegionCodeForCountryCode(countryCallingCode int) string { - var regionCodes []string = CountryCodeToRegion[countryCallingCode] - if len(regionCodes) == 0 { - return UNKNOWN_REGION - } - return regionCodes[0] -} - -// Returns a list with the region codes that match the specific country -// calling code. For non-geographical country calling codes, the region -// code 001 is returned. Also, in the case of no region code being found, -// an empty list is returned. -func GetRegionCodesForCountryCode(countryCallingCode int) []string { - var regionCodes []string = CountryCodeToRegion[countryCallingCode] - return regionCodes -} - -// Returns the country calling code for a specific region. For example, this -// would be 1 for the United States, and 64 for New Zealand. -func GetCountryCodeForRegion(regionCode string) int { - if !isValidRegionCode(regionCode) { - return 0 - } - return getCountryCodeForValidRegion(regionCode) -} - -// Returns the country calling code for a specific region. For example, -// this would be 1 for the United States, and 64 for New Zealand. Assumes -// the region is already valid. -func getCountryCodeForValidRegion(regionCode string) int { - var metadata *PhoneMetadata = getMetadataForRegion(regionCode) - return int(metadata.GetCountryCode()) -} - -// Returns the national dialling prefix for a specific region. For example, -// this would be 1 for the United States, and 0 for New Zealand. Set -// stripNonDigits to true to strip symbols like "~" (which indicates a -// wait for a dialling tone) from the prefix returned. If no national prefix -// is present, we return null. -// -// Warning: Do not use this method for do-your-own formatting - for some -// regions, the national dialling prefix is used only for certain types -// of numbers. Use the library's formatting functions to prefix the -// national prefix when required. -func GetNddPrefixForRegion(regionCode string, stripNonDigits bool) string { - var metadata *PhoneMetadata = getMetadataForRegion(regionCode) - if metadata == nil { - return "" - } - var nationalPrefix string = metadata.GetNationalPrefix() - // If no national prefix was found, we return an empty string. - if len(nationalPrefix) == 0 { - return "" - } - if stripNonDigits { - // Note: if any other non-numeric symbols are ever used in - // national prefixes, these would have to be removed here as well. - nationalPrefix = strings.Replace(nationalPrefix, "~", "", -1) - } - return nationalPrefix -} - -// Checks if this is a region under the North American Numbering Plan -// Administration (NANPA). -func IsNANPACountry(regionCode string) bool { - _, ok := readFromNanpaRegions(regionCode) - return ok -} - -// Checks if the number is a valid vanity (alpha) number such as 800 -// MICROSOFT. A valid vanity number will start with at least 3 digits and -// will have three or more alpha characters. This does not do -// region-specific checks - to work out if this number is actually valid -// for a region, it should be parsed and methods such as -// IsPossibleNumberWithReason() and IsValidNumber() should be used. -func IsAlphaNumber(number string) bool { - if !isViablePhoneNumber(number) { - // Number is too short, or doesn't match the basic phone - // number pattern. - return false - } - strippedNumber := NewBuilderString(number) - maybeStripExtension(strippedNumber) - return VALID_ALPHA_PHONE_PATTERN.MatchString(strippedNumber.String()) -} - -// Convenience wrapper around IsPossibleNumberWithReason(). Instead of -// returning the reason for failure, this method returns a boolean value. -func IsPossibleNumber(number *PhoneNumber) bool { - return IsPossibleNumberWithReason(number) == IS_POSSIBLE -} - -// Helper method to check a number against a particular pattern and -// determine whether it matches, or is too short or too long. Currently, -// if a number pattern suggests that numbers of length 7 and 10 are -// possible, and a number in between these possible lengths is entered, -// such as of length 8, this will return TOO_LONG. -func testNumberLengthAgainstPattern( - numberPattern *regexp.Regexp, - number string) ValidationResult { - - inds := numberPattern.FindStringIndex(number) - if len(inds) > 0 && inds[0] == 0 { // Match from the start - if inds[1] == len(number) { // Exact match - return IS_POSSIBLE - } - return TOO_LONG // Matches input start but not end - } - - return TOO_SHORT // Does not match input start -} - -// Helper method to check whether a number is too short to be a regular -// length phone number in a region. -func isShorterThanPossibleNormalNumber( - regionMetadata *PhoneMetadata, - number string) bool { - - pat, ok := readFromRegexCache(regionMetadata.GetGeneralDesc().GetPossibleNumberPattern()) - if !ok { - patP := regionMetadata.GetGeneralDesc().GetPossibleNumberPattern() - pat = regexp.MustCompile(patP) - writeToRegexCache(patP, pat) - } - return testNumberLengthAgainstPattern(pat, number) == TOO_SHORT -} - -// Check whether a phone number is a possible number. It provides a more -// lenient check than IsValidNumber() in the following sense: -// -// - It only checks the length of phone numbers. In particular, it -// doesn't check starting digits of the number. -// - It doesn't attempt to figure out the type of the number, but uses -// general rules which applies to all types of phone numbers in a -// region. Therefore, it is much faster than isValidNumber. -// - For fixed line numbers, many regions have the concept of area code, -// which together with subscriber number constitute the national -// significant number. It is sometimes okay to dial the subscriber number -// only when dialing in the same area. This function will return true -// if the subscriber-number-only version is passed in. On the other hand, -// because isValidNumber validates using information on both starting -// digits (for fixed line numbers, that would most likely be area codes) -// and length (obviously includes the length of area codes for fixed -// line numbers), it will return false for the subscriber-number-only -// version. -func IsPossibleNumberWithReason(number *PhoneNumber) ValidationResult { - nationalNumber := GetNationalSignificantNumber(number) - countryCode := int(number.GetCountryCode()) - // Note: For Russian Fed and NANPA numbers, we just use the rules - // from the default region (US or Russia) since the - // getRegionCodeForNumber will not work if the number is possible - // but not valid. This would need to be revisited if the possible - // number pattern ever differed between various regions within - // those plans. - if !hasValidCountryCallingCode(countryCode) { - return INVALID_COUNTRY_CODE - } - regionCode := GetRegionCodeForCountryCode(countryCode) - // Metadata cannot be null because the country calling code is valid. - var metadata *PhoneMetadata = getMetadataForRegionOrCallingCode( - countryCode, regionCode) - var generalNumDesc *PhoneNumberDesc = metadata.GetGeneralDesc() - // Handling case of numbers with no metadata. - if len(generalNumDesc.GetNationalNumberPattern()) == 0 { - numberLength := len(nationalNumber) - if numberLength < MIN_LENGTH_FOR_NSN { - return TOO_SHORT - } else if numberLength > MAX_LENGTH_FOR_NSN { - return TOO_LONG - } else { - return IS_POSSIBLE - } - } - pat, ok := readFromRegexCache(generalNumDesc.GetPossibleNumberPattern()) - if !ok { - patP := generalNumDesc.GetPossibleNumberPattern() - pat = regexp.MustCompile(patP) - writeToRegexCache(patP, pat) - } - return testNumberLengthAgainstPattern(pat, nationalNumber) -} - -// Check whether a phone number is a possible number given a number in the -// form of a string, and the region where the number could be dialed from. -// It provides a more lenient check than IsValidNumber(). See -// IsPossibleNumber(PhoneNumber) for details. -// -// This method first parses the number, then invokes -// IsPossibleNumber(PhoneNumber) with the resultant PhoneNumber object. -func isPossibleNumberWithRegion(number, regionDialingFrom string) bool { - num, err := Parse(number, regionDialingFrom) - if err != nil { - return false - } - return IsPossibleNumber(num) -} - -// Attempts to extract a valid number from a phone number that is too long -// to be valid, and resets the PhoneNumber object passed in to that valid -// version. If no valid number could be extracted, the PhoneNumber object -// passed in will not be modified. -func TruncateTooLongNumber(number *PhoneNumber) bool { - if IsValidNumber(number) { - return true - } - var numberCopy *PhoneNumber - proto.Merge(numberCopy, number) - nationalNumber := number.GetNationalNumber() - nationalNumber /= 10 - numberCopy.NationalNumber = proto.Uint64(nationalNumber) - if IsPossibleNumberWithReason(numberCopy) == TOO_SHORT || nationalNumber == 0 { - return false - } - for !IsValidNumber(numberCopy) { - nationalNumber /= 10 - numberCopy.NationalNumber = proto.Uint64(nationalNumber) - if IsPossibleNumberWithReason(numberCopy) == TOO_SHORT || - nationalNumber == 0 { - return false - } - } - - number.NationalNumber = proto.Uint64(nationalNumber) - return true -} - -// Gets an AsYouTypeFormatter for the specific region. -// TODO(ttacon): uncomment once we do asyoutypeformatter.go -//public AsYouTypeFormatter getAsYouTypeFormatter(String regionCode) { -// return new AsYouTypeFormatter(regionCode); -//} - -// Extracts country calling code from fullNumber, returns it and places -// the remaining number in nationalNumber. It assumes that the leading plus -// sign or IDD has already been removed. Returns 0 if fullNumber doesn't -// start with a valid country calling code, and leaves nationalNumber -// unmodified. -func extractCountryCode(fullNumber, nationalNumber *Builder) int { - fullNumBytes := fullNumber.Bytes() - if len(fullNumBytes) == 0 || fullNumBytes[0] == '0' { - // Country codes do not begin with a '0'. - return 0 - } - var ( - potentialCountryCode int - numberLength = len(fullNumBytes) - ) - for i := 1; i <= MAX_LENGTH_COUNTRY_CODE && i <= numberLength; i++ { - potentialCountryCode, _ = strconv.Atoi(string(fullNumBytes[0:i])) - if _, ok := CountryCodeToRegion[potentialCountryCode]; ok { - nationalNumber.Write(fullNumBytes[i:]) - return potentialCountryCode - } - } - return 0 -} - -var ErrTooShortAfterIDD = errors.New("Phone number had an IDD, but " + - "after this was not long enough to be a viable phone number.") - -// Tries to extract a country calling code from a number. This method will -// return zero if no country calling code is considered to be present. -// Country calling codes are extracted in the following ways: -// -// - by stripping the international dialing prefix of the region the -// person is dialing from, if this is present in the number, and looking -// at the next digits -// - by stripping the '+' sign if present and then looking at the next digits -// - by comparing the start of the number and the country calling code of -// the default region. If the number is not considered possible for the -// numbering plan of the default region initially, but starts with the -// country calling code of this region, validation will be reattempted -// after stripping this country calling code. If this number is considered a -// possible number, then the first digits will be considered the country -// calling code and removed as such. -// -// It will throw a NumberParseException if the number starts with a '+' but -// the country calling code supplied after this does not match that of any -// known region. -func maybeExtractCountryCode( - number string, - defaultRegionMetadata *PhoneMetadata, - nationalNumber *Builder, - keepRawInput bool, - phoneNumber *PhoneNumber) (int, error) { - - if len(number) == 0 { - return 0, nil - } - fullNumber := NewBuilderString(number) - // Set the default prefix to be something that will never match. - possibleCountryIddPrefix := "NonMatch" - if defaultRegionMetadata != nil { - possibleCountryIddPrefix = defaultRegionMetadata.GetInternationalPrefix() - } - - countryCodeSource := - maybeStripInternationalPrefixAndNormalize(fullNumber, possibleCountryIddPrefix) - if keepRawInput { - phoneNumber.CountryCodeSource = &countryCodeSource - } - if countryCodeSource != PhoneNumber_FROM_DEFAULT_COUNTRY { - if len(fullNumber.String()) <= MIN_LENGTH_FOR_NSN { - return 0, ErrTooShortAfterIDD - } - potentialCountryCode := extractCountryCode(fullNumber, nationalNumber) - if potentialCountryCode != 0 { - phoneNumber.CountryCode = proto.Int(potentialCountryCode) - return potentialCountryCode, nil - } - - // If this fails, they must be using a strange country calling code - // that we don't recognize, or that doesn't exist. - return 0, ErrInvalidCountryCode - } else if defaultRegionMetadata != nil { - // Check to see if the number starts with the country calling code - // for the default region. If so, we remove the country calling - // code, and do some checks on the validity of the number before - // and after. - defaultCountryCode := int(defaultRegionMetadata.GetCountryCode()) - defaultCountryCodeString := strconv.Itoa(defaultCountryCode) - normalizedNumber := fullNumber.String() - if strings.HasPrefix(normalizedNumber, defaultCountryCodeString) { - var ( - potentialNationalNumber = NewBuilderString( - normalizedNumber[len(defaultCountryCodeString):]) - generalDesc = defaultRegionMetadata.GetGeneralDesc() - patP = `^(?:` + generalDesc.GetNationalNumberPattern() + `)$` // Strictly match - validNumberPattern, ok = readFromRegexCache(patP) - ) - if !ok { - validNumberPattern = regexp.MustCompile(patP) - writeToRegexCache(patP, validNumberPattern) - } - maybeStripNationalPrefixAndCarrierCode( - potentialNationalNumber, - defaultRegionMetadata, - NewBuilder(nil) /* Don't need the carrier code */) - possibleNumberPattern, ok := readFromRegexCache(generalDesc.GetPossibleNumberPattern()) - if !ok { - pat := generalDesc.GetPossibleNumberPattern() - possibleNumberPattern = regexp.MustCompile(pat) - writeToRegexCache(pat, possibleNumberPattern) - } - // If the number was not valid before but is valid now, or - // if it was too long before, we consider the number with - // the country calling code stripped to be a better result and - // keep that instead. - if (!validNumberPattern.MatchString(fullNumber.String()) && - validNumberPattern.MatchString(potentialNationalNumber.String())) || - testNumberLengthAgainstPattern( - possibleNumberPattern, fullNumber.String()) == TOO_LONG { - nationalNumber.Write(potentialNationalNumber.Bytes()) - if keepRawInput { - val := PhoneNumber_FROM_NUMBER_WITHOUT_PLUS_SIGN - phoneNumber.CountryCodeSource = &val - } - phoneNumber.CountryCode = proto.Int(defaultCountryCode) - return defaultCountryCode, nil - } - } - } - // No country calling code present. - phoneNumber.CountryCode = proto.Int(0) - return 0, nil -} - -// Strips the IDD from the start of the number if present. Helper function -// used by maybeStripInternationalPrefixAndNormalize. -func parsePrefixAsIdd(iddPattern *regexp.Regexp, number *Builder) bool { - numStr := number.String() - ind := iddPattern.FindStringIndex(numStr) - if len(ind) == 0 || ind[0] != 0 { - return false - } - matchEnd := ind[1] // ind is a two element slice - // Only strip this if the first digit after the match is not - // a 0, since country calling codes cannot begin with 0. - find := CAPTURING_DIGIT_PATTERN.FindAllString(numStr[matchEnd:], -1) - if len(find) > 0 { - if NormalizeDigitsOnly(find[0]) == "0" { - return false - } - } - - numBytes := []byte(numStr) - number.ResetWith(numBytes[matchEnd:]) - return true -} - -// Strips any international prefix (such as +, 00, 011) present in the -// number provided, normalizes the resulting number, and indicates if -// an international prefix was present. -func maybeStripInternationalPrefixAndNormalize( - number *Builder, - possibleIddPrefix string) PhoneNumber_CountryCodeSource { - - numBytes := number.Bytes() - if len(numBytes) == 0 { - return PhoneNumber_FROM_DEFAULT_COUNTRY - } - // Check to see if the number begins with one or more plus signs. - ind := PLUS_CHARS_PATTERN.FindIndex(numBytes) // Return is an int pair [start,end] - if len(ind) > 0 && ind[0] == 0 { // Strictly match from string start - number.ResetWith(numBytes[ind[1]:]) - // Can now normalize the rest of the number since we've consumed - // the "+" sign at the start. - number.ResetWithString(normalize(number.String())) - return PhoneNumber_FROM_NUMBER_WITH_PLUS_SIGN - } - - // Attempt to parse the first digits as an international prefix. - iddPattern, ok := readFromRegexCache(possibleIddPrefix) - if !ok { - pat := possibleIddPrefix - iddPattern = regexp.MustCompile(pat) - writeToRegexCache(pat, iddPattern) - } - number.ResetWithString(normalize(string(numBytes))) - if parsePrefixAsIdd(iddPattern, number) { - return PhoneNumber_FROM_NUMBER_WITH_IDD - } - return PhoneNumber_FROM_DEFAULT_COUNTRY -} - -// Strips any national prefix (such as 0, 1) present in the number provided. -// @VisibleForTesting -func maybeStripNationalPrefixAndCarrierCode( - number *Builder, - metadata *PhoneMetadata, - carrierCode *Builder) bool { - - numberLength := len(number.String()) - possibleNationalPrefix := metadata.GetNationalPrefixForParsing() - if numberLength == 0 || len(possibleNationalPrefix) == 0 { - // Early return for numbers of zero length. - return false - } - possibleNationalPrefix = "^(?:" + possibleNationalPrefix + ")" // Strictly match from string start - // Attempt to parse the first digits as a national prefix. - prefixMatcher, ok := readFromRegexCache(possibleNationalPrefix) - if !ok { - pat := possibleNationalPrefix - prefixMatcher = regexp.MustCompile(pat) - writeToRegexCache(pat, prefixMatcher) - } - if prefixMatcher.MatchString(number.String()) { - natRulePattern := "^(?:" + metadata.GetGeneralDesc().GetNationalNumberPattern() + ")$" // Strictly match - nationalNumberRule, ok := - readFromRegexCache(natRulePattern) - if !ok { - nationalNumberRule = regexp.MustCompile(natRulePattern) - writeToRegexCache(natRulePattern, nationalNumberRule) - } - // Check if the original number is viable. - isViableOriginalNumber := nationalNumberRule.Match(number.Bytes()) - // prefixMatcher.group(numOfGroups) == null implies nothing was - // captured by the capturing groups in possibleNationalPrefix; - // therefore, no transformation is necessary, and we just - // remove the national prefix. - groups := prefixMatcher.FindSubmatchIndex(number.Bytes()) - numOfGroups := len(groups)/2 - 1 // groups is a list of index pairs, idx0,idx1 defines the whole match, idx2+ submatches. - // Subtract one to ignore group(0) in count - transformRule := metadata.GetNationalPrefixTransformRule() - if len(transformRule) == 0 || groups[numOfGroups*2] < 0 { // Negative idx means subgroup did not match - // If the original number was viable, and the resultant number - // is not, we return. - if isViableOriginalNumber && - !nationalNumberRule.MatchString( - number.String()[groups[1]:]) { // groups[1] == last match idx - return false - } - if len(carrierCode.Bytes()) != 0 && - numOfGroups > 0 && - groups[numOfGroups*2] > 0 { // Negative idx means subgroup did not match - carrierCode.Write(number.Bytes()[groups[numOfGroups*2]:groups[numOfGroups*2+1]]) - } - number.ResetWith(number.Bytes()[groups[1]:]) - return true - } else { - // Check that the resultant number is still viable. If not, - // return. Check this by copying the string buffer and - // making the transformation on the copy first. - numString := number.String() - transformedNumBytes := []byte(prefixMatcher.ReplaceAllString(numString, transformRule)) - if isViableOriginalNumber && - !nationalNumberRule.Match(transformedNumBytes) { - return false - } - if len(carrierCode.Bytes()) != 0 && numOfGroups > 1 && groups[2] != -1 { // Check group(1) got a submatch - carrC := numString[groups[2]:groups[3]] // group(1) idxs - carrierCode.WriteString(carrC) - } - number.ResetWith(transformedNumBytes) - return true - } - } - return false -} - -// Strips any extension (as in, the part of the number dialled after the -// call is connected, usually indicated with extn, ext, x or similar) from -// the end of the number, and returns it. -// @VisibleForTesting -func maybeStripExtension(number *Builder) string { - // If we find a potential extension, and the number preceding this is - // a viable number, we assume it is an extension. - numStr := number.String() - ind := EXTN_PATTERN.FindStringIndex(numStr) - if len(ind) > 0 && isViablePhoneNumber(numStr[0:ind[0]]) { - // The numbers are captured into groups in the regular expression. - for _, extensionGroup := range EXTN_PATTERN.FindAllStringIndex(numStr, -1) { - if len(extensionGroup) == 0 { - continue - } - // We go through the capturing groups until we find one - // that captured some digits. If none did, then we will - // return the empty string. - extension := numStr[extensionGroup[0]:extensionGroup[1]] - number.ResetWithString(numStr[0:ind[0]]) - return extension - } - } - return "" -} - -// Checks to see that the region code used is valid, or if it is not valid, -// that the number to parse starts with a + symbol so that we can attempt -// to infer the region from the number. Returns false if it cannot use the -// region provided and the region cannot be inferred. -func checkRegionForParsing(numberToParse, defaultRegion string) bool { - if !isValidRegionCode(defaultRegion) { - // If the number is null or empty, we can't infer the region. - if len(numberToParse) == 0 || - !PLUS_CHARS_PATTERN.MatchString(numberToParse) { - return false - } - } - return true -} - -// Parses a string and returns it in proto buffer format. This method will -// throw a NumberParseException if the number is not considered to be a -// possible number. Note that validation of whether the number is actually -// a valid number for a particular region is not performed. This can be -// done separately with IsValidNumber(). -func Parse(numberToParse, defaultRegion string) (*PhoneNumber, error) { - var phoneNumber *PhoneNumber = &PhoneNumber{} - err := ParseToNumber(numberToParse, defaultRegion, phoneNumber) - return phoneNumber, err -} - -// Same as Parse(string, string), but accepts mutable PhoneNumber as a -// parameter to decrease object creation when invoked many times. -func ParseToNumber(numberToParse, defaultRegion string, phoneNumber *PhoneNumber) error { - return parseHelper(numberToParse, defaultRegion, false, true, phoneNumber) -} - -// Parses a string and returns it in proto buffer format. This method -// differs from Parse() in that it always populates the raw_input field of -// the protocol buffer with numberToParse as well as the country_code_source -// field. -func ParseAndKeepRawInput( - numberToParse, defaultRegion string) (*PhoneNumber, error) { - var phoneNumber *PhoneNumber = &PhoneNumber{} - return phoneNumber, ParseAndKeepRawInputToNumber( - numberToParse, defaultRegion, phoneNumber) -} - -// Same as ParseAndKeepRawInput(String, String), but accepts a mutable -// PhoneNumber as a parameter to decrease object creation when invoked many -// times. -func ParseAndKeepRawInputToNumber( - numberToParse, defaultRegion string, - phoneNumber *PhoneNumber) error { - return parseHelper(numberToParse, defaultRegion, true, true, phoneNumber) -} - -// Returns an iterable over all PhoneNumberMatch PhoneNumberMatches in text. -// This is a shortcut for findNumbers(CharSequence, String, Leniency, long) -// getMatcher(text, defaultRegion, Leniency.VALID, Long.MAX_VALUE)}. -//public Iterable findNumbers(CharSequence text, String defaultRegion) { -// return findNumbers(text, defaultRegion, Leniency.VALID, Long.MAX_VALUE); -//} - -// Returns an iterable over all PhoneNumberMatch PhoneNumberMatches in text. -//public Iterable findNumbers( -// final CharSequence text, final String defaultRegion, final Leniency leniency, -// final long maxTries) { -// -// return new Iterable() { -// public Iterator iterator() { -// return new PhoneNumberMatcher( -// PhoneNumberUtil.this, text, defaultRegion, leniency, maxTries); -// } -// }; -// } - -// A helper function to set the values related to leading zeros in a -// PhoneNumber. -func setItalianLeadingZerosForPhoneNumber( - nationalNum string, phoneNumber *PhoneNumber) { - if len(nationalNum) < 2 || nationalNum[0] != '0' { - return - } - - phoneNumber.ItalianLeadingZero = proto.Bool(true) - numLeadZeros := 1 - // Note that if the national number is all "0"s, the last "0" - // is not counted as a leading zero. - for numLeadZeros < len(nationalNum)-1 && nationalNum[numLeadZeros] == '0' { - numLeadZeros++ - } - if numLeadZeros != 1 { - phoneNumber.NumberOfLeadingZeros = proto.Int(numLeadZeros) - } -} - -var ( - ErrInvalidCountryCode = errors.New("invalid country code") - ErrNotANumber = errors.New("The phone number supplied was empty.") - ErrTooShortNSN = errors.New("The string supplied is too short to be a phone number.") -) - -// Parses a string and fills up the phoneNumber. This method is the same -// as the public Parse() method, with the exception that it allows the -// default region to be null, for use by IsNumberMatch(). checkRegion should -// be set to false if it is permitted for the default region to be null or -// unknown ("ZZ"). -func parseHelper( - numberToParse, defaultRegion string, - keepRawInput, checkRegion bool, - phoneNumber *PhoneNumber) error { - if len(numberToParse) == 0 { - return ErrNotANumber - } else if len(numberToParse) > MAX_INPUT_STRING_LENGTH { - return ErrNumTooLong - } - - nationalNumber := NewBuilder(nil) - buildNationalNumberForParsing(numberToParse, nationalNumber) - - if !isViablePhoneNumber(nationalNumber.String()) { - return ErrNotANumber - } - - // Check the region supplied is valid, or that the extracted number - // starts with some sort of + sign so the number's region can be determined. - if checkRegion && - !checkRegionForParsing(nationalNumber.String(), defaultRegion) { - return ErrInvalidCountryCode - } - - if keepRawInput { - phoneNumber.RawInput = proto.String(numberToParse) - } - // Attempt to parse extension first, since it doesn't require - // region-specific data and we want to have the non-normalised - // number here. - extension := maybeStripExtension(nationalNumber) - if len(extension) > 0 { - phoneNumber.Extension = proto.String(extension) - } - var regionMetadata *PhoneMetadata = getMetadataForRegion(defaultRegion) - // Check to see if the number is given in international format so we - // know whether this number is from the default region or not. - normalizedNationalNumber := NewBuilder(nil) - // TODO: This method should really just take in the string buffer that - // has already been created, and just remove the prefix, rather than - // taking in a string and then outputting a string buffer. - countryCode, err := maybeExtractCountryCode( - nationalNumber.String(), regionMetadata, - normalizedNationalNumber, keepRawInput, phoneNumber) - if err != nil { - // There might be a plus at the beginning - inds := PLUS_CHARS_PATTERN.FindStringIndex(nationalNumber.String()) - if err == ErrInvalidCountryCode && len(inds) > 0 { - // Strip the plus-char, and try again. - countryCode, err = maybeExtractCountryCode( - nationalNumber.String()[inds[1]:], regionMetadata, - normalizedNationalNumber, keepRawInput, phoneNumber) - if err != nil { - return err - } else if countryCode == 0 { - return ErrInvalidCountryCode - } - } else { - return err - } - } - if countryCode != 0 { - phoneNumberRegion := GetRegionCodeForCountryCode(countryCode) - if phoneNumberRegion != defaultRegion { - // Metadata cannot be null because the country calling - // code is valid. - regionMetadata = getMetadataForRegionOrCallingCode( - countryCode, phoneNumberRegion) - } - } else { - // If no extracted country calling code, use the region supplied - // instead. The national number is just the normalized version of - // the number we were given to parse. - normalizedNationalNumber.WriteString(normalize(nationalNumber.String())) - if len(defaultRegion) != 0 { - countryCode = int(regionMetadata.GetCountryCode()) - phoneNumber.CountryCode = proto.Int(countryCode) - } else if keepRawInput { - phoneNumber.CountryCodeSource = nil - } - } - if len(normalizedNationalNumber.String()) < MIN_LENGTH_FOR_NSN { - return ErrTooShortNSN - } - - if regionMetadata != nil { - carrierCode := NewBuilder(nil) - bufferCopy := make([]byte, normalizedNationalNumber.Len()) - copy(bufferCopy, normalizedNationalNumber.Bytes()) - potentialNationalNumber := NewBuilder(bufferCopy) - maybeStripNationalPrefixAndCarrierCode( - potentialNationalNumber, regionMetadata, carrierCode) - // We require that the NSN remaining after stripping the national - // prefix and carrier code be of a possible length for the region. - // Otherwise, we don't do the stripping, since the original number - // could be a valid short number. - if !isShorterThanPossibleNormalNumber( - regionMetadata, potentialNationalNumber.String()) { - normalizedNationalNumber = potentialNationalNumber - if keepRawInput { - phoneNumber.PreferredDomesticCarrierCode = - proto.String(carrierCode.String()) - } - } - } - lengthOfNationalNumber := len(normalizedNationalNumber.String()) - if lengthOfNationalNumber < MIN_LENGTH_FOR_NSN { - return ErrTooShortNSN - } - if lengthOfNationalNumber > MAX_LENGTH_FOR_NSN { - return ErrNumTooLong - } - setItalianLeadingZerosForPhoneNumber( - normalizedNationalNumber.String(), phoneNumber) - val, _ := strconv.ParseUint(normalizedNationalNumber.String(), 10, 64) - phoneNumber.NationalNumber = proto.Uint64(val) - return nil -} - -var ErrNumTooLong = errors.New("The string supplied is too long to be a phone number.") - -// Converts numberToParse to a form that we can parse and write it to -// nationalNumber if it is written in RFC3966; otherwise extract a possible -// number out of it and write to nationalNumber. -func buildNationalNumberForParsing( - numberToParse string, - nationalNumber *Builder) { - - indexOfPhoneContext := strings.Index(numberToParse, RFC3966_PHONE_CONTEXT) - if indexOfPhoneContext > 0 { - phoneContextStart := indexOfPhoneContext + len(RFC3966_PHONE_CONTEXT) - // If the phone context contains a phone number prefix, we need - // to capture it, whereas domains will be ignored. - if numberToParse[phoneContextStart] == PLUS_SIGN { - // Additional parameters might follow the phone context. If so, - // we will remove them here because the parameters after phone - // context are not important for parsing the phone number. - phoneContextEnd := strings.Index(numberToParse[phoneContextStart:], ";") - if phoneContextEnd > 0 { - nationalNumber.WriteString( - numberToParse[phoneContextStart:phoneContextEnd]) - } else { - nationalNumber.WriteString(numberToParse[phoneContextStart:]) - } - } - // Now append everything between the "tel:" prefix and the - // phone-context. This should include the national number, an - // optional extension or isdn-subaddress component. Note we also - // handle the case when "tel:" is missing, as we have seen in some - // of the phone number inputs. In that case, we append everything - // from the beginning. - indexOfRfc3966Prefix := strings.Index(numberToParse, RFC3966_PREFIX) - indexOfNationalNumber := 0 - if indexOfRfc3966Prefix >= 0 { - indexOfNationalNumber = indexOfRfc3966Prefix + len(RFC3966_PREFIX) - } - nationalNumber.WriteString( - numberToParse[indexOfNationalNumber:indexOfPhoneContext]) - } else { - // Extract a possible number from the string passed in (this - // strips leading characters that could not be the start of a - // phone number.) - nationalNumber.WriteString(extractPossibleNumber(numberToParse)) - } - - // Delete the isdn-subaddress and everything after it if it is present. - // Note extension won't appear at the same time with isdn-subaddress - // according to paragraph 5.3 of the RFC3966 spec, - indexOfIsdn := strings.Index(nationalNumber.String(), RFC3966_ISDN_SUBADDRESS) - if indexOfIsdn > 0 { - natNumBytes := nationalNumber.Bytes() - nationalNumber.ResetWith(natNumBytes[:indexOfIsdn]) - } - // If both phone context and isdn-subaddress are absent but other - // parameters are present, the parameters are left in nationalNumber. - // This is because we are concerned about deleting content from a - // potential number string when there is no strong evidence that the - // number is actually written in RFC3966. -} - -// Takes two phone numbers and compares them for equality. -// -// Returns EXACT_MATCH if the country_code, NSN, presence of a leading zero -// for Italian numbers and any extension present are the same. -// Returns NSN_MATCH if either or both has no region specified, and the NSNs -// and extensions are the same. -// Returns SHORT_NSN_MATCH if either or both has no region specified, or the -// region specified is the same, and one NSN could be a shorter version of -// the other number. This includes the case where one has an extension -// specified, and the other does not. -// Returns NO_MATCH otherwise. -// For example, the numbers +1 345 657 1234 and 657 1234 are a SHORT_NSN_MATCH. -// The numbers +1 345 657 1234 and 345 657 are a NO_MATCH. -func isNumberMatchWithNumbers(firstNumberIn, secondNumberIn *PhoneNumber) MatchType { - // Make copies of the phone number so that the numbers passed in are not edited. - var firstNumber, secondNumber *PhoneNumber - firstNumber = &PhoneNumber{} - secondNumber = &PhoneNumber{} - proto.Merge(firstNumber, firstNumberIn) - proto.Merge(secondNumber, secondNumberIn) - // First clear raw_input, country_code_source and - // preferred_domestic_carrier_code fields and any empty-string - // extensions so that we can use the proto-buffer equality method. - firstNumber.RawInput = nil - firstNumber.CountryCodeSource = nil - firstNumber.PreferredDomesticCarrierCode = nil - secondNumber.RawInput = nil - secondNumber.CountryCodeSource = nil - secondNumber.PreferredDomesticCarrierCode = nil - - firstNumExt := firstNumber.GetExtension() - secondNumExt := secondNumber.GetExtension() - // NOTE(ttacon): don't think we need this in go land... - if len(firstNumExt) == 0 { - firstNumber.Extension = nil - } - if len(secondNumExt) == 0 { - secondNumber.Extension = nil - } - - // Early exit if both had extensions and these are different. - if len(firstNumExt) > 0 && len(secondNumExt) > 0 && - firstNumExt != secondNumExt { - return NO_MATCH - } - var ( - firstNumberCountryCode = firstNumber.GetCountryCode() - secondNumberCountryCode = secondNumber.GetCountryCode() - ) - // Both had country_code specified. - if firstNumberCountryCode != 0 && secondNumberCountryCode != 0 { - // TODO(ttacon): remove when make gen-equals - if reflect.DeepEqual(firstNumber, secondNumber) { - return EXACT_MATCH - } else if firstNumberCountryCode == secondNumberCountryCode && - isNationalNumberSuffixOfTheOther(firstNumber, secondNumber) { - // A SHORT_NSN_MATCH occurs if there is a difference because of - // the presence or absence of an 'Italian leading zero', the - // presence or absence of an extension, or one NSN being a - // shorter variant of the other. - return SHORT_NSN_MATCH - } - // This is not a match. - return NO_MATCH - } - // Checks cases where one or both country_code fields were not - // specified. To make equality checks easier, we first set the - // country_code fields to be equal. - firstNumber.CountryCode = proto.Int(int(secondNumberCountryCode)) - // If all else was the same, then this is an NSN_MATCH. - // TODO(ttacon): remove when make gen-equals - if reflect.DeepEqual(firstNumber, secondNumber) { - return NSN_MATCH - } - if isNationalNumberSuffixOfTheOther(firstNumber, secondNumber) { - return SHORT_NSN_MATCH - } - return NO_MATCH -} - -// Returns true when one national number is the suffix of the other or both -// are the same. -func isNationalNumberSuffixOfTheOther(firstNumber, secondNumber *PhoneNumber) bool { - var ( - firstNumberNationalNumber = strconv.FormatUint( - firstNumber.GetNationalNumber(), 10) - secondNumberNationalNumber = strconv.FormatUint( - secondNumber.GetNationalNumber(), 10) - ) - // Note that endsWith returns true if the numbers are equal. - return strings.HasSuffix(firstNumberNationalNumber, secondNumberNationalNumber) || - strings.HasSuffix(secondNumberNationalNumber, firstNumberNationalNumber) -} - -// Takes two phone numbers as strings and compares them for equality. This is -// a convenience wrapper for IsNumberMatch(PhoneNumber, PhoneNumber). No -// default region is known. -func IsNumberMatch(firstNumber, secondNumber string) MatchType { - firstNumberAsProto, err := Parse(firstNumber, UNKNOWN_REGION) - if err == nil { - return isNumberMatchWithOneNumber(firstNumberAsProto, secondNumber) - } else if err != ErrInvalidCountryCode { - return NOT_A_NUMBER - } - - secondNumberAsProto, err := Parse(secondNumber, UNKNOWN_REGION) - if err == nil { - return isNumberMatchWithOneNumber(secondNumberAsProto, firstNumber) - } else if err != ErrInvalidCountryCode { - return NOT_A_NUMBER - } - - var firstNumberProto, secondNumberProto *PhoneNumber - err = parseHelper(firstNumber, "", false, false, firstNumberProto) - if err != nil { - return NOT_A_NUMBER - } - err = parseHelper(secondNumber, "", false, false, secondNumberProto) - if err != nil { - return NOT_A_NUMBER - } - return isNumberMatchWithNumbers(firstNumberProto, secondNumberProto) -} - -// Takes two phone numbers and compares them for equality. This is a -// convenience wrapper for IsNumberMatch(PhoneNumber, PhoneNumber). No -// default region is known. -func isNumberMatchWithOneNumber( - firstNumber *PhoneNumber, secondNumber string) MatchType { - // First see if the second number has an implicit country calling - // code, by attempting to parse it. - secondNumberAsProto, err := Parse(secondNumber, UNKNOWN_REGION) - if err == nil { - return isNumberMatchWithNumbers(firstNumber, secondNumberAsProto) - } - if err != ErrInvalidCountryCode { - return NOT_A_NUMBER - } - // The second number has no country calling code. EXACT_MATCH is no - // longer possible. We parse it as if the region was the same as that - // for the first number, and if EXACT_MATCH is returned, we replace - // this with NSN_MATCH. - firstNumberRegion := GetRegionCodeForCountryCode(int(firstNumber.GetCountryCode())) - - if firstNumberRegion != UNKNOWN_REGION { - secondNumberWithFirstNumberRegion, err := - Parse(secondNumber, firstNumberRegion) - if err != nil { - return NOT_A_NUMBER - } - match := isNumberMatchWithNumbers( - firstNumber, secondNumberWithFirstNumberRegion) - if match == EXACT_MATCH { - return NSN_MATCH - } - return match - } else { - // If the first number didn't have a valid country calling - // code, then we parse the second number without one as well. - var secondNumberProto *PhoneNumber - err := parseHelper(secondNumber, "", false, false, secondNumberProto) - if err != nil { - return NOT_A_NUMBER - } - return isNumberMatchWithNumbers(firstNumber, secondNumberProto) - } -} - -// Returns true if the number can be dialled from outside the region, or -// unknown. If the number can only be dialled from within the region, -// returns false. Does not check the number is a valid number. Note that, -// at the moment, this method does not handle short numbers. -// TODO: Make this method public when we have enough metadata to make it worthwhile. -func canBeInternationallyDialled(number *PhoneNumber) bool { - metadata := getMetadataForRegion(GetRegionCodeForNumber(number)) - if metadata == nil { - // Note numbers belonging to non-geographical entities - // (e.g. +800 numbers) are always internationally diallable, - // and will be caught here. - return true - } - nationalSignificantNumber := GetNationalSignificantNumber(number) - return !isNumberMatchingDesc( - nationalSignificantNumber, metadata.GetNoInternationalDialling()) -} - -// Returns true if the supplied region supports mobile number portability. -// Returns false for invalid, unknown or regions that don't support mobile -// number portability. -func IsMobileNumberPortableRegion(regionCode string) bool { - metadata := getMetadataForRegion(regionCode) - if metadata == nil { - return false - } - return metadata.GetMobileNumberPortableRegion() -} - -func init() { - err := loadMetadataFromFile("US", 1) - if err != nil { - // better to die on start up - panic(err) - } - - for eKey, regionCodes := range CountryCodeToRegion { - // We can assume that if the county calling code maps to the - // non-geo entity region code then that's the only region code - // it maps to. - if len(regionCodes) == 1 && REGION_CODE_FOR_NON_GEO_ENTITY == regionCodes[0] { - // This is the subset of all country codes that map to the - // non-geo entity region code. - writeToCCsForNonGeographicalRegion(eKey, struct{}{}) - } else { - // The supported regions set does not include the "001" - // non-geo entity region code. - for _, val := range regionCodes { - writeToSupportedRegions(val, struct{}{}) - } - } - } - // If the non-geo entity still got added to the set of supported - // regions it must be because there are entries that list the non-geo - // entity alongside normal regions (which is wrong). If we discover - // this, remove the non-geo entity from the set of supported regions - // and log (or not log). - deleteFromSupportedRegions(REGION_CODE_FOR_NON_GEO_ENTITY) - - for _, val := range CountryCodeToRegion[NANPA_COUNTRY_CODE] { - writeToNanpaRegions(val, struct{}{}) - } -} - -// Returns a slice of Timezones corresponding to the number passed -// or error when it is impossible to convert the string to int -// The algorythm tries to match the timezones starting from the maximum -// number of phone number digits and decreasing until it finds one or reaches 0 -func GetTimezonesForPrefix(number string) ([]string, error) { - for i := MAX_PREFIX_LENGTH; i > 0; i-- { - index, err := strconv.Atoi(number[0:i]) - if err != nil { - return nil, err - } - if PrefixToTimezone[index] != nil { - return PrefixToTimezone[index], nil - } - } - return []string{UNKNOWN_TIMEZONE}, nil -} diff --git a/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/pmezard/go-difflib/LICENSE deleted file mode 100644 index c67dad6..0000000 --- a/vendor/github.com/pmezard/go-difflib/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2013, Patrick Mezard -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. - The names of its contributors may not be used to endorse or promote -products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go deleted file mode 100644 index 003e99f..0000000 --- a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go +++ /dev/null @@ -1,772 +0,0 @@ -// Package difflib is a partial port of Python difflib module. -// -// It provides tools to compare sequences of strings and generate textual diffs. -// -// The following class and functions have been ported: -// -// - SequenceMatcher -// -// - unified_diff -// -// - context_diff -// -// Getting unified diffs was the main goal of the port. Keep in mind this code -// is mostly suitable to output text differences in a human friendly way, there -// are no guarantees generated diffs are consumable by patch(1). -package difflib - -import ( - "bufio" - "bytes" - "fmt" - "io" - "strings" -) - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} - -func calculateRatio(matches, length int) float64 { - if length > 0 { - return 2.0 * float64(matches) / float64(length) - } - return 1.0 -} - -type Match struct { - A int - B int - Size int -} - -type OpCode struct { - Tag byte - I1 int - I2 int - J1 int - J2 int -} - -// SequenceMatcher compares sequence of strings. The basic -// algorithm predates, and is a little fancier than, an algorithm -// published in the late 1980's by Ratcliff and Obershelp under the -// hyperbolic name "gestalt pattern matching". The basic idea is to find -// the longest contiguous matching subsequence that contains no "junk" -// elements (R-O doesn't address junk). The same idea is then applied -// recursively to the pieces of the sequences to the left and to the right -// of the matching subsequence. This does not yield minimal edit -// sequences, but does tend to yield matches that "look right" to people. -// -// SequenceMatcher tries to compute a "human-friendly diff" between two -// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the -// longest *contiguous* & junk-free matching subsequence. That's what -// catches peoples' eyes. The Windows(tm) windiff has another interesting -// notion, pairing up elements that appear uniquely in each sequence. -// That, and the method here, appear to yield more intuitive difference -// reports than does diff. This method appears to be the least vulnerable -// to synching up on blocks of "junk lines", though (like blank lines in -// ordinary text files, or maybe "

" lines in HTML files). That may be -// because this is the only method of the 3 that has a *concept* of -// "junk" . -// -// Timing: Basic R-O is cubic time worst case and quadratic time expected -// case. SequenceMatcher is quadratic time for the worst case and has -// expected-case behavior dependent in a complicated way on how many -// elements the sequences have in common; best case time is linear. -type SequenceMatcher struct { - a []string - b []string - b2j map[string][]int - IsJunk func(string) bool - autoJunk bool - bJunk map[string]struct{} - matchingBlocks []Match - fullBCount map[string]int - bPopular map[string]struct{} - opCodes []OpCode -} - -func NewMatcher(a, b []string) *SequenceMatcher { - m := SequenceMatcher{autoJunk: true} - m.SetSeqs(a, b) - return &m -} - -func NewMatcherWithJunk(a, b []string, autoJunk bool, - isJunk func(string) bool) *SequenceMatcher { - - m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} - m.SetSeqs(a, b) - return &m -} - -// Set two sequences to be compared. -func (m *SequenceMatcher) SetSeqs(a, b []string) { - m.SetSeq1(a) - m.SetSeq2(b) -} - -// Set the first sequence to be compared. The second sequence to be compared is -// not changed. -// -// SequenceMatcher computes and caches detailed information about the second -// sequence, so if you want to compare one sequence S against many sequences, -// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other -// sequences. -// -// See also SetSeqs() and SetSeq2(). -func (m *SequenceMatcher) SetSeq1(a []string) { - if &a == &m.a { - return - } - m.a = a - m.matchingBlocks = nil - m.opCodes = nil -} - -// Set the second sequence to be compared. The first sequence to be compared is -// not changed. -func (m *SequenceMatcher) SetSeq2(b []string) { - if &b == &m.b { - return - } - m.b = b - m.matchingBlocks = nil - m.opCodes = nil - m.fullBCount = nil - m.chainB() -} - -func (m *SequenceMatcher) chainB() { - // Populate line -> index mapping - b2j := map[string][]int{} - for i, s := range m.b { - indices := b2j[s] - indices = append(indices, i) - b2j[s] = indices - } - - // Purge junk elements - m.bJunk = map[string]struct{}{} - if m.IsJunk != nil { - junk := m.bJunk - for s, _ := range b2j { - if m.IsJunk(s) { - junk[s] = struct{}{} - } - } - for s, _ := range junk { - delete(b2j, s) - } - } - - // Purge remaining popular elements - popular := map[string]struct{}{} - n := len(m.b) - if m.autoJunk && n >= 200 { - ntest := n/100 + 1 - for s, indices := range b2j { - if len(indices) > ntest { - popular[s] = struct{}{} - } - } - for s, _ := range popular { - delete(b2j, s) - } - } - m.bPopular = popular - m.b2j = b2j -} - -func (m *SequenceMatcher) isBJunk(s string) bool { - _, ok := m.bJunk[s] - return ok -} - -// Find longest matching block in a[alo:ahi] and b[blo:bhi]. -// -// If IsJunk is not defined: -// -// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where -// alo <= i <= i+k <= ahi -// blo <= j <= j+k <= bhi -// and for all (i',j',k') meeting those conditions, -// k >= k' -// i <= i' -// and if i == i', j <= j' -// -// In other words, of all maximal matching blocks, return one that -// starts earliest in a, and of all those maximal matching blocks that -// start earliest in a, return the one that starts earliest in b. -// -// If IsJunk is defined, first the longest matching block is -// determined as above, but with the additional restriction that no -// junk element appears in the block. Then that block is extended as -// far as possible by matching (only) junk elements on both sides. So -// the resulting block never matches on junk except as identical junk -// happens to be adjacent to an "interesting" match. -// -// If no blocks match, return (alo, blo, 0). -func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { - // CAUTION: stripping common prefix or suffix would be incorrect. - // E.g., - // ab - // acab - // Longest matching block is "ab", but if common prefix is - // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so - // strip, so ends up claiming that ab is changed to acab by - // inserting "ca" in the middle. That's minimal but unintuitive: - // "it's obvious" that someone inserted "ac" at the front. - // Windiff ends up at the same place as diff, but by pairing up - // the unique 'b's and then matching the first two 'a's. - besti, bestj, bestsize := alo, blo, 0 - - // find longest junk-free match - // during an iteration of the loop, j2len[j] = length of longest - // junk-free match ending with a[i-1] and b[j] - j2len := map[int]int{} - for i := alo; i != ahi; i++ { - // look at all instances of a[i] in b; note that because - // b2j has no junk keys, the loop is skipped if a[i] is junk - newj2len := map[int]int{} - for _, j := range m.b2j[m.a[i]] { - // a[i] matches b[j] - if j < blo { - continue - } - if j >= bhi { - break - } - k := j2len[j-1] + 1 - newj2len[j] = k - if k > bestsize { - besti, bestj, bestsize = i-k+1, j-k+1, k - } - } - j2len = newj2len - } - - // Extend the best by non-junk elements on each end. In particular, - // "popular" non-junk elements aren't in b2j, which greatly speeds - // the inner loop above, but also means "the best" match so far - // doesn't contain any junk *or* popular non-junk elements. - for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && - m.a[besti-1] == m.b[bestj-1] { - besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 - } - for besti+bestsize < ahi && bestj+bestsize < bhi && - !m.isBJunk(m.b[bestj+bestsize]) && - m.a[besti+bestsize] == m.b[bestj+bestsize] { - bestsize += 1 - } - - // Now that we have a wholly interesting match (albeit possibly - // empty!), we may as well suck up the matching junk on each - // side of it too. Can't think of a good reason not to, and it - // saves post-processing the (possibly considerable) expense of - // figuring out what to do with it. In the case of an empty - // interesting match, this is clearly the right thing to do, - // because no other kind of match is possible in the regions. - for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && - m.a[besti-1] == m.b[bestj-1] { - besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 - } - for besti+bestsize < ahi && bestj+bestsize < bhi && - m.isBJunk(m.b[bestj+bestsize]) && - m.a[besti+bestsize] == m.b[bestj+bestsize] { - bestsize += 1 - } - - return Match{A: besti, B: bestj, Size: bestsize} -} - -// Return list of triples describing matching subsequences. -// -// Each triple is of the form (i, j, n), and means that -// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in -// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are -// adjacent triples in the list, and the second is not the last triple in the -// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe -// adjacent equal blocks. -// -// The last triple is a dummy, (len(a), len(b), 0), and is the only -// triple with n==0. -func (m *SequenceMatcher) GetMatchingBlocks() []Match { - if m.matchingBlocks != nil { - return m.matchingBlocks - } - - var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match - matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { - match := m.findLongestMatch(alo, ahi, blo, bhi) - i, j, k := match.A, match.B, match.Size - if match.Size > 0 { - if alo < i && blo < j { - matched = matchBlocks(alo, i, blo, j, matched) - } - matched = append(matched, match) - if i+k < ahi && j+k < bhi { - matched = matchBlocks(i+k, ahi, j+k, bhi, matched) - } - } - return matched - } - matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) - - // It's possible that we have adjacent equal blocks in the - // matching_blocks list now. - nonAdjacent := []Match{} - i1, j1, k1 := 0, 0, 0 - for _, b := range matched { - // Is this block adjacent to i1, j1, k1? - i2, j2, k2 := b.A, b.B, b.Size - if i1+k1 == i2 && j1+k1 == j2 { - // Yes, so collapse them -- this just increases the length of - // the first block by the length of the second, and the first - // block so lengthened remains the block to compare against. - k1 += k2 - } else { - // Not adjacent. Remember the first block (k1==0 means it's - // the dummy we started with), and make the second block the - // new block to compare against. - if k1 > 0 { - nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) - } - i1, j1, k1 = i2, j2, k2 - } - } - if k1 > 0 { - nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) - } - - nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) - m.matchingBlocks = nonAdjacent - return m.matchingBlocks -} - -// Return list of 5-tuples describing how to turn a into b. -// -// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple -// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the -// tuple preceding it, and likewise for j1 == the previous j2. -// -// The tags are characters, with these meanings: -// -// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] -// -// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. -// -// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. -// -// 'e' (equal): a[i1:i2] == b[j1:j2] -func (m *SequenceMatcher) GetOpCodes() []OpCode { - if m.opCodes != nil { - return m.opCodes - } - i, j := 0, 0 - matching := m.GetMatchingBlocks() - opCodes := make([]OpCode, 0, len(matching)) - for _, m := range matching { - // invariant: we've pumped out correct diffs to change - // a[:i] into b[:j], and the next matching block is - // a[ai:ai+size] == b[bj:bj+size]. So we need to pump - // out a diff to change a[i:ai] into b[j:bj], pump out - // the matching block, and move (i,j) beyond the match - ai, bj, size := m.A, m.B, m.Size - tag := byte(0) - if i < ai && j < bj { - tag = 'r' - } else if i < ai { - tag = 'd' - } else if j < bj { - tag = 'i' - } - if tag > 0 { - opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) - } - i, j = ai+size, bj+size - // the list of matching blocks is terminated by a - // sentinel with size 0 - if size > 0 { - opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) - } - } - m.opCodes = opCodes - return m.opCodes -} - -// Isolate change clusters by eliminating ranges with no changes. -// -// Return a generator of groups with up to n lines of context. -// Each group is in the same format as returned by GetOpCodes(). -func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { - if n < 0 { - n = 3 - } - codes := m.GetOpCodes() - if len(codes) == 0 { - codes = []OpCode{OpCode{'e', 0, 1, 0, 1}} - } - // Fixup leading and trailing groups if they show no changes. - if codes[0].Tag == 'e' { - c := codes[0] - i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 - codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} - } - if codes[len(codes)-1].Tag == 'e' { - c := codes[len(codes)-1] - i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 - codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} - } - nn := n + n - groups := [][]OpCode{} - group := []OpCode{} - for _, c := range codes { - i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 - // End the current group and start a new one whenever - // there is a large range with no changes. - if c.Tag == 'e' && i2-i1 > nn { - group = append(group, OpCode{c.Tag, i1, min(i2, i1+n), - j1, min(j2, j1+n)}) - groups = append(groups, group) - group = []OpCode{} - i1, j1 = max(i1, i2-n), max(j1, j2-n) - } - group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) - } - if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { - groups = append(groups, group) - } - return groups -} - -// Return a measure of the sequences' similarity (float in [0,1]). -// -// Where T is the total number of elements in both sequences, and -// M is the number of matches, this is 2.0*M / T. -// Note that this is 1 if the sequences are identical, and 0 if -// they have nothing in common. -// -// .Ratio() is expensive to compute if you haven't already computed -// .GetMatchingBlocks() or .GetOpCodes(), in which case you may -// want to try .QuickRatio() or .RealQuickRation() first to get an -// upper bound. -func (m *SequenceMatcher) Ratio() float64 { - matches := 0 - for _, m := range m.GetMatchingBlocks() { - matches += m.Size - } - return calculateRatio(matches, len(m.a)+len(m.b)) -} - -// Return an upper bound on ratio() relatively quickly. -// -// This isn't defined beyond that it is an upper bound on .Ratio(), and -// is faster to compute. -func (m *SequenceMatcher) QuickRatio() float64 { - // viewing a and b as multisets, set matches to the cardinality - // of their intersection; this counts the number of matches - // without regard to order, so is clearly an upper bound - if m.fullBCount == nil { - m.fullBCount = map[string]int{} - for _, s := range m.b { - m.fullBCount[s] = m.fullBCount[s] + 1 - } - } - - // avail[x] is the number of times x appears in 'b' less the - // number of times we've seen it in 'a' so far ... kinda - avail := map[string]int{} - matches := 0 - for _, s := range m.a { - n, ok := avail[s] - if !ok { - n = m.fullBCount[s] - } - avail[s] = n - 1 - if n > 0 { - matches += 1 - } - } - return calculateRatio(matches, len(m.a)+len(m.b)) -} - -// Return an upper bound on ratio() very quickly. -// -// This isn't defined beyond that it is an upper bound on .Ratio(), and -// is faster to compute than either .Ratio() or .QuickRatio(). -func (m *SequenceMatcher) RealQuickRatio() float64 { - la, lb := len(m.a), len(m.b) - return calculateRatio(min(la, lb), la+lb) -} - -// Convert range to the "ed" format -func formatRangeUnified(start, stop int) string { - // Per the diff spec at http://www.unix.org/single_unix_specification/ - beginning := start + 1 // lines start numbering with one - length := stop - start - if length == 1 { - return fmt.Sprintf("%d", beginning) - } - if length == 0 { - beginning -= 1 // empty ranges begin at line just before the range - } - return fmt.Sprintf("%d,%d", beginning, length) -} - -// Unified diff parameters -type UnifiedDiff struct { - A []string // First sequence lines - FromFile string // First file name - FromDate string // First file time - B []string // Second sequence lines - ToFile string // Second file name - ToDate string // Second file time - Eol string // Headers end of line, defaults to LF - Context int // Number of context lines -} - -// Compare two sequences of lines; generate the delta as a unified diff. -// -// Unified diffs are a compact way of showing line changes and a few -// lines of context. The number of context lines is set by 'n' which -// defaults to three. -// -// By default, the diff control lines (those with ---, +++, or @@) are -// created with a trailing newline. This is helpful so that inputs -// created from file.readlines() result in diffs that are suitable for -// file.writelines() since both the inputs and outputs have trailing -// newlines. -// -// For inputs that do not have trailing newlines, set the lineterm -// argument to "" so that the output will be uniformly newline free. -// -// The unidiff format normally has a header for filenames and modification -// times. Any or all of these may be specified using strings for -// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. -// The modification times are normally expressed in the ISO 8601 format. -func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { - buf := bufio.NewWriter(writer) - defer buf.Flush() - wf := func(format string, args ...interface{}) error { - _, err := buf.WriteString(fmt.Sprintf(format, args...)) - return err - } - ws := func(s string) error { - _, err := buf.WriteString(s) - return err - } - - if len(diff.Eol) == 0 { - diff.Eol = "\n" - } - - started := false - m := NewMatcher(diff.A, diff.B) - for _, g := range m.GetGroupedOpCodes(diff.Context) { - if !started { - started = true - fromDate := "" - if len(diff.FromDate) > 0 { - fromDate = "\t" + diff.FromDate - } - toDate := "" - if len(diff.ToDate) > 0 { - toDate = "\t" + diff.ToDate - } - if diff.FromFile != "" || diff.ToFile != "" { - err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) - if err != nil { - return err - } - err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) - if err != nil { - return err - } - } - } - first, last := g[0], g[len(g)-1] - range1 := formatRangeUnified(first.I1, last.I2) - range2 := formatRangeUnified(first.J1, last.J2) - if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { - return err - } - for _, c := range g { - i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 - if c.Tag == 'e' { - for _, line := range diff.A[i1:i2] { - if err := ws(" " + line); err != nil { - return err - } - } - continue - } - if c.Tag == 'r' || c.Tag == 'd' { - for _, line := range diff.A[i1:i2] { - if err := ws("-" + line); err != nil { - return err - } - } - } - if c.Tag == 'r' || c.Tag == 'i' { - for _, line := range diff.B[j1:j2] { - if err := ws("+" + line); err != nil { - return err - } - } - } - } - } - return nil -} - -// Like WriteUnifiedDiff but returns the diff a string. -func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { - w := &bytes.Buffer{} - err := WriteUnifiedDiff(w, diff) - return string(w.Bytes()), err -} - -// Convert range to the "ed" format. -func formatRangeContext(start, stop int) string { - // Per the diff spec at http://www.unix.org/single_unix_specification/ - beginning := start + 1 // lines start numbering with one - length := stop - start - if length == 0 { - beginning -= 1 // empty ranges begin at line just before the range - } - if length <= 1 { - return fmt.Sprintf("%d", beginning) - } - return fmt.Sprintf("%d,%d", beginning, beginning+length-1) -} - -type ContextDiff UnifiedDiff - -// Compare two sequences of lines; generate the delta as a context diff. -// -// Context diffs are a compact way of showing line changes and a few -// lines of context. The number of context lines is set by diff.Context -// which defaults to three. -// -// By default, the diff control lines (those with *** or ---) are -// created with a trailing newline. -// -// For inputs that do not have trailing newlines, set the diff.Eol -// argument to "" so that the output will be uniformly newline free. -// -// The context diff format normally has a header for filenames and -// modification times. Any or all of these may be specified using -// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate. -// The modification times are normally expressed in the ISO 8601 format. -// If not specified, the strings default to blanks. -func WriteContextDiff(writer io.Writer, diff ContextDiff) error { - buf := bufio.NewWriter(writer) - defer buf.Flush() - var diffErr error - wf := func(format string, args ...interface{}) { - _, err := buf.WriteString(fmt.Sprintf(format, args...)) - if diffErr == nil && err != nil { - diffErr = err - } - } - ws := func(s string) { - _, err := buf.WriteString(s) - if diffErr == nil && err != nil { - diffErr = err - } - } - - if len(diff.Eol) == 0 { - diff.Eol = "\n" - } - - prefix := map[byte]string{ - 'i': "+ ", - 'd': "- ", - 'r': "! ", - 'e': " ", - } - - started := false - m := NewMatcher(diff.A, diff.B) - for _, g := range m.GetGroupedOpCodes(diff.Context) { - if !started { - started = true - fromDate := "" - if len(diff.FromDate) > 0 { - fromDate = "\t" + diff.FromDate - } - toDate := "" - if len(diff.ToDate) > 0 { - toDate = "\t" + diff.ToDate - } - if diff.FromFile != "" || diff.ToFile != "" { - wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol) - wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol) - } - } - - first, last := g[0], g[len(g)-1] - ws("***************" + diff.Eol) - - range1 := formatRangeContext(first.I1, last.I2) - wf("*** %s ****%s", range1, diff.Eol) - for _, c := range g { - if c.Tag == 'r' || c.Tag == 'd' { - for _, cc := range g { - if cc.Tag == 'i' { - continue - } - for _, line := range diff.A[cc.I1:cc.I2] { - ws(prefix[cc.Tag] + line) - } - } - break - } - } - - range2 := formatRangeContext(first.J1, last.J2) - wf("--- %s ----%s", range2, diff.Eol) - for _, c := range g { - if c.Tag == 'r' || c.Tag == 'i' { - for _, cc := range g { - if cc.Tag == 'd' { - continue - } - for _, line := range diff.B[cc.J1:cc.J2] { - ws(prefix[cc.Tag] + line) - } - } - break - } - } - } - return diffErr -} - -// Like WriteContextDiff but returns the diff a string. -func GetContextDiffString(diff ContextDiff) (string, error) { - w := &bytes.Buffer{} - err := WriteContextDiff(w, diff) - return string(w.Bytes()), err -} - -// Split a string on "\n" while preserving them. The output can be used -// as input for UnifiedDiff and ContextDiff structures. -func SplitLines(s string) []string { - lines := strings.SplitAfter(s, "\n") - lines[len(lines)-1] += "\n" - return lines -} diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE deleted file mode 100644 index 473b670..0000000 --- a/vendor/github.com/stretchr/testify/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell - -Please consider promoting this project if you find it useful. - -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/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go deleted file mode 100644 index ae06a54..0000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ /dev/null @@ -1,349 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ - -package assert - -import ( - http "net/http" - url "net/url" - time "time" -) - -// Conditionf uses a Comparison to assert a complex condition. -func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { - return Condition(t, comp, append([]interface{}{msg}, args...)...) -} - -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") -func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return Contains(t, s, contains, append([]interface{}{msg}, args...)...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - return DirExists(t, path, append([]interface{}{msg}, args...)...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool { - return ElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...) -} - -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Emptyf(t, obj, "error message %s", "formatted") -func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return Empty(t, object, append([]interface{}{msg}, args...)...) -} - -// Equalf asserts that two objects are equal. -// -// assert.Equalf(t, 123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") -func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { - return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) -} - -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) -func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { - return Error(t, err, append([]interface{}{msg}, args...)...) -} - -// Exactlyf asserts that two objects are equal in value and type. -// -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) -func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Failf reports a failure through -func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { - return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) -} - -// FailNowf fails test -func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { - return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) -} - -// Falsef asserts that the specified value is false. -// -// assert.Falsef(t, myBool, "error message %s", "formatted") -func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { - return False(t, value, append([]interface{}{msg}, args...)...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { - return FileExists(t, path, append([]interface{}{msg}, args...)...) -} - -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) -} - -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyNotContains(t, handler, method, url, values, str, append([]interface{}{msg}, args...)...) -} - -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPError(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPSuccess(t, handler, method, url, values, append([]interface{}{msg}, args...)...) -} - -// Implementsf asserts that an object is implemented by the specified interface. -// -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) -func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { - return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) -func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaMapValues(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) -} - -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) -} - -// IsTypef asserts that the specified objects are of the same type. -func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { - return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) -} - -// JSONEqf asserts that two JSON strings are equivalent. -// -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { - return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") -func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { - return Len(t, object, length, append([]interface{}{msg}, args...)...) -} - -// Nilf asserts that the specified object is nil. -// -// assert.Nilf(t, err, "error message %s", "formatted") -func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return Nil(t, object, append([]interface{}{msg}, args...)...) -} - -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { - return NoError(t, err, append([]interface{}{msg}, args...)...) -} - -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") -func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) -} - -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return NotEmpty(t, object, append([]interface{}{msg}, args...)...) -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) -} - -// NotNilf asserts that the specified object is not nil. -// -// assert.NotNilf(t, err, "error message %s", "formatted") -func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { - return NotNil(t, object, append([]interface{}{msg}, args...)...) -} - -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") -func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { - return NotPanics(t, f, append([]interface{}{msg}, args...)...) -} - -// NotRegexpf asserts that a specified regexp does not match a string. -// -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") -func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) -} - -// NotZerof asserts that i is not the zero value for its type. -func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { - return NotZero(t, i, append([]interface{}{msg}, args...)...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") -func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { - return Panics(t, f, append([]interface{}{msg}, args...)...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { - return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) -} - -// Regexpf asserts that a specified regexp matches a string. -// -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") -func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return Subset(t, list, subset, append([]interface{}{msg}, args...)...) -} - -// Truef asserts that the specified value is true. -// -// assert.Truef(t, myBool, "error message %s", "formatted") -func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { - return True(t, value, append([]interface{}{msg}, args...)...) -} - -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { - return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) -} - -// Zerof asserts that i is the zero value for its type. -func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { - return Zero(t, i, append([]interface{}{msg}, args...)...) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl deleted file mode 100644 index c5cc66f..0000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.CommentFormat}} -func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { - return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go deleted file mode 100644 index ffa5428..0000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ /dev/null @@ -1,686 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ - -package assert - -import ( - http "net/http" - url "net/url" - time "time" -) - -// Condition uses a Comparison to assert a complex condition. -func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { - return Condition(a.t, comp, msgAndArgs...) -} - -// Conditionf uses a Comparison to assert a complex condition. -func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { - return Conditionf(a.t, comp, msg, args...) -} - -// Contains asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// a.Contains("Hello World", "World") -// a.Contains(["Hello", "World"], "World") -// a.Contains({"Hello": "World"}, "Hello") -func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { - return Contains(a.t, s, contains, msgAndArgs...) -} - -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// a.Containsf("Hello World", "World", "error message %s", "formatted") -// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") -// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") -func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return Containsf(a.t, s, contains, msg, args...) -} - -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { - return DirExists(a.t, path, msgAndArgs...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { - return DirExistsf(a.t, path, msg, args...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) -func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool { - return ElementsMatch(a.t, listA, listB, msgAndArgs...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool { - return ElementsMatchf(a.t, listA, listB, msg, args...) -} - -// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// a.Empty(obj) -func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { - return Empty(a.t, object, msgAndArgs...) -} - -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// a.Emptyf(obj, "error message %s", "formatted") -func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { - return Emptyf(a.t, object, msg, args...) -} - -// Equal asserts that two objects are equal. -// -// a.Equal(123, 123) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - return Equal(a.t, expected, actual, msgAndArgs...) -} - -// EqualError asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// a.EqualError(err, expectedErrorString) -func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { - return EqualError(a.t, theError, errString, msgAndArgs...) -} - -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") -func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { - return EqualErrorf(a.t, theError, errString, msg, args...) -} - -// EqualValues asserts that two objects are equal or convertable to the same types -// and equal. -// -// a.EqualValues(uint32(123), int32(123)) -func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - return EqualValues(a.t, expected, actual, msgAndArgs...) -} - -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) -func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return EqualValuesf(a.t, expected, actual, msg, args...) -} - -// Equalf asserts that two objects are equal. -// -// a.Equalf(123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Equalf(a.t, expected, actual, msg, args...) -} - -// Error asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if a.Error(err) { -// assert.Equal(t, expectedError, err) -// } -func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { - return Error(a.t, err, msgAndArgs...) -} - -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if a.Errorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { - return Errorf(a.t, err, msg, args...) -} - -// Exactly asserts that two objects are equal in value and type. -// -// a.Exactly(int32(123), int64(123)) -func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - return Exactly(a.t, expected, actual, msgAndArgs...) -} - -// Exactlyf asserts that two objects are equal in value and type. -// -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) -func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return Exactlyf(a.t, expected, actual, msg, args...) -} - -// Fail reports a failure through -func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { - return Fail(a.t, failureMessage, msgAndArgs...) -} - -// FailNow fails test -func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { - return FailNow(a.t, failureMessage, msgAndArgs...) -} - -// FailNowf fails test -func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { - return FailNowf(a.t, failureMessage, msg, args...) -} - -// Failf reports a failure through -func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { - return Failf(a.t, failureMessage, msg, args...) -} - -// False asserts that the specified value is false. -// -// a.False(myBool) -func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { - return False(a.t, value, msgAndArgs...) -} - -// Falsef asserts that the specified value is false. -// -// a.Falsef(myBool, "error message %s", "formatted") -func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { - return Falsef(a.t, value, msg, args...) -} - -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { - return FileExists(a.t, path, msgAndArgs...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { - return FileExistsf(a.t, path, msg, args...) -} - -// HTTPBodyContains asserts that a specified handler returns a -// body that contains a string. -// -// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - return HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) -} - -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) -} - -// HTTPBodyNotContains asserts that a specified handler returns a -// body that does not contain a string. -// -// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - return HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) -} - -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { - return HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) -} - -// HTTPError asserts that a specified handler returns an error status code. -// -// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - return HTTPError(a.t, handler, method, url, values, msgAndArgs...) -} - -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPErrorf(a.t, handler, method, url, values, msg, args...) -} - -// HTTPRedirect asserts that a specified handler returns a redirect status code. -// -// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - return HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) -} - -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) -} - -// HTTPSuccess asserts that a specified handler returns a success status code. -// -// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { - return HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) -} - -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { - return HTTPSuccessf(a.t, handler, method, url, values, msg, args...) -} - -// Implements asserts that an object is implemented by the specified interface. -// -// a.Implements((*MyInterface)(nil), new(MyObject)) -func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { - return Implements(a.t, interfaceObject, object, msgAndArgs...) -} - -// Implementsf asserts that an object is implemented by the specified interface. -// -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) -func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { - return Implementsf(a.t, interfaceObject, object, msg, args...) -} - -// InDelta asserts that the two numerals are within delta of each other. -// -// a.InDelta(math.Pi, (22 / 7.0), 0.01) -func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - return InDelta(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - return InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) -} - -// InDeltaSlice is the same as InDelta, except it compares two slices. -func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) -func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { - return InDeltaf(a.t, expected, actual, delta, msg, args...) -} - -// InEpsilon asserts that expected and actual have a relative error less than epsilon -func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) -} - -// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) -} - -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { - return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) -} - -// IsType asserts that the specified objects are of the same type. -func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { - return IsType(a.t, expectedType, object, msgAndArgs...) -} - -// IsTypef asserts that the specified objects are of the same type. -func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { - return IsTypef(a.t, expectedType, object, msg, args...) -} - -// JSONEq asserts that two JSON strings are equivalent. -// -// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) -func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { - return JSONEq(a.t, expected, actual, msgAndArgs...) -} - -// JSONEqf asserts that two JSON strings are equivalent. -// -// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { - return JSONEqf(a.t, expected, actual, msg, args...) -} - -// Len asserts that the specified object has specific length. -// Len also fails if the object has a type that len() not accept. -// -// a.Len(mySlice, 3) -func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { - return Len(a.t, object, length, msgAndArgs...) -} - -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// a.Lenf(mySlice, 3, "error message %s", "formatted") -func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { - return Lenf(a.t, object, length, msg, args...) -} - -// Nil asserts that the specified object is nil. -// -// a.Nil(err) -func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { - return Nil(a.t, object, msgAndArgs...) -} - -// Nilf asserts that the specified object is nil. -// -// a.Nilf(err, "error message %s", "formatted") -func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { - return Nilf(a.t, object, msg, args...) -} - -// NoError asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if a.NoError(err) { -// assert.Equal(t, expectedObj, actualObj) -// } -func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { - return NoError(a.t, err, msgAndArgs...) -} - -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if a.NoErrorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { - return NoErrorf(a.t, err, msg, args...) -} - -// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// a.NotContains("Hello World", "Earth") -// a.NotContains(["Hello", "World"], "Earth") -// a.NotContains({"Hello": "World"}, "Earth") -func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { - return NotContains(a.t, s, contains, msgAndArgs...) -} - -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") -// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") -// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") -func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { - return NotContainsf(a.t, s, contains, msg, args...) -} - -// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if a.NotEmpty(obj) { -// assert.Equal(t, "two", obj[1]) -// } -func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { - return NotEmpty(a.t, object, msgAndArgs...) -} - -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if a.NotEmptyf(obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { - return NotEmptyf(a.t, object, msg, args...) -} - -// NotEqual asserts that the specified values are NOT equal. -// -// a.NotEqual(obj1, obj2) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { - return NotEqual(a.t, expected, actual, msgAndArgs...) -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// a.NotEqualf(obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { - return NotEqualf(a.t, expected, actual, msg, args...) -} - -// NotNil asserts that the specified object is not nil. -// -// a.NotNil(err) -func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { - return NotNil(a.t, object, msgAndArgs...) -} - -// NotNilf asserts that the specified object is not nil. -// -// a.NotNilf(err, "error message %s", "formatted") -func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { - return NotNilf(a.t, object, msg, args...) -} - -// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanics(func(){ RemainCalm() }) -func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { - return NotPanics(a.t, f, msgAndArgs...) -} - -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") -func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { - return NotPanicsf(a.t, f, msg, args...) -} - -// NotRegexp asserts that a specified regexp does not match a string. -// -// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") -// a.NotRegexp("^start", "it's not starting") -func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - return NotRegexp(a.t, rx, str, msgAndArgs...) -} - -// NotRegexpf asserts that a specified regexp does not match a string. -// -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") -// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") -func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return NotRegexpf(a.t, rx, str, msg, args...) -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { - return NotSubset(a.t, list, subset, msgAndArgs...) -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return NotSubsetf(a.t, list, subset, msg, args...) -} - -// NotZero asserts that i is not the zero value for its type. -func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { - return NotZero(a.t, i, msgAndArgs...) -} - -// NotZerof asserts that i is not the zero value for its type. -func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { - return NotZerof(a.t, i, msg, args...) -} - -// Panics asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panics(func(){ GoCrazy() }) -func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { - return Panics(a.t, f, msgAndArgs...) -} - -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) -func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { - return PanicsWithValue(a.t, expected, f, msgAndArgs...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { - return PanicsWithValuef(a.t, expected, f, msg, args...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { - return Panicsf(a.t, f, msg, args...) -} - -// Regexp asserts that a specified regexp matches a string. -// -// a.Regexp(regexp.MustCompile("start"), "it's starting") -// a.Regexp("start...$", "it's not starting") -func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - return Regexp(a.t, rx, str, msgAndArgs...) -} - -// Regexpf asserts that a specified regexp matches a string. -// -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") -// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") -func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { - return Regexpf(a.t, rx, str, msg, args...) -} - -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { - return Subset(a.t, list, subset, msgAndArgs...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { - return Subsetf(a.t, list, subset, msg, args...) -} - -// True asserts that the specified value is true. -// -// a.True(myBool) -func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { - return True(a.t, value, msgAndArgs...) -} - -// Truef asserts that the specified value is true. -// -// a.Truef(myBool, "error message %s", "formatted") -func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { - return Truef(a.t, value, msg, args...) -} - -// WithinDuration asserts that the two times are within duration delta of each other. -// -// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) -func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { - return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) -} - -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { - return WithinDurationf(a.t, expected, actual, delta, msg, args...) -} - -// Zero asserts that i is the zero value for its type. -func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { - return Zero(a.t, i, msgAndArgs...) -} - -// Zerof asserts that i is the zero value for its type. -func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { - return Zerof(a.t, i, msg, args...) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl deleted file mode 100644 index 99f9acf..0000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.CommentWithoutT "a"}} -func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { - return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) -} diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go deleted file mode 100644 index 47bda77..0000000 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ /dev/null @@ -1,1256 +0,0 @@ -package assert - -import ( - "bufio" - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "os" - "reflect" - "regexp" - "runtime" - "strings" - "time" - "unicode" - "unicode/utf8" - - "github.com/davecgh/go-spew/spew" - "github.com/pmezard/go-difflib/difflib" -) - -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl - -// TestingT is an interface wrapper around *testing.T -type TestingT interface { - Errorf(format string, args ...interface{}) -} - -// Comparison a custom function that returns true on success and false on failure -type Comparison func() (success bool) - -/* - Helper functions -*/ - -// ObjectsAreEqual determines if two objects are considered equal. -// -// This function does no assertion of any kind. -func ObjectsAreEqual(expected, actual interface{}) bool { - - if expected == nil || actual == nil { - return expected == actual - } - if exp, ok := expected.([]byte); ok { - act, ok := actual.([]byte) - if !ok { - return false - } else if exp == nil || act == nil { - return exp == nil && act == nil - } - return bytes.Equal(exp, act) - } - return reflect.DeepEqual(expected, actual) - -} - -// ObjectsAreEqualValues gets whether two objects are equal, or if their -// values are equal. -func ObjectsAreEqualValues(expected, actual interface{}) bool { - if ObjectsAreEqual(expected, actual) { - return true - } - - actualType := reflect.TypeOf(actual) - if actualType == nil { - return false - } - expectedValue := reflect.ValueOf(expected) - if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { - // Attempt comparison after type conversion - return reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) - } - - return false -} - -/* CallerInfo is necessary because the assert functions use the testing object -internally, causing it to print the file:line of the assert method, rather than where -the problem actually occurred in calling code.*/ - -// CallerInfo returns an array of strings containing the file and line number -// of each stack frame leading from the current test to the assert call that -// failed. -func CallerInfo() []string { - - pc := uintptr(0) - file := "" - line := 0 - ok := false - name := "" - - callers := []string{} - for i := 0; ; i++ { - pc, file, line, ok = runtime.Caller(i) - if !ok { - // The breaks below failed to terminate the loop, and we ran off the - // end of the call stack. - break - } - - // This is a huge edge case, but it will panic if this is the case, see #180 - if file == "" { - break - } - - f := runtime.FuncForPC(pc) - if f == nil { - break - } - name = f.Name() - - // testing.tRunner is the standard library function that calls - // tests. Subtests are called directly by tRunner, without going through - // the Test/Benchmark/Example function that contains the t.Run calls, so - // with subtests we should break when we hit tRunner, without adding it - // to the list of callers. - if name == "testing.tRunner" { - break - } - - parts := strings.Split(file, "/") - file = parts[len(parts)-1] - if len(parts) > 1 { - dir := parts[len(parts)-2] - if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { - callers = append(callers, fmt.Sprintf("%s:%d", file, line)) - } - } - - // Drop the package - segments := strings.Split(name, ".") - name = segments[len(segments)-1] - if isTest(name, "Test") || - isTest(name, "Benchmark") || - isTest(name, "Example") { - break - } - } - - return callers -} - -// Stolen from the `go test` tool. -// 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) -} - -// getWhitespaceString returns a string that is long enough to overwrite the default -// output from the go testing framework. -func getWhitespaceString() string { - - _, file, line, ok := runtime.Caller(1) - if !ok { - return "" - } - parts := strings.Split(file, "/") - file = parts[len(parts)-1] - - return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) - -} - -func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { - if len(msgAndArgs) == 0 || msgAndArgs == nil { - return "" - } - if len(msgAndArgs) == 1 { - return msgAndArgs[0].(string) - } - if len(msgAndArgs) > 1 { - return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) - } - return "" -} - -// Aligns the provided message so that all lines after the first line start at the same location as the first line. -// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). -// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the -// basis on which the alignment occurs). -func indentMessageLines(message string, longestLabelLen int) string { - outBuf := new(bytes.Buffer) - - for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { - // no need to align first line because it starts at the correct location (after the label) - if i != 0 { - // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab - outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") - } - outBuf.WriteString(scanner.Text()) - } - - return outBuf.String() -} - -type failNower interface { - FailNow() -} - -// FailNow fails test -func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { - Fail(t, failureMessage, msgAndArgs...) - - // We cannot extend TestingT with FailNow() and - // maintain backwards compatibility, so we fallback - // to panicking when FailNow is not available in - // TestingT. - // See issue #263 - - if t, ok := t.(failNower); ok { - t.FailNow() - } else { - panic("test failed and t is missing `FailNow()`") - } - return false -} - -// Fail reports a failure through -func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { - content := []labeledContent{ - {"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")}, - {"Error", failureMessage}, - } - - // Add test name if the Go version supports it - if n, ok := t.(interface { - Name() string - }); ok { - content = append(content, labeledContent{"Test", n.Name()}) - } - - message := messageFromMsgAndArgs(msgAndArgs...) - if len(message) > 0 { - content = append(content, labeledContent{"Messages", message}) - } - - t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...)) - - return false -} - -type labeledContent struct { - label string - content string -} - -// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: -// -// \r\t{{label}}:{{align_spaces}}\t{{content}}\n -// -// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. -// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this -// alignment is achieved, "\t{{content}}\n" is added for the output. -// -// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. -func labeledOutput(content ...labeledContent) string { - longestLabel := 0 - for _, v := range content { - if len(v.label) > longestLabel { - longestLabel = len(v.label) - } - } - var output string - for _, v := range content { - output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" - } - return output -} - -// Implements asserts that an object is implemented by the specified interface. -// -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) -func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { - interfaceType := reflect.TypeOf(interfaceObject).Elem() - - if object == nil { - return Fail(t, fmt.Sprintf("Cannot check if nil implements %v", interfaceType), msgAndArgs...) - } - if !reflect.TypeOf(object).Implements(interfaceType) { - return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) - } - - return true -} - -// IsType asserts that the specified objects are of the same type. -func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { - - if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { - return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) - } - - return true -} - -// Equal asserts that two objects are equal. -// -// assert.Equal(t, 123, 123) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if err := validateEqualArgs(expected, actual); err != nil { - return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", - expected, actual, err), msgAndArgs...) - } - - if !ObjectsAreEqual(expected, actual) { - diff := diff(expected, actual) - expected, actual = formatUnequalValues(expected, actual) - return Fail(t, fmt.Sprintf("Not equal: \n"+ - "expected: %s\n"+ - "actual : %s%s", expected, actual, diff), msgAndArgs...) - } - - return true - -} - -// formatUnequalValues takes two values of arbitrary types and returns string -// representations appropriate to be presented to the user. -// -// If the values are not of like type, the returned strings will be prefixed -// with the type name, and the value will be enclosed in parenthesis similar -// to a type conversion in the Go grammar. -func formatUnequalValues(expected, actual interface{}) (e string, a string) { - if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%#v)", expected, expected), - fmt.Sprintf("%T(%#v)", actual, actual) - } - - return fmt.Sprintf("%#v", expected), - fmt.Sprintf("%#v", actual) -} - -// EqualValues asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValues(t, uint32(123), int32(123)) -func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - - if !ObjectsAreEqualValues(expected, actual) { - diff := diff(expected, actual) - expected, actual = formatUnequalValues(expected, actual) - return Fail(t, fmt.Sprintf("Not equal: \n"+ - "expected: %s\n"+ - "actual : %s%s", expected, actual, diff), msgAndArgs...) - } - - return true - -} - -// Exactly asserts that two objects are equal in value and type. -// -// assert.Exactly(t, int32(123), int64(123)) -func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - - aType := reflect.TypeOf(expected) - bType := reflect.TypeOf(actual) - - if aType != bType { - return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...) - } - - return Equal(t, expected, actual, msgAndArgs...) - -} - -// NotNil asserts that the specified object is not nil. -// -// assert.NotNil(t, err) -func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if !isNil(object) { - return true - } - return Fail(t, "Expected value not to be nil.", msgAndArgs...) -} - -// isNil checks if a specified object is nil or not, without Failing. -func isNil(object interface{}) bool { - if object == nil { - return true - } - - value := reflect.ValueOf(object) - kind := value.Kind() - if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { - return true - } - - return false -} - -// Nil asserts that the specified object is nil. -// -// assert.Nil(t, err) -func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if isNil(object) { - return true - } - return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) -} - -// isEmpty gets whether the specified object is considered empty or not. -func isEmpty(object interface{}) bool { - - // get nil case out of the way - if object == nil { - return true - } - - objValue := reflect.ValueOf(object) - - switch objValue.Kind() { - // collection types are empty when they have no element - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: - return objValue.Len() == 0 - // pointers are empty if nil or if the value they point to is empty - case reflect.Ptr: - if objValue.IsNil() { - return true - } - deref := objValue.Elem().Interface() - return isEmpty(deref) - // for all other types, compare against the zero value - default: - zero := reflect.Zero(objValue.Type()) - return reflect.DeepEqual(object, zero.Interface()) - } -} - -// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Empty(t, obj) -func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - - pass := isEmpty(object) - if !pass { - Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) - } - - return pass - -} - -// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmpty(t, obj) { -// assert.Equal(t, "two", obj[1]) -// } -func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - - pass := !isEmpty(object) - if !pass { - Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) - } - - return pass - -} - -// getLen try to get length of object. -// return (false, 0) if impossible. -func getLen(x interface{}) (ok bool, length int) { - v := reflect.ValueOf(x) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - return true, v.Len() -} - -// Len asserts that the specified object has specific length. -// Len also fails if the object has a type that len() not accept. -// -// assert.Len(t, mySlice, 3) -func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { - ok, l := getLen(object) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) - } - - if l != length { - return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) - } - return true -} - -// True asserts that the specified value is true. -// -// assert.True(t, myBool) -func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - - if value != true { - return Fail(t, "Should be true", msgAndArgs...) - } - - return true - -} - -// False asserts that the specified value is false. -// -// assert.False(t, myBool) -func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - - if value != false { - return Fail(t, "Should be false", msgAndArgs...) - } - - return true - -} - -// NotEqual asserts that the specified values are NOT equal. -// -// assert.NotEqual(t, obj1, obj2) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { - if err := validateEqualArgs(expected, actual); err != nil { - return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", - expected, actual, err), msgAndArgs...) - } - - if ObjectsAreEqual(expected, actual) { - return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) - } - - return true - -} - -// containsElement try loop over the list check if the list includes the element. -// return (false, false) if impossible. -// return (true, false) if element was not found. -// return (true, true) if element was found. -func includeElement(list interface{}, element interface{}) (ok, found bool) { - - listValue := reflect.ValueOf(list) - elementValue := reflect.ValueOf(element) - defer func() { - if e := recover(); e != nil { - ok = false - found = false - } - }() - - if reflect.TypeOf(list).Kind() == reflect.String { - return true, strings.Contains(listValue.String(), elementValue.String()) - } - - if reflect.TypeOf(list).Kind() == reflect.Map { - mapKeys := listValue.MapKeys() - for i := 0; i < len(mapKeys); i++ { - if ObjectsAreEqual(mapKeys[i].Interface(), element) { - return true, true - } - } - return true, false - } - - for i := 0; i < listValue.Len(); i++ { - if ObjectsAreEqual(listValue.Index(i).Interface(), element) { - return true, true - } - } - return true, false - -} - -// Contains asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") -func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { - - ok, found := includeElement(s, contains) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) - } - if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) - } - - return true - -} - -// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") -func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { - - ok, found := includeElement(s, contains) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) - } - if found { - return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) - } - - return true - -} - -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { - if subset == nil { - return true // we consider nil to be equal to the nil set - } - - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) - } - - if subsetKind != reflect.Array && subsetKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) - } - - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() - ok, found := includeElement(list, element) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) - } - if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) - } - } - - return true -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { - if subset == nil { - return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...) - } - - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) - } - - if subsetKind != reflect.Array && subsetKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) - } - - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() - ok, found := includeElement(list, element) - if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) - } - if !found { - return true - } - } - - return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) -func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { - if isEmpty(listA) && isEmpty(listB) { - return true - } - - aKind := reflect.TypeOf(listA).Kind() - bKind := reflect.TypeOf(listB).Kind() - - if aKind != reflect.Array && aKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) - } - - if bKind != reflect.Array && bKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) - } - - aValue := reflect.ValueOf(listA) - bValue := reflect.ValueOf(listB) - - aLen := aValue.Len() - bLen := bValue.Len() - - if aLen != bLen { - return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) - } - - // Mark indexes in bValue that we already used - visited := make([]bool, bLen) - for i := 0; i < aLen; i++ { - element := aValue.Index(i).Interface() - found := false - for j := 0; j < bLen; j++ { - if visited[j] { - continue - } - if ObjectsAreEqual(bValue.Index(j).Interface(), element) { - visited[j] = true - found = true - break - } - } - if !found { - return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) - } - } - - return true -} - -// Condition uses a Comparison to assert a complex condition. -func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { - result := comp() - if !result { - Fail(t, "Condition failed!", msgAndArgs...) - } - return result -} - -// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics -// methods, and represents a simple func that takes no arguments, and returns nothing. -type PanicTestFunc func() - -// didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}) { - - didPanic := false - var message interface{} - func() { - - defer func() { - if message = recover(); message != nil { - didPanic = true - } - }() - - // call the target function - f() - - }() - - return didPanic, message - -} - -// Panics asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panics(t, func(){ GoCrazy() }) -func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { - - if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) - } - - return true -} - -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) -func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { - - funcDidPanic, panicValue := didPanic(f) - if !funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) - } - if panicValue != expected { - return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) - } - - return true -} - -// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanics(t, func(){ RemainCalm() }) -func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { - - if funcDidPanic, panicValue := didPanic(f); funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) - } - - return true -} - -// WithinDuration asserts that the two times are within duration delta of each other. -// -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) -func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { - - dt := expected.Sub(actual) - if dt < -delta || dt > delta { - return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) - } - - return true -} - -func toFloat(x interface{}) (float64, bool) { - var xf float64 - xok := true - - switch xn := x.(type) { - case uint8: - xf = float64(xn) - case uint16: - xf = float64(xn) - case uint32: - xf = float64(xn) - case uint64: - xf = float64(xn) - case int: - xf = float64(xn) - case int8: - xf = float64(xn) - case int16: - xf = float64(xn) - case int32: - xf = float64(xn) - case int64: - xf = float64(xn) - case float32: - xf = float64(xn) - case float64: - xf = float64(xn) - case time.Duration: - xf = float64(xn) - default: - xok = false - } - - return xf, xok -} - -// InDelta asserts that the two numerals are within delta of each other. -// -// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) -func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - - af, aok := toFloat(expected) - bf, bok := toFloat(actual) - - if !aok || !bok { - return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) - } - - if math.IsNaN(af) { - return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) - } - - if math.IsNaN(bf) { - return Fail(t, fmt.Sprintf("Expected %v with delta %v, but was NaN", expected, delta), msgAndArgs...) - } - - dt := af - bf - if dt < -delta || dt > delta { - return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) - } - - return true -} - -// InDeltaSlice is the same as InDelta, except it compares two slices. -func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if expected == nil || actual == nil || - reflect.TypeOf(actual).Kind() != reflect.Slice || - reflect.TypeOf(expected).Kind() != reflect.Slice { - return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) - } - - actualSlice := reflect.ValueOf(actual) - expectedSlice := reflect.ValueOf(expected) - - for i := 0; i < actualSlice.Len(); i++ { - result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) - if !result { - return result - } - } - - return true -} - -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { - if expected == nil || actual == nil || - reflect.TypeOf(actual).Kind() != reflect.Map || - reflect.TypeOf(expected).Kind() != reflect.Map { - return Fail(t, "Arguments must be maps", msgAndArgs...) - } - - expectedMap := reflect.ValueOf(expected) - actualMap := reflect.ValueOf(actual) - - if expectedMap.Len() != actualMap.Len() { - return Fail(t, "Arguments must have the same number of keys", msgAndArgs...) - } - - for _, k := range expectedMap.MapKeys() { - ev := expectedMap.MapIndex(k) - av := actualMap.MapIndex(k) - - if !ev.IsValid() { - return Fail(t, fmt.Sprintf("missing key %q in expected map", k), msgAndArgs...) - } - - if !av.IsValid() { - return Fail(t, fmt.Sprintf("missing key %q in actual map", k), msgAndArgs...) - } - - if !InDelta( - t, - ev.Interface(), - av.Interface(), - delta, - msgAndArgs..., - ) { - return false - } - } - - return true -} - -func calcRelativeError(expected, actual interface{}) (float64, error) { - af, aok := toFloat(expected) - if !aok { - return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) - } - if af == 0 { - return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") - } - bf, bok := toFloat(actual) - if !bok { - return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) - } - - return math.Abs(af-bf) / math.Abs(af), nil -} - -// InEpsilon asserts that expected and actual have a relative error less than epsilon -func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - actualEpsilon, err := calcRelativeError(expected, actual) - if err != nil { - return Fail(t, err.Error(), msgAndArgs...) - } - if actualEpsilon > epsilon { - return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ - " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) - } - - return true -} - -// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. -func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { - if expected == nil || actual == nil || - reflect.TypeOf(actual).Kind() != reflect.Slice || - reflect.TypeOf(expected).Kind() != reflect.Slice { - return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) - } - - actualSlice := reflect.ValueOf(actual) - expectedSlice := reflect.ValueOf(expected) - - for i := 0; i < actualSlice.Len(); i++ { - result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon) - if !result { - return result - } - } - - return true -} - -/* - Errors -*/ - -// NoError asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) -// } -func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if err != nil { - return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) - } - - return true -} - -// Error asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) -// } -func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - - if err == nil { - return Fail(t, "An error is expected but got nil.", msgAndArgs...) - } - - return true -} - -// EqualError asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) -func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { - if !Error(t, theError, msgAndArgs...) { - return false - } - expected := errString - actual := theError.Error() - // don't need to use deep equals here, we know they are both strings - if expected != actual { - return Fail(t, fmt.Sprintf("Error message not equal:\n"+ - "expected: %q\n"+ - "actual : %q", expected, actual), msgAndArgs...) - } - return true -} - -// matchRegexp return true if a specified regexp matches a string. -func matchRegexp(rx interface{}, str interface{}) bool { - - var r *regexp.Regexp - if rr, ok := rx.(*regexp.Regexp); ok { - r = rr - } else { - r = regexp.MustCompile(fmt.Sprint(rx)) - } - - return (r.FindStringIndex(fmt.Sprint(str)) != nil) - -} - -// Regexp asserts that a specified regexp matches a string. -// -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") -func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - - match := matchRegexp(rx, str) - - if !match { - Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) - } - - return match -} - -// NotRegexp asserts that a specified regexp does not match a string. -// -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") -func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { - match := matchRegexp(rx, str) - - if match { - Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) - } - - return !match - -} - -// Zero asserts that i is the zero value for its type. -func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { - if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { - return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) - } - return true -} - -// NotZero asserts that i is not the zero value for its type. -func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { - if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { - return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) - } - return true -} - -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) - } - return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) - } - if info.IsDir() { - return Fail(t, fmt.Sprintf("%q is a directory", path), msgAndArgs...) - } - return true -} - -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { - info, err := os.Lstat(path) - if err != nil { - if os.IsNotExist(err) { - return Fail(t, fmt.Sprintf("unable to find file %q", path), msgAndArgs...) - } - return Fail(t, fmt.Sprintf("error when running os.Lstat(%q): %s", path, err), msgAndArgs...) - } - if !info.IsDir() { - return Fail(t, fmt.Sprintf("%q is a file", path), msgAndArgs...) - } - return true -} - -// JSONEq asserts that two JSON strings are equivalent. -// -// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) -func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { - var expectedJSONAsInterface, actualJSONAsInterface interface{} - - if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { - return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid json.\nJSON parsing error: '%s'", expected, err.Error()), msgAndArgs...) - } - - if err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil { - return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid json.\nJSON parsing error: '%s'", actual, err.Error()), msgAndArgs...) - } - - return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) -} - -func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { - t := reflect.TypeOf(v) - k := t.Kind() - - if k == reflect.Ptr { - t = t.Elem() - k = t.Kind() - } - return t, k -} - -// diff returns a diff of both values as long as both are of the same type and -// are a struct, map, slice or array. Otherwise it returns an empty string. -func diff(expected interface{}, actual interface{}) string { - if expected == nil || actual == nil { - return "" - } - - et, ek := typeAndKind(expected) - at, _ := typeAndKind(actual) - - if et != at { - return "" - } - - if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { - return "" - } - - e := spewConfig.Sdump(expected) - a := spewConfig.Sdump(actual) - - diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ - A: difflib.SplitLines(e), - B: difflib.SplitLines(a), - FromFile: "Expected", - FromDate: "", - ToFile: "Actual", - ToDate: "", - Context: 1, - }) - - return "\n\nDiff:\n" + diff -} - -// validateEqualArgs checks whether provided arguments can be safely used in the -// Equal/NotEqual functions. -func validateEqualArgs(expected, actual interface{}) error { - if isFunction(expected) || isFunction(actual) { - return errors.New("cannot take func type as argument") - } - return nil -} - -func isFunction(arg interface{}) bool { - if arg == nil { - return false - } - return reflect.TypeOf(arg).Kind() == reflect.Func -} - -var spewConfig = spew.ConfigState{ - Indent: " ", - DisablePointerAddresses: true, - DisableCapacities: true, - SortKeys: true, -} diff --git a/vendor/github.com/stretchr/testify/assert/doc.go b/vendor/github.com/stretchr/testify/assert/doc.go deleted file mode 100644 index c9dccc4..0000000 --- a/vendor/github.com/stretchr/testify/assert/doc.go +++ /dev/null @@ -1,45 +0,0 @@ -// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. -// -// Example Usage -// -// The following is a complete example using assert in a standard test function: -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// ) -// -// func TestSomething(t *testing.T) { -// -// var a string = "Hello" -// var b string = "Hello" -// -// assert.Equal(t, a, b, "The two words should be the same.") -// -// } -// -// if you assert many times, use the format below: -// -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// ) -// -// func TestSomething(t *testing.T) { -// assert := assert.New(t) -// -// var a string = "Hello" -// var b string = "Hello" -// -// assert.Equal(a, b, "The two words should be the same.") -// } -// -// Assertions -// -// Assertions allow you to easily write test code, and are global funcs in the `assert` package. -// All assertion functions take, as the first argument, the `*testing.T` object provided by the -// testing framework. This allows the assertion funcs to write the failings and other details to -// the correct place. -// -// Every assertion function also takes an optional string message as the final argument, -// allowing custom error messages to be appended to the message the assertion method outputs. -package assert diff --git a/vendor/github.com/stretchr/testify/assert/errors.go b/vendor/github.com/stretchr/testify/assert/errors.go deleted file mode 100644 index ac9dc9d..0000000 --- a/vendor/github.com/stretchr/testify/assert/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -package assert - -import ( - "errors" -) - -// AnError is an error instance useful for testing. If the code does not care -// about error specifics, and only needs to return the error for example, this -// error should be used to make the test code more readable. -var AnError = errors.New("assert.AnError general error for testing") diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go deleted file mode 100644 index 9ad5685..0000000 --- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go +++ /dev/null @@ -1,16 +0,0 @@ -package assert - -// Assertions provides assertion methods around the -// TestingT interface. -type Assertions struct { - t TestingT -} - -// New makes a new Assertions object for the specified TestingT. -func New(t TestingT) *Assertions { - return &Assertions{ - t: t, - } -} - -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go deleted file mode 100644 index 3101e78..0000000 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ /dev/null @@ -1,127 +0,0 @@ -package assert - -import ( - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "strings" -) - -// httpCode is a helper that returns HTTP code of the response. It returns -1 and -// an error if building a new request fails. -func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { - w := httptest.NewRecorder() - req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) - if err != nil { - return -1, err - } - handler(w, req) - return w.Code, nil -} - -// HTTPSuccess asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false - } - - isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent - if !isSuccessCode { - Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isSuccessCode -} - -// HTTPRedirect asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false - } - - isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect - if !isRedirectCode { - Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isRedirectCode -} - -// HTTPError asserts that a specified handler returns an error status code. -// -// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { - code, err := httpCode(handler, method, url, values) - if err != nil { - Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false - } - - isErrorCode := code >= http.StatusBadRequest - if !isErrorCode { - Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) - } - - return isErrorCode -} - -// HTTPBody is a helper that returns HTTP body of the response. It returns -// empty string if building a new request fails. -func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { - w := httptest.NewRecorder() - req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) - if err != nil { - return "" - } - handler(w, req) - return w.Body.String() -} - -// HTTPBodyContains asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - body := HTTPBody(handler, method, url, values) - - contains := strings.Contains(body, fmt.Sprint(str)) - if !contains { - Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) - } - - return contains -} - -// HTTPBodyNotContains asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { - body := HTTPBody(handler, method, url, values) - - contains := strings.Contains(body, fmt.Sprint(str)) - if contains { - Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) - } - - return !contains -} diff --git a/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/stretchr/testify/require/doc.go deleted file mode 100644 index 169de39..0000000 --- a/vendor/github.com/stretchr/testify/require/doc.go +++ /dev/null @@ -1,28 +0,0 @@ -// Package require implements the same assertions as the `assert` package but -// stops test execution when a test fails. -// -// Example Usage -// -// The following is a complete example using require in a standard test function: -// import ( -// "testing" -// "github.com/stretchr/testify/require" -// ) -// -// func TestSomething(t *testing.T) { -// -// var a string = "Hello" -// var b string = "Hello" -// -// require.Equal(t, a, b, "The two words should be the same.") -// -// } -// -// Assertions -// -// The `require` package have same global functions as in the `assert` package, -// but instead of returning a boolean result they call `t.FailNow()`. -// -// Every assertion function also takes an optional string message as the final argument, -// allowing custom error messages to be appended to the message the assertion method outputs. -package require diff --git a/vendor/github.com/stretchr/testify/require/forward_requirements.go b/vendor/github.com/stretchr/testify/require/forward_requirements.go deleted file mode 100644 index ac71d40..0000000 --- a/vendor/github.com/stretchr/testify/require/forward_requirements.go +++ /dev/null @@ -1,16 +0,0 @@ -package require - -// Assertions provides assertion methods around the -// TestingT interface. -type Assertions struct { - t TestingT -} - -// New makes a new Assertions object for the specified TestingT. -func New(t TestingT) *Assertions { - return &Assertions{ - t: t, - } -} - -//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go deleted file mode 100644 index ac3c308..0000000 --- a/vendor/github.com/stretchr/testify/require/require.go +++ /dev/null @@ -1,867 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ - -package require - -import ( - assert "github.com/stretchr/testify/assert" - http "net/http" - url "net/url" - time "time" -) - -// Condition uses a Comparison to assert a complex condition. -func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { - if !assert.Condition(t, comp, msgAndArgs...) { - t.FailNow() - } -} - -// Conditionf uses a Comparison to assert a complex condition. -func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) { - if !assert.Conditionf(t, comp, msg, args...) { - t.FailNow() - } -} - -// Contains asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") -func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { - if !assert.Contains(t, s, contains, msgAndArgs...) { - t.FailNow() - } -} - -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") -func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { - if !assert.Containsf(t, s, contains, msg, args...) { - t.FailNow() - } -} - -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func DirExists(t TestingT, path string, msgAndArgs ...interface{}) { - if !assert.DirExists(t, path, msgAndArgs...) { - t.FailNow() - } -} - -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func DirExistsf(t TestingT, path string, msg string, args ...interface{}) { - if !assert.DirExistsf(t, path, msg, args...) { - t.FailNow() - } -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) -func ElementsMatch(t TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) { - if !assert.ElementsMatch(t, listA, listB, msgAndArgs...) { - t.FailNow() - } -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// assert.ElementsMatchf(t, [1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) { - if !assert.ElementsMatchf(t, listA, listB, msg, args...) { - t.FailNow() - } -} - -// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Empty(t, obj) -func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { - if !assert.Empty(t, object, msgAndArgs...) { - t.FailNow() - } -} - -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// assert.Emptyf(t, obj, "error message %s", "formatted") -func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { - if !assert.Emptyf(t, object, msg, args...) { - t.FailNow() - } -} - -// Equal asserts that two objects are equal. -// -// assert.Equal(t, 123, 123) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - if !assert.Equal(t, expected, actual, msgAndArgs...) { - t.FailNow() - } -} - -// EqualError asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) -func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { - if !assert.EqualError(t, theError, errString, msgAndArgs...) { - t.FailNow() - } -} - -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") -func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { - if !assert.EqualErrorf(t, theError, errString, msg, args...) { - t.FailNow() - } -} - -// EqualValues asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValues(t, uint32(123), int32(123)) -func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - if !assert.EqualValues(t, expected, actual, msgAndArgs...) { - t.FailNow() - } -} - -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) -func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { - if !assert.EqualValuesf(t, expected, actual, msg, args...) { - t.FailNow() - } -} - -// Equalf asserts that two objects are equal. -// -// assert.Equalf(t, 123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { - if !assert.Equalf(t, expected, actual, msg, args...) { - t.FailNow() - } -} - -// Error asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) -// } -func Error(t TestingT, err error, msgAndArgs ...interface{}) { - if !assert.Error(t, err, msgAndArgs...) { - t.FailNow() - } -} - -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func Errorf(t TestingT, err error, msg string, args ...interface{}) { - if !assert.Errorf(t, err, msg, args...) { - t.FailNow() - } -} - -// Exactly asserts that two objects are equal in value and type. -// -// assert.Exactly(t, int32(123), int64(123)) -func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - if !assert.Exactly(t, expected, actual, msgAndArgs...) { - t.FailNow() - } -} - -// Exactlyf asserts that two objects are equal in value and type. -// -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) -func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { - if !assert.Exactlyf(t, expected, actual, msg, args...) { - t.FailNow() - } -} - -// Fail reports a failure through -func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { - if !assert.Fail(t, failureMessage, msgAndArgs...) { - t.FailNow() - } -} - -// FailNow fails test -func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { - if !assert.FailNow(t, failureMessage, msgAndArgs...) { - t.FailNow() - } -} - -// FailNowf fails test -func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) { - if !assert.FailNowf(t, failureMessage, msg, args...) { - t.FailNow() - } -} - -// Failf reports a failure through -func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { - if !assert.Failf(t, failureMessage, msg, args...) { - t.FailNow() - } -} - -// False asserts that the specified value is false. -// -// assert.False(t, myBool) -func False(t TestingT, value bool, msgAndArgs ...interface{}) { - if !assert.False(t, value, msgAndArgs...) { - t.FailNow() - } -} - -// Falsef asserts that the specified value is false. -// -// assert.Falsef(t, myBool, "error message %s", "formatted") -func Falsef(t TestingT, value bool, msg string, args ...interface{}) { - if !assert.Falsef(t, value, msg, args...) { - t.FailNow() - } -} - -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func FileExists(t TestingT, path string, msgAndArgs ...interface{}) { - if !assert.FileExists(t, path, msgAndArgs...) { - t.FailNow() - } -} - -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func FileExistsf(t TestingT, path string, msg string, args ...interface{}) { - if !assert.FileExistsf(t, path, msg, args...) { - t.FailNow() - } -} - -// HTTPBodyContains asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { - if !assert.HTTPBodyContains(t, handler, method, url, values, str, msgAndArgs...) { - t.FailNow() - } -} - -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { - if !assert.HTTPBodyContainsf(t, handler, method, url, values, str, msg, args...) { - t.FailNow() - } -} - -// HTTPBodyNotContains asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { - if !assert.HTTPBodyNotContains(t, handler, method, url, values, str, msgAndArgs...) { - t.FailNow() - } -} - -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { - if !assert.HTTPBodyNotContainsf(t, handler, method, url, values, str, msg, args...) { - t.FailNow() - } -} - -// HTTPError asserts that a specified handler returns an error status code. -// -// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { - if !assert.HTTPError(t, handler, method, url, values, msgAndArgs...) { - t.FailNow() - } -} - -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { - if !assert.HTTPErrorf(t, handler, method, url, values, msg, args...) { - t.FailNow() - } -} - -// HTTPRedirect asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { - if !assert.HTTPRedirect(t, handler, method, url, values, msgAndArgs...) { - t.FailNow() - } -} - -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { - if !assert.HTTPRedirectf(t, handler, method, url, values, msg, args...) { - t.FailNow() - } -} - -// HTTPSuccess asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { - if !assert.HTTPSuccess(t, handler, method, url, values, msgAndArgs...) { - t.FailNow() - } -} - -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { - if !assert.HTTPSuccessf(t, handler, method, url, values, msg, args...) { - t.FailNow() - } -} - -// Implements asserts that an object is implemented by the specified interface. -// -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) -func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { - if !assert.Implements(t, interfaceObject, object, msgAndArgs...) { - t.FailNow() - } -} - -// Implementsf asserts that an object is implemented by the specified interface. -// -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) -func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { - if !assert.Implementsf(t, interfaceObject, object, msg, args...) { - t.FailNow() - } -} - -// InDelta asserts that the two numerals are within delta of each other. -// -// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) -func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { - if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) { - t.FailNow() - } -} - -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValues(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { - if !assert.InDeltaMapValues(t, expected, actual, delta, msgAndArgs...) { - t.FailNow() - } -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func InDeltaMapValuesf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { - if !assert.InDeltaMapValuesf(t, expected, actual, delta, msg, args...) { - t.FailNow() - } -} - -// InDeltaSlice is the same as InDelta, except it compares two slices. -func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { - if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { - t.FailNow() - } -} - -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { - if !assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) { - t.FailNow() - } -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) -func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { - if !assert.InDeltaf(t, expected, actual, delta, msg, args...) { - t.FailNow() - } -} - -// InEpsilon asserts that expected and actual have a relative error less than epsilon -func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { - if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { - t.FailNow() - } -} - -// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. -func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { - if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) { - t.FailNow() - } -} - -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { - if !assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) { - t.FailNow() - } -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { - if !assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) { - t.FailNow() - } -} - -// IsType asserts that the specified objects are of the same type. -func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { - if !assert.IsType(t, expectedType, object, msgAndArgs...) { - t.FailNow() - } -} - -// IsTypef asserts that the specified objects are of the same type. -func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) { - if !assert.IsTypef(t, expectedType, object, msg, args...) { - t.FailNow() - } -} - -// JSONEq asserts that two JSON strings are equivalent. -// -// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) -func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { - if !assert.JSONEq(t, expected, actual, msgAndArgs...) { - t.FailNow() - } -} - -// JSONEqf asserts that two JSON strings are equivalent. -// -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { - if !assert.JSONEqf(t, expected, actual, msg, args...) { - t.FailNow() - } -} - -// Len asserts that the specified object has specific length. -// Len also fails if the object has a type that len() not accept. -// -// assert.Len(t, mySlice, 3) -func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { - if !assert.Len(t, object, length, msgAndArgs...) { - t.FailNow() - } -} - -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") -func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { - if !assert.Lenf(t, object, length, msg, args...) { - t.FailNow() - } -} - -// Nil asserts that the specified object is nil. -// -// assert.Nil(t, err) -func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { - if !assert.Nil(t, object, msgAndArgs...) { - t.FailNow() - } -} - -// Nilf asserts that the specified object is nil. -// -// assert.Nilf(t, err, "error message %s", "formatted") -func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { - if !assert.Nilf(t, object, msg, args...) { - t.FailNow() - } -} - -// NoError asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) -// } -func NoError(t TestingT, err error, msgAndArgs ...interface{}) { - if !assert.NoError(t, err, msgAndArgs...) { - t.FailNow() - } -} - -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { - if !assert.NoErrorf(t, err, msg, args...) { - t.FailNow() - } -} - -// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") -func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { - if !assert.NotContains(t, s, contains, msgAndArgs...) { - t.FailNow() - } -} - -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") -func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { - if !assert.NotContainsf(t, s, contains, msg, args...) { - t.FailNow() - } -} - -// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmpty(t, obj) { -// assert.Equal(t, "two", obj[1]) -// } -func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { - if !assert.NotEmpty(t, object, msgAndArgs...) { - t.FailNow() - } -} - -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { - if !assert.NotEmptyf(t, object, msg, args...) { - t.FailNow() - } -} - -// NotEqual asserts that the specified values are NOT equal. -// -// assert.NotEqual(t, obj1, obj2) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - if !assert.NotEqual(t, expected, actual, msgAndArgs...) { - t.FailNow() - } -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { - if !assert.NotEqualf(t, expected, actual, msg, args...) { - t.FailNow() - } -} - -// NotNil asserts that the specified object is not nil. -// -// assert.NotNil(t, err) -func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { - if !assert.NotNil(t, object, msgAndArgs...) { - t.FailNow() - } -} - -// NotNilf asserts that the specified object is not nil. -// -// assert.NotNilf(t, err, "error message %s", "formatted") -func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { - if !assert.NotNilf(t, object, msg, args...) { - t.FailNow() - } -} - -// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanics(t, func(){ RemainCalm() }) -func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { - if !assert.NotPanics(t, f, msgAndArgs...) { - t.FailNow() - } -} - -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") -func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { - if !assert.NotPanicsf(t, f, msg, args...) { - t.FailNow() - } -} - -// NotRegexp asserts that a specified regexp does not match a string. -// -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") -func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { - if !assert.NotRegexp(t, rx, str, msgAndArgs...) { - t.FailNow() - } -} - -// NotRegexpf asserts that a specified regexp does not match a string. -// -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") -func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { - if !assert.NotRegexpf(t, rx, str, msg, args...) { - t.FailNow() - } -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { - if !assert.NotSubset(t, list, subset, msgAndArgs...) { - t.FailNow() - } -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { - if !assert.NotSubsetf(t, list, subset, msg, args...) { - t.FailNow() - } -} - -// NotZero asserts that i is not the zero value for its type. -func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { - if !assert.NotZero(t, i, msgAndArgs...) { - t.FailNow() - } -} - -// NotZerof asserts that i is not the zero value for its type. -func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { - if !assert.NotZerof(t, i, msg, args...) { - t.FailNow() - } -} - -// Panics asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panics(t, func(){ GoCrazy() }) -func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { - if !assert.Panics(t, f, msgAndArgs...) { - t.FailNow() - } -} - -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) -func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { - if !assert.PanicsWithValue(t, expected, f, msgAndArgs...) { - t.FailNow() - } -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { - if !assert.PanicsWithValuef(t, expected, f, msg, args...) { - t.FailNow() - } -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") -func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { - if !assert.Panicsf(t, f, msg, args...) { - t.FailNow() - } -} - -// Regexp asserts that a specified regexp matches a string. -// -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") -func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { - if !assert.Regexp(t, rx, str, msgAndArgs...) { - t.FailNow() - } -} - -// Regexpf asserts that a specified regexp matches a string. -// -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") -func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { - if !assert.Regexpf(t, rx, str, msg, args...) { - t.FailNow() - } -} - -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { - if !assert.Subset(t, list, subset, msgAndArgs...) { - t.FailNow() - } -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { - if !assert.Subsetf(t, list, subset, msg, args...) { - t.FailNow() - } -} - -// True asserts that the specified value is true. -// -// assert.True(t, myBool) -func True(t TestingT, value bool, msgAndArgs ...interface{}) { - if !assert.True(t, value, msgAndArgs...) { - t.FailNow() - } -} - -// Truef asserts that the specified value is true. -// -// assert.Truef(t, myBool, "error message %s", "formatted") -func Truef(t TestingT, value bool, msg string, args ...interface{}) { - if !assert.Truef(t, value, msg, args...) { - t.FailNow() - } -} - -// WithinDuration asserts that the two times are within duration delta of each other. -// -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) -func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { - if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { - t.FailNow() - } -} - -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { - if !assert.WithinDurationf(t, expected, actual, delta, msg, args...) { - t.FailNow() - } -} - -// Zero asserts that i is the zero value for its type. -func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { - if !assert.Zero(t, i, msgAndArgs...) { - t.FailNow() - } -} - -// Zerof asserts that i is the zero value for its type. -func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) { - if !assert.Zerof(t, i, msg, args...) { - t.FailNow() - } -} diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/stretchr/testify/require/require.go.tmpl deleted file mode 100644 index d2c38f6..0000000 --- a/vendor/github.com/stretchr/testify/require/require.go.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -{{.Comment}} -func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { - if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { - t.FailNow() - } -} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go deleted file mode 100644 index 299ceb9..0000000 --- a/vendor/github.com/stretchr/testify/require/require_forward.go +++ /dev/null @@ -1,687 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen -* THIS FILE MUST NOT BE EDITED BY HAND - */ - -package require - -import ( - assert "github.com/stretchr/testify/assert" - http "net/http" - url "net/url" - time "time" -) - -// Condition uses a Comparison to assert a complex condition. -func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { - Condition(a.t, comp, msgAndArgs...) -} - -// Conditionf uses a Comparison to assert a complex condition. -func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) { - Conditionf(a.t, comp, msg, args...) -} - -// Contains asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// a.Contains("Hello World", "World") -// a.Contains(["Hello", "World"], "World") -// a.Contains({"Hello": "World"}, "Hello") -func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { - Contains(a.t, s, contains, msgAndArgs...) -} - -// Containsf asserts that the specified string, list(array, slice...) or map contains the -// specified substring or element. -// -// a.Containsf("Hello World", "World", "error message %s", "formatted") -// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") -// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") -func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { - Containsf(a.t, s, contains, msg, args...) -} - -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) { - DirExists(a.t, path, msgAndArgs...) -} - -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. -func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) { - DirExistsf(a.t, path, msg, args...) -} - -// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatch([1, 3, 2, 3], [1, 3, 3, 2]) -func (a *Assertions) ElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) { - ElementsMatch(a.t, listA, listB, msgAndArgs...) -} - -// ElementsMatchf asserts that the specified listA(array, slice...) is equal to specified -// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, -// the number of appearances of each of them in both lists should match. -// -// a.ElementsMatchf([1, 3, 2, 3], [1, 3, 3, 2], "error message %s", "formatted") -func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) { - ElementsMatchf(a.t, listA, listB, msg, args...) -} - -// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// a.Empty(obj) -func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { - Empty(a.t, object, msgAndArgs...) -} - -// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// a.Emptyf(obj, "error message %s", "formatted") -func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { - Emptyf(a.t, object, msg, args...) -} - -// Equal asserts that two objects are equal. -// -// a.Equal(123, 123) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - Equal(a.t, expected, actual, msgAndArgs...) -} - -// EqualError asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// a.EqualError(err, expectedErrorString) -func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { - EqualError(a.t, theError, errString, msgAndArgs...) -} - -// EqualErrorf asserts that a function returned an error (i.e. not `nil`) -// and that it is equal to the provided error. -// -// actualObj, err := SomeFunction() -// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") -func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { - EqualErrorf(a.t, theError, errString, msg, args...) -} - -// EqualValues asserts that two objects are equal or convertable to the same types -// and equal. -// -// a.EqualValues(uint32(123), int32(123)) -func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - EqualValues(a.t, expected, actual, msgAndArgs...) -} - -// EqualValuesf asserts that two objects are equal or convertable to the same types -// and equal. -// -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) -func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { - EqualValuesf(a.t, expected, actual, msg, args...) -} - -// Equalf asserts that two objects are equal. -// -// a.Equalf(123, 123, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). Function equality -// cannot be determined and will always fail. -func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) { - Equalf(a.t, expected, actual, msg, args...) -} - -// Error asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if a.Error(err) { -// assert.Equal(t, expectedError, err) -// } -func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { - Error(a.t, err, msgAndArgs...) -} - -// Errorf asserts that a function returned an error (i.e. not `nil`). -// -// actualObj, err := SomeFunction() -// if a.Errorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } -func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { - Errorf(a.t, err, msg, args...) -} - -// Exactly asserts that two objects are equal in value and type. -// -// a.Exactly(int32(123), int64(123)) -func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - Exactly(a.t, expected, actual, msgAndArgs...) -} - -// Exactlyf asserts that two objects are equal in value and type. -// -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) -func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { - Exactlyf(a.t, expected, actual, msg, args...) -} - -// Fail reports a failure through -func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { - Fail(a.t, failureMessage, msgAndArgs...) -} - -// FailNow fails test -func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { - FailNow(a.t, failureMessage, msgAndArgs...) -} - -// FailNowf fails test -func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) { - FailNowf(a.t, failureMessage, msg, args...) -} - -// Failf reports a failure through -func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) { - Failf(a.t, failureMessage, msg, args...) -} - -// False asserts that the specified value is false. -// -// a.False(myBool) -func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { - False(a.t, value, msgAndArgs...) -} - -// Falsef asserts that the specified value is false. -// -// a.Falsef(myBool, "error message %s", "formatted") -func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { - Falsef(a.t, value, msg, args...) -} - -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) { - FileExists(a.t, path, msgAndArgs...) -} - -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. -func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) { - FileExistsf(a.t, path, msg, args...) -} - -// HTTPBodyContains asserts that a specified handler returns a -// body that contains a string. -// -// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { - HTTPBodyContains(a.t, handler, method, url, values, str, msgAndArgs...) -} - -// HTTPBodyContainsf asserts that a specified handler returns a -// body that contains a string. -// -// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { - HTTPBodyContainsf(a.t, handler, method, url, values, str, msg, args...) -} - -// HTTPBodyNotContains asserts that a specified handler returns a -// body that does not contain a string. -// -// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { - HTTPBodyNotContains(a.t, handler, method, url, values, str, msgAndArgs...) -} - -// HTTPBodyNotContainsf asserts that a specified handler returns a -// body that does not contain a string. -// -// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { - HTTPBodyNotContainsf(a.t, handler, method, url, values, str, msg, args...) -} - -// HTTPError asserts that a specified handler returns an error status code. -// -// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { - HTTPError(a.t, handler, method, url, values, msgAndArgs...) -} - -// HTTPErrorf asserts that a specified handler returns an error status code. -// -// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { - HTTPErrorf(a.t, handler, method, url, values, msg, args...) -} - -// HTTPRedirect asserts that a specified handler returns a redirect status code. -// -// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { - HTTPRedirect(a.t, handler, method, url, values, msgAndArgs...) -} - -// HTTPRedirectf asserts that a specified handler returns a redirect status code. -// -// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} -// -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). -func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { - HTTPRedirectf(a.t, handler, method, url, values, msg, args...) -} - -// HTTPSuccess asserts that a specified handler returns a success status code. -// -// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { - HTTPSuccess(a.t, handler, method, url, values, msgAndArgs...) -} - -// HTTPSuccessf asserts that a specified handler returns a success status code. -// -// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") -// -// Returns whether the assertion was successful (true) or not (false). -func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { - HTTPSuccessf(a.t, handler, method, url, values, msg, args...) -} - -// Implements asserts that an object is implemented by the specified interface. -// -// a.Implements((*MyInterface)(nil), new(MyObject)) -func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { - Implements(a.t, interfaceObject, object, msgAndArgs...) -} - -// Implementsf asserts that an object is implemented by the specified interface. -// -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) -func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { - Implementsf(a.t, interfaceObject, object, msg, args...) -} - -// InDelta asserts that the two numerals are within delta of each other. -// -// a.InDelta(math.Pi, (22 / 7.0), 0.01) -func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { - InDelta(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaMapValues is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValues(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { - InDeltaMapValues(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaMapValuesf is the same as InDelta, but it compares all values between two maps. Both maps must have exactly the same keys. -func (a *Assertions) InDeltaMapValuesf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { - InDeltaMapValuesf(a.t, expected, actual, delta, msg, args...) -} - -// InDeltaSlice is the same as InDelta, except it compares two slices. -func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { - InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) -} - -// InDeltaSlicef is the same as InDelta, except it compares two slices. -func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { - InDeltaSlicef(a.t, expected, actual, delta, msg, args...) -} - -// InDeltaf asserts that the two numerals are within delta of each other. -// -// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) -func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { - InDeltaf(a.t, expected, actual, delta, msg, args...) -} - -// InEpsilon asserts that expected and actual have a relative error less than epsilon -func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { - InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) -} - -// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { - InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) -} - -// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. -func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { - InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) -} - -// InEpsilonf asserts that expected and actual have a relative error less than epsilon -func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { - InEpsilonf(a.t, expected, actual, epsilon, msg, args...) -} - -// IsType asserts that the specified objects are of the same type. -func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { - IsType(a.t, expectedType, object, msgAndArgs...) -} - -// IsTypef asserts that the specified objects are of the same type. -func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) { - IsTypef(a.t, expectedType, object, msg, args...) -} - -// JSONEq asserts that two JSON strings are equivalent. -// -// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) -func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { - JSONEq(a.t, expected, actual, msgAndArgs...) -} - -// JSONEqf asserts that two JSON strings are equivalent. -// -// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") -func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { - JSONEqf(a.t, expected, actual, msg, args...) -} - -// Len asserts that the specified object has specific length. -// Len also fails if the object has a type that len() not accept. -// -// a.Len(mySlice, 3) -func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { - Len(a.t, object, length, msgAndArgs...) -} - -// Lenf asserts that the specified object has specific length. -// Lenf also fails if the object has a type that len() not accept. -// -// a.Lenf(mySlice, 3, "error message %s", "formatted") -func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { - Lenf(a.t, object, length, msg, args...) -} - -// Nil asserts that the specified object is nil. -// -// a.Nil(err) -func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { - Nil(a.t, object, msgAndArgs...) -} - -// Nilf asserts that the specified object is nil. -// -// a.Nilf(err, "error message %s", "formatted") -func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { - Nilf(a.t, object, msg, args...) -} - -// NoError asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if a.NoError(err) { -// assert.Equal(t, expectedObj, actualObj) -// } -func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { - NoError(a.t, err, msgAndArgs...) -} - -// NoErrorf asserts that a function returned no error (i.e. `nil`). -// -// actualObj, err := SomeFunction() -// if a.NoErrorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } -func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { - NoErrorf(a.t, err, msg, args...) -} - -// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// a.NotContains("Hello World", "Earth") -// a.NotContains(["Hello", "World"], "Earth") -// a.NotContains({"Hello": "World"}, "Earth") -func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { - NotContains(a.t, s, contains, msgAndArgs...) -} - -// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the -// specified substring or element. -// -// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") -// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") -// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") -func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { - NotContainsf(a.t, s, contains, msg, args...) -} - -// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if a.NotEmpty(obj) { -// assert.Equal(t, "two", obj[1]) -// } -func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { - NotEmpty(a.t, object, msgAndArgs...) -} - -// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either -// a slice or a channel with len == 0. -// -// if a.NotEmptyf(obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } -func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { - NotEmptyf(a.t, object, msg, args...) -} - -// NotEqual asserts that the specified values are NOT equal. -// -// a.NotEqual(obj1, obj2) -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { - NotEqual(a.t, expected, actual, msgAndArgs...) -} - -// NotEqualf asserts that the specified values are NOT equal. -// -// a.NotEqualf(obj1, obj2, "error message %s", "formatted") -// -// Pointer variable equality is determined based on the equality of the -// referenced values (as opposed to the memory addresses). -func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) { - NotEqualf(a.t, expected, actual, msg, args...) -} - -// NotNil asserts that the specified object is not nil. -// -// a.NotNil(err) -func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { - NotNil(a.t, object, msgAndArgs...) -} - -// NotNilf asserts that the specified object is not nil. -// -// a.NotNilf(err, "error message %s", "formatted") -func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { - NotNilf(a.t, object, msg, args...) -} - -// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanics(func(){ RemainCalm() }) -func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { - NotPanics(a.t, f, msgAndArgs...) -} - -// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. -// -// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") -func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { - NotPanicsf(a.t, f, msg, args...) -} - -// NotRegexp asserts that a specified regexp does not match a string. -// -// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") -// a.NotRegexp("^start", "it's not starting") -func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { - NotRegexp(a.t, rx, str, msgAndArgs...) -} - -// NotRegexpf asserts that a specified regexp does not match a string. -// -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") -// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") -func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { - NotRegexpf(a.t, rx, str, msg, args...) -} - -// NotSubset asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") -func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { - NotSubset(a.t, list, subset, msgAndArgs...) -} - -// NotSubsetf asserts that the specified list(array, slice...) contains not all -// elements given in the specified subset(array, slice...). -// -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { - NotSubsetf(a.t, list, subset, msg, args...) -} - -// NotZero asserts that i is not the zero value for its type. -func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { - NotZero(a.t, i, msgAndArgs...) -} - -// NotZerof asserts that i is not the zero value for its type. -func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { - NotZerof(a.t, i, msg, args...) -} - -// Panics asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panics(func(){ GoCrazy() }) -func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { - Panics(a.t, f, msgAndArgs...) -} - -// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) -func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { - PanicsWithValue(a.t, expected, f, msgAndArgs...) -} - -// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that -// the recovered panic value equals the expected panic value. -// -// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { - PanicsWithValuef(a.t, expected, f, msg, args...) -} - -// Panicsf asserts that the code inside the specified PanicTestFunc panics. -// -// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") -func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { - Panicsf(a.t, f, msg, args...) -} - -// Regexp asserts that a specified regexp matches a string. -// -// a.Regexp(regexp.MustCompile("start"), "it's starting") -// a.Regexp("start...$", "it's not starting") -func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { - Regexp(a.t, rx, str, msgAndArgs...) -} - -// Regexpf asserts that a specified regexp matches a string. -// -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") -// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") -func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { - Regexpf(a.t, rx, str, msg, args...) -} - -// Subset asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") -func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { - Subset(a.t, list, subset, msgAndArgs...) -} - -// Subsetf asserts that the specified list(array, slice...) contains all -// elements given in the specified subset(array, slice...). -// -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") -func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { - Subsetf(a.t, list, subset, msg, args...) -} - -// True asserts that the specified value is true. -// -// a.True(myBool) -func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { - True(a.t, value, msgAndArgs...) -} - -// Truef asserts that the specified value is true. -// -// a.Truef(myBool, "error message %s", "formatted") -func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { - Truef(a.t, value, msg, args...) -} - -// WithinDuration asserts that the two times are within duration delta of each other. -// -// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) -func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { - WithinDuration(a.t, expected, actual, delta, msgAndArgs...) -} - -// WithinDurationf asserts that the two times are within duration delta of each other. -// -// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") -func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { - WithinDurationf(a.t, expected, actual, delta, msg, args...) -} - -// Zero asserts that i is the zero value for its type. -func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { - Zero(a.t, i, msgAndArgs...) -} - -// Zerof asserts that i is the zero value for its type. -func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) { - Zerof(a.t, i, msg, args...) -} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl deleted file mode 100644 index b93569e..0000000 --- a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.CommentWithoutT "a"}} -func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { - {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) -} diff --git a/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/stretchr/testify/require/requirements.go deleted file mode 100644 index e404f01..0000000 --- a/vendor/github.com/stretchr/testify/require/requirements.go +++ /dev/null @@ -1,9 +0,0 @@ -package require - -// TestingT is an interface wrapper around *testing.T -type TestingT interface { - Errorf(format string, args ...interface{}) - FailNow() -} - -//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl -include-format-funcs diff --git a/vendor/github.com/stretchr/testify/suite/doc.go b/vendor/github.com/stretchr/testify/suite/doc.go deleted file mode 100644 index f91a245..0000000 --- a/vendor/github.com/stretchr/testify/suite/doc.go +++ /dev/null @@ -1,65 +0,0 @@ -// Package suite contains logic for creating testing suite structs -// and running the methods on those structs as tests. The most useful -// piece of this package is that you can create setup/teardown methods -// on your testing suites, which will run before/after the whole suite -// or individual tests (depending on which interface(s) you -// implement). -// -// A testing suite is usually built by first extending the built-in -// suite functionality from suite.Suite in testify. Alternatively, -// you could reproduce that logic on your own if you wanted (you -// just need to implement the TestingSuite interface from -// suite/interfaces.go). -// -// After that, you can implement any of the interfaces in -// suite/interfaces.go to add setup/teardown functionality to your -// suite, and add any methods that start with "Test" to add tests. -// Methods that do not match any suite interfaces and do not begin -// with "Test" will not be run by testify, and can safely be used as -// helper methods. -// -// Once you've built your testing suite, you need to run the suite -// (using suite.Run from testify) inside any function that matches the -// identity that "go test" is already looking for (i.e. -// func(*testing.T)). -// -// Regular expression to select test suites specified command-line -// argument "-run". Regular expression to select the methods -// of test suites specified command-line argument "-m". -// Suite object has assertion methods. -// -// A crude example: -// // Basic imports -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// "github.com/stretchr/testify/suite" -// ) -// -// // Define the suite, and absorb the built-in basic suite -// // functionality from testify - including a T() method which -// // returns the current testing context -// type ExampleTestSuite struct { -// suite.Suite -// VariableThatShouldStartAtFive int -// } -// -// // Make sure that VariableThatShouldStartAtFive is set to five -// // before each test -// func (suite *ExampleTestSuite) SetupTest() { -// suite.VariableThatShouldStartAtFive = 5 -// } -// -// // All methods that begin with "Test" are run as tests within a -// // suite. -// func (suite *ExampleTestSuite) TestExample() { -// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) -// suite.Equal(5, suite.VariableThatShouldStartAtFive) -// } -// -// // In order for 'go test' to run this suite, we need to create -// // a normal test function and pass our suite to suite.Run -// func TestExampleTestSuite(t *testing.T) { -// suite.Run(t, new(ExampleTestSuite)) -// } -package suite diff --git a/vendor/github.com/stretchr/testify/suite/interfaces.go b/vendor/github.com/stretchr/testify/suite/interfaces.go deleted file mode 100644 index b37cb04..0000000 --- a/vendor/github.com/stretchr/testify/suite/interfaces.go +++ /dev/null @@ -1,46 +0,0 @@ -package suite - -import "testing" - -// TestingSuite can store and return the current *testing.T context -// generated by 'go test'. -type TestingSuite interface { - T() *testing.T - SetT(*testing.T) -} - -// SetupAllSuite has a SetupSuite method, which will run before the -// tests in the suite are run. -type SetupAllSuite interface { - SetupSuite() -} - -// SetupTestSuite has a SetupTest method, which will run before each -// test in the suite. -type SetupTestSuite interface { - SetupTest() -} - -// TearDownAllSuite has a TearDownSuite method, which will run after -// all the tests in the suite have been run. -type TearDownAllSuite interface { - TearDownSuite() -} - -// TearDownTestSuite has a TearDownTest method, which will run after -// each test in the suite. -type TearDownTestSuite interface { - TearDownTest() -} - -// BeforeTest has a function to be executed right before the test -// starts and receives the suite and test names as input -type BeforeTest interface { - BeforeTest(suiteName, testName string) -} - -// AfterTest has a function to be executed right after the test -// finishes and receives the suite and test names as input -type AfterTest interface { - AfterTest(suiteName, testName string) -} diff --git a/vendor/github.com/stretchr/testify/suite/suite.go b/vendor/github.com/stretchr/testify/suite/suite.go deleted file mode 100644 index e20afbc..0000000 --- a/vendor/github.com/stretchr/testify/suite/suite.go +++ /dev/null @@ -1,136 +0,0 @@ -package suite - -import ( - "flag" - "fmt" - "os" - "reflect" - "regexp" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -var allTestsFilter = func(_, _ string) (bool, error) { return true, nil } -var matchMethod = flag.String("testify.m", "", "regular expression to select tests of the testify suite to run") - -// Suite is a basic testing suite with methods for storing and -// retrieving the current *testing.T context. -type Suite struct { - *assert.Assertions - require *require.Assertions - t *testing.T -} - -// T retrieves the current *testing.T context. -func (suite *Suite) T() *testing.T { - return suite.t -} - -// SetT sets the current *testing.T context. -func (suite *Suite) SetT(t *testing.T) { - suite.t = t - suite.Assertions = assert.New(t) - suite.require = require.New(t) -} - -// Require returns a require context for suite. -func (suite *Suite) Require() *require.Assertions { - if suite.require == nil { - suite.require = require.New(suite.T()) - } - return suite.require -} - -// Assert returns an assert context for suite. Normally, you can call -// `suite.NoError(expected, actual)`, but for situations where the embedded -// methods are overridden (for example, you might want to override -// assert.Assertions with require.Assertions), this method is provided so you -// can call `suite.Assert().NoError()`. -func (suite *Suite) Assert() *assert.Assertions { - if suite.Assertions == nil { - suite.Assertions = assert.New(suite.T()) - } - return suite.Assertions -} - -// Run takes a testing suite and runs all of the tests attached -// to it. -func Run(t *testing.T, suite TestingSuite) { - suite.SetT(t) - - if setupAllSuite, ok := suite.(SetupAllSuite); ok { - setupAllSuite.SetupSuite() - } - defer func() { - if tearDownAllSuite, ok := suite.(TearDownAllSuite); ok { - tearDownAllSuite.TearDownSuite() - } - }() - - methodFinder := reflect.TypeOf(suite) - tests := []testing.InternalTest{} - for index := 0; index < methodFinder.NumMethod(); index++ { - method := methodFinder.Method(index) - ok, err := methodFilter(method.Name) - if err != nil { - fmt.Fprintf(os.Stderr, "testify: invalid regexp for -m: %s\n", err) - os.Exit(1) - } - if ok { - test := testing.InternalTest{ - Name: method.Name, - F: func(t *testing.T) { - parentT := suite.T() - suite.SetT(t) - if setupTestSuite, ok := suite.(SetupTestSuite); ok { - setupTestSuite.SetupTest() - } - if beforeTestSuite, ok := suite.(BeforeTest); ok { - beforeTestSuite.BeforeTest(methodFinder.Elem().Name(), method.Name) - } - defer func() { - if afterTestSuite, ok := suite.(AfterTest); ok { - afterTestSuite.AfterTest(methodFinder.Elem().Name(), method.Name) - } - if tearDownTestSuite, ok := suite.(TearDownTestSuite); ok { - tearDownTestSuite.TearDownTest() - } - suite.SetT(parentT) - }() - method.Func.Call([]reflect.Value{reflect.ValueOf(suite)}) - }, - } - tests = append(tests, test) - } - } - runTests(t, tests) -} - -func runTests(t testing.TB, tests []testing.InternalTest) { - r, ok := t.(runner) - if !ok { // backwards compatibility with Go 1.6 and below - if !testing.RunTests(allTestsFilter, tests) { - t.Fail() - } - return - } - - for _, test := range tests { - r.Run(test.Name, test.F) - } -} - -// Filtering method according to set regular expression -// specified command-line argument -m -func methodFilter(name string) (bool, error) { - if ok, _ := regexp.MatchString("^Test", name); !ok { - return false, nil - } - return regexp.MatchString(*matchMethod, name) -} - -type runner interface { - Run(name string, f func(t *testing.T)) bool -}