diff --git a/build/cloudnet/root/etc/yunion/ansibleserver.conf.sample b/build/cloudnet/root/etc/yunion/ansibleserver.conf.sample
new file mode 100644
index 0000000000..6f432cf75a
--- /dev/null
+++ b/build/cloudnet/root/etc/yunion/ansibleserver.conf.sample
@@ -0,0 +1,10 @@
+region = 'Yunion'
+address = '10.168.222.136'
+port = 8891
+auth_uri = 'http://10.168.222.136:35357/v3'
+admin_user = 'cloudnetadmin'
+admin_password = 'xxxxxxxxxxxxxxxx'
+admin_tenant_name = 'system'
+sql_connection = 'mysql+pymysql://yunionansible:9YuQL9KEZn1mppaK@localhost:3306/yunionansible?charset=utf8'
+
+auto_sync_table = True
diff --git a/build/cloudnet/vars b/build/cloudnet/vars
new file mode 100644
index 0000000000..bc3e44d9c0
--- /dev/null
+++ b/build/cloudnet/vars
@@ -0,0 +1 @@
+DESCRIPTION="Yunion Cloudnet"
diff --git a/cmd/climc/climc.go b/cmd/climc/climc.go
index d68b579b8f..31430dd147 100644
--- a/cmd/climc/climc.go
+++ b/cmd/climc/climc.go
@@ -32,6 +32,7 @@ import (
"yunion.io/x/onecloud/cmd/climc/promputils"
"yunion.io/x/onecloud/cmd/climc/shell"
+ _ "yunion.io/x/onecloud/cmd/climc/shell/cloudnet"
_ "yunion.io/x/onecloud/cmd/climc/shell/etcd"
_ "yunion.io/x/onecloud/cmd/climc/shell/k8s"
"yunion.io/x/onecloud/pkg/mcclient"
diff --git a/cmd/climc/shell/ansibleplaybooks_v2.go b/cmd/climc/shell/ansibleplaybooks_v2.go
new file mode 100644
index 0000000000..8e3a9ed751
--- /dev/null
+++ b/cmd/climc/shell/ansibleplaybooks_v2.go
@@ -0,0 +1,52 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package shell
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/onecloud/pkg/mcclient/modules"
+ "yunion.io/x/onecloud/pkg/mcclient/options"
+)
+
+func init() {
+ type AnsiblePlaybookV2IdOptions struct {
+ ID string `help:"name/id of the playbook"`
+ }
+
+ type AnsiblePlaybookV2ListOptions struct {
+ options.BaseListOptions
+ }
+
+ R(&AnsiblePlaybookV2IdOptions{}, "ansibleplaybookv2-show", "Show ansible playbook", func(s *mcclient.ClientSession, opts *AnsiblePlaybookV2IdOptions) error {
+ apb, err := modules.AnsiblePlaybooksV2.Get(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(apb)
+ return nil
+ })
+ R(&AnsiblePlaybookV2ListOptions{}, "ansibleplaybookv2-list", "List ansible playbooks", func(s *mcclient.ClientSession, opts *AnsiblePlaybookV2ListOptions) error {
+ params, err := opts.Params()
+ if err != nil {
+ return err
+ }
+ apbs, err := modules.AnsiblePlaybooksV2.List(s, params)
+ if err != nil {
+ return err
+ }
+ printList(apbs, modules.AnsiblePlaybooksV2.GetColumns(s))
+ return nil
+ })
+}
diff --git a/cmd/climc/shell/cloudnet/common.go b/cmd/climc/shell/cloudnet/common.go
new file mode 100644
index 0000000000..0ea0709712
--- /dev/null
+++ b/cmd/climc/shell/cloudnet/common.go
@@ -0,0 +1,13 @@
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/cmd/climc/shell"
+ "yunion.io/x/onecloud/pkg/util/printutils"
+)
+
+var (
+ R = shell.R
+ printList = printutils.PrintJSONList
+ printObject = printutils.PrintJSONObject
+ printBatchResults = printutils.PrintJSONBatchResults
+)
diff --git a/cmd/climc/shell/cloudnet/meshnetworks.go b/cmd/climc/shell/cloudnet/meshnetworks.go
new file mode 100644
index 0000000000..357b5c26d7
--- /dev/null
+++ b/cmd/climc/shell/cloudnet/meshnetworks.go
@@ -0,0 +1,82 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient"
+ modules "yunion.io/x/onecloud/pkg/mcclient/modules/cloudnet"
+ base_options "yunion.io/x/onecloud/pkg/mcclient/options"
+ options "yunion.io/x/onecloud/pkg/mcclient/options/cloudnet"
+)
+
+func init() {
+ R(&options.MeshNetworkCreateOptions{}, "meshnetwork-create", "Create mesh network", func(s *mcclient.ClientSession, opts *options.MeshNetworkCreateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ mn, err := modules.MeshNetworks.Create(s, params)
+ if err != nil {
+ return err
+ }
+ printObject(mn)
+ return nil
+ })
+ R(&options.MeshNetworkGetOptions{}, "meshnetwork-show", "Show mesh network", func(s *mcclient.ClientSession, opts *options.MeshNetworkGetOptions) error {
+ mn, err := modules.MeshNetworks.Get(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(mn)
+ return nil
+ })
+ R(&options.MeshNetworkListOptions{}, "meshnetwork-list", "List mesh networks", func(s *mcclient.ClientSession, opts *options.MeshNetworkListOptions) error {
+ params, err := base_options.ListStructToParams(opts)
+ if err != nil {
+ return err
+ }
+ result, err := modules.MeshNetworks.List(s, params)
+ if err != nil {
+ return err
+ }
+ printList(result, modules.MeshNetworks.GetColumns(s))
+ return nil
+ })
+ R(&options.MeshNetworkUpdateOptions{}, "meshnetwork-update", "Update mesh network", func(s *mcclient.ClientSession, opts *options.MeshNetworkUpdateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ mn, err := modules.MeshNetworks.Update(s, opts.ID, params)
+ if err != nil {
+ return err
+ }
+ printObject(mn)
+ return nil
+ })
+ R(&options.MeshNetworkDeleteOptions{}, "meshnetwork-delete", "Delete mesh network", func(s *mcclient.ClientSession, opts *options.MeshNetworkDeleteOptions) error {
+ mn, err := modules.MeshNetworks.Delete(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(mn)
+ return nil
+ })
+ R(&options.MeshNetworkActionRealizeOptions{}, "meshnetwork-realize", "Realize mesh network", func(s *mcclient.ClientSession, opts *options.MeshNetworkActionRealizeOptions) error {
+ mn, err := modules.MeshNetworks.PerformAction(s, opts.ID, "realize", nil)
+ if err != nil {
+ return err
+ }
+ printObject(mn)
+ return nil
+ })
+}
diff --git a/cmd/climc/shell/cloudnet/routers.go b/cmd/climc/shell/cloudnet/routers.go
new file mode 100644
index 0000000000..d52583da83
--- /dev/null
+++ b/cmd/climc/shell/cloudnet/routers.go
@@ -0,0 +1,134 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient"
+ modules "yunion.io/x/onecloud/pkg/mcclient/modules/cloudnet"
+ base_options "yunion.io/x/onecloud/pkg/mcclient/options"
+ options "yunion.io/x/onecloud/pkg/mcclient/options/cloudnet"
+)
+
+func init() {
+ R(&options.RouterCreateOptions{}, "router-create", "Create router", func(s *mcclient.ClientSession, opts *options.RouterCreateOptions) error {
+ params, err := opts.Params()
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routers.Create(s, params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterGetOptions{}, "router-show", "Show router", func(s *mcclient.ClientSession, opts *options.RouterGetOptions) error {
+ router, err := modules.Routers.Get(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterListOptions{}, "router-list", "List routers", func(s *mcclient.ClientSession, opts *options.RouterListOptions) error {
+ params, err := base_options.ListStructToParams(opts)
+ if err != nil {
+ return err
+ }
+ result, err := modules.Routers.List(s, params)
+ if err != nil {
+ return err
+ }
+ printList(result, modules.Routers.GetColumns(s))
+ return nil
+ })
+ R(&options.RouterUpdateOptions{}, "router-update", "Update router", func(s *mcclient.ClientSession, opts *options.RouterUpdateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ router, err := modules.Routers.Update(s, opts.ID, params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterDeleteOptions{}, "router-delete", "Delete router", func(s *mcclient.ClientSession, opts *options.RouterDeleteOptions) error {
+ router, err := modules.Routers.Delete(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterActionJoinMeshNetworkOptions{}, "router-join-meshnetwork", "Router join meshnetwork", func(s *mcclient.ClientSession, opts *options.RouterActionJoinMeshNetworkOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routers.PerformAction(s, opts.ID, "join-mesh-network", params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterActionLeaveMeshNetworkOptions{}, "router-leave-meshnetwork", "Router leave meshnetwork", func(s *mcclient.ClientSession, opts *options.RouterActionLeaveMeshNetworkOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routers.PerformAction(s, opts.ID, "leave-mesh-network", params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterActionRegisterIfnameOptions{}, "router-register-ifname", "Router register new ifname", func(s *mcclient.ClientSession, opts *options.RouterActionRegisterIfnameOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routers.PerformAction(s, opts.ID, "register-ifname", params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterActionUnregisterIfnameOptions{}, "router-unregister-ifname", "Router unregister ifname", func(s *mcclient.ClientSession, opts *options.RouterActionUnregisterIfnameOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routers.PerformAction(s, opts.ID, "unregister-ifname", params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouterActionRealizeOptions{}, "router-realize", "Router realize", func(s *mcclient.ClientSession, opts *options.RouterActionRealizeOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routers.PerformAction(s, opts.ID, "realize", params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+}
diff --git a/cmd/climc/shell/cloudnet/routes.go b/cmd/climc/shell/cloudnet/routes.go
new file mode 100644
index 0000000000..7773ed881b
--- /dev/null
+++ b/cmd/climc/shell/cloudnet/routes.go
@@ -0,0 +1,74 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient"
+ modules "yunion.io/x/onecloud/pkg/mcclient/modules/cloudnet"
+ base_options "yunion.io/x/onecloud/pkg/mcclient/options"
+ options "yunion.io/x/onecloud/pkg/mcclient/options/cloudnet"
+)
+
+func init() {
+ R(&options.RouteCreateOptions{}, "router-route-create", "Create router", func(s *mcclient.ClientSession, opts *options.RouteCreateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Routes.Create(s, params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouteGetOptions{}, "router-route-show", "Show router", func(s *mcclient.ClientSession, opts *options.RouteGetOptions) error {
+ router, err := modules.Routes.Get(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouteListOptions{}, "router-route-list", "List routers", func(s *mcclient.ClientSession, opts *options.RouteListOptions) error {
+ params, err := base_options.ListStructToParams(opts)
+ if err != nil {
+ return err
+ }
+ result, err := modules.Routes.List(s, params)
+ if err != nil {
+ return err
+ }
+ printList(result, modules.Routes.GetColumns(s))
+ return nil
+ })
+ R(&options.RouteUpdateOptions{}, "router-route-update", "Update router", func(s *mcclient.ClientSession, opts *options.RouteUpdateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ router, err := modules.Routes.Update(s, opts.ID, params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RouteDeleteOptions{}, "router-route-delete", "Delete router", func(s *mcclient.ClientSession, opts *options.RouteDeleteOptions) error {
+ router, err := modules.Routes.Delete(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+}
diff --git a/cmd/climc/shell/cloudnet/rules.go b/cmd/climc/shell/cloudnet/rules.go
new file mode 100644
index 0000000000..ae4302a598
--- /dev/null
+++ b/cmd/climc/shell/cloudnet/rules.go
@@ -0,0 +1,74 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient"
+ modules "yunion.io/x/onecloud/pkg/mcclient/modules/cloudnet"
+ base_options "yunion.io/x/onecloud/pkg/mcclient/options"
+ options "yunion.io/x/onecloud/pkg/mcclient/options/cloudnet"
+)
+
+func init() {
+ R(&options.RuleCreateOptions{}, "router-rule-create", "Create router rule", func(s *mcclient.ClientSession, opts *options.RuleCreateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ if err != nil {
+ return err
+ }
+ router, err := modules.Rules.Create(s, params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RuleGetOptions{}, "router-rule-show", "Show router rule", func(s *mcclient.ClientSession, opts *options.RuleGetOptions) error {
+ router, err := modules.Rules.Get(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RuleListOptions{}, "router-rule-list", "List router rules", func(s *mcclient.ClientSession, opts *options.RuleListOptions) error {
+ params, err := base_options.ListStructToParams(opts)
+ if err != nil {
+ return err
+ }
+ result, err := modules.Rules.List(s, params)
+ if err != nil {
+ return err
+ }
+ printList(result, modules.Rules.GetColumns(s))
+ return nil
+ })
+ R(&options.RuleUpdateOptions{}, "router-rule-update", "Update router rule", func(s *mcclient.ClientSession, opts *options.RuleUpdateOptions) error {
+ params, err := base_options.StructToParams(opts)
+ router, err := modules.Rules.Update(s, opts.ID, params)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+ R(&options.RuleDeleteOptions{}, "router-rule-delete", "Delete router rule", func(s *mcclient.ClientSession, opts *options.RuleDeleteOptions) error {
+ router, err := modules.Rules.Delete(s, opts.ID, nil)
+ if err != nil {
+ return err
+ }
+ printObject(router)
+ return nil
+ })
+}
diff --git a/cmd/cloudnet/main.go b/cmd/cloudnet/main.go
new file mode 100644
index 0000000000..73690b6ac9
--- /dev/null
+++ b/cmd/cloudnet/main.go
@@ -0,0 +1,23 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import (
+ "yunion.io/x/onecloud/pkg/cloudnet/service"
+)
+
+func main() {
+ service.StartService()
+}
diff --git a/go.mod b/go.mod
index 81bbbd2fd6..da4a29058f 100644
--- a/go.mod
+++ b/go.mod
@@ -51,6 +51,7 @@ require (
github.com/go-logfmt/logfmt v0.4.0 // indirect
github.com/go-ole/go-ole v1.2.2 // indirect
github.com/go-sql-driver/mysql v1.4.1
+ github.com/go-yaml/yaml v2.1.0+incompatible
github.com/gofrs/uuid v3.2.0+incompatible // indirect
github.com/golang-plus/errors v1.0.0
github.com/golang-plus/testing v1.0.0 // indirect
@@ -131,9 +132,10 @@ require (
go.uber.org/atomic v1.4.0 // indirect
go.uber.org/multierr v1.1.0 // indirect
go.uber.org/zap v1.10.0 // indirect
- golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4
- golang.org/x/net v0.0.0-20190603091049-60506f45cf65
- golang.org/x/sys v0.0.0-20190620070143-6f217b454f45
+ golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc
+ golang.org/x/net v0.0.0-20191007182048-72f939374954
+ golang.org/x/sys v0.0.0-20191008105621-543471e840be
+ golang.zx2c4.com/wireguard/wgctrl v0.0.0-20191008142428-8d021180e987
google.golang.org/grpc v1.19.0
gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
diff --git a/go.sum b/go.sum
index 16c5c954fa..f73147b42e 100644
--- a/go.sum
+++ b/go.sum
@@ -164,6 +164,8 @@ github.com/go-ole/go-ole v1.2.2/go.mod h1:pnvuG7BrDMZ8ifMurTQmxwhQM/odqm9sSqNe5B
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o=
+github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -194,6 +196,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
@@ -255,6 +259,7 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5i
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw=
github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -300,6 +305,10 @@ github.com/mdlayher/arp v0.0.0-20190313224443-98a83c8a2717/go.mod h1:eOj1DDj3NAZ
github.com/mdlayher/ethernet v0.0.0-20190313224307-5b5fc417d966/go.mod h1:5s5p/sMJ6sNsFl6uCh85lkFGV8kLuIYJCRJLavVJwvg=
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7 h1:lez6TS6aAau+8wXUP3G9I3TGlmPFEq2CTxBaRqY6AGE=
github.com/mdlayher/ethernet v0.0.0-20190606142754-0394541c37b7/go.mod h1:U6ZQobyTjI/tJyq2HG+i/dfSoFUt8/aZCM+GKtmFk/Y=
+github.com/mdlayher/genetlink v0.0.0-20191004171646-5cf585d3b847/go.mod h1:LNhNWFVJapYK8zEjVHUIle4gy+Oahfc3UtcaqZ8Dz98=
+github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
+github.com/mdlayher/netlink v0.0.0-20191004170026-3c8695cb0643/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
+github.com/mdlayher/netlink v0.0.0-20191008140946-2a17fd90af51/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M=
github.com/mdlayher/raw v0.0.0-20190313224157-43dbcdd7739d/go.mod h1:r1fbeITl2xL/zLbVnNHFyOzQJTgr/3fpf1lJX/cjzR8=
github.com/mdlayher/raw v0.0.0-20190606142536-fef19f00fc18/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg=
github.com/mdlayher/raw v0.0.0-20190606144222-a54781e5f38f h1:Xjvm7UTnKTwrlhbs+8qA6I0v1iX77rY3QxftSgvOVRk=
@@ -310,6 +319,7 @@ github.com/mholt/caddy v0.10.11 h1:s8X+R8DuBbrrMuUTcWSxlDe567B0s5EDmiDBKSYsioY=
github.com/mholt/caddy v0.10.11/go.mod h1:Wb1PlT4DAYSqOEd03MsqkdkXnTxA8v9pKjdpxbqM1kY=
github.com/miekg/dns v1.1.1 h1:DVkblRdiScEnEr0LR9nTnEQqHYycjkXW9bOjd+2EL2o=
github.com/miekg/dns v1.1.1/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc=
github.com/minio/cli v1.20.0/go.mod h1:bYxnK0uS629N3Bq+AOZZ+6lwF77Sodk4+UL9vNuXhOY=
github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
@@ -464,6 +474,9 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A=
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4=
+golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -484,6 +497,10 @@ golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191007182048-72f939374954 h1:JGZucVF/L/TotR719NbujzadOZ2AgnYlqphQGHDCKaU=
+golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -505,24 +522,35 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606122018-79a91cf218c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190620070143-6f217b454f45 h1:Dl2hc890lrizvUppGbRWhnIh2f8jOTCQpY5IKWRS0oM=
-golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190830023255-19e00faab6ad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU=
+golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.zx2c4.com/wireguard v0.0.20190908 h1:SUoXDdwSMtomLdvke+zz83/u9tNvl4hHmcTIWp38tow=
+golang.zx2c4.com/wireguard v0.0.20190908/go.mod h1:LhfXh5z6bLC2lW2ve6BzYZFwnnsXK3OQjySR0Yh2dO8=
+golang.zx2c4.com/wireguard/wgctrl v0.0.0-20191008142428-8d021180e987 h1:26OAgqBTufVr8WKonCEhhjO1oKsYhHv0iM5Dg92G1TM=
+golang.zx2c4.com/wireguard/wgctrl v0.0.0-20191008142428-8d021180e987/go.mod h1:7hq1rEDsx7/FWl8IEEnfH2Xhs6M2MNnjUfN0PeI8Rm0=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
diff --git a/pkg/ansibleserver/models/ansibleplaybooks.go b/pkg/ansibleserver/models/ansibleplaybooks.go
index 5bfa1180b1..841cb34c98 100644
--- a/pkg/ansibleserver/models/ansibleplaybooks.go
+++ b/pkg/ansibleserver/models/ansibleplaybooks.go
@@ -29,21 +29,9 @@ import (
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/mcclient"
- "yunion.io/x/onecloud/pkg/mcclient/auth"
- mcclient_models "yunion.io/x/onecloud/pkg/mcclient/models"
- mcclient_modules "yunion.io/x/onecloud/pkg/mcclient/modules"
"yunion.io/x/onecloud/pkg/util/ansible"
)
-const (
- AnsiblePlaybookStatusInit = "init"
- AnsiblePlaybookStatusRunning = "running"
- AnsiblePlaybookStatusSucceeded = "succeeded"
- AnsiblePlaybookStatusFailed = "failed"
- AnsiblePlaybookStatusCanceled = "canceled"
- AnsiblePlaybookStatusUnknown = "unknown"
-)
-
// low priority
//
// - retry times and interval
@@ -59,11 +47,6 @@ type SAnsiblePlaybook struct {
EndTime time.Time `list:"user"`
}
-const (
- OutputMaxBytes = 64*1024*1024 - 1
- PlaybookMaxBytes = 64*1024 - 1
-)
-
type SAnsiblePlaybookManager struct {
db.SVirtualResourceBaseManager
@@ -180,34 +163,6 @@ func (apb *SAnsiblePlaybook) PerformStop(ctx context.Context, userCred mcclient.
return nil, nil
}
-func (apb *SAnsiblePlaybook) fetchPrivateKey(ctx context.Context, userCred mcclient.TokenCredential) (string, error) {
- s := auth.GetSession(ctx, userCred, "", "")
- jd := jsonutils.NewDict()
- var jr jsonutils.JSONObject
- if userCred.HasSystemAdminPrivilege() {
- jd.Set("admin", jsonutils.JSONTrue)
- r, err := mcclient_modules.Sshkeypairs.List(s, jd)
- if err != nil {
- return "", errors.WithMessage(err, "get admin ssh key")
- }
- jr = r.Data[0]
- } else {
- r, err := mcclient_modules.Sshkeypairs.GetById(s, userCred.GetProjectId(), jd)
- if err != nil {
- return "", errors.WithMessage(err, "get project ssh key")
- }
- jr = r
- }
- kp := &mcclient_models.SshKeypair{}
- if err := jr.Unmarshal(kp); err != nil {
- return "", errors.WithMessage(err, "unmarshal ssh key")
- }
- if kp.PrivateKey == "" {
- return "", errors.New("empty ssh key")
- }
- return kp.PrivateKey, nil
-}
-
func (apb *SAnsiblePlaybook) runPlaybook(ctx context.Context, userCred mcclient.TokenCredential) error {
man := AnsiblePlaybookManager
man.sessionsMux.Lock()
@@ -218,12 +173,12 @@ func (apb *SAnsiblePlaybook) runPlaybook(ctx context.Context, userCred mcclient.
// init private key
pb := apb.Playbook.Copy()
- if k, err := apb.fetchPrivateKey(ctx, userCred); err != nil {
+ if k, err := fetchPrivateKey(ctx, userCred); err != nil {
return err
} else {
pb.PrivateKey = []byte(k)
}
- pb.OutputWriter(&ansiblePlaybookOutputRecorder{apb})
+ pb.OutputWriter(&ansiblePlaybookOutputWriter{apb})
_, err := db.Update(apb, func() error {
apb.StartTime = time.Now()
@@ -237,6 +192,7 @@ func (apb *SAnsiblePlaybook) runPlaybook(ctx context.Context, userCred mcclient.
}
man.sessions.Add(apb.Id, pb)
+
go func() {
defer func() {
man.sessionsMux.Lock()
@@ -286,26 +242,14 @@ func (apb *SAnsiblePlaybook) stopPlaybook(ctx context.Context, userCred mcclient
return nil
}
-type ansiblePlaybookOutputRecorder struct {
- apb *SAnsiblePlaybook
+func (apb *SAnsiblePlaybook) getMaxOutputLength() int {
+ return OutputMaxBytes
}
-func (w *ansiblePlaybookOutputRecorder) Write(p []byte) (n int, err error) {
- apb := w.apb
- _, err = db.Update(apb, func() error {
- cur := apb.Output
- i := len(p) + len(cur) - OutputMaxBytes
- if i > 0 {
- // truncate to preserve the tail
- apb.Output = cur[i:] + string(p)
- } else {
- apb.Output += string(p)
- }
- return nil
- })
- if err != nil {
- log.Errorf("ansibleplaybook %s(%s): record output: %v", apb.Name, apb.Id, err)
- return 0, err
- }
- return len(p), nil
+func (apb *SAnsiblePlaybook) getOutput() string {
+ return apb.Output
+}
+
+func (apb *SAnsiblePlaybook) setOutput(s string) {
+ apb.Output = s
}
diff --git a/pkg/ansibleserver/models/ansibleplaybooks_fetch_private_key.go b/pkg/ansibleserver/models/ansibleplaybooks_fetch_private_key.go
new file mode 100644
index 0000000000..ee334ad83d
--- /dev/null
+++ b/pkg/ansibleserver/models/ansibleplaybooks_fetch_private_key.go
@@ -0,0 +1,56 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+
+ "github.com/pkg/errors"
+
+ "yunion.io/x/jsonutils"
+
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/onecloud/pkg/mcclient/auth"
+ mcclient_models "yunion.io/x/onecloud/pkg/mcclient/models"
+ mcclient_modules "yunion.io/x/onecloud/pkg/mcclient/modules"
+)
+
+func fetchPrivateKey(ctx context.Context, userCred mcclient.TokenCredential) (string, error) {
+ s := auth.GetSession(ctx, userCred, "", "")
+ jd := jsonutils.NewDict()
+ var jr jsonutils.JSONObject
+ if userCred.HasSystemAdminPrivilege() {
+ jd.Set("admin", jsonutils.JSONTrue)
+ r, err := mcclient_modules.Sshkeypairs.List(s, jd)
+ if err != nil {
+ return "", errors.WithMessage(err, "get admin ssh key")
+ }
+ jr = r.Data[0]
+ } else {
+ r, err := mcclient_modules.Sshkeypairs.GetById(s, userCred.GetProjectId(), jd)
+ if err != nil {
+ return "", errors.WithMessage(err, "get project ssh key")
+ }
+ jr = r
+ }
+ kp := &mcclient_models.SshKeypair{}
+ if err := jr.Unmarshal(kp); err != nil {
+ return "", errors.WithMessage(err, "unmarshal ssh key")
+ }
+ if kp.PrivateKey == "" {
+ return "", errors.New("empty ssh key")
+ }
+ return kp.PrivateKey, nil
+}
diff --git a/pkg/ansibleserver/models/ansibleplaybooks_output_recorder.go b/pkg/ansibleserver/models/ansibleplaybooks_output_recorder.go
new file mode 100644
index 0000000000..34e82193ac
--- /dev/null
+++ b/pkg/ansibleserver/models/ansibleplaybooks_output_recorder.go
@@ -0,0 +1,57 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "yunion.io/x/log"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+)
+
+const (
+ OutputMaxBytes = 64*1024*1024 - 1
+ PlaybookMaxBytes = 64*1024 - 1
+)
+
+type ansiblePlaybookOutputRecorder interface {
+ db.IModel
+ getMaxOutputLength() int
+ getOutput() string
+ setOutput(string)
+}
+
+type ansiblePlaybookOutputWriter struct {
+ rec ansiblePlaybookOutputRecorder
+}
+
+func (w *ansiblePlaybookOutputWriter) Write(p []byte) (n int, err error) {
+ rec := w.rec
+ _, err = db.Update(rec, func() error {
+ cur := rec.getOutput()
+ i := len(p) + len(cur) - rec.getMaxOutputLength()
+ if i > 0 {
+ // truncate to preserve the tail
+ rec.setOutput(cur[i:] + string(p))
+ } else {
+ rec.setOutput(cur + string(p))
+ }
+ return nil
+ })
+ if err != nil {
+ log.Errorf("%s %s(%s): record output: %v", rec.Keyword(), rec.GetName(), rec.GetId(), err)
+ return 0, err
+ }
+ return len(p), nil
+}
diff --git a/pkg/ansibleserver/models/ansibleplaybooks_v2.go b/pkg/ansibleserver/models/ansibleplaybooks_v2.go
new file mode 100644
index 0000000000..fae6ab19b8
--- /dev/null
+++ b/pkg/ansibleserver/models/ansibleplaybooks_v2.go
@@ -0,0 +1,242 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+ "sync"
+ "time"
+
+ "github.com/pkg/errors"
+
+ "yunion.io/x/jsonutils"
+ "yunion.io/x/log"
+ "yunion.io/x/sqlchemy"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/httperrors"
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/onecloud/pkg/util/ansible"
+ "yunion.io/x/onecloud/pkg/util/ansiblev2"
+)
+
+// This is at the moment for internal use only. Update is not allowed
+type SAnsiblePlaybookV2 struct {
+ db.SVirtualResourceBase
+
+ Playbook string `length:"text" nullable:"false" create:"required" get:"user"`
+ Inventory string `length:"text" nullable:"false" create:"required" get:"user"`
+ Files string `length:"text" nullable:"false" create:"optional" get:"user"`
+ Output string `length:"medium" get:"user"`
+ StartTime time.Time `list:"user"`
+ EndTime time.Time `list:"user"`
+
+ CreatorMark string `length:"32" nullable:"false" create:"optional" get:"user"`
+}
+
+type SAnsiblePlaybookV2Manager struct {
+ db.SVirtualResourceBaseManager
+
+ sessions ansible.SessionManager
+ sessionsMux *sync.Mutex
+}
+
+var AnsiblePlaybookV2Manager *SAnsiblePlaybookV2Manager
+
+func init() {
+ AnsiblePlaybookV2Manager = &SAnsiblePlaybookV2Manager{
+ SVirtualResourceBaseManager: db.NewVirtualResourceBaseManager(
+ SAnsiblePlaybookV2{},
+ "ansibleplaybooks_v2_tbl",
+ "ansibleplaybook_v2",
+ "ansibleplaybooks_v2",
+ ),
+ sessions: ansible.SessionManager{},
+ sessionsMux: &sync.Mutex{},
+ }
+ AnsiblePlaybookV2Manager.SetVirtualObject(AnsiblePlaybookV2Manager)
+}
+
+func (man *SAnsiblePlaybookV2Manager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ data.Set("status", jsonutils.NewString(AnsiblePlaybookStatusInit))
+ return man.SVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data)
+}
+
+func (apb *SAnsiblePlaybookV2) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
+ apb.SVirtualResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
+ err := apb.runPlaybook(ctx, userCred)
+ if err != nil {
+ log.Errorf("postCreate: runPlaybook: %v", err)
+ }
+}
+
+func (man *SAnsiblePlaybookV2Manager) InitializeData() error {
+ pbs := []SAnsiblePlaybookV2{}
+ q := AnsiblePlaybookV2Manager.Query()
+ q = q.Filter(sqlchemy.Equals(q.Field("status"), AnsiblePlaybookStatusRunning))
+ if err := db.FetchModelObjects(AnsiblePlaybookV2Manager, q, &pbs); err != nil {
+ return errors.WithMessage(err, "fetch running playbooks")
+ }
+ for i := 0; i < len(pbs); i++ {
+ pb := &pbs[i]
+ _, err := db.Update(pb, func() error {
+ pb.Status = AnsiblePlaybookStatusUnknown
+ return nil
+ })
+ if err != nil {
+ log.Errorf("set playbook %s(%s) to unknown state: %v", pb.Name, pb.Id, err)
+ }
+ }
+ return nil
+}
+
+func (apb *SAnsiblePlaybookV2) ValidateDeleteCondition(ctx context.Context) error {
+ if apb.Status == AnsiblePlaybookStatusRunning {
+ return httperrors.NewConflictError("playbook is in running state")
+ }
+ return nil
+}
+
+func (apb *SAnsiblePlaybookV2) AllowPerformRun(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return apb.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, apb, "run")
+}
+
+func (apb *SAnsiblePlaybookV2) PerformRun(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ err := apb.runPlaybook(ctx, userCred)
+ if err != nil {
+ return nil, httperrors.NewConflictError("%s", err.Error())
+ }
+ return nil, nil
+}
+
+func (apb *SAnsiblePlaybookV2) AllowPerformStop(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return apb.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, apb, "stop")
+}
+
+func (apb *SAnsiblePlaybookV2) PerformStop(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ err := apb.stopPlaybook(ctx, userCred)
+ if err != nil {
+ return nil, httperrors.NewConflictError("%s", err.Error())
+ }
+ return nil, nil
+}
+
+func (apb *SAnsiblePlaybookV2) runPlaybook(ctx context.Context, userCred mcclient.TokenCredential) error {
+ man := AnsiblePlaybookV2Manager
+ man.sessionsMux.Lock()
+ defer man.sessionsMux.Unlock()
+ if man.sessions.Has(apb.Id) {
+ return fmt.Errorf("playbook is already running")
+ }
+
+ var (
+ privateKey string
+ err error
+ files = map[string][]byte{}
+ )
+ if apb.Files != "" {
+ obj, err := jsonutils.ParseString(apb.Files)
+ if err != nil {
+ return fmt.Errorf("playbook files json: parse: %v", err)
+ }
+ filesJ, err := obj.GetMap()
+ if err != nil {
+ return fmt.Errorf("playbook files json: get map: %v", err)
+ }
+ for name, obj := range filesJ {
+ content, err := obj.GetString()
+ if err != nil {
+ return fmt.Errorf("playbook files json: get content %s: %v", name, err)
+ }
+ files[name] = []byte(content)
+ }
+ }
+ // init private key
+ if privateKey, err = fetchPrivateKey(ctx, userCred); err != nil {
+ return err
+ }
+
+ _, err = db.Update(apb, func() error {
+ apb.StartTime = time.Now()
+ apb.EndTime = time.Time{}
+ apb.Output = ""
+ apb.Status = AnsiblePlaybookStatusRunning
+ return nil
+ })
+ if err != nil {
+ log.Errorf("run playbook: update db failed before run: %v", err)
+ }
+
+ sess := ansiblev2.NewSession().
+ Inventory(apb.Inventory).
+ Playbook(apb.Playbook).
+ PrivateKey(privateKey).
+ Files(files).
+ OutputWriter(&ansiblePlaybookOutputWriter{apb})
+ man.sessions.Add(apb.Id, sess)
+
+ // NOTE host state check? run only on online hosts and running guests, skip others
+ go func() {
+ defer func() {
+ man.sessionsMux.Lock()
+ defer man.sessionsMux.Unlock()
+ man.sessions.Remove(apb.Id)
+ }()
+ runErr := man.sessions.Run(apb.Id)
+
+ _, err := db.Update(apb, func() error {
+ err := man.sessions.Err(apb.Id)
+ if err != nil {
+ apb.Status = AnsiblePlaybookStatusCanceled
+ } else if runErr != nil {
+ log.Warningf("playbook %s(%s) failed: %v", apb.Name, apb.Id, runErr)
+ apb.Status = AnsiblePlaybookStatusFailed
+ } else {
+ apb.Status = AnsiblePlaybookStatusSucceeded
+ }
+ apb.EndTime = time.Now()
+ return nil
+ })
+ if err != nil {
+ log.Errorf("updating ansible playbook failed: %v", err)
+ }
+ }()
+ return nil
+}
+
+func (apb *SAnsiblePlaybookV2) stopPlaybook(ctx context.Context, userCred mcclient.TokenCredential) error {
+ man := AnsiblePlaybookV2Manager
+ man.sessionsMux.Lock()
+ defer man.sessionsMux.Unlock()
+ if !man.sessions.Has(apb.Id) {
+ return fmt.Errorf("playbook is not running")
+ }
+ // the playbook will be removed from session map in runPlaybook() on return from run
+ man.sessions.Stop(apb.Id)
+ return nil
+}
+
+func (apb *SAnsiblePlaybookV2) getMaxOutputLength() int {
+ return OutputMaxBytes
+}
+
+func (apb *SAnsiblePlaybookV2) getOutput() string {
+ return apb.Output
+}
+
+func (apb *SAnsiblePlaybookV2) setOutput(s string) {
+ apb.Output = s
+}
diff --git a/pkg/ansibleserver/models/status.go b/pkg/ansibleserver/models/status.go
new file mode 100644
index 0000000000..5d65d67e4e
--- /dev/null
+++ b/pkg/ansibleserver/models/status.go
@@ -0,0 +1,24 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+const (
+ AnsiblePlaybookStatusInit = "init"
+ AnsiblePlaybookStatusRunning = "running"
+ AnsiblePlaybookStatusSucceeded = "succeeded"
+ AnsiblePlaybookStatusFailed = "failed"
+ AnsiblePlaybookStatusCanceled = "canceled"
+ AnsiblePlaybookStatusUnknown = "unknown"
+)
diff --git a/pkg/ansibleserver/service/handlers.go b/pkg/ansibleserver/service/handlers.go
index bd61704cdd..4a5e798f35 100644
--- a/pkg/ansibleserver/service/handlers.go
+++ b/pkg/ansibleserver/service/handlers.go
@@ -43,6 +43,7 @@ func InitHandlers(app *appsrv.Application) {
db.RegisterModelManager(db.TenantCacheManager)
for _, manager := range []db.IModelManager{
models.AnsiblePlaybookManager,
+ models.AnsiblePlaybookV2Manager,
} {
db.RegisterModelManager(manager)
handler := db.NewModelHandler(manager)
diff --git a/pkg/cloudcommon/validators/errors.go b/pkg/cloudcommon/validators/errors.go
index e91d036a44..9c541e9063 100644
--- a/pkg/cloudcommon/validators/errors.go
+++ b/pkg/cloudcommon/validators/errors.go
@@ -33,6 +33,7 @@ const (
ERR_MISSING_KEY
ERR_INVALID_TYPE
ERR_INVALID_CHOICE
+ ERR_INVALID_LENGTH
ERR_NOT_IN_RANGE
ERR_INVALID_VALUE
ERR_MODEL_MANAGER
@@ -45,6 +46,7 @@ var errTypeToString = map[ErrType]string{
ERR_MISSING_KEY: "Missing key error",
ERR_INVALID_TYPE: "Invalid type error",
ERR_INVALID_CHOICE: "Invalid choice error",
+ ERR_INVALID_LENGTH: "Invalid length error",
ERR_NOT_IN_RANGE: "Not in range error",
ERR_INVALID_VALUE: "Invalid value error",
ERR_MODEL_MANAGER: "Model manager error",
@@ -85,6 +87,14 @@ func newInvalidChoiceError(key string, choices choices.Choices, choice string) e
return newError(ERR_INVALID_CHOICE, "invalid %q, want %s, got %s", key, choices, choice)
}
+func newStringTooShortError(key string, got, want int) error {
+ return newError(ERR_INVALID_LENGTH, "%q too short, got %d, min %s", key, got, want)
+}
+
+func newStringTooLongError(key string, got, want int) error {
+ return newError(ERR_INVALID_LENGTH, "%q too long, got %d, max %s", key, got, want)
+}
+
func newNotInRangeError(key string, value, lower, upper int64) error {
return newError(ERR_NOT_IN_RANGE, "invalid %q: %d, want [%d,%d]", key, value, lower, upper)
}
@@ -93,6 +103,10 @@ func newInvalidValueError(key string, value string) error {
return newError(ERR_INVALID_VALUE, "invalid %q: %s", key, value)
}
+func newInvalidValueErrorEx(key string, err error) error {
+ return newError(ERR_INVALID_VALUE, "invalid %q: %v", key, err)
+}
+
func newInvalidStructError(key string, err error) error {
errFmt := "invalid %q: "
params := []interface{}{key}
diff --git a/pkg/cloudcommon/validators/validators_actor.go b/pkg/cloudcommon/validators/validators_actor.go
new file mode 100644
index 0000000000..41888cfe4a
--- /dev/null
+++ b/pkg/cloudcommon/validators/validators_actor.go
@@ -0,0 +1,166 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package validators
+
+import (
+ "fmt"
+ "strings"
+
+ "yunion.io/x/jsonutils"
+ "yunion.io/x/pkg/util/netutils"
+)
+
+type IValidateActor interface {
+ Validate(val interface{}) (bool, error)
+ Set(data *jsonutils.JSONDict, key string, val interface{})
+ getValue() interface{}
+}
+
+type actorSetString struct{}
+
+func (actor *actorSetString) Set(data *jsonutils.JSONDict, key string, val interface{}) {
+ s := val.(string)
+ data.Set(key, jsonutils.NewString(s))
+}
+
+type ActorIPv4Prefix struct {
+ actorSetString
+
+ val *netutils.IPV4Prefix
+}
+
+func NewActorIPv4Prefix() *ActorIPv4Prefix {
+ return &ActorIPv4Prefix{}
+}
+
+func (actor *ActorIPv4Prefix) Validate(val interface{}) (bool, error) {
+ s, ok := val.(string)
+ if !ok {
+ return false, fmt.Errorf("invalid type, want string, got %t", val)
+ }
+ p, err := netutils.NewIPV4Prefix(s)
+ if err != nil {
+ return false, err
+ }
+ actor.val = &p
+ return true, nil
+}
+
+func (actor *ActorIPv4Prefix) getValue() interface{} {
+ return actor.val
+}
+
+type ActorJoinedBy struct {
+ sep string
+ trimSpace bool
+ ignoreEmpty bool
+ actor IValidateActor
+
+ sanitized string
+ vals []interface{}
+}
+
+func NewActorJoinedBy(sep string, subActor IValidateActor) *ActorJoinedBy {
+ return &ActorJoinedBy{
+ sep: sep,
+ trimSpace: true,
+ ignoreEmpty: true,
+ actor: subActor,
+ }
+}
+
+func (actor *ActorJoinedBy) TrimSpace(b bool) *ActorJoinedBy {
+ actor.trimSpace = b
+ return actor
+}
+
+func (actor *ActorJoinedBy) IgnoreEmpty(b bool) *ActorJoinedBy {
+ actor.ignoreEmpty = b
+ return actor
+}
+
+func (actor *ActorJoinedBy) Validate(val interface{}) (bool, error) {
+ s, ok := val.(string)
+ if !ok {
+ return false, fmt.Errorf("invalid type, want string, got %t", val)
+ }
+ parts := strings.Split(s, actor.sep)
+ sanitizedParts := make([]string, 0, len(parts))
+ vals := make([]interface{}, 0, len(parts))
+ for i, part := range parts {
+ if actor.trimSpace {
+ part = strings.TrimSpace(part)
+ }
+ if actor.ignoreEmpty && part == "" {
+ continue
+ }
+ if _, err := actor.actor.Validate(part); err != nil {
+ return false, fmt.Errorf("bad value at index %d: %v", i, err)
+ }
+ sanitizedParts = append(sanitizedParts, part)
+ vals = append(vals, actor.actor.getValue())
+ }
+ actor.sanitized = strings.Join(sanitizedParts, actor.sep)
+ actor.vals = vals
+ return true, nil
+}
+
+func (actor *ActorJoinedBy) Set(data *jsonutils.JSONDict, key string, val interface{}) {
+ data.Set(key, jsonutils.NewString(actor.sanitized))
+}
+
+func (actor *ActorJoinedBy) getValue() interface{} {
+ return actor.vals
+}
+
+type ValidatorByActor struct {
+ Validator
+ Value interface{}
+
+ actor IValidateActor
+}
+
+func NewValidatorByActor(key string, actor IValidateActor) *ValidatorByActor {
+ v := &ValidatorByActor{
+ Validator: Validator{Key: key},
+ actor: actor,
+ }
+ v.SetParent(v)
+ return v
+}
+
+func (v *ValidatorByActor) Default(val interface{}) IValidator {
+ if ok, err := v.actor.Validate(val); !ok {
+ panic(fmt.Sprintf("invalid default value: %v", err))
+ }
+ return v.Validator.Default(val)
+}
+
+func (v *ValidatorByActor) getValue() interface{} {
+ return v.Value
+}
+
+func (v *ValidatorByActor) Validate(data *jsonutils.JSONDict) error {
+ if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
+ return err
+ }
+ val := v.value.Interface()
+ if ok, err := v.actor.Validate(val); !ok {
+ return newInvalidValueErrorEx(v.Key, err)
+ }
+ v.actor.Set(data, v.Key, val)
+ v.Value = v.actor.getValue()
+ return nil
+}
diff --git a/pkg/cloudcommon/validators/validators_actor_test.go b/pkg/cloudcommon/validators/validators_actor_test.go
new file mode 100644
index 0000000000..2e4d09c988
--- /dev/null
+++ b/pkg/cloudcommon/validators/validators_actor_test.go
@@ -0,0 +1,160 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package validators
+
+import (
+ "testing"
+
+ "yunion.io/x/pkg/util/netutils"
+)
+
+type actorJoinedByCase struct {
+ sep string
+ trimSpace bool
+ ignoreEmpty bool
+ C
+}
+
+func (ac *actorJoinedByCase) Validator() *ValidatorByActor {
+ actor := NewActorJoinedBy(ac.sep,
+ NewActorIPv4Prefix(),
+ ).TrimSpace(ac.trimSpace).IgnoreEmpty(ac.ignoreEmpty)
+ return NewValidatorByActor("s", actor)
+}
+
+func TestJoinedByActor(t *testing.T) {
+ var valsWant []interface{}
+ for _, n := range []string{"10.0.0.0/8", "192.168.0.0/16"} {
+ p, _ := netutils.NewIPV4Prefix(n)
+ valsWant = append(valsWant, &p)
+ }
+ cases := []*actorJoinedByCase{
+ {
+ C: C{
+ Name: "missing non-optional",
+ In: `{}`,
+ Out: `{}`,
+ Optional: false,
+ Err: ERR_MISSING_KEY,
+ ValueWant: nil,
+ },
+ },
+ {
+ C: C{
+ Name: "missing optional",
+ In: `{}`,
+ Out: `{}`,
+ Optional: true,
+ ValueWant: nil,
+ },
+ },
+ {
+ sep: ",",
+ C: C{
+ Name: "missing with default",
+ In: `{}`,
+ Out: `{s: "10.0.0.0/8,192.168.0.0/16"}`,
+ Default: "10.0.0.0/8,192.168.0.0/16",
+ ValueWant: valsWant,
+ },
+ },
+ {
+ sep: ",",
+ C: C{
+ Name: "good in",
+ In: `{"s": "10.0.0.0/8,192.168.0.0/16"}`,
+ Out: `{"s": "10.0.0.0/8,192.168.0.0/16"}`,
+ ValueWant: valsWant,
+ },
+ },
+ {
+ sep: ",",
+ ignoreEmpty: true,
+ C: C{
+ Name: "good in (nothing)",
+ In: `{"s": ""}`,
+ Out: `{"s": ""}`,
+ ValueWant: []interface{}{},
+ },
+ },
+ {
+ sep: ",",
+ C: C{
+ Name: "good in (0.0.0.0/32)",
+ In: `{"s": ""}`,
+ Out: `{"s": ""}`,
+ ValueWant: []interface{}{func() *netutils.IPV4Prefix {
+ p, _ := netutils.NewIPV4Prefix("0.0.0.0/32")
+ return &p
+ }()},
+ },
+ },
+ {
+ sep: ",",
+ trimSpace: true,
+ ignoreEmpty: true,
+ C: C{
+ Name: "good in (ignore empty, trim space)",
+ In: `{"s": ",,, 10.0.0.0/8 , 192.168.0.0/16, ,,"}`,
+ Out: `{"s": "10.0.0.0/8,192.168.0.0/16"}`,
+ ValueWant: valsWant,
+ },
+ },
+ {
+ sep: ",",
+ ignoreEmpty: false,
+ C: C{
+ Name: "bad in (empty)",
+ In: `{"s": ",,, 10.0.0.0/8 , 192.168.0.0/16, ,,"}`,
+ Out: `{"s": ",,, 10.0.0.0/8 , 192.168.0.0/16, ,,"}`,
+ Err: ERR_INVALID_VALUE,
+ ValueWant: nil,
+ },
+ },
+ {
+ sep: ",",
+ trimSpace: false,
+ C: C{
+ Name: "bad in (space)",
+ In: `{"s": ",,, 10.0.0.0/8 , 192.168.0.0/16, ,,"}`,
+ Out: `{"s": ",,, 10.0.0.0/8 , 192.168.0.0/16, ,,"}`,
+ Err: ERR_INVALID_VALUE,
+ ValueWant: nil,
+ },
+ },
+ {
+ C: C{
+ Name: "bad in (bad value)",
+ In: `{"s": "10.0.0.259/32"}`,
+ Out: `{"s": "10.0.0.259/32"}`,
+ Err: ERR_INVALID_VALUE,
+ ValueWant: nil,
+ },
+ },
+ }
+ for _, c := range cases {
+ t.Run(c.C.Name, func(t *testing.T) {
+ v := c.Validator()
+ if c.Default != nil {
+ s := c.Default.(string)
+ v.Default(s)
+ }
+ if c.Optional {
+ v.Optional(true)
+ }
+ testS(t, v, &c.C)
+ })
+ }
+}
diff --git a/pkg/cloudcommon/validators/validators_sshkey.go b/pkg/cloudcommon/validators/validators_sshkey.go
new file mode 100644
index 0000000000..944ec1aee3
--- /dev/null
+++ b/pkg/cloudcommon/validators/validators_sshkey.go
@@ -0,0 +1,74 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package validators
+
+import (
+ "golang.org/x/crypto/ssh"
+
+ "yunion.io/x/jsonutils"
+)
+
+type ValidatorSSHKey struct {
+ Validator
+ Value string
+ Signer ssh.Signer
+}
+
+func NewSSHKeyValidator(key string) *ValidatorSSHKey {
+ v := &ValidatorSSHKey{
+ Validator: Validator{Key: key},
+ }
+ v.SetParent(v)
+ return v
+}
+
+func (v *ValidatorSSHKey) parseKey(s string) (ssh.Signer, error) {
+ signer, err := ssh.ParsePrivateKey([]byte(s))
+ if err != nil {
+ return nil, err
+ }
+ return signer, nil
+}
+
+func (v *ValidatorSSHKey) Default(s string) IValidator {
+ _, err := v.parseKey(s)
+ if err != nil {
+ panic(err)
+ }
+ v.Validator.Default(s)
+ return v
+}
+
+func (v *ValidatorSSHKey) getValue() interface{} {
+ return v.Value
+}
+
+func (v *ValidatorSSHKey) Validate(data *jsonutils.JSONDict) error {
+ if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
+ return err
+ }
+ s, err := v.value.GetString()
+ if err != nil {
+ return newGeneralError(v.Key, err)
+ }
+ if signer, err := v.parseKey(s); err != nil {
+ return newInvalidValueError(v.Key, s)
+ } else {
+ v.Signer = signer
+ }
+ data.Set(v.Key, jsonutils.NewString(s))
+ v.Value = s
+ return nil
+}
diff --git a/pkg/cloudcommon/validators/validators_sshkey_test.go b/pkg/cloudcommon/validators/validators_sshkey_test.go
new file mode 100644
index 0000000000..6bf55412ae
--- /dev/null
+++ b/pkg/cloudcommon/validators/validators_sshkey_test.go
@@ -0,0 +1,101 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package validators
+
+import (
+ "testing"
+)
+
+func TestSSHKeyValidator(t *testing.T) {
+ aKey := `
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAvWB7GIQ5nuffEtS5L5fPvkBP8MjOLuuIkn+G+BS8HDhWkXr4
+jYokpPz/mXwdk2VmJONQw28XmAvJTLyT6xZPNOehBENm6VNakY7PJ4fXAoHFNMaF
+crkj3KmwjQXQAEX6Ul7vOVl8wRBMWQ3iQiR2OKvnIkrWZF7Y4lEQVJkHTPzp7GLv
+LjmiOEnOZdtrM6YtrRtIdfEk/vGDJL86xOAWmM7vMFrH9obuhyXwqtomGn+4II3C
+j4ShMWKQkmHoOOmd14At+fhHlKkvtAOtDOlCXB/svKSvqBfzjbYORHCtXXc8WvID
+yz2OCPgh9VgxAIcgfEt4cKvtZjz3hlcCgIY0qQIDAQABAoIBAQCPNCQhd+typHhl
+bwLSYIQxo8RPmimABY/y6AiSFGvjEx8zR8Aol+v5728BC3/589V304VBJAK9cTw5
+kOhx/x7KLNXvuWBa1DNKmqk/hVMrjCIqNGy5QhNCS/c7zMdrTX9rRmqz/V1/SOnS
+9dLAnX3ggO15WwogQDDVguNMdaO1rMWtO/DZS53rVbhSxfM5JPq2oxAucDKxlhjT
+MGdF/iK3/NyRft36QEbBB9qG+97YvXUmXFF2UVFAro9k+nWzR7BLGhkcDRRc5FsK
+R/Vixe3G8pR9/XBs6MyWK/HlGBEvzdlehyEw1duGxEUNdBALcVtZXTZ37L6pn8G9
+yHSvzzcBAoGBAOPUGPC77CBR9d0YP+YydkTjayV+p55k1vhrW/uvlSKZO/LwZ5b5
+T/2qcmWt2SiXE6A6YUOwq2NJvBPeq+6WJBVqQoPsiVg7mc0j5/nP0TtH2GGgfPBm
+JKCG+bdrh5OcVkql5fdX35zLSDkKNnxASS4bEAISdViBelmPN/QH7ayxAoGBANTL
+MtnwhKj9Eas7yNfV6H1Va6AUuB3nx+ZDcFq/mPNzPE15Ddv3gqoQqi9doXe61oGx
+X4XfMiKBlo5Jzh2u5LcO6fAmV1itCi2pyWcKk8Nc+Aarc36HsOLao4sw1zczCVyt
+BF0TlxKeRpqBT/uQfmEThwbN8LUyoBKGl2oBWiV5AoGAHpW0m2y+8D/Qf9PnkCGq
+Gulk0u3D1tG2wja3bHxPywtDLwPzBCOIB4fAP8Is6vQNIG916z5mY7fcVdaIwkjJ
+o05Wi5tPfNbTeOSfGbw6XHjypXiEDUnJFPvJvkPjOX+9XdwTmTbkwAnSMkYatmdy
+64uahIyx0CXhpPBDFLGTyKECgYAO4XLZ6MbuJlxg9BpUdaH/ecS/+hLyDG5fPOIT
+hoiEpc9Wv5tngYSCrg2oqEyNWeR8R1Idw4D3BsbnhmPCkaNu5b0YTSYYjmlCzjfG
+W+f/ZnX1yXGXLJgDFTUQm8bBFnGWKIdAlwkehTD8xwQ33F/qG/p6UFZ/5V1qTj0y
+bYvHSQKBgBwzshyuDA/QSxSVDn2HI3hK1202eAN2PERsBGP2VSAEpIwav2KvBVva
+p30+rx5gwUquGpB24gyHlZ0l3eVbONop84wOS8eoA4wUyXBlkgzvZvlFvJCpm8x1
+qtvUqlXM7TheLX3gGucB76fmc+wLs06QPHd0sxAlTGcwwBVOUPvH
+-----END RSA PRIVATE KEY-----
+`
+ cases := []*C{
+ {
+ Name: "missing non-optional",
+ In: `{}`,
+ Out: `{}`,
+ Optional: false,
+ Err: ERR_MISSING_KEY,
+ ValueWant: "",
+ },
+ {
+ Name: "missing optional",
+ In: `{}`,
+ Out: `{}`,
+ Optional: true,
+ ValueWant: "",
+ },
+ {
+ Name: "missing with default",
+ In: `{}`,
+ Out: `{s: "` + aKey + `"}`,
+ Default: aKey,
+ ValueWant: aKey,
+ },
+ {
+ Name: "good in",
+ In: `{"s": "` + aKey + `"}`,
+ Out: `{"s": "` + aKey + `"}`,
+ ValueWant: aKey,
+ },
+ {
+ Name: "bad in",
+ In: `{"s": "0"}`,
+ Out: `{"s": "0"}`,
+ Err: ERR_INVALID_VALUE,
+ ValueWant: "",
+ },
+ }
+ for _, c := range cases {
+ t.Run(c.Name, func(t *testing.T) {
+ v := NewSSHKeyValidator("s")
+ if c.Default != nil {
+ s := c.Default.(string)
+ v.Default(s)
+ }
+ if c.Optional {
+ v.Optional(true)
+ }
+ testS(t, v, c)
+ })
+ }
+}
diff --git a/pkg/cloudcommon/validators/validators_string.go b/pkg/cloudcommon/validators/validators_string.go
new file mode 100644
index 0000000000..d7411e9baa
--- /dev/null
+++ b/pkg/cloudcommon/validators/validators_string.go
@@ -0,0 +1,81 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package validators
+
+import (
+ "yunion.io/x/jsonutils"
+)
+
+type ValidatorStringLen struct {
+ Validator
+ Value string
+ minLen int
+ maxLen int
+}
+
+func NewStringLenRangeValidator(key string, minLen, maxLen int) *ValidatorStringLen {
+ v := &ValidatorStringLen{
+ Validator: Validator{Key: key},
+ minLen: minLen,
+ maxLen: maxLen,
+ }
+ v.SetParent(v)
+ return v
+}
+
+func NewMinStringLenValidator(key string, minLen int) *ValidatorStringLen {
+ return NewStringLenRangeValidator(key, minLen, -1)
+}
+
+func NewMaxStringLenValidator(key string, maxLen int) *ValidatorStringLen {
+ return NewStringLenRangeValidator(key, -1, maxLen)
+}
+
+func NewStringNonEmptyValidator(key string) *ValidatorStringLen {
+ return NewMinStringLenValidator(key, 1)
+}
+
+func (v *ValidatorStringLen) Default(s string) IValidator {
+ if v.minLen >= 0 && len(s) < v.minLen {
+ panic("invalid default string: shorter than validator requirement")
+ }
+ if v.maxLen >= 0 && len(s) > v.maxLen {
+ panic("invalid default string: shorter than validator requirement")
+ }
+ return v.Validator.Default(s)
+}
+
+func (v *ValidatorStringLen) getValue() interface{} {
+ return v.Value
+}
+
+func (v *ValidatorStringLen) Validate(data *jsonutils.JSONDict) error {
+ if err, isSet := v.Validator.validateEx(data); err != nil || !isSet {
+ return err
+ }
+ s, err := v.value.GetString()
+ if err != nil {
+ return newGeneralError(v.Key, err)
+ }
+ if v.minLen >= 0 && len(s) < v.minLen {
+ return newStringTooShortError(v.Key, len(s), v.minLen)
+ }
+ if v.maxLen >= 0 && len(s) > v.maxLen {
+ return newStringTooLongError(v.Key, len(s), v.maxLen)
+ }
+ data.Set(v.Key, jsonutils.NewString(s))
+ v.Value = s
+ return nil
+}
diff --git a/pkg/cloudcommon/validators/validators_string_test.go b/pkg/cloudcommon/validators/validators_string_test.go
new file mode 100644
index 0000000000..3fff30a1bd
--- /dev/null
+++ b/pkg/cloudcommon/validators/validators_string_test.go
@@ -0,0 +1,99 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package validators
+
+import (
+ "testing"
+)
+
+func TestStringLenValidator(t *testing.T) {
+ cases := []*C{
+ {
+ Name: "missing non-optional",
+ In: `{}`,
+ Out: `{}`,
+ Optional: false,
+ Err: ERR_MISSING_KEY,
+ ValueWant: "",
+ },
+ {
+ Name: "missing optional",
+ In: `{}`,
+ Out: `{}`,
+ Optional: true,
+ ValueWant: "",
+ },
+ {
+ Name: "missing with default",
+ In: `{}`,
+ Out: `{s: "12345"}`,
+ Default: "12345",
+ ValueWant: "12345",
+ },
+ {
+ Name: "stringified",
+ In: `{"s": 100}`,
+ Out: `{s: "100"}`,
+ ValueWant: "100",
+ },
+ {
+ Name: "stringified too long",
+ In: `{"s": 9876543210}`,
+ Out: `{"s": 9876543210}`,
+ Err: ERR_INVALID_LENGTH,
+ ValueWant: "",
+ },
+ {
+ Name: "stringified too short",
+ In: `{"s": 0}`,
+ Out: `{"s": 0}`,
+ Err: ERR_INVALID_LENGTH,
+ ValueWant: "",
+ },
+ {
+ Name: "good length",
+ In: `{"s": "abcde"}`,
+ Out: `{"s": "abcde"}`,
+ ValueWant: "abcde",
+ },
+ {
+ Name: "bad length (too short)",
+ In: `{"s": "0"}`,
+ Out: `{"s": "0"}`,
+ Err: ERR_INVALID_LENGTH,
+ ValueWant: "",
+ },
+ {
+ Name: "bad length (too long)",
+ In: `{"s": "9876543210"}`,
+ Out: `{"s": "9876543210"}`,
+ Err: ERR_INVALID_LENGTH,
+ ValueWant: "",
+ },
+ }
+ for _, c := range cases {
+ t.Run(c.Name, func(t *testing.T) {
+ v := NewStringLenRangeValidator("s", 2, 5)
+ if c.Default != nil {
+ s := c.Default.(string)
+ v.Default(s)
+ }
+ if c.Optional {
+ v.Optional(true)
+ }
+ testS(t, v, c)
+ })
+ }
+}
diff --git a/pkg/cloudnet/models/doc.go b/pkg/cloudnet/models/doc.go
new file mode 100644
index 0000000000..64cf742135
--- /dev/null
+++ b/pkg/cloudnet/models/doc.go
@@ -0,0 +1,15 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models // import "yunion.io/x/onecloud/pkg/cloudnet/models"
diff --git a/pkg/cloudnet/models/iface_peers.go b/pkg/cloudnet/models/iface_peers.go
new file mode 100644
index 0000000000..f7afce1352
--- /dev/null
+++ b/pkg/cloudnet/models/iface_peers.go
@@ -0,0 +1,212 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+ "net"
+ "strings"
+
+ "yunion.io/x/log"
+ yerrors "yunion.io/x/pkg/util/errors"
+ "yunion.io/x/pkg/util/netutils"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/mcclient"
+)
+
+type SIfacePeer struct {
+ db.SStandaloneResourceBase
+
+ RouterId string
+ IfaceId string
+
+ PeerIfaceId string
+ PeerRouterId string
+
+ PublicKey string
+ AllowedIPs string
+ Endpoint string
+ PersistentKeepalive int
+}
+
+type SIfacePeerManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var IfacePeerManager *SIfacePeerManager
+
+func init() {
+ IfacePeerManager = &SIfacePeerManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SIfacePeer{},
+ "ifacepeers_tbl",
+ "ifacepeer",
+ "ifacepeers",
+ ),
+ }
+ IfacePeerManager.SetVirtualObject(IfacePeerManager)
+}
+
+func (ifacePeer *SIfacePeer) subnetsStrList() []string {
+ return strings.Split(ifacePeer.AllowedIPs, ",")
+}
+
+func (ifacePeer *SIfacePeer) subnetsParsed() Subnets {
+ parts := ifacePeer.subnetsStrList()
+ r := make([]*netutils.IPV4Prefix, 0, len(parts))
+ for _, part := range parts {
+ p, err := netutils.NewIPV4Prefix(part)
+ if err != nil {
+ log.Errorf("%s: invalid subnet sneaked in: %s", ifacePeer.Id, part)
+ return nil
+ }
+ r = append(r, &p)
+ }
+ return Subnets(r)
+}
+
+func (man *SIfacePeerManager) removeByPeerIface(ctx context.Context, userCred mcclient.TokenCredential, iface *SIface) error {
+ peers := []SIfacePeer{}
+ q := man.Query().Equals("peer_iface_id", iface.Id)
+ if err := db.FetchModelObjects(IfacePeerManager, q, &peers); err != nil {
+ return err
+ }
+ var errs []error
+ for j := range peers {
+ if err := peers[j].Delete(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SIfacePeerManager) removeByIface(ctx context.Context, userCred mcclient.TokenCredential, iface *SIface) error {
+ peers := []SIfacePeer{}
+ q := man.Query().Equals("iface_id", iface.Id)
+ if err := db.FetchModelObjects(IfacePeerManager, q, &peers); err != nil {
+ return err
+ }
+ var errs []error
+ for j := range peers {
+ if err := peers[j].Delete(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SIfacePeerManager) getByFilter(filter map[string]string) ([]SIfacePeer, error) {
+ ifacePeers := []SIfacePeer{}
+ q := man.Query()
+ for key, val := range filter {
+ q = q.Equals(key, val)
+ }
+ if err := db.FetchModelObjects(IfacePeerManager, q, &ifacePeers); err != nil {
+ return nil, err
+ }
+ return ifacePeers, nil
+}
+
+func (man *SIfacePeerManager) getOneByFilter(filter map[string]string) (*SIfacePeer, error) {
+ ifacePeers, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ if len(ifacePeers) == 0 {
+ return nil, errNotFound(fmt.Errorf("cannot find iface peer: %#v", filter))
+ }
+ if len(ifacePeers) > 1 {
+ return nil, errMoreThanOne(fmt.Errorf("found more than 1 iface peers: %#v", filter))
+ }
+ return &ifacePeers[0], nil
+}
+
+func (man *SIfacePeerManager) getByIface(iface *SIface) ([]SIfacePeer, error) {
+ filter := map[string]string{
+ "router_id": iface.RouterId,
+ "iface_id": iface.Id,
+ }
+ ifacePeers, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ return ifacePeers, nil
+}
+
+func (man *SIfacePeerManager) getByIfacePublicKey(iface *SIface, pubkey string) (*SIfacePeer, error) {
+ filter := map[string]string{
+ "router_id": iface.RouterId,
+ "iface_id": iface.Id,
+ "public_key": pubkey,
+ }
+ ifacePeer, err := man.getOneByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ return ifacePeer, nil
+}
+
+func (man *SIfacePeerManager) checkAllowedIPs(iface *SIface, oldPeer *SIfacePeer, allowedNets Subnets) error {
+ ifacePeers, err := man.getByIface(iface)
+ if err != nil {
+ return err
+ }
+ for i := range ifacePeers {
+ ifacePeer := &ifacePeers[i]
+ if oldPeer != nil && oldPeer.Id == ifacePeer.Id {
+ continue
+ }
+ existingNets := ifacePeer.subnetsParsed()
+ if _, net := existingNets.ContainsAnyEx(allowedNets); net != nil {
+ return fmt.Errorf("subnet %s is already occupied by peer %s(%s)",
+ net, ifacePeer.Name, ifacePeer.Id)
+ }
+ }
+ return nil
+}
+
+func (man *SIfacePeerManager) updateEndpointIPByPeerRouter(ctx context.Context, endpointIP string, router *SRouter) error {
+ filter := map[string]string{
+ "peer_router_id": router.Id,
+ }
+ ifacePeers, err := man.getByFilter(filter)
+ if err != nil {
+ return err
+ }
+
+ var errs []error
+ for i := range ifacePeers {
+ ifacePeer := &ifacePeers[i]
+ host, port, err := net.SplitHostPort(ifacePeer.Endpoint)
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ if host == endpointIP {
+ continue
+ }
+ _, err = db.Update(ifacePeer, func() error {
+ endpoint := net.JoinHostPort(endpointIP, port)
+ ifacePeer.Endpoint = endpoint
+ return nil
+ })
+ if err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
diff --git a/pkg/cloudnet/models/ifaces.go b/pkg/cloudnet/models/ifaces.go
new file mode 100644
index 0000000000..9286d3e0a2
--- /dev/null
+++ b/pkg/cloudnet/models/ifaces.go
@@ -0,0 +1,420 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+ "regexp"
+ "strconv"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "yunion.io/x/jsonutils"
+ yerrors "yunion.io/x/pkg/util/errors"
+ "yunion.io/x/sqlchemy"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/cloudcommon/validators"
+ cnutils "yunion.io/x/onecloud/pkg/cloudnet/utils"
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/pkg/util/netutils"
+)
+
+var regexpIfname = regexp.MustCompile(`[A-Za-z][A-Za-z0-9]{0,14}`)
+
+type SIface struct {
+ db.SStandaloneResourceBase
+
+ RouterId string `length:"32" nullable:"false"`
+ NetworkId string `length:"32" nullable:"false"`
+
+ Ifname string `length:"32" nullable:"false"`
+
+ PrivateKey string
+ PublicKey string
+ ListenPort int `nullable:"false"`
+
+ IsSystem bool `nullable:"false"`
+}
+
+type SIfaceManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var IfaceManager *SIfaceManager
+
+func init() {
+ IfaceManager = &SIfaceManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SIface{},
+ "ifaces_tbl",
+ "iface",
+ "ifaces",
+ ),
+ }
+ IfaceManager.SetVirtualObject(IfaceManager)
+}
+
+func (man *SIfaceManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ // router existence
+ // PrivateKey validation , or generation
+ // ListenPort validation, uniqueness
+ // ListenPort generation
+ return nil, errors.New("manually adding interface is currently not supported")
+}
+
+func (man *SIfaceManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
+ q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
+ if err != nil {
+ return nil, err
+ }
+ data := query.(*jsonutils.JSONDict)
+ q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{
+ {Key: "router", ModelKeyword: "router", OwnerId: userCred},
+ })
+ if err != nil {
+ return nil, err
+ }
+ return q, nil
+}
+
+func (iface *SIface) ValidateUpdateCondition(ctx context.Context) error {
+ // same as create but no generation
+ // if privatekey updated
+ // update peers whose peerifaceid == self.id
+ return nil
+}
+
+func (iface *SIface) ValidateDeleteCondition(ctx context.Context) error {
+ // if networkid != "" {
+ // return errors.New("part of network, remove it by remove network memeber")
+ // }
+ return nil
+}
+
+func (iface *SIface) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
+ // remove ifacepeer whose peerifaceId is self.id
+ return nil
+}
+
+func (iface *SIface) addOrUpdatePeer(ctx context.Context, userCred mcclient.TokenCredential,
+ peerIface *SIface, allowedNets Subnets, peerRouter *SRouter) error {
+ // XXX lock
+ endpoint := ""
+ endpointIP := peerRouter.endpointIP()
+ if endpointIP != "" && peerIface.ListenPort > 0 {
+ endpoint = fmt.Sprintf("%s:%d", endpointIP, peerIface.ListenPort)
+ }
+ persistentKeepalive := 0
+ if endpointIP != "" {
+ // persistent keepalive from private addr to exit addr
+ router, err := iface.getRouter()
+ if err != nil {
+ return errors.WithMessagef(err, "get iface router %s", iface.RouterId)
+ }
+ myIP := router.endpointIP()
+ if myIP != "" {
+ myIPAddr, err := netutils.NewIPV4Addr(myIP)
+ if err != nil {
+ return err
+ }
+ if netutils.IsPrivate(myIPAddr) {
+ peerIPAddr, err := netutils.NewIPV4Addr(endpointIP)
+ if err != nil {
+ return err
+ }
+ if netutils.IsExitAddress(peerIPAddr) {
+ persistentKeepalive = 10
+ }
+ }
+ }
+ }
+ ifacePeer, err := IfacePeerManager.getByIfacePublicKey(iface, peerIface.PublicKey)
+ if err != nil && !IsNotFound(err) {
+ return err
+ }
+ if err := IfacePeerManager.checkAllowedIPs(iface, ifacePeer, allowedNets); err != nil {
+ return err
+ }
+ if ifacePeer == nil {
+ ifacePeer := &SIfacePeer{
+ RouterId: iface.RouterId,
+ IfaceId: iface.Id,
+
+ PeerIfaceId: peerIface.Id,
+ PeerRouterId: peerIface.RouterId,
+ PublicKey: peerIface.PublicKey,
+ AllowedIPs: allowedNets.String(),
+ Endpoint: endpoint,
+ PersistentKeepalive: persistentKeepalive,
+ }
+ ifacePeer.Name = fmt.Sprintf("%s-%s", iface.Name, peerIface.Name)
+ err := IfacePeerManager.TableSpec().Insert(ifacePeer)
+ return err
+ }
+ _, err = db.Update(ifacePeer, func() error {
+ ifacePeer.PeerIfaceId = peerIface.Id
+ ifacePeer.PeerRouterId = peerIface.RouterId
+ ifacePeer.Endpoint = endpoint
+ ifacePeer.AllowedIPs = allowedNets.String()
+ ifacePeer.PersistentKeepalive = persistentKeepalive
+ return nil
+ })
+ return err
+}
+
+func (iface *SIface) clearPeers(ctx context.Context, userCred mcclient.TokenCredential) error {
+ return IfacePeerManager.removeByIface(ctx, userCred, iface)
+}
+
+func (iface *SIface) clearPeerRefs(ctx context.Context, userCred mcclient.TokenCredential) error {
+ return IfacePeerManager.removeByPeerIface(ctx, userCred, iface)
+}
+
+func (iface *SIface) clearRoutes(ctx context.Context, userCred mcclient.TokenCredential) error {
+ return RouteManager.removeByIface(ctx, userCred, iface)
+}
+
+func (iface *SIface) remove(ctx context.Context, userCred mcclient.TokenCredential) error {
+ var errs []error
+ if err := iface.clearRoutes(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ if err := iface.clearPeers(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ if err := iface.clearPeerRefs(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ if len(errs) == 0 {
+ if err := iface.Delete(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (iface *SIface) isTypeWireguard() bool {
+ r := iface.ListenPort > 0 && iface.PrivateKey != "" && iface.PublicKey != ""
+ return r
+}
+
+func (iface *SIface) getRouter() (*SRouter, error) {
+ obj, err := db.FetchById(RouterManager, iface.RouterId)
+ if err != nil {
+ return nil, err
+ }
+ router := obj.(*SRouter)
+ return router, nil
+}
+
+func (man *SIfaceManager) removeByFilter(ctx context.Context, userCred mcclient.TokenCredential, filter map[string]string) error {
+ ifaces, err := man.getByFilter(filter)
+ if err != nil {
+ return err
+ }
+ var errs []error
+ for i := range ifaces {
+ iface := &ifaces[i]
+ if err := iface.remove(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SIfaceManager) removeByRouter(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ err := man.removeByFilter(ctx, userCred, map[string]string{
+ "router_id": router.Id,
+ })
+ return err
+}
+
+func (man *SIfaceManager) removeByMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, mn *SMeshNetwork) error {
+ err := man.removeByFilter(ctx, userCred, map[string]string{
+ "network_id": mn.Id,
+ })
+ return err
+}
+
+func (man *SIfaceManager) removeByMeshNetworkRouter(ctx context.Context, userCred mcclient.TokenCredential, mn *SMeshNetwork, router *SRouter) error {
+ err := man.removeByFilter(ctx, userCred, map[string]string{
+ "network_id": mn.Id,
+ "router_id": router.Id,
+ })
+ return err
+}
+func (man *SIfaceManager) getByRouter(router *SRouter) ([]SIface, error) {
+ return man.getByFilter(map[string]string{
+ "router_id": router.Id,
+ })
+}
+
+func (man *SIfaceManager) getByRouterIfname(router *SRouter, ifname string) (*SIface, error) {
+ return man.getOneByFilter(map[string]string{
+ "router_id": router.Id,
+ "ifname": ifname,
+ })
+}
+
+func (man *SIfaceManager) getByFilter(filter map[string]string) ([]SIface, error) {
+ ifaces := []SIface{}
+ q := man.Query()
+ for key, val := range filter {
+ q = q.Equals(key, val)
+ }
+ if err := db.FetchModelObjects(IfaceManager, q, &ifaces); err != nil {
+ return nil, err
+ }
+ return ifaces, nil
+}
+
+func (man *SIfaceManager) getOneByFilter(filter map[string]string) (*SIface, error) {
+ ifaces, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ if len(ifaces) == 0 {
+ return nil, fmt.Errorf("cannot find iface for condition: %#v", filter)
+ }
+ if len(ifaces) > 1 {
+ return nil, fmt.Errorf("found more than 1 ifaces for condition: %#v", filter)
+ }
+ return &ifaces[0], nil
+}
+
+func (man *SIfaceManager) checkExistenceByFilter(filter map[string]string) error {
+ ifaces, err := man.getByFilter(filter)
+ if err != nil {
+ return err
+ }
+ if len(ifaces) > 0 {
+ return fmt.Errorf("iface exist: %s(%s)", ifaces[0].Name, ifaces[0].Id)
+ }
+ return nil
+}
+
+func (man *SIfaceManager) getByRouterNetwork(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter, mn *SMeshNetwork) ([]SIface, error) {
+ ifaces, err := man.getByFilter(map[string]string{
+ "router_id": router.Id,
+ "network_id": mn.Id,
+ })
+ return ifaces, err
+}
+
+func (man *SIfaceManager) getOneByRouterNetwork(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter, mn *SMeshNetwork) (*SIface, error) {
+ iface, err := man.getOneByFilter(map[string]string{
+ "router_id": router.Id,
+ "network_id": mn.Id,
+ })
+ return iface, err
+}
+
+func (man *SIfaceManager) getByMeshNetworkMember(member *SMeshNetworkMember) (*SIface, error) {
+ iface, err := man.getOneByFilter(map[string]string{
+ "router_id": member.RouterId,
+ "network_id": member.MeshNetworkId,
+ })
+ return iface, err
+}
+
+func (man *SIfaceManager) getNextName(filter map[string]string, base string) (string, error) {
+ ifaces, err := man.getByFilter(filter)
+ if err != nil {
+ return "", err
+ }
+ occupied := map[int]struct{}{}
+ for i := range ifaces {
+ iface := &ifaces[i]
+ if strings.HasPrefix(iface.Ifname, base) {
+ istr := iface.Ifname[len(base):]
+ i, err := strconv.ParseUint(istr, 10, 16)
+ if err != nil {
+ continue
+ }
+ occupied[int(i)] = struct{}{}
+ }
+ }
+ for i := 0; i < 65536; i++ {
+ if _, ok := occupied[i]; !ok {
+ return fmt.Sprintf("%s%d", base, i), nil
+ }
+ }
+ return "", fmt.Errorf("all names occupied")
+}
+
+func (man *SIfaceManager) addWireguardIface(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter, mn *SMeshNetwork) (*SIface, error) {
+ k := cnutils.MustNewKey()
+ port := router.mustFindFreePort(ctx)
+ iface := &SIface{
+ RouterId: router.Id,
+ PrivateKey: k.String(),
+ PublicKey: k.PublicKey().String(),
+ ListenPort: port,
+ }
+ iface.IsSystem = true
+
+ { // ifname
+ if name, err := man.getNextName(map[string]string{
+ "router_id": router.Id,
+ }, "wg"); err != nil {
+ return nil, err
+ } else {
+ iface.Ifname = name
+ }
+ }
+
+ { // obj name
+ name := router.Name + "-"
+ if mn != nil {
+ iface.NetworkId = mn.Id
+ name += mn.Name + "-"
+ }
+ name += fmt.Sprintf("%d", port)
+ iface.Name = name
+ }
+
+ iface.SetModelManager(man, iface)
+ err := man.TableSpec().Insert(iface)
+ if err != nil {
+ return nil, err
+ }
+ if err := RuleManager.addWireguardIfaceRules(ctx, userCred, iface); err != nil {
+ iface.Delete(ctx, userCred)
+ return nil, err
+ }
+ return iface, nil
+}
+
+func (man *SIfaceManager) addIface(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter, ifname string) (*SIface, error) {
+ if err := man.checkExistenceByFilter(map[string]string{
+ "router_id": router.Id,
+ "ifname": ifname,
+ }); err != nil {
+ return nil, err
+ }
+ iface := &SIface{
+ RouterId: router.Id,
+ Ifname: ifname,
+ }
+ iface.SetModelManager(man, iface)
+ err := man.TableSpec().Insert(iface)
+ if err != nil {
+ return nil, err
+ }
+ return iface, nil
+}
diff --git a/pkg/cloudnet/models/initdb.go b/pkg/cloudnet/models/initdb.go
new file mode 100644
index 0000000000..173a348fb5
--- /dev/null
+++ b/pkg/cloudnet/models/initdb.go
@@ -0,0 +1,19 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+func InitDB() error {
+ return nil
+}
diff --git a/pkg/cloudnet/models/meshnetwork_members.go b/pkg/cloudnet/models/meshnetwork_members.go
new file mode 100644
index 0000000000..7de54c6f8f
--- /dev/null
+++ b/pkg/cloudnet/models/meshnetwork_members.go
@@ -0,0 +1,152 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+ "strings"
+
+ "yunion.io/x/log"
+ yerrors "yunion.io/x/pkg/util/errors"
+ "yunion.io/x/pkg/util/netutils"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/mcclient"
+)
+
+type SMeshNetworkMember struct {
+ db.SStandaloneResourceBase
+
+ MeshNetworkId string
+ RouterId string
+ AdvertiseSubnets string
+}
+
+type SMeshNetworkMemberManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var MeshNetworkMemberManager *SMeshNetworkMemberManager
+
+func init() {
+ MeshNetworkMemberManager = &SMeshNetworkMemberManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SMeshNetworkMember{},
+ "meshnetwork_members_tbl",
+ "meshnetwork_member",
+ "meshnetwork_members",
+ ),
+ }
+ MeshNetworkMemberManager.SetVirtualObject(MeshNetworkMemberManager)
+}
+
+func (member *SMeshNetworkMember) subnetsStrList() []string {
+ return strings.Split(member.AdvertiseSubnets, ",")
+}
+
+func (member *SMeshNetworkMember) subnetsParsed() Subnets {
+ parts := member.subnetsStrList()
+ r := make([]*netutils.IPV4Prefix, 0, len(parts))
+ for _, part := range parts {
+ p, err := netutils.NewIPV4Prefix(part)
+ if err != nil {
+ log.Errorf("%s: invalid subnet sneaked in: %s", member.Id, part)
+ return nil
+ }
+ r = append(r, &p)
+ }
+ return Subnets(r)
+}
+
+func (member *SMeshNetworkMember) getRouter() (*SRouter, error) {
+ obj, err := db.FetchById(RouterManager, member.RouterId)
+ if err != nil {
+ return nil, err
+ }
+ router := obj.(*SRouter)
+ return router, nil
+}
+
+func (man *SMeshNetworkMemberManager) getByFilter(filter map[string]string) ([]SMeshNetworkMember, error) {
+ members := []SMeshNetworkMember{}
+ q := man.Query()
+ for key, val := range filter {
+ q = q.Equals(key, val)
+ }
+ if err := db.FetchModelObjects(man, q, &members); err != nil {
+ return nil, err
+ }
+ return members, nil
+}
+
+func (man *SMeshNetworkMemberManager) removeByFilter(ctx context.Context, userCred mcclient.TokenCredential, filter map[string]string) error {
+ members, err := man.getByFilter(filter)
+ if err != nil {
+ return err
+ }
+ var errs []error
+ for i := range members {
+ if err := members[i].Delete(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SMeshNetworkMemberManager) removeByRouter(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ err := man.removeByFilter(ctx, userCred, map[string]string{
+ "router_id": router.Id,
+ })
+ return err
+}
+
+func (man *SMeshNetworkMemberManager) removeByMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, mn *SMeshNetwork) error {
+ err := man.removeByFilter(ctx, userCred, map[string]string{
+ "mesh_network_id": mn.Id,
+ })
+ return err
+}
+
+func (man *SMeshNetworkMemberManager) removeByMeshNetworkRouter(ctx context.Context, userCred mcclient.TokenCredential,
+ mn *SMeshNetwork, router *SRouter) error {
+ err := man.removeByFilter(ctx, userCred, map[string]string{
+ "mesh_network_id": mn.Id,
+ "router_id": router.Id,
+ })
+ return err
+}
+
+func (man *SMeshNetworkMemberManager) getMemebersByMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, mn *SMeshNetwork) ([]SMeshNetworkMember, error) {
+ members := []SMeshNetworkMember{}
+ q := man.Query().Equals("mesh_network_id", mn.Id)
+ err := db.FetchModelObjects(man, q, &members)
+ if err != nil {
+ return nil, err
+ }
+ return members, nil
+}
+
+func (man *SMeshNetworkMemberManager) addMember(ctx context.Context, userCred mcclient.TokenCredential, mn *SMeshNetwork, router *SRouter, nets Subnets) (*SMeshNetworkMember, error) {
+ member := &SMeshNetworkMember{
+ MeshNetworkId: mn.Id,
+ RouterId: router.Id,
+ AdvertiseSubnets: nets.String(),
+ }
+ member.SetModelManager(man, member)
+ member.Name = fmt.Sprintf("%s-%s", mn.Name, router.Name)
+ man.TableSpec().Insert(member)
+ return member, nil
+}
diff --git a/pkg/cloudnet/models/meshnetworks.go b/pkg/cloudnet/models/meshnetworks.go
new file mode 100644
index 0000000000..bba8923184
--- /dev/null
+++ b/pkg/cloudnet/models/meshnetworks.go
@@ -0,0 +1,157 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/pkg/errors"
+
+ "yunion.io/x/jsonutils"
+ yerrors "yunion.io/x/pkg/util/errors"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/httperrors"
+ "yunion.io/x/onecloud/pkg/mcclient"
+)
+
+type SMeshNetwork struct {
+ db.SStandaloneResourceBase
+}
+
+type SMeshNetworkManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var MeshNetworkManager *SMeshNetworkManager
+
+func init() {
+ MeshNetworkManager = &SMeshNetworkManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SMeshNetwork{},
+ "meshnetworks_tbl",
+ "meshnetwork",
+ "meshnetworks",
+ ),
+ }
+ MeshNetworkManager.SetVirtualObject(MeshNetworkManager)
+}
+
+func (mn *SMeshNetwork) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
+ var errs []error
+ if err := MeshNetworkMemberManager.removeByMeshNetwork(ctx, userCred, mn); err != nil {
+ errs = append(errs, err)
+ }
+ if err := IfaceManager.removeByMeshNetwork(ctx, userCred, mn); err != nil {
+ errs = append(errs, err)
+ }
+ if err := mn.SStandaloneResourceBase.CustomizeDelete(ctx, userCred, query, data); err != nil {
+ errs = append(errs, err)
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (mn *SMeshNetwork) AllowPerformRealize(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, mn, "realize")
+}
+
+func (mn *SMeshNetwork) PerformRealize(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ members, err := MeshNetworkMemberManager.getMemebersByMeshNetwork(ctx, userCred, mn)
+ if err != nil {
+ return nil, httperrors.NewBadRequestError("fetch members: %v", err)
+ }
+ var errs []error
+ for i := range members {
+ member := &members[i]
+ router, err := member.getRouter()
+ if err != nil {
+ errs = append(errs, errors.WithMessagef(err, "get router %s", member.RouterId))
+ continue
+ }
+ if err := router.realize(ctx, userCred); err != nil {
+ errs = append(errs, errors.WithMessagef(err, "realize router %s", router.Name))
+ }
+ }
+ err = yerrors.NewAggregate(errs)
+ if err != nil {
+ err = httperrors.NewBadRequestError("some router realization failed: %s", err)
+ }
+ return nil, err
+}
+
+func (mn *SMeshNetwork) addRouter(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter, nets Subnets) error {
+ // XXX lock
+ members, err := MeshNetworkMemberManager.getMemebersByMeshNetwork(ctx, userCred, mn)
+ if err != nil {
+ return err
+ }
+ for i := range members {
+ member := &members[i]
+ if member.RouterId == router.Id {
+ return fmt.Errorf("router %s is already a member of %s",
+ router.Name, mn.Name)
+ }
+ memberSubnets := member.subnetsParsed()
+ if _, p := memberSubnets.ContainsAnyEx(nets); p != nil {
+ return fmt.Errorf("router %s subnet %s already advertised by member %s(%s)",
+ router.Name, p.String(), member.Name, member.Id)
+ }
+ }
+ _, err = MeshNetworkMemberManager.addMember(ctx, userCred, mn, router, nets)
+ if err != nil {
+ return err
+ }
+ newIface, err := IfaceManager.addWireguardIface(ctx, userCred, router, mn)
+ if err != nil {
+ return err
+ }
+ // XXX allocate an iface and populate iface peers
+ var errs []error
+ for i := range members {
+ member := &members[i]
+ memberIface, err := IfaceManager.getByMeshNetworkMember(member)
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ if err := memberIface.addOrUpdatePeer(ctx, userCred, newIface, nets, router); err != nil {
+ errs = append(errs, err)
+ }
+ if memberHost, err := RouterManager.getById(member.RouterId); err != nil {
+ errs = append(errs, err)
+ } else {
+ if err := newIface.addOrUpdatePeer(ctx, userCred, memberIface, member.subnetsParsed(), memberHost); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (mn *SMeshNetwork) removeRouter(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ if err := MeshNetworkMemberManager.removeByMeshNetworkRouter(ctx, userCred, mn, router); err != nil {
+ return err
+ }
+ if err := IfaceManager.removeByMeshNetworkRouter(ctx, userCred, mn, router); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (man *SMeshNetworkManager) removeRouter(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ err := MeshNetworkMemberManager.removeByRouter(ctx, userCred, router)
+ return err
+}
diff --git a/pkg/cloudnet/models/routers.go b/pkg/cloudnet/models/routers.go
new file mode 100644
index 0000000000..2095c0171a
--- /dev/null
+++ b/pkg/cloudnet/models/routers.go
@@ -0,0 +1,295 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+
+ "yunion.io/x/jsonutils"
+ "yunion.io/x/log"
+ "yunion.io/x/pkg/gotypes"
+ yerrors "yunion.io/x/pkg/util/errors"
+ "yunion.io/x/pkg/util/netutils"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/cloudcommon/validators"
+ "yunion.io/x/onecloud/pkg/httperrors"
+ "yunion.io/x/onecloud/pkg/mcclient"
+)
+
+// Add revision?
+type SRouter struct {
+ db.SStandaloneResourceBase
+
+ User string `nullable:"false" list:"user" update:"user" create:"optional"`
+ Host string `nullable:"false" list:"user" update:"user" create:"required"`
+ Port int `nullable:"false" list:"user" update:"user" create:"optional"`
+ PrivateKey string `nullable:"true" update:"user" create:"optional"` // do not allow get, list
+
+ RealizeWgIfaces bool `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional" update:"user"`
+ RealizeRoutes bool `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional" update:"user"`
+ RealizeRules bool `width:"16" charset:"ascii" nullable:"false" list:"user" create:"optional" update:"user"`
+}
+
+type SRouterManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var RouterManager *SRouterManager
+
+func init() {
+ RouterManager = &SRouterManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SRouter{},
+ "routers_tbl",
+ "router",
+ "routers",
+ ),
+ }
+ RouterManager.SetVirtualObject(RouterManager)
+}
+
+func (man *SRouterManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ if _, err := man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data); err != nil {
+ return nil, err
+ }
+
+ vs := []validators.IValidator{
+ validators.NewStringNonEmptyValidator("user").Default("cloudroot"),
+ validators.NewStringNonEmptyValidator("host"),
+ validators.NewPortValidator("port").Default(22),
+ validators.NewSSHKeyValidator("private_key").Optional(true),
+ validators.NewBoolValidator("realize_wg_ifaces").Default(true),
+ validators.NewBoolValidator("realize_routes").Default(true),
+ validators.NewBoolValidator("realize_rules").Default(true),
+ }
+ for _, v := range vs {
+ if err := v.Validate(data); err != nil {
+ return nil, err
+ }
+ }
+ // populate ssh credential through "cloudhost"
+ //
+ // if ! skip validation {
+ // ssh credential validation
+ // }
+ return data, nil
+}
+
+func (router *SRouter) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
+ err := RuleManager.addRouterRules(ctx, userCred, router)
+ if err != nil {
+ log.Errorf("add router rule: %v", err)
+ }
+}
+
+func (man *SRouterManager) getById(id string) (*SRouter, error) {
+ m, err := db.FetchById(man, id)
+ if err != nil {
+ return nil, err
+ }
+ router := m.(*SRouter)
+ return router, err
+}
+
+func (router *SRouter) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ if _, err := router.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data); err != nil {
+ return nil, err
+ }
+ vs := []validators.IValidator{
+ validators.NewStringNonEmptyValidator("user"),
+ validators.NewStringNonEmptyValidator("host"),
+ validators.NewPortValidator("port"),
+ validators.NewSSHKeyValidator("private_key").Optional(true),
+ validators.NewBoolValidator("realize_wg_ifaces"),
+ validators.NewBoolValidator("realize_routes"),
+ validators.NewBoolValidator("realize_rules"),
+ }
+ for _, v := range vs {
+ v.Optional(true)
+ if err := v.Validate(data); err != nil {
+ return nil, err
+ }
+ }
+ data.Set("_old_endpoint", jsonutils.NewString(router.endpointIP()))
+ return data, nil
+}
+
+func (router *SRouter) PostUpdate(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) {
+ endpointOld, _ := data.GetString("_old_endpoint")
+ endpoint := router.endpointIP()
+ if endpoint != endpointOld {
+ err := IfacePeerManager.updateEndpointIPByPeerRouter(ctx, endpoint, router)
+ if err != nil {
+ log.Errorf("updating peer endpoint failed: %v", err)
+ }
+ }
+}
+
+func (router *SRouter) CustomizeDelete(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) error {
+ var errs []error
+ if err := MeshNetworkManager.removeRouter(ctx, userCred, router); err != nil {
+ errs = append(errs, err)
+ }
+ if err := IfaceManager.removeByRouter(ctx, userCred, router); err != nil {
+ errs = append(errs, err)
+ }
+ if err := RuleManager.removeByRouter(ctx, userCred, router); err != nil {
+ errs = append(errs, err)
+ }
+ if err := router.SStandaloneResourceBase.CustomizeDelete(ctx, userCred, query, data); err != nil {
+ errs = append(errs, err)
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (router *SRouter) AllowPerformJoinMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, router, "join-mesh-network")
+}
+
+func (router *SRouter) PerformJoinMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ mnV := validators.NewModelIdOrNameValidator("mesh_network", "meshnetwork", userCred)
+ advSubnetsV := validators.NewValidatorByActor("advertise_subnets",
+ validators.NewActorJoinedBy(",", validators.NewActorIPv4Prefix()))
+ {
+ vs := []validators.IValidator{
+ mnV,
+ advSubnetsV,
+ }
+ jd, ok := data.(*jsonutils.JSONDict)
+ if !ok {
+ return nil, httperrors.NewBadRequestError("expecting json dict")
+ }
+ for _, v := range vs {
+ if err := v.Validate(jd); err != nil {
+ return nil, err
+ }
+ }
+ }
+ // TODO dedup
+ nets := gotypes.ConvertSliceElemType(advSubnetsV.Value, (**netutils.IPV4Prefix)(nil)).([]*netutils.IPV4Prefix)
+ if len(nets) == 0 {
+ return nil, httperrors.NewBadRequestError("advertise_subnets must not be empty")
+ }
+ mn := mnV.Model.(*SMeshNetwork)
+ if err := mn.addRouter(ctx, userCred, router, nets); err != nil {
+ return nil, err
+ }
+ return data, nil
+}
+
+func (router *SRouter) AllowPerformLeaveMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, router, "leave-mesh-network")
+}
+
+func (router *SRouter) PerformLeaveMeshNetwork(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ jd, ok := data.(*jsonutils.JSONDict)
+ if !ok {
+ return nil, httperrors.NewBadRequestError("expecting json dict")
+ }
+ mnV := validators.NewModelIdOrNameValidator("mesh_network", "meshnetwork", userCred)
+ if err := mnV.Validate(jd); err != nil {
+ return nil, err
+ }
+ mn := mnV.Model.(*SMeshNetwork)
+ if err := mn.removeRouter(ctx, userCred, router); err != nil {
+ return nil, err
+ }
+ return nil, nil
+}
+
+func (router *SRouter) AllowPerformRegisterIfname(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, router, "register-ifname")
+}
+
+func (router *SRouter) PerformRegisterIfname(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ jd, ok := data.(*jsonutils.JSONDict)
+ if !ok {
+ return nil, httperrors.NewBadRequestError("expecting json dict")
+ }
+ ifnameV := validators.NewRegexpValidator("ifname", regexpIfname)
+ if err := ifnameV.Validate(jd); err != nil {
+ return nil, err
+ }
+ _, err := IfaceManager.addIface(ctx, userCred, router, ifnameV.Value)
+ if err != nil {
+ return nil, err
+ }
+ return nil, nil
+}
+
+func (router *SRouter) AllowPerformUnregisterIfname(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, router, "unregister-ifname")
+}
+
+func (router *SRouter) PerformUnregisterIfname(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ jd, ok := data.(*jsonutils.JSONDict)
+ if !ok {
+ return nil, httperrors.NewBadRequestError("expecting json dict")
+ }
+ ifname, err := jd.GetString("ifname")
+ if err != nil {
+ return nil, httperrors.NewBadRequestError("get request ifname field: %v", err)
+ }
+ iface, err := IfaceManager.getByRouterIfname(router, ifname)
+ if err != nil {
+ return nil, httperrors.NewBadRequestError("get iface: %s", err)
+ }
+ if iface.NetworkId != "" {
+ // XXX can_unregister
+ return nil, httperrors.NewBadRequestError("please use leave network to unregister")
+ }
+ if err := iface.remove(ctx, userCred); err != nil {
+ return nil, httperrors.NewBadRequestError("remove iface: %v", err)
+ }
+ return nil, nil
+}
+
+func (router *SRouter) mustFindFreePort(ctx context.Context) int {
+ // loop through ifaces listen port
+ ifaces, err := IfaceManager.getByRouter(router)
+ if err != nil {
+ panic(err)
+ }
+ for sport := 20000; sport < 65536; sport++ {
+ notfound := true
+ for i := range ifaces {
+ if ifaces[i].ListenPort == sport {
+ notfound = false
+ break
+ }
+ }
+ if notfound {
+ return sport
+ }
+ }
+ panic(fmt.Sprintf("cannot find free port for host %s(%s)", router.Name, router.Id))
+}
+
+func (router *SRouter) endpointIP() string {
+ return router.Host
+}
+
+func (router *SRouter) AllowPerformDeploy(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, router, "deploy")
+}
+
+func (router *SRouter) PerformDeploy(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ if err := RouterDeploymentManager.requestDeployment(ctx, userCred, router); err != nil {
+ return nil, err
+ }
+ return nil, nil
+}
diff --git a/pkg/cloudnet/models/routers_ansible.go b/pkg/cloudnet/models/routers_ansible.go
new file mode 100644
index 0000000000..16049d2967
--- /dev/null
+++ b/pkg/cloudnet/models/routers_ansible.go
@@ -0,0 +1,367 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "encoding/json"
+ "encoding/xml"
+ "fmt"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "yunion.io/x/onecloud/pkg/util/ansiblev2"
+)
+
+func (router *SRouter) ansibleHost() (*ansiblev2.Host, error) {
+ vars := map[string]interface{}{
+ "ansible_user": router.User,
+ "ansible_host": router.Host,
+ }
+ if router.User != "root" {
+ vars["ansible_become"] = "yes"
+ }
+ if router.PrivateKey != "" {
+ vars["ansible_ssh_private_key_file"] = ".id_rsa"
+ }
+ if router.RealizeWgIfaces {
+ if err := router.inventoryWireguardVars(vars); err != nil {
+ return nil, err
+ }
+ }
+ h := ansiblev2.NewHost()
+ h.Vars = vars
+ return h, nil
+}
+
+func (router *SRouter) playFiles() map[string]string {
+ r := map[string]string{
+ "wgX.conf.j2": wgX_conf_j2,
+ }
+ if router.PrivateKey != "" {
+ r[".id_rsa"] = router.PrivateKey
+ }
+ return r
+}
+
+func (router *SRouter) playFilesStr() string {
+ files := router.playFiles()
+ r, _ := json.Marshal(files)
+ return string(r)
+}
+
+func (router *SRouter) inventoryWireguardVars(vars map[string]interface{}) error {
+ type (
+ WgNetworks []string
+ WgInterface map[string]interface{}
+ WgPeer map[string]interface{}
+ WgPeers map[string]WgPeer
+ )
+ ifaces, err := IfaceManager.getByRouter(router)
+ if err != nil {
+ return err
+ }
+ wgnetworks := WgNetworks{}
+ for i := range ifaces {
+ iface := &ifaces[i]
+ if iface.PrivateKey == "" {
+ continue
+ }
+ ifacePeers, err := IfacePeerManager.getByIface(iface)
+ if err != nil {
+ return err
+ }
+ wgpeers := WgPeers{}
+ for j := range ifacePeers {
+ ifacePeer := &ifacePeers[j]
+ if ifacePeer.PublicKey == "" {
+ continue
+ }
+ wgpeer := WgPeer{
+ "public_key": ifacePeer.PublicKey,
+ "allowed_ips": ifacePeer.AllowedIPs,
+ "endpoint": ifacePeer.Endpoint,
+ }
+ if ifacePeer.PersistentKeepalive > 0 {
+ wgpeer["persistent_keepalive"] = ifacePeer.PersistentKeepalive
+ }
+ wgpeers[ifacePeer.Name] = wgpeer
+ }
+ if len(wgpeers) == 0 {
+ continue
+ }
+ vars["wireguard_"+iface.Ifname+"_interface"] = WgInterface{
+ "private_key": iface.PrivateKey,
+ "listen_port": iface.ListenPort,
+ }
+ vars["wireguard_"+iface.Ifname+"_peers"] = wgpeers
+ wgnetworks = append(wgnetworks, iface.Ifname)
+ }
+ vars["wireguard_networks"] = wgnetworks
+ return nil
+}
+
+func (router *SRouter) playInstallWireguard() *ansiblev2.Play {
+ play := ansiblev2.NewPlay(
+ &ansiblev2.Task{
+ Name: "Enable EPEL",
+ ModuleName: "package",
+ ModuleArgs: map[string]interface{}{
+ "name": "epel-release",
+ "state": "present",
+ },
+ },
+ &ansiblev2.Task{
+ Name: "Check existence of wireguard repo file",
+ ModuleName: "stat",
+ ModuleArgs: map[string]interface{}{
+ "path": "/etc/yum.repos.d/_copr_jdoss-wireguard.repo",
+ },
+ Register: "wireguard_repo",
+ },
+ &ansiblev2.Task{
+ Name: "Enable wireguard repo from copr",
+ ModuleName: "get_url",
+ ModuleArgs: map[string]interface{}{
+ "dest": "/etc/yum.repos.d/_copr_jdoss-wireguard.repo",
+ "url": "https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo",
+ },
+ When: "(not wireguard_repo.stat.exists) or (wireguard_repo.stat.size < 10)",
+ },
+ &ansiblev2.Task{
+ Name: "Install wireguard packages",
+ ModuleName: "package",
+ ModuleArgs: map[string]interface{}{
+ "name": "{{ item }}",
+ "state": "present",
+ },
+ WithPlugin: "items",
+ WithPluginVal: []string{"wireguard-dkms", "wireguard-tools"},
+ },
+ &ansiblev2.Task{
+ Name: "Create /etc/wireguard",
+ ModuleName: "file",
+ ModuleArgs: map[string]interface{}{
+ "path": "/etc/wireguard",
+ "state": "directory",
+ "owner": "root",
+ "group": "root",
+ },
+ },
+ )
+ play.Hosts = "all"
+ play.Name = "Install WireGuard"
+ return play
+}
+
+func (router *SRouter) playDeployWireguardNetworks() *ansiblev2.Play {
+ play := ansiblev2.NewPlay(
+ &ansiblev2.ShellTask{
+ Name: "List existing managed wireguard networks",
+ Script: `grep -rnl 'Ansible managed' /etc/wireguard/ | grep '\.conf$' | cut -d/ -f4 | cut -d. -f1`,
+ Register: "oldconfs",
+ IgnoreErrors: true,
+ },
+ &ansiblev2.Task{
+ Name: "Backup stale wireguard confs",
+ ModuleName: "copy",
+ ModuleArgs: map[string]interface{}{
+ "src": "/etc/wireguard/{{ item }}.conf",
+ "dest": "/etc/wireguard/{{ item }}.conf.stale",
+ "remote_src": "yes",
+ },
+ WithPlugin: "items",
+ WithPluginVal: "{{ oldconfs.stdout_lines }}",
+ When: "(not oldconfs.failed) and (item not in wireguard_networks)",
+ },
+ &ansiblev2.Task{
+ Name: "Remove stale wireguard confs",
+ ModuleName: "file",
+ ModuleArgs: map[string]interface{}{
+ "path": "/etc/wireguard/{{ item }}.conf",
+ "state": "absent",
+ },
+ WithPlugin: "items",
+ WithPluginVal: "{{ oldconfs.stdout_lines }}",
+ When: "(not oldconfs.failed) and (item not in wireguard_networks)",
+ },
+ &ansiblev2.Task{
+ Name: "Disable stale wireguard networks",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "wg-quick@{{ item }}",
+ "state": "stopped",
+ "enabled": "no",
+ },
+ WithPlugin: "items",
+ WithPluginVal: "{{ oldconfs.stdout_lines }}",
+ When: "(not oldconfs.failed) and (item not in wireguard_networks)",
+ },
+ &ansiblev2.Task{
+ Name: "Configure wireguard conf",
+ ModuleName: "template",
+ ModuleArgs: map[string]interface{}{
+ "src": "wgX.conf.j2", // wgX_conf_j2
+ "dest": "/etc/wireguard/{{ item }}.conf",
+ "mode": 0600,
+ },
+ WithPlugin: "items",
+ WithPluginVal: "{{ wireguard_networks }}",
+ Register: "configuration",
+ },
+ &ansiblev2.Task{
+ Name: "Enable wg-quick@xx service",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "wg-quick@{{ item }}",
+ "enabled": "yes",
+ },
+ WithPlugin: "items",
+ WithPluginVal: "{{ wireguard_networks }}",
+ },
+ &ansiblev2.Task{
+ Name: "Restart wg-quick@xx service",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "wg-quick@{{ item.1 }}",
+ "state": "restarted",
+ },
+ WithPlugin: "indexed_items",
+ WithPluginVal: "{{ wireguard_networks }}",
+ When: "configuration.results[item.0].changed",
+ },
+ )
+ play.Hosts = "all"
+ play.Name = "Configure wireguard networks"
+ return play
+}
+
+func (router *SRouter) playDeployRoutes() (*ansiblev2.Play, error) {
+ r, err := RouteManager.routeLinesRouter(router)
+ if err != nil {
+ return nil, err
+ }
+ tasks := []ansiblev2.ITask{}
+ i := 0
+ for ifname, lines := range r {
+ if len(lines) == 0 {
+ continue
+ }
+ iface, err := IfaceManager.getByRouterIfname(router, ifname)
+ if err != nil {
+ return nil, errors.WithMessagef(err, "get iface %s", ifname)
+ }
+ filename := "route-" + ifname
+ content := strings.Join(lines, "\n") + "\n"
+ registerVar := fmt.Sprintf("var%d", i)
+ i += 1
+ tasks = append(tasks, &ansiblev2.Task{
+ Name: "Put routes for " + ifname,
+ ModuleName: "copy",
+ ModuleArgs: map[string]interface{}{
+ "content": content,
+ "dest": "/etc/sysconfig/network-scripts/" + filename,
+ "owner": "root",
+ "group": "root",
+ "mode": "0644",
+ },
+ Register: registerVar,
+ })
+ if !iface.isTypeWireguard() {
+ tasks = append(tasks, &ansiblev2.ShellTask{
+ Name: fmt.Sprintf("Apply routes (Ifup/ifdown %s)", ifname),
+ Script: fmt.Sprintf("ifdown %s; ifup %s", ifname, ifname),
+ IgnoreErrors: true,
+ When: fmt.Sprintf("%s.changed", registerVar),
+ })
+ }
+ // apply by diff on changed
+ }
+ play := ansiblev2.NewPlay(tasks...)
+ play.Hosts = "all"
+ play.Name = "Configure routes"
+ return play, nil
+}
+
+func (router *SRouter) playDeployRules() (*ansiblev2.Play, error) {
+ d, err := RuleManager.firewalldDirectByRouter(router)
+ if err != nil {
+ return nil, err
+ }
+ directXML, err := xml.MarshalIndent(d, "", " ")
+ if err != nil {
+ return nil, err
+ }
+ play := ansiblev2.NewPlay(
+ &ansiblev2.Task{
+ Name: "Install firewalld",
+ ModuleName: "package",
+ ModuleArgs: map[string]interface{}{
+ "name": "firewalld",
+ "state": "present",
+ },
+ },
+ &ansiblev2.Task{
+ Name: "Enable firewalld",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "firewalld",
+ "enabled": "yes",
+ },
+ },
+ &ansiblev2.Task{
+ Name: "Put firewalld direct.xml",
+ ModuleName: "copy",
+ ModuleArgs: map[string]interface{}{
+ "content": string(directXML),
+ "dest": "/etc/firewalld/direct.xml",
+ "owner": "root",
+ "group": "root",
+ "mode": "0644",
+ },
+ Register: "direct_xml",
+ },
+ &ansiblev2.Task{
+ Name: "Restart firewalld",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "firewalld",
+ "state": "restarted",
+ },
+ When: "direct_xml.changed",
+ },
+ )
+ play.Hosts = "all"
+ play.Name = "Configure firewall rules"
+ return play, nil
+}
+
+func (router *SRouter) playEssential() *ansiblev2.Play {
+ play := ansiblev2.NewPlay(
+ &ansiblev2.Task{
+ Name: "Enable ip_forward",
+ ModuleName: "sysctl",
+ ModuleArgs: map[string]interface{}{
+ "name": "net.ipv4.ip_forward",
+ "value": "1",
+ "state": "present",
+ "reload": "yes",
+ },
+ },
+ )
+ play.Hosts = "all"
+ play.Name = "Perform essential steps"
+ return play
+}
diff --git a/pkg/cloudnet/models/routers_ansible_wgX_conf_j2.go b/pkg/cloudnet/models/routers_ansible_wgX_conf_j2.go
new file mode 100644
index 0000000000..eb967d91ef
--- /dev/null
+++ b/pkg/cloudnet/models/routers_ansible_wgX_conf_j2.go
@@ -0,0 +1,68 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+const wgX_conf_j2 = `
+{% set interface = lookup('vars', 'wireguard_' + item + '_interface') -%}
+{% set peers = lookup('vars', 'wireguard_' + item + '_peers') -%}
+
+{% set interface_required_keys = { 'private_key': 'PrivateKey' } -%}
+{% set interface_optional_keys = {
+ 'address': 'Address',
+ 'listen_port': 'ListenPort',
+ 'fw_mark': 'FwMark',
+ 'dns': 'DNS',
+ 'mtu': 'MTU',
+ 'table': 'Table',
+ 'pre_up': 'PreUp',
+ 'post_up': 'PostUp',
+ 'pre_down': 'PreDown',
+ 'post_down': 'PostDown',
+ 'save_config': 'SaveConfig'
+} -%}
+{% set peer_required_keys = {
+ 'public_key': 'PublicKey',
+ 'allowed_ips': 'AllowedIPs'
+} -%}
+{% set peer_optional_keys = {
+ 'endpoint': 'EndPoint',
+ 'preshared_key': 'PresharedKey',
+ 'persistent_keepalive': 'PersistentKeepalive'
+} -%}
+{{ ansible_managed | comment }}
+
+[Interface]
+{% for key, option in interface_required_keys.items() %}
+{{ option }} = {{ interface[key] }}
+{% endfor %}
+{% for key, option in interface_optional_keys.items() %}
+{% if interface[key] is defined %}
+{{ option }} = {{ interface[key] }}
+{% endif %}
+{% endfor %}
+
+{% for peer_name, peer in peers.items() %}
+[Peer] # {{ peer_name }}
+{% for key, option in peer_required_keys.items() %}
+{{ option }} = {{ peer[key] }}
+{% endfor %}
+{% for key, option in peer_optional_keys.items() %}
+{% if peer[key] is defined %}
+{{ option }} = {{ peer[key] }}
+{% endif %}
+{% endfor %}
+
+{% endfor %}
+`
diff --git a/pkg/cloudnet/models/routers_deployment.go b/pkg/cloudnet/models/routers_deployment.go
new file mode 100644
index 0000000000..be83194228
--- /dev/null
+++ b/pkg/cloudnet/models/routers_deployment.go
@@ -0,0 +1,57 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/mcclient"
+)
+
+type SRouterDeployment struct {
+ db.SStandaloneResourceBase
+
+ RouterId string
+ AnsiblePlaybookId string
+
+ RouterRevision int
+}
+
+type SRouterDeploymentManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var RouterDeploymentManager *SRouterDeploymentManager
+
+func init() {
+ RouterDeploymentManager = &SRouterDeploymentManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SRouterDeployment{},
+ "router_deployments_tbl",
+ "router_deployment",
+ "router_deployments",
+ ),
+ }
+ RouterDeploymentManager.SetVirtualObject(RouterDeploymentManager)
+}
+
+func (man *SRouterDeploymentManager) requestDeployment(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ // XXX
+ // make inventory
+ // make playbook
+ // queue a deploy ansible task
+ return nil
+}
diff --git a/pkg/cloudnet/models/routers_realize.go b/pkg/cloudnet/models/routers_realize.go
new file mode 100644
index 0000000000..ba3ed44f9a
--- /dev/null
+++ b/pkg/cloudnet/models/routers_realize.go
@@ -0,0 +1,93 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/pkg/errors"
+
+ "yunion.io/x/jsonutils"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/httperrors"
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/onecloud/pkg/mcclient/auth"
+ mcclient_modules "yunion.io/x/onecloud/pkg/mcclient/modules"
+ "yunion.io/x/onecloud/pkg/util/ansiblev2"
+ "yunion.io/x/onecloud/pkg/util/rand"
+)
+
+func (router *SRouter) realize(ctx context.Context, userCred mcclient.TokenCredential) error {
+ plays := []*ansiblev2.Play{
+ router.playEssential(),
+ }
+
+ host, err := router.ansibleHost()
+ if err != nil {
+ return err
+ }
+ if router.RealizeWgIfaces {
+ plays = append(plays,
+ router.playInstallWireguard(),
+ router.playDeployWireguardNetworks(),
+ )
+ }
+
+ if router.RealizeRoutes {
+ playRoutes, err := router.playDeployRoutes()
+ if err != nil {
+ return err
+ }
+ plays = append(plays, playRoutes)
+ }
+ if router.RealizeRules {
+ playRules, err := router.playDeployRules()
+ if err != nil {
+ return err
+ }
+ plays = append(plays, playRules)
+ }
+
+ inv := ansiblev2.NewInventory()
+ inv.SetHost(router.Name, host)
+ pb := ansiblev2.NewPlaybook(plays...)
+ files := router.playFilesStr()
+
+ params := jsonutils.NewDict()
+ params.Set("creator_mark", jsonutils.NewString("router:"+router.Id))
+ params.Set("name", jsonutils.NewString(router.Name+"-"+fmt.Sprintf("%d-", router.UpdateVersion)+rand.String(5)))
+ params.Set("inventory", jsonutils.NewString(inv.String()))
+ params.Set("playbook", jsonutils.NewString(pb.String()))
+ params.Set("files", jsonutils.NewString(files))
+ cliSess := auth.GetSession(ctx, userCred, "", "")
+ if _, err := mcclient_modules.AnsiblePlaybooksV2.Create(cliSess, params); err != nil {
+ return errors.WithMessagef(err, "create ansible task")
+ }
+ return nil
+}
+
+func (router *SRouter) AllowPerformRealize(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool {
+ return db.IsAdminAllowPerform(userCred, router, "realize")
+}
+
+func (router *SRouter) PerformRealize(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
+ err := router.realize(ctx, userCred)
+ if err != nil {
+ return nil, httperrors.NewBadRequestError("%s", err)
+ }
+ return nil, nil
+}
diff --git a/pkg/cloudnet/models/routes.go b/pkg/cloudnet/models/routes.go
new file mode 100644
index 0000000000..3080117127
--- /dev/null
+++ b/pkg/cloudnet/models/routes.go
@@ -0,0 +1,260 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+
+ "yunion.io/x/jsonutils"
+ yerrors "yunion.io/x/pkg/util/errors"
+ "yunion.io/x/sqlchemy"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/cloudcommon/validators"
+ "yunion.io/x/onecloud/pkg/httperrors"
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/onecloud/pkg/util/rand"
+)
+
+type SRoute struct {
+ db.SStandaloneResourceBase
+
+ IfaceId string `length:"32" nullable:"false" list:"user" create:"required"`
+ Ifname string `length:"32" nullable:"false" list:"user" create:"optional"`
+
+ Network string `length:"32" nullable:"false" list:"user" update:"user" create:"required"`
+ Gateway string `length:"32" nullable:"false" list:"user" update:"user" create:"optional"`
+
+ RouterId string `length:"32" nullable:"false" list:"user" create:"optional"`
+}
+
+type SRouteManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var RouteManager *SRouteManager
+
+func init() {
+ RouteManager = &SRouteManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SRoute{},
+ "routes_tbl",
+ "route",
+ "routes",
+ ),
+ }
+ RouteManager.SetVirtualObject(RouteManager)
+}
+
+func (man *SRouteManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ if _, err := man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data); err != nil {
+ return nil, err
+ }
+
+ ifaceV := validators.NewModelIdOrNameValidator("iface", "iface", ownerId)
+ networkV := validators.NewIPv4PrefixValidator("network")
+ gatewayV := validators.NewIPv4AddrValidator("gateway")
+ vs := []validators.IValidator{
+ networkV,
+ gatewayV.Optional(true),
+ ifaceV,
+ }
+ for _, v := range vs {
+ if err := v.Validate(data); err != nil {
+ return nil, err
+ }
+ }
+ iface := ifaceV.Model.(*SIface)
+ network := networkV.Value.String()
+ routerId := iface.RouterId
+ {
+ if routes, err := man.getByFilter(map[string]string{
+ "router_id": routerId,
+ "network": network,
+ }); err != nil {
+ return nil, httperrors.NewConflictError("query existing route to network %s: %v", network, err)
+ } else if len(routes) > 0 {
+ return nil, httperrors.NewConflictError("route to %s already exist: %s(%s)", network, routes[0].Name, routes[0].Id)
+ }
+ }
+
+ data.Set("router_id", jsonutils.NewString(routerId))
+ data.Set("ifname", jsonutils.NewString(iface.Ifname))
+ routerV := validators.NewModelIdOrNameValidator("router", "router", ownerId)
+ if err := routerV.Validate(data); err != nil {
+ return nil, err
+ }
+ if !data.Contains("name") {
+ router := routerV.Model.(*SRouter)
+ data.Set("name", jsonutils.NewString(
+ router.Name+"-"+iface.Name+"-"+rand.String(4)),
+ )
+ }
+ return nil, nil
+}
+
+func (man *SRouteManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
+ q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
+ if err != nil {
+ return nil, err
+ }
+ data := query.(*jsonutils.JSONDict)
+ q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{
+ {Key: "router", ModelKeyword: "router", OwnerId: userCred},
+ {Key: "iface", ModelKeyword: "iface", OwnerId: userCred},
+ })
+ if err != nil {
+ return nil, err
+ }
+ return q, nil
+}
+
+func (route *SRoute) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ if _, err := route.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data); err != nil {
+ return nil, err
+ }
+ vs := []validators.IValidator{
+ validators.NewIPv4PrefixValidator("network"),
+ validators.NewIPv4AddrValidator("gateway"),
+ }
+ for _, v := range vs {
+ v.Optional(true)
+ if err := v.Validate(data); err != nil {
+ return nil, err
+ }
+ }
+ return nil, nil
+}
+
+func (man *SRouteManager) removeByIface(ctx context.Context, userCred mcclient.TokenCredential, iface *SIface) error {
+ routes := []SRoute{}
+ q := man.Query().Equals("iface_id", iface.Id)
+ if err := db.FetchModelObjects(RouteManager, q, &routes); err != nil {
+ return err
+ }
+ var errs []error
+ for j := range routes {
+ if err := routes[j].Delete(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SRouteManager) getByFilter(filter map[string]string) ([]SRoute, error) {
+ routes := []SRoute{}
+ q := man.Query()
+ for key, val := range filter {
+ q = q.Equals(key, val)
+ }
+ if err := db.FetchModelObjects(RouteManager, q, &routes); err != nil {
+ return nil, err
+ }
+ return routes, nil
+}
+
+func (man *SRouteManager) getOneByFilter(filter map[string]string) (*SRoute, error) {
+ routes, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ if len(routes) == 0 {
+ return nil, errNotFound(fmt.Errorf("cannot find iface route: %#v", filter))
+ }
+ if len(routes) > 1 {
+ return nil, errMoreThanOne(fmt.Errorf("found more than 1 iface routes: %#v", filter))
+ }
+ return &routes[0], nil
+}
+
+func (man *SRouteManager) checkExistenceByFilter(filter map[string]string) error {
+ ifaces, err := man.getByFilter(filter)
+ if err != nil {
+ return err
+ }
+ if len(ifaces) > 0 {
+ return fmt.Errorf("iface exist: %s(%s)", ifaces[0].Name, ifaces[0].Id)
+ }
+ return nil
+}
+
+func (man *SRouteManager) getByIface(iface *SIface) ([]SRoute, error) {
+ filter := map[string]string{
+ "router_id": iface.RouterId,
+ "iface_id": iface.Id,
+ }
+ routes, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ return routes, nil
+}
+
+func (man *SRouteManager) getByRouter(router *SRouter) ([]SRoute, error) {
+ filter := map[string]string{
+ "router_id": router.Id,
+ }
+ routes, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ return routes, nil
+}
+
+func (route *SRoute) routeLine() string {
+ line := route.Network
+ if route.Gateway != "" {
+ line += " via " + route.Gateway
+ }
+ if route.Ifname != "" {
+ line += " dev " + route.Ifname
+ }
+ return line
+}
+
+func (man *SRouteManager) routeLinesByIface(iface *SIface) ([]string, error) {
+ routes, err := man.getByIface(iface)
+ if err != nil {
+ return nil, err
+ }
+ lines := []string{}
+ for i := range routes {
+ route := &routes[i]
+ line := route.routeLine()
+ if line != "" {
+ lines = append(lines, line)
+ }
+ }
+ return lines, nil
+}
+
+func (man *SRouteManager) routeLinesRouter(router *SRouter) (map[string][]string, error) {
+ routes, err := man.getByRouter(router)
+ if err != nil {
+ return nil, err
+ }
+ r := map[string][]string{}
+ for i := range routes {
+ route := &routes[i]
+ line := route.routeLine()
+ if line != "" {
+ lines := r[route.Ifname]
+ lines = append(lines, line)
+ r[route.Ifname] = lines
+ }
+ }
+ return r, nil
+}
diff --git a/pkg/cloudnet/models/rules.go b/pkg/cloudnet/models/rules.go
new file mode 100644
index 0000000000..433f93a30f
--- /dev/null
+++ b/pkg/cloudnet/models/rules.go
@@ -0,0 +1,459 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package models
+
+import (
+ "context"
+ "fmt"
+ "strings"
+
+ "yunion.io/x/jsonutils"
+ yerrors "yunion.io/x/pkg/util/errors"
+ "yunion.io/x/sqlchemy"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/cloudcommon/validators"
+ "yunion.io/x/onecloud/pkg/httperrors"
+ "yunion.io/x/onecloud/pkg/mcclient"
+ "yunion.io/x/onecloud/pkg/util/choices"
+ "yunion.io/x/onecloud/pkg/util/firewalld"
+ "yunion.io/x/onecloud/pkg/util/rand"
+)
+
+type SRule struct {
+ db.SStandaloneResourceBase
+
+ Prio int `nullable:"false" list:"user" update:"user" create:"optional"`
+
+ MatchSrcNet string `length:"32" nullable:"false" list:"user" update:"user" create:"optional"`
+ MatchDestNet string `length:"32" nullable:"false" list:"user" update:"user" create:"optional"`
+ MatchProto string `length:"8" nullable:"false" list:"user" update:"user" create:"optional"`
+ MatchSrcPort int `nullable:"false" list:"user" update:"user" create:"optional"`
+ MatchDestPort int `nullable:"false" list:"user" update:"user" create:"optional"`
+ MatchInIfname string `length:"32" nullable:"false" list:"user" update:"user" create:"optional"`
+ MatchOutIfname string `length:"32" nullable:"false" list:"user" update:"user" create:"optional"`
+
+ Action string `length:"32" nullable:"false" list:"user" update:"user" create:"required"`
+ ActionOptions string `length:"32" nullable:"false" list:"user" update:"user" create:"optional"`
+
+ RouterId string `length:"32" nullable:"false" list:"user" create:"optional"`
+
+ IsSystem bool `nullable:"false" list:"user" create:"optional"`
+}
+
+const (
+ MIN_PRIO = 0
+ MAX_PRIO = 2000
+ DEF_PRIO = 0
+ DEF_PRIO_ROUTER_FORWARD = 1000
+ DEF_PRIO_MASQUERADE = 1000
+
+ ACT_SNAT = "SNAT"
+ ACT_DNAT = "DNAT"
+ ACT_MASQUERADE = "MASQUERADE"
+ ACT_TCPMSS = "TCPMSS" // FORWARD chain for now
+ ACT_INPUT_ACCEPT = "INPUT_ACCEPT"
+ ACT_FORWARD_ACCEPT = "FORWARD_ACCEPT"
+
+ PROTO_TCP = "tcp"
+ PROTO_UDP = "udp"
+)
+
+var (
+ actionChoices = choices.NewChoices(
+ ACT_SNAT,
+ ACT_DNAT,
+ ACT_MASQUERADE,
+ ACT_TCPMSS,
+
+ //"DROP",
+ ACT_INPUT_ACCEPT,
+ ACT_FORWARD_ACCEPT,
+ //"REJECT",
+ )
+ protoChoices = choices.NewChoices(
+ PROTO_TCP,
+ PROTO_UDP,
+ )
+)
+
+type SRuleManager struct {
+ db.SStandaloneResourceBaseManager
+}
+
+var RuleManager *SRuleManager
+
+func init() {
+ RuleManager = &SRuleManager{
+ SStandaloneResourceBaseManager: db.NewStandaloneResourceBaseManager(
+ SRule{},
+ "rules_tbl",
+ "rule",
+ "rules",
+ ),
+ }
+ RuleManager.SetVirtualObject(RuleManager)
+}
+
+func (man *SRuleManager) validateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict, rule *SRule) error {
+ isUpdate := rule != nil
+ routerV := validators.NewModelIdOrNameValidator("router", "router", ownerId)
+ inIfnameV := validators.NewRegexpValidator("match_in_ifname", regexpIfname)
+ outIfnameV := validators.NewRegexpValidator("match_out_ifname", regexpIfname)
+ protoV := validators.NewStringChoicesValidator("match_proto", protoChoices)
+ srcPortV := validators.NewPortValidator("match_src_port")
+ destPortV := validators.NewPortValidator("match_dest_port")
+ actionV := validators.NewStringChoicesValidator("action", protoChoices)
+ actionOptsV := validators.NewStringLenRangeValidator("action_options", 0, 256)
+ if isUpdate {
+ inIfnameV.Default(rule.MatchInIfname)
+ outIfnameV.Default(rule.MatchOutIfname)
+ protoV.Default(rule.MatchProto)
+ srcPortV.Default(int64(rule.MatchSrcPort))
+ destPortV.Default(int64(rule.MatchDestPort))
+ actionV.Default(rule.Action)
+ actionOptsV.Default(rule.ActionOptions)
+ }
+ vs := []validators.IValidator{
+ inIfnameV.Optional(true),
+ outIfnameV.Optional(true),
+ validators.NewIPv4PrefixValidator("match_src_net").Optional(true),
+ validators.NewIPv4PrefixValidator("match_dest_net").Optional(true),
+ protoV.Optional(true),
+ srcPortV.Optional(true),
+ destPortV.Optional(true),
+ actionV,
+ actionOptsV.Optional(true),
+ routerV,
+ }
+ for _, v := range vs {
+ if isUpdate {
+ v.Optional(true)
+ }
+ if err := v.Validate(data); err != nil {
+ return err
+ }
+ }
+ if actionV.Value == ACT_TCPMSS {
+ if protoV.Value != "" && protoV.Value != PROTO_TCP {
+ return httperrors.NewBadRequestError("TCPMSS only works for proto tcp")
+ }
+ if protoV.Value == "" {
+ data.Set("match_proto", jsonutils.NewString(PROTO_TCP))
+ }
+ } else if actionV.Value == ACT_DNAT {
+ if outIfnameV.Value != "" {
+ return httperrors.NewBadRequestError("cannot match out interface for DNAT")
+ }
+ } else if actionV.Value == ACT_SNAT {
+ if inIfnameV.Value != "" {
+ return httperrors.NewBadRequestError("cannot match in interface for SNAT")
+ }
+ }
+ if (srcPortV.Value > 0 || destPortV.Value > 0) && protoV.Value == "" {
+ return httperrors.NewBadRequestError("protocol must be specified when matching port")
+ }
+
+ {
+ prioDefault := int64(0)
+ if !isUpdate && actionV.Value == ACT_MASQUERADE && !data.Contains("prio") {
+ prioDefault = DEF_PRIO_MASQUERADE
+ }
+ prioV := validators.NewRangeValidator("prio", MIN_PRIO, MAX_PRIO)
+ if !isUpdate {
+ prioV.Default(prioDefault)
+ }
+ if err := prioV.Validate(data); err != nil {
+ return err
+ }
+ }
+
+ // XXX validate interface against db
+ // XXX validate action options
+
+ if !isUpdate && !data.Contains("name") {
+ router := routerV.Model.(*SRouter)
+ data.Set("name", jsonutils.NewString(
+ router.Name+"-"+rand.String(4),
+ ))
+ }
+
+ return nil
+}
+
+func (man *SRuleManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ if _, err := man.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, data); err != nil {
+ return nil, err
+ }
+ if err := man.validateData(ctx, userCred, ownerId, query, data, nil); err != nil {
+ return nil, err
+ }
+ return nil, nil
+}
+
+func (man *SRuleManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
+ q, err := man.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query)
+ if err != nil {
+ return nil, err
+ }
+ data := query.(*jsonutils.JSONDict)
+ q, err = validators.ApplyModelFilters(q, data, []*validators.ModelFilterOptions{
+ {Key: "router", ModelKeyword: "router", OwnerId: userCred},
+ })
+ if err != nil {
+ return nil, err
+ }
+ return q, nil
+}
+
+func (rule *SRule) ValidateUpdateData(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+ if _, err := rule.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data); err != nil {
+ return nil, err
+ }
+ if err := RuleManager.validateData(ctx, userCred, rule.GetOwnerId(), query, data, rule); err != nil {
+ return nil, err
+ }
+ return nil, nil
+}
+
+func (man *SRuleManager) removeByRouter(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ rules, err := man.getByFilter(map[string]string{
+ "router_id": router.Id,
+ })
+ if err != nil {
+ return err
+ }
+ var errs []error
+ for j := range rules {
+ if err := rules[j].Delete(ctx, userCred); err != nil {
+ errs = append(errs, err)
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SRuleManager) getByFilter(filter map[string]string) ([]SRule, error) {
+ rules := []SRule{}
+ q := man.Query()
+ for key, val := range filter {
+ q = q.Equals(key, val)
+ }
+ if err := db.FetchModelObjects(RuleManager, q, &rules); err != nil {
+ return nil, err
+ }
+ return rules, nil
+}
+
+func (man *SRuleManager) getOneByFilter(filter map[string]string) (*SRule, error) {
+ rules, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ if len(rules) == 0 {
+ return nil, errNotFound(fmt.Errorf("cannot find rule: %#v", filter))
+ }
+ if len(rules) > 1 {
+ return nil, errMoreThanOne(fmt.Errorf("found more than 1 rules: %#v", filter))
+ }
+ return &rules[0], nil
+}
+
+func (man *SRuleManager) checkExistenceByFilter(filter map[string]string) error {
+ rules, err := man.getByFilter(filter)
+ if err != nil {
+ return err
+ }
+ if len(rules) > 0 {
+ return fmt.Errorf("rule exist: %s(%s)", rules[0].Name, rules[0].Id)
+ }
+ return nil
+}
+
+func (man *SRuleManager) getByRouter(router *SRouter) ([]SRule, error) {
+ filter := map[string]string{
+ "router_id": router.Id,
+ }
+ rules, err := man.getByFilter(filter)
+ if err != nil {
+ return nil, err
+ }
+ return rules, nil
+}
+
+func (man *SRuleManager) addRouterRules(ctx context.Context, userCred mcclient.TokenCredential, router *SRouter) error {
+ r := &SRule{
+ Prio: DEF_PRIO_ROUTER_FORWARD,
+ RouterId: router.Id,
+ Action: ACT_FORWARD_ACCEPT,
+ }
+ r.IsSystem = true
+ r.Name = router.Name + "-allow-forward-" + rand.String(4)
+ r.SetModelManager(man, r)
+
+ err := man.addRule(ctx, userCred, r)
+ return err
+}
+
+func (man *SRuleManager) addWireguardIfaceRules(ctx context.Context, userCred mcclient.TokenCredential, iface *SIface) error {
+ r := &SRule{
+ RouterId: iface.RouterId,
+ MatchProto: PROTO_UDP,
+ MatchDestPort: iface.ListenPort,
+ Action: ACT_INPUT_ACCEPT,
+ }
+ r.IsSystem = true
+ r.Name = iface.Name + "-allow-" + fmt.Sprintf("%d-", iface.ListenPort) + rand.String(4)
+ r.SetModelManager(man, r)
+
+ rules := man.ifaceTCPMSSRules(ctx, userCred, iface)
+ rules = append(rules, r)
+ err := man.addRules(ctx, userCred, rules)
+ return err
+}
+
+func (man *SRuleManager) ifaceTCPMSSRules(ctx context.Context, userCred mcclient.TokenCredential, iface *SIface) []*SRule {
+ rules := []*SRule{
+ &SRule{
+ RouterId: iface.RouterId,
+ MatchInIfname: iface.Ifname,
+ MatchProto: PROTO_TCP,
+ Action: ACT_TCPMSS,
+ ActionOptions: "--clamp-mss-to-pmtu",
+ },
+ &SRule{
+ RouterId: iface.RouterId,
+ MatchProto: PROTO_TCP,
+ MatchOutIfname: iface.Ifname,
+ Action: ACT_TCPMSS,
+ ActionOptions: "--clamp-mss-to-pmtu",
+ },
+ }
+ for _, r := range rules {
+ r.IsSystem = true
+ r.Name = iface.Name + "-tcpmss-" + rand.String(4)
+ r.SetModelManager(man, r)
+ }
+ return rules
+}
+
+func (man *SRuleManager) addRules(ctx context.Context, userCred mcclient.TokenCredential, rules []*SRule) error {
+ errs := []error{}
+ for _, r := range rules {
+ err := man.addRule(ctx, userCred, r)
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ }
+ return yerrors.NewAggregate(errs)
+}
+
+func (man *SRuleManager) addRule(ctx context.Context, userCred mcclient.TokenCredential, rule *SRule) error {
+ return man.TableSpec().Insert(rule)
+}
+
+func (rule *SRule) firewalldRule() (*firewalld.Rule, error) {
+ var (
+ prio int
+ table string
+ chain string
+ action string
+ body string
+ matchOthers []string
+ actionOthers []string
+ )
+ prio = rule.Prio
+ switch rule.Action {
+ case ACT_SNAT, ACT_DNAT, ACT_MASQUERADE:
+ table = "nat"
+ if rule.Action == ACT_DNAT {
+ chain = "PREROUTING"
+ } else {
+ chain = "POSTROUTING"
+ }
+ action = rule.Action
+ case ACT_TCPMSS:
+ table = "mangle"
+ chain = "FORWARD" // save INPUT, OUTPUT for future occasions
+ action = rule.Action
+ matchOthers = []string{"-m", "tcp", "--tcp-flags", "SYN,RST", "SYN"}
+ if rule.ActionOptions == "" {
+ actionOthers = []string{"--clamp-mss-to-pmtu"}
+ }
+ case ACT_INPUT_ACCEPT:
+ table = "filter"
+ chain = "INPUT"
+ action = "ACCEPT"
+ case ACT_FORWARD_ACCEPT:
+ table = "filter"
+ chain = "FORWARD"
+ action = "ACCEPT"
+ default:
+ return nil, fmt.Errorf("unknown rule action: %s", rule.Action)
+ }
+
+ {
+ elms := []string{}
+ if rule.MatchInIfname != "" {
+ elms = append(elms, "-i", rule.MatchInIfname)
+ }
+ if rule.MatchOutIfname != "" {
+ elms = append(elms, "-o", rule.MatchOutIfname)
+ }
+ if rule.MatchSrcNet != "" {
+ elms = append(elms, "-s", rule.MatchSrcNet)
+ }
+ if rule.MatchDestNet != "" {
+ elms = append(elms, "-d", rule.MatchDestNet)
+ }
+ if rule.MatchProto != "" {
+ elms = append(elms, "-p", rule.MatchProto)
+ }
+ if rule.MatchSrcPort > 0 {
+ elms = append(elms, "--sport", fmt.Sprintf("%d", rule.MatchSrcPort))
+ }
+ if rule.MatchDestPort > 0 {
+ elms = append(elms, "--dport", fmt.Sprintf("%d", rule.MatchDestPort))
+ }
+ elms = append(elms, matchOthers...) // XXX empty elm
+ elms = append(elms, "-j", action)
+ if rule.ActionOptions != "" {
+ elms = append(elms, rule.ActionOptions)
+ }
+ elms = append(elms, actionOthers...)
+ body = strings.Join(elms, " ")
+ }
+ r := firewalld.NewIP4Rule(prio, table, chain, body)
+ return r, nil
+}
+
+func (man *SRuleManager) firewalldDirectByRouter(router *SRouter) (*firewalld.Direct, error) {
+ rules, err := man.getByRouter(router)
+ if err != nil {
+ return nil, err
+ }
+ rs := []*firewalld.Rule{}
+ errs := []error{}
+ for i := range rules {
+ rule := &rules[i]
+ r, err := rule.firewalldRule()
+ if err != nil {
+ errs = append(errs, err)
+ continue
+ }
+ rs = append(rs, r)
+ }
+ return firewalld.NewDirect(rs...), yerrors.NewAggregate(errs)
+}
diff --git a/pkg/cloudnet/models/util_errors.go b/pkg/cloudnet/models/util_errors.go
new file mode 100644
index 0000000000..add47bdfb1
--- /dev/null
+++ b/pkg/cloudnet/models/util_errors.go
@@ -0,0 +1,16 @@
+package models
+
+type (
+ errNotFound error
+ errMoreThanOne error
+)
+
+func IsNotFound(err error) bool {
+ _, ok := err.(errNotFound)
+ return ok
+}
+
+func IsMoreThanOne(err error) bool {
+ _, ok := err.(errMoreThanOne)
+ return ok
+}
diff --git a/pkg/cloudnet/models/util_subnets.go b/pkg/cloudnet/models/util_subnets.go
new file mode 100644
index 0000000000..1b0d664f74
--- /dev/null
+++ b/pkg/cloudnet/models/util_subnets.go
@@ -0,0 +1,38 @@
+package models
+
+import (
+ "strings"
+
+ "yunion.io/x/pkg/util/netutils"
+)
+
+type Subnets []*netutils.IPV4Prefix
+
+func (nets Subnets) StrList() []string {
+ r := make([]string, 0, len(nets))
+ for _, p := range nets {
+ r = append(r, p.String())
+ }
+ return r
+}
+
+func (nets Subnets) String() string {
+ r := nets.StrList()
+ return strings.Join(r, ",")
+}
+
+func (nets Subnets) ContainsAny(nets1 Subnets) bool {
+ contains, _ := nets.ContainsAnyEx(nets1)
+ return contains
+}
+
+func (nets Subnets) ContainsAnyEx(nets1 Subnets) (bool, *netutils.IPV4Prefix) {
+ for _, p0 := range nets {
+ for _, p1 := range nets1 {
+ if p0.Equals(p1) {
+ return true, p0
+ }
+ }
+ }
+ return false, nil
+}
diff --git a/pkg/cloudnet/options/doc.go b/pkg/cloudnet/options/doc.go
new file mode 100644
index 0000000000..cc39592099
--- /dev/null
+++ b/pkg/cloudnet/options/doc.go
@@ -0,0 +1,15 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package options // import "yunion.io/x/onecloud/pkg/cloudnet/options"
diff --git a/pkg/cloudnet/options/options.go b/pkg/cloudnet/options/options.go
new file mode 100644
index 0000000000..a0e0459667
--- /dev/null
+++ b/pkg/cloudnet/options/options.go
@@ -0,0 +1,26 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package options
+
+import common_options "yunion.io/x/onecloud/pkg/cloudcommon/options"
+
+type CloudnetOptions struct {
+ common_options.CommonOptions
+ common_options.DBOptions
+}
+
+var (
+ Options CloudnetOptions
+)
diff --git a/pkg/cloudnet/service/doc.go b/pkg/cloudnet/service/doc.go
new file mode 100644
index 0000000000..9480270440
--- /dev/null
+++ b/pkg/cloudnet/service/doc.go
@@ -0,0 +1,15 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package service // import "yunion.io/x/onecloud/pkg/cloudnet/service"
diff --git a/pkg/cloudnet/service/handlers.go b/pkg/cloudnet/service/handlers.go
new file mode 100644
index 0000000000..991c8061d2
--- /dev/null
+++ b/pkg/cloudnet/service/handlers.go
@@ -0,0 +1,57 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package service
+
+// Copyright 2019 Yunion
+//
+// 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.
+
+import (
+ "yunion.io/x/onecloud/pkg/appsrv"
+ "yunion.io/x/onecloud/pkg/appsrv/dispatcher"
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ "yunion.io/x/onecloud/pkg/cloudnet/models"
+)
+
+func InitHandlers(app *appsrv.Application) {
+ db.InitAllManagers()
+
+ db.RegisterModelManager(db.OpsLog)
+ db.RegisterModelManager(db.TenantCacheManager)
+ db.RegisterModelManager(db.UserCacheManager)
+ db.RegisterModelManager(models.IfaceManager)
+ db.RegisterModelManager(models.IfacePeerManager)
+ db.RegisterModelManager(models.MeshNetworkMemberManager)
+ for _, manager := range []db.IModelManager{
+ models.RouterManager,
+ models.MeshNetworkManager,
+ models.RouteManager,
+ models.RuleManager,
+ } {
+ db.RegisterModelManager(manager)
+ handler := db.NewModelHandler(manager)
+ dispatcher.AddModelDispatcher("", app, handler)
+ }
+}
diff --git a/pkg/cloudnet/service/service.go b/pkg/cloudnet/service/service.go
new file mode 100644
index 0000000000..63f9747fb0
--- /dev/null
+++ b/pkg/cloudnet/service/service.go
@@ -0,0 +1,51 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package service
+
+import (
+ "os"
+
+ _ "github.com/go-sql-driver/mysql"
+
+ "yunion.io/x/log"
+
+ "yunion.io/x/onecloud/pkg/cloudcommon"
+ common_app "yunion.io/x/onecloud/pkg/cloudcommon/app"
+ "yunion.io/x/onecloud/pkg/cloudcommon/db"
+ common_options "yunion.io/x/onecloud/pkg/cloudcommon/options"
+ "yunion.io/x/onecloud/pkg/cloudnet/models"
+ "yunion.io/x/onecloud/pkg/cloudnet/options"
+)
+
+func StartService() {
+ opts := &options.Options
+ common_options.ParseOptions(opts, os.Args, "cloudnet.conf", "cloudnet")
+
+ commonOpts := &opts.CommonOptions
+ common_app.InitAuth(commonOpts, func() {
+ log.Infof("Auth complete")
+ })
+
+ dbOpts := &opts.DBOptions
+ baseOpts := &opts.BaseOptions
+
+ app := common_app.InitApp(baseOpts, false)
+ InitHandlers(app)
+
+ db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB)
+ defer cloudcommon.CloseDB()
+
+ common_app.ServeForever(app, baseOpts)
+}
diff --git a/pkg/cloudnet/utils/doc.go b/pkg/cloudnet/utils/doc.go
new file mode 100644
index 0000000000..bd6ede3e15
--- /dev/null
+++ b/pkg/cloudnet/utils/doc.go
@@ -0,0 +1 @@
+package utils // import "yunion.io/x/onecloud/pkg/cloudnet/utils"
diff --git a/pkg/cloudnet/utils/key.go b/pkg/cloudnet/utils/key.go
new file mode 100644
index 0000000000..1f2cee8fc8
--- /dev/null
+++ b/pkg/cloudnet/utils/key.go
@@ -0,0 +1,28 @@
+package utils
+
+import (
+ "fmt"
+
+ "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
+)
+
+func MustNewKey() wgtypes.Key {
+ key, err := wgtypes.GeneratePrivateKey()
+ if err != nil {
+ panic(fmt.Errorf("new key: %v", err))
+ }
+ return key
+}
+
+func MustNewKeyString() string {
+ key := MustNewKey()
+ return key.String()
+}
+
+func MustParseKeyString(k string) wgtypes.Key {
+ key, err := wgtypes.ParseKey(k)
+ if err != nil {
+ panic(fmt.Errorf("invalid key: %v", err))
+ }
+ return key
+}
diff --git a/pkg/cloudnet/utils/key_test.go b/pkg/cloudnet/utils/key_test.go
new file mode 100644
index 0000000000..f2c2f39ace
--- /dev/null
+++ b/pkg/cloudnet/utils/key_test.go
@@ -0,0 +1,36 @@
+package utils
+
+import (
+ "testing"
+
+ "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
+)
+
+func TestKey(t *testing.T) {
+ t.Run("parse", func(t *testing.T) {
+ keyStr := "WJYVsrTtAae1QS9YzefV4OmVM6mkJglR+GEgxQpTs2g="
+ pubkeyStr := "mOX0S5AuRqd8lQZWcqTlzOS+veo404gE7NyV4u3xVkg="
+ pubkeyX, err := wgtypes.ParseKey(pubkeyStr)
+ if err != nil {
+ t.Fatalf("parse public key failed: %v", err)
+ }
+
+ key, err := wgtypes.ParseKey(keyStr)
+ if err != nil {
+ t.Fatalf("parse private key failed: %v", err)
+ }
+ pubkey := key.PublicKey()
+ if pubkey != pubkeyX {
+ t.Errorf("derived public key does not match expected.\ngot %#v\nwant %#v", pubkey, pubkeyX)
+ }
+ })
+ t.Run("generate", func(t *testing.T) {
+ key, err := wgtypes.GeneratePrivateKey()
+ if err != nil {
+ t.Fatalf("generate private key failed: %v", err)
+ }
+ pubkey := key.PublicKey()
+ t.Logf("private key: %s", key)
+ t.Logf(" public key: %s", pubkey)
+ })
+}
diff --git a/pkg/mcclient/modules/cloudnet/common.go b/pkg/mcclient/modules/cloudnet/common.go
new file mode 100644
index 0000000000..930c78ee3d
--- /dev/null
+++ b/pkg/mcclient/modules/cloudnet/common.go
@@ -0,0 +1,31 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/modulebase"
+)
+
+func NewCloudnetManager(keyword, keywordPlural string, columns, adminColumns []string) modulebase.ResourceManager {
+ return modulebase.ResourceManager{
+ BaseManager: *modulebase.NewBaseManager("cloudnet", "", "", columns, adminColumns),
+ Keyword: keyword, KeywordPlural: keywordPlural}
+}
+
+var (
+ registerV2 = func(mod modulebase.BaseManagerInterface) {
+ modulebase.Register("v2", mod)
+ }
+)
diff --git a/pkg/mcclient/modules/cloudnet/doc.go b/pkg/mcclient/modules/cloudnet/doc.go
new file mode 100644
index 0000000000..219682d62a
--- /dev/null
+++ b/pkg/mcclient/modules/cloudnet/doc.go
@@ -0,0 +1 @@
+package cloudnet // import "yunion.io/x/onecloud/pkg/mcclient/modules/cloudnet"
diff --git a/pkg/mcclient/modules/cloudnet/mod_meshnetworks.go b/pkg/mcclient/modules/cloudnet/mod_meshnetworks.go
new file mode 100644
index 0000000000..8bbd1339dc
--- /dev/null
+++ b/pkg/mcclient/modules/cloudnet/mod_meshnetworks.go
@@ -0,0 +1,42 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/modulebase"
+)
+
+type MeshNetworkManager struct {
+ modulebase.ResourceManager
+}
+
+var (
+ MeshNetworks MeshNetworkManager
+)
+
+func init() {
+ MeshNetworks = MeshNetworkManager{
+ NewCloudnetManager(
+ "meshnetwork",
+ "meshnetworks",
+ []string{
+ "id",
+ "name",
+ },
+ []string{"tenant"},
+ ),
+ }
+ registerV2(&MeshNetworks)
+}
diff --git a/pkg/mcclient/modules/cloudnet/mod_routers.go b/pkg/mcclient/modules/cloudnet/mod_routers.go
new file mode 100644
index 0000000000..ee5c0051b3
--- /dev/null
+++ b/pkg/mcclient/modules/cloudnet/mod_routers.go
@@ -0,0 +1,45 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/modulebase"
+)
+
+type RouterManager struct {
+ modulebase.ResourceManager
+}
+
+var (
+ Routers RouterManager
+)
+
+func init() {
+ Routers = RouterManager{
+ NewCloudnetManager(
+ "router",
+ "routers",
+ []string{
+ "id",
+ "name",
+ "user",
+ "host",
+ "port",
+ },
+ []string{"tenant"},
+ ),
+ }
+ registerV2(&Routers)
+}
diff --git a/pkg/mcclient/modules/cloudnet/mod_routes.go b/pkg/mcclient/modules/cloudnet/mod_routes.go
new file mode 100644
index 0000000000..8a65bb288c
--- /dev/null
+++ b/pkg/mcclient/modules/cloudnet/mod_routes.go
@@ -0,0 +1,46 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/modulebase"
+)
+
+type RouteManager struct {
+ modulebase.ResourceManager
+}
+
+var (
+ Routes RouteManager
+)
+
+func init() {
+ Routes = RouteManager{
+ NewCloudnetManager(
+ "route",
+ "routes",
+ []string{
+ "id",
+ "name",
+ "iface_id",
+ "ifname",
+ "network",
+ "gateway",
+ },
+ []string{"tenant"},
+ ),
+ }
+ registerV2(&Routes)
+}
diff --git a/pkg/mcclient/modules/cloudnet/mod_rules.go b/pkg/mcclient/modules/cloudnet/mod_rules.go
new file mode 100644
index 0000000000..bbc8ac390a
--- /dev/null
+++ b/pkg/mcclient/modules/cloudnet/mod_rules.go
@@ -0,0 +1,51 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/modulebase"
+)
+
+type RuleManager struct {
+ modulebase.ResourceManager
+}
+
+var (
+ Rules RuleManager
+)
+
+func init() {
+ Rules = RuleManager{
+ NewCloudnetManager(
+ "rule",
+ "rules",
+ []string{
+ "id",
+ "name",
+ "router_id",
+ "match_src_net",
+ "match_dest_net",
+ "match_proto",
+ "match_port",
+ "match_in_ifname",
+ "match_out_ifname",
+ "action",
+ "action_options",
+ },
+ []string{"tenant"},
+ ),
+ }
+ registerV2(&Rules)
+}
diff --git a/pkg/mcclient/modules/mod_ansibleplaybooks_v2.go b/pkg/mcclient/modules/mod_ansibleplaybooks_v2.go
new file mode 100644
index 0000000000..0ca195a575
--- /dev/null
+++ b/pkg/mcclient/modules/mod_ansibleplaybooks_v2.go
@@ -0,0 +1,43 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package modules
+
+import "yunion.io/x/onecloud/pkg/mcclient/modulebase"
+
+type AnsiblePlaybookV2Manager struct {
+ modulebase.ResourceManager
+}
+
+var (
+ AnsiblePlaybooksV2 AnsiblePlaybookV2Manager
+)
+
+func init() {
+ AnsiblePlaybooksV2 = AnsiblePlaybookV2Manager{
+ NewAnsibleManager(
+ "ansibleplaybook_v2",
+ "ansibleplaybooks_v2",
+ []string{
+ "id",
+ "name",
+ "status",
+ "start_time",
+ "end_time",
+ },
+ []string{},
+ ),
+ }
+ registerV2(&AnsiblePlaybooksV2)
+}
diff --git a/pkg/mcclient/options/cloudnet/doc.go b/pkg/mcclient/options/cloudnet/doc.go
new file mode 100644
index 0000000000..923a95ad11
--- /dev/null
+++ b/pkg/mcclient/options/cloudnet/doc.go
@@ -0,0 +1 @@
+package cloudnet // import "yunion.io/x/onecloud/pkg/mcclient/options/cloudnet"
diff --git a/pkg/mcclient/options/cloudnet/meshnetworks.go b/pkg/mcclient/options/cloudnet/meshnetworks.go
new file mode 100644
index 0000000000..4ec19fe265
--- /dev/null
+++ b/pkg/mcclient/options/cloudnet/meshnetworks.go
@@ -0,0 +1,44 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/options"
+)
+
+type MeshNetworkCreateOptions struct {
+ NAME string
+}
+
+type MeshNetworkGetOptions struct {
+ ID string `json:"-"`
+}
+
+type MeshNetworkUpdateOptions struct {
+ ID string `json:"-"`
+ Name string
+}
+
+type MeshNetworkDeleteOptions struct {
+ ID string `json:"-"`
+}
+
+type MeshNetworkListOptions struct {
+ options.BaseListOptions
+}
+
+type MeshNetworkActionRealizeOptions struct {
+ ID string `json:"-"`
+}
diff --git a/pkg/mcclient/options/cloudnet/routers.go b/pkg/mcclient/options/cloudnet/routers.go
new file mode 100644
index 0000000000..781297fd4c
--- /dev/null
+++ b/pkg/mcclient/options/cloudnet/routers.go
@@ -0,0 +1,120 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "io/ioutil"
+
+ "yunion.io/x/jsonutils"
+
+ "yunion.io/x/onecloud/pkg/mcclient/options"
+)
+
+type RouterCreateOptions struct {
+ NAME string
+ User string
+ Host string
+ Port int
+ PrivateKey string
+
+ RealizeWgIfaces string `choices:"on|off" default:"on" help:"apply wg ifaces config on realization"`
+ RealizeRoutes string `choices:"on|off" default:"on" help:"apply routes config on realization"`
+ RealizeRules string `choices:"on|off" default:"on" help:"apply firewall rules on realization"`
+}
+
+func (opts *RouterCreateOptions) Params() (jsonutils.JSONObject, error) {
+ params, err := options.StructToParams(opts)
+ if err != nil {
+ return nil, err
+ }
+ if opts.PrivateKey != "" && opts.PrivateKey[0] == '@' {
+ data, err := ioutil.ReadFile(opts.PrivateKey[1:])
+ if err != nil {
+ return nil, err
+ }
+ params.Set("private_key", jsonutils.NewString(string(data)))
+ }
+ return params, nil
+}
+
+type RouterGetOptions struct {
+ ID string `json:"-"`
+}
+
+type RouterUpdateOptions struct {
+ ID string `json:"-"`
+ Name string
+
+ User string
+ Host string
+ Port int `json:",omitzero"`
+ PrivateKey string
+
+ RealizeWgIfaces string `json:",omitzero" choices:"on|off" help:"apply wg ifaces config on realization"`
+ RealizeRoutes string `json:",omitzero" choices:"on|off" help:"apply routes config on realization"`
+ RealizeRules string `json:",omitzero" choices:"on|off" help:"apply firewall rules on realization"`
+}
+
+func (opts *RouterUpdateOptions) Params() (jsonutils.JSONObject, error) {
+ params, err := options.StructToParams(opts)
+ if err != nil {
+ return nil, err
+ }
+ if opts.PrivateKey != "" && opts.PrivateKey[0] == '@' {
+ data, err := ioutil.ReadFile(opts.PrivateKey[1:])
+ if err != nil {
+ return nil, err
+ }
+ params.Set("private_key", jsonutils.NewString(string(data)))
+ }
+ return params, nil
+}
+
+type RouterDeleteOptions struct {
+ ID string `json:"-"`
+}
+
+type RouterListOptions struct {
+ options.BaseListOptions
+}
+
+type RouterActionJoinMeshNetworkOptions struct {
+ ID string `json:"-"`
+
+ MeshNetwork string
+ AdvertiseSubnets string `help:"cidr concatenated by comma"`
+}
+
+type RouterActionLeaveMeshNetworkOptions struct {
+ ID string `json:"-"`
+
+ MeshNetwork string
+}
+
+type RouterActionRegisterIfnameOptions struct {
+ ID string `json:"-"`
+
+ Ifname string
+}
+
+type RouterActionUnregisterIfnameOptions struct {
+ ID string `json:"-"`
+
+ Ifname string
+}
+
+type RouterActionRealizeOptions struct {
+ ID string `json:"-"`
+}
diff --git a/pkg/mcclient/options/cloudnet/routes.go b/pkg/mcclient/options/cloudnet/routes.go
new file mode 100644
index 0000000000..d9062ad7ab
--- /dev/null
+++ b/pkg/mcclient/options/cloudnet/routes.go
@@ -0,0 +1,51 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/options"
+)
+
+type RouteCreateOptions struct {
+ NAME string
+
+ Iface string `required:"true"`
+ Network string
+ Gateway string
+}
+
+type RouteGetOptions struct {
+ ID string `json:"-"`
+}
+
+type RouteUpdateOptions struct {
+ ID string `json:"-"`
+ Name string
+
+ Network string
+ Gateway string
+}
+
+type RouteDeleteOptions struct {
+ ID string `json:"-"`
+}
+
+type RouteListOptions struct {
+ options.BaseListOptions
+
+ Iface string
+ Network string
+ Gateway string
+}
diff --git a/pkg/mcclient/options/cloudnet/rules.go b/pkg/mcclient/options/cloudnet/rules.go
new file mode 100644
index 0000000000..9607e38f9f
--- /dev/null
+++ b/pkg/mcclient/options/cloudnet/rules.go
@@ -0,0 +1,77 @@
+// Copyright 2019 Yunion
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cloudnet
+
+import (
+ "yunion.io/x/onecloud/pkg/mcclient/options"
+)
+
+type RuleCreateOptions struct {
+ NAME string
+
+ Router string `required:"true"`
+
+ MatchSrcNet string
+ MatchDestNet string
+ MatchProto string
+ MatchSrcPort int
+ MatchDestPort int
+ MatchInIfname string
+ MatchOutIfname string
+
+ Action string
+ ActionOptions string
+}
+
+type RuleGetOptions struct {
+ ID string `json:"-"`
+}
+
+type RuleUpdateOptions struct {
+ ID string `json:"-"`
+ Name string
+
+ MatchSrcNet string
+ MatchDestNet string
+ MatchProto string
+ MatchSrcPort int `json:",omitzero"`
+ MatchDestPort int `json:",omitzero"`
+ MatchInIfname string
+ MatchOutIfname string
+
+ Action string
+ ActionOptions string
+}
+
+type RuleDeleteOptions struct {
+ ID string `json:"-"`
+}
+
+type RuleListOptions struct {
+ options.BaseListOptions
+
+ Router string
+
+ MatchSrcNet string
+ MatchDestNet string
+ MatchProto string
+ MatchSrcPort int `json:",omitzero"`
+ MatchDestPort int `json:",omitzero"`
+ MatchInIfname string
+ MatchOutIfname string
+
+ Action string
+ ActionOptions string
+}
diff --git a/pkg/util/ansible/session.go b/pkg/util/ansible/session.go
index 363fdbc2e0..29098eb8f9 100644
--- a/pkg/util/ansible/session.go
+++ b/pkg/util/ansible/session.go
@@ -18,12 +18,16 @@ import (
"context"
)
+type Runnable interface {
+ Run(context.Context) error
+}
+
// Session is a container for execution of playbook
type Session struct {
// Ctx is the context under which the playbook will run
Ctx context.Context
- // Playbook is the ansible playbook to be run
- Playbook *Playbook
+ // Runnable is the task to be run
+ Runnable Runnable
// cancelFunc can be called to cancel the running playbook
cancelFunc context.CancelFunc
@@ -38,11 +42,11 @@ func (sm SessionManager) Has(id string) bool {
return ok
}
-// Add adds a Playbook to the manager keyed with the specified id
-func (sm SessionManager) Add(id string, pb *Playbook) *Session {
+// Add adds a Runnable to the manager keyed with the specified id
+func (sm SessionManager) Add(id string, runnable Runnable) *Session {
ctx, cancelFunc := context.WithCancel(context.Background())
session := &Session{
- Playbook: pb,
+ Runnable: runnable,
Ctx: ctx,
cancelFunc: cancelFunc,
}
@@ -63,7 +67,7 @@ func (sm SessionManager) Run(id string) error {
if !ok {
return nil
}
- return s.Playbook.Run(s.Ctx)
+ return s.Runnable.Run(s.Ctx)
}
// Stop stops the playbook keyed with specified id
diff --git a/pkg/util/ansiblev2/doc.go b/pkg/util/ansiblev2/doc.go
new file mode 100644
index 0000000000..625647ec10
--- /dev/null
+++ b/pkg/util/ansiblev2/doc.go
@@ -0,0 +1 @@
+package ansiblev2 // import "yunion.io/x/onecloud/pkg/util/ansiblev2"
diff --git a/pkg/util/ansiblev2/inventory.go b/pkg/util/ansiblev2/inventory.go
new file mode 100644
index 0000000000..7808369228
--- /dev/null
+++ b/pkg/util/ansiblev2/inventory.go
@@ -0,0 +1,108 @@
+package ansiblev2
+
+import (
+ "fmt"
+
+ "github.com/go-yaml/yaml"
+)
+
+func newVars(args ...interface{}) map[string]interface{} {
+ if len(args)&1 != 0 {
+ panic("odd number of args for key/value pairs!")
+ }
+ vars := map[string]interface{}{}
+ for i := 0; i < len(args); i += 2 {
+ if k, ok := args[i].(string); !ok {
+ panic(fmt.Sprintf("the %drd key is not string type: %#v", i, args[i]))
+ } else {
+ vars[k] = args[i+1]
+ }
+ }
+ return vars
+}
+
+type Host struct {
+ Vars map[string]interface{}
+}
+
+func NewHost(args ...interface{}) *Host {
+ return &Host{
+ Vars: newVars(args...),
+ }
+}
+
+type HostGroup struct {
+ Hosts map[string]*Host
+ Children map[string]*HostGroup
+ Vars map[string]interface{}
+}
+
+func NewHostGroup(args ...interface{}) *HostGroup {
+ return &HostGroup{
+ Vars: newVars(args...),
+ }
+}
+
+func (hg *HostGroup) SetHost(name string, host *Host) *HostGroup {
+ if hg.Hosts == nil {
+ hg.Hosts = map[string]*Host{}
+ }
+ hg.Hosts[name] = host
+ return hg
+}
+
+func (hg *HostGroup) SetChild(name string, child *HostGroup) *HostGroup {
+ if hg.Children == nil {
+ hg.Children = map[string]*HostGroup{}
+ }
+ hg.Children[name] = child
+ return hg
+}
+
+func (hg *HostGroup) MarshalYAML() (interface{}, error) {
+ hosts := map[string]interface{}{}
+ for name := range hg.Hosts {
+ hosts[name] = hg.Hosts[name].Vars
+ }
+ children := map[string]interface{}{}
+ for name := range hg.Children {
+ children[name], _ = hg.Children[name].MarshalYAML()
+ }
+
+ r := map[string]interface{}{}
+ if len(hosts) > 0 {
+ r["hosts"] = hosts
+ }
+ if len(children) > 0 {
+ r["children"] = children
+ }
+ if len(hg.Vars) > 0 {
+ r["vars"] = hg.Vars
+ }
+ return r, nil
+}
+
+type Inventory struct {
+ HostGroup
+}
+
+func NewInventory(args ...interface{}) *Inventory {
+ hg := NewHostGroup(args...)
+ inv := &Inventory{
+ HostGroup: *hg,
+ }
+ return inv
+}
+
+func (inv *Inventory) MarshalYAML() (interface{}, error) {
+ all, _ := inv.HostGroup.MarshalYAML()
+ r := map[string]interface{}{
+ "all": all,
+ }
+ return r, nil
+}
+
+func (inv *Inventory) String() string {
+ b, _ := yaml.Marshal(inv)
+ return string(b)
+}
diff --git a/pkg/util/ansiblev2/inventory_test.go b/pkg/util/ansiblev2/inventory_test.go
new file mode 100644
index 0000000000..f99b92ec26
--- /dev/null
+++ b/pkg/util/ansiblev2/inventory_test.go
@@ -0,0 +1,30 @@
+package ansiblev2
+
+import (
+ "testing"
+)
+
+func TestInventory(t *testing.T) {
+ inv := NewInventory(
+ "ansible_user", "root",
+ "ansible_become", "yes",
+ "redis_bind_address", "0.0.0.0",
+ "redis_bind_port", 9736,
+ )
+ inv.SetHost("redis", NewHost(
+ "ansible_host", "192.168.0.248",
+ "ansible_port", 2222,
+ ))
+ inv.SetHost("nameonly", NewHost())
+ child := NewHostGroup()
+ child.SetHost("aws-bj01", NewHost(
+ "ansible_user", "ec2-user",
+ "ansible_host", "1.2.2.3",
+ ))
+ child.SetHost("ali-hk01", NewHost(
+ "ansible_user", "cloudroot",
+ "ansible_host", "1.2.2.4",
+ ))
+ inv.SetChild("netmon-agents", child)
+ t.Logf("\n%s", inv.String())
+}
diff --git a/pkg/util/ansiblev2/playbook.go b/pkg/util/ansiblev2/playbook.go
new file mode 100644
index 0000000000..3998f730db
--- /dev/null
+++ b/pkg/util/ansiblev2/playbook.go
@@ -0,0 +1,229 @@
+package ansiblev2
+
+import (
+ "fmt"
+
+ "github.com/go-yaml/yaml"
+)
+
+type ITask interface {
+ MarshalYAML() (interface{}, error)
+}
+
+type Task struct {
+ Name string
+ WithPlugin string
+ WithPluginVal interface{}
+ When string
+ Register string
+ IgnoreErrors bool
+ Vars map[string]interface{}
+
+ ModuleName string
+ ModuleArgs map[string]interface{}
+}
+
+func (t *Task) MarshalYAML() (interface{}, error) {
+ r := map[string]interface{}{
+ t.ModuleName: t.ModuleArgs,
+ }
+ if t.Name != "" {
+ r["name"] = t.Name
+ }
+ if t.WithPlugin != "" && t.WithPluginVal != nil {
+ r["with_"+t.WithPlugin] = t.WithPluginVal
+ }
+ if t.When != "" {
+ r["when"] = t.When
+ }
+ if t.Register != "" {
+ r["register"] = t.Register
+ }
+ if t.IgnoreErrors {
+ r["ignore_errors"] = "yes"
+ }
+ if len(t.Vars) > 0 {
+ r["vars"] = t.Vars
+ }
+ return r, nil
+}
+
+type ShellTask struct {
+ Name string
+ WithPlugin string
+ WithPluginVal interface{}
+ When string
+ Register string
+ IgnoreErrors bool
+ Vars map[string]interface{}
+
+ Script string
+ ModuleArgs map[string]interface{}
+}
+
+func (t *ShellTask) MarshalYAML() (interface{}, error) {
+ r := map[string]interface{}{
+ "shell": t.Script,
+ }
+ if len(t.ModuleArgs) > 0 {
+ r["args"] = t.ModuleArgs
+ }
+
+ if t.Name != "" {
+ r["name"] = t.Name
+ }
+ if t.WithPlugin != "" && t.WithPluginVal != nil {
+ r["with_"+t.WithPlugin] = t.WithPluginVal
+ }
+ if t.When != "" {
+ r["when"] = t.When
+ }
+ if t.Register != "" {
+ r["register"] = t.Register
+ }
+ if t.IgnoreErrors {
+ r["ignore_errors"] = "yes"
+ }
+ if len(t.Vars) > 0 {
+ r["vars"] = t.Vars
+ }
+ return r, nil
+}
+
+type Block struct {
+ Name string
+ WithPlugin string
+ WithPluginVal interface{}
+ When string
+ Register string
+ IgnoreErrors bool
+ Vars map[string]interface{}
+
+ Tasks []ITask
+}
+
+func NewBlock(tasks ...ITask) *Block {
+ b := &Block{
+ Tasks: tasks,
+ }
+ return b
+}
+
+func (b *Block) MarshalYAML() (interface{}, error) {
+ r := map[string]interface{}{}
+ if len(b.Tasks) > 0 {
+ tasks := make([]interface{}, len(b.Tasks))
+ for i := range tasks {
+ var err error
+ tasks[i], err = b.Tasks[i].MarshalYAML()
+ if err != nil {
+ return nil, err
+ }
+ }
+ r["block"] = tasks
+ }
+
+ if b.Name != "" {
+ r["name"] = b.Name
+ }
+ if b.WithPlugin != "" && b.WithPluginVal != nil {
+ r["with_"+b.WithPlugin] = b.WithPluginVal
+ }
+ if b.When != "" {
+ r["when"] = b.When
+ }
+ if b.Register != "" {
+ r["register"] = b.Register
+ }
+ if b.IgnoreErrors {
+ r["ignore_errors"] = "yes"
+ }
+ if len(b.Vars) > 0 {
+ r["vars"] = b.Vars
+ }
+ return r, nil
+}
+
+type Play struct {
+ Name string
+ RemoteUser string
+ Vars map[string]interface{}
+ IgnoreErrors bool
+
+ Hosts string
+ Tasks []ITask
+}
+
+func NewPlay(tasks ...ITask) *Play {
+ play := &Play{
+ Tasks: tasks,
+ }
+ return play
+}
+
+func (play *Play) MarshalYAML() (interface{}, error) {
+ if play.Hosts == "" {
+ return nil, fmt.Errorf("hosts is required but not set")
+ }
+
+ r := map[string]interface{}{
+ "hosts": play.Hosts,
+ }
+ if len(play.Tasks) > 0 {
+ tasks := make([]interface{}, len(play.Tasks))
+ for i := range tasks {
+ var err error
+ tasks[i], err = play.Tasks[i].MarshalYAML()
+ if err != nil {
+ return nil, err
+ }
+ }
+ r["tasks"] = tasks
+ }
+
+ if play.Name != "" {
+ r["name"] = play.Name
+ }
+ if play.RemoteUser != "" {
+ r["remote_user"] = play.RemoteUser
+ }
+ if len(play.Vars) > 0 {
+ r["vars"] = play.Vars
+ }
+ if play.IgnoreErrors {
+ r["ignore_errors"] = "yes"
+ }
+ return r, nil
+}
+
+type Playbook struct {
+ Plays []*Play
+}
+
+func NewPlaybook(plays ...*Play) *Playbook {
+ pb := &Playbook{
+ Plays: plays,
+ }
+ return pb
+
+}
+func (pb *Playbook) MarshalYAML() (interface{}, error) {
+ r := make([]interface{}, len(pb.Plays))
+ for i := range pb.Plays {
+ var err error
+ r[i], err = pb.Plays[i].MarshalYAML()
+ if err != nil {
+ return nil, err
+ }
+ }
+ return r, nil
+}
+
+func (pb *Playbook) String() string {
+ b, err := yaml.Marshal(pb)
+ if err != nil {
+ // panic early
+ panic(err)
+ }
+ return string(b)
+}
diff --git a/pkg/util/ansiblev2/playbook_test.go b/pkg/util/ansiblev2/playbook_test.go
new file mode 100644
index 0000000000..abea848315
--- /dev/null
+++ b/pkg/util/ansiblev2/playbook_test.go
@@ -0,0 +1,84 @@
+package ansiblev2
+
+import (
+ "testing"
+)
+
+func TestPlaybookString(t *testing.T) {
+ play := NewPlay(
+ &Task{
+ Name: "Enable ip_forward",
+ ModuleName: "sysctl",
+ ModuleArgs: map[string]interface{}{
+ "name": "net.ipv4.ip_forward",
+ "value": "1",
+ "state": "present",
+ "reload": "yes",
+ },
+ },
+ &Task{
+ Name: "Enable EPEL",
+ ModuleName: "package",
+ ModuleArgs: map[string]interface{}{
+ "name": "epel-release",
+ "state": "present",
+ },
+ When: `ansible_distribution != "Fedora"`,
+ },
+ &Task{
+ Name: "Install wireguard packages",
+ ModuleName: "package",
+ ModuleArgs: map[string]interface{}{
+ "name": "{{ item }}",
+ "state": "present",
+ },
+ WithPlugin: "items",
+ WithPluginVal: []interface{}{"wireguard-dkms", "wireguard-tools"},
+ },
+ &Task{
+ Name: "Create /etc/wireguard",
+ ModuleName: "file",
+ ModuleArgs: map[string]interface{}{
+ "path": "/etc/wireguard",
+ "staet": "directory",
+ "owner": "root",
+ "group": "root",
+ },
+ },
+ )
+ play.Hosts = "all"
+ configureBlock := NewBlock(
+ &Task{
+ Name: "Configure {{ item }}",
+ ModuleName: "template",
+ ModuleArgs: map[string]interface{}{
+ "src": "wgX.conf.j2", //XXX
+ "dest": "/etc/wireguard/{{ item }}.conf",
+ "mode": 0600,
+ },
+ Register: "configuration",
+ },
+ &Task{
+ Name: "Enable wg-quick@{{ item }} service",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "wg-quick@{{ item }}",
+ "state": "started",
+ "enabled": "yes",
+ },
+ },
+ &Task{
+ Name: "Restart wg-quick@{{ item }} service",
+ ModuleName: "service",
+ ModuleArgs: map[string]interface{}{
+ "name": "wg-quick@{{ item }}",
+ "state": "restarted",
+ },
+ When: "configuration is changed",
+ },
+ )
+ configureBlock.Name = "Configure wireguard networks"
+ play.Tasks = append(play.Tasks, configureBlock)
+ pb := NewPlaybook(play)
+ t.Logf("\n%s", pb.String())
+}
diff --git a/pkg/util/ansiblev2/session.go b/pkg/util/ansiblev2/session.go
new file mode 100644
index 0000000000..1cd7575185
--- /dev/null
+++ b/pkg/util/ansiblev2/session.go
@@ -0,0 +1,184 @@
+package ansiblev2
+
+import (
+ "context"
+ "io"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "sync"
+
+ "github.com/pkg/errors"
+
+ yerrors "yunion.io/x/pkg/util/errors"
+)
+
+type Session struct {
+ privateKey string
+ playbook string
+ inventory string
+ files map[string][]byte
+
+ outputWriter io.Writer
+ stateMux *sync.Mutex
+ isRunning bool
+ keepTmpdir bool
+}
+
+func NewSession() *Session {
+ sess := &Session{
+ stateMux: &sync.Mutex{},
+ files: map[string][]byte{},
+ }
+ return sess
+}
+
+func (sess *Session) PrivateKey(s string) *Session {
+ sess.privateKey = s
+ return sess
+}
+
+func (sess *Session) Playbook(s string) *Session {
+ sess.playbook = s
+ return sess
+}
+
+func (sess *Session) Inventory(s string) *Session {
+ sess.inventory = s
+ return sess
+}
+
+func (sess *Session) AddFile(path string, data []byte) *Session {
+ sess.files[path] = data
+ return sess
+}
+
+func (sess *Session) RemoveFile(path string) []byte {
+ data := sess.files[path]
+ delete(sess.files, path)
+ return data
+}
+
+func (sess *Session) Files(files map[string][]byte) *Session {
+ sess.files = files
+ return sess
+}
+
+func (sess *Session) OutputWriter(w io.Writer) *Session {
+ sess.outputWriter = w
+ return sess
+}
+
+func (sess *Session) Run(ctx context.Context) (err error) {
+ var (
+ tmpdir string
+ )
+
+ sess.stateMux.Lock()
+ if sess.isRunning {
+ return errors.Errorf("playbook is already running")
+ }
+ sess.isRunning = true
+ sess.stateMux.Unlock()
+ defer func() {
+ sess.stateMux.Lock()
+ sess.isRunning = false
+ sess.stateMux.Unlock()
+ }()
+
+ // make tmpdir
+ tmpdir, err = ioutil.TempDir("", "onecloud-ansiblev2")
+ if err != nil {
+ err = errors.WithMessage(err, "making tmp dir")
+ return
+ }
+ defer func() {
+ if sess.keepTmpdir {
+ return
+ }
+ if err1 := os.RemoveAll(tmpdir); err1 != nil {
+ err = errors.WithMessagef(err1, "removing %q", tmpdir)
+ }
+ }()
+
+ // write out inventory
+ inventory := filepath.Join(tmpdir, "inventory")
+ err = ioutil.WriteFile(inventory, []byte(sess.inventory), os.FileMode(0600))
+ if err != nil {
+ err = errors.WithMessagef(err, "writing inventory %s", inventory)
+ return
+ }
+
+ // write out playbook
+ playbook := filepath.Join(tmpdir, "playbook")
+ err = ioutil.WriteFile(playbook, []byte(sess.playbook), os.FileMode(0600))
+ if err != nil {
+ err = errors.WithMessagef(err, "writing playbook %s", playbook)
+ return
+ }
+
+ // write out private key
+ var privateKey string
+ if len(sess.privateKey) > 0 {
+ privateKey = filepath.Join(tmpdir, "private_key")
+ err = ioutil.WriteFile(privateKey, []byte(sess.privateKey), os.FileMode(0600))
+ if err != nil {
+ err = errors.WithMessagef(err, "writing private key %s", privateKey)
+ return
+ }
+ }
+
+ // write out files
+ for name, content := range sess.files {
+ path := filepath.Join(tmpdir, name)
+ dir := filepath.Dir(path)
+ err = os.MkdirAll(dir, os.FileMode(0700))
+ if err != nil {
+ err = errors.WithMessagef(err, "mkdir -p %s", dir)
+ return
+ }
+ err = ioutil.WriteFile(path, content, os.FileMode(0600))
+ if err != nil {
+ err = errors.WithMessagef(err, "writing file %s", name)
+ return
+ }
+ }
+
+ // run modules one by one
+ var errs []error
+ defer func() {
+ if len(errs) > 0 {
+ err = yerrors.NewAggregate(errs)
+ }
+ }()
+
+ {
+ args := []string{
+ "--inventory", inventory,
+ }
+ if privateKey != "" {
+ args = append(args, "--private-key", privateKey)
+ }
+ args = append(args, playbook)
+ cmd := exec.CommandContext(ctx, "ansible-playbook", args...)
+ cmd.Dir = tmpdir
+ cmd.Env = os.Environ()
+ cmd.Env = append(cmd.Env, "ANSIBLE_HOST_KEY_CHECKING=False")
+ stdout, _ := cmd.StdoutPipe()
+ stderr, _ := cmd.StderrPipe()
+ if err1 := cmd.Start(); err1 != nil {
+ errs = append(errs, errors.WithMessagef(err1, "start playbook %s", playbook))
+ return
+ }
+ // Mix stdout, stderr
+ if sess.outputWriter != nil {
+ go io.Copy(sess.outputWriter, stdout)
+ go io.Copy(sess.outputWriter, stderr)
+ }
+ if err1 := cmd.Wait(); err1 != nil {
+ errs = append(errs, errors.WithMessagef(err1, "wait playbook %s", playbook))
+ }
+ }
+ return nil
+}
diff --git a/pkg/util/firewalld/direct.go b/pkg/util/firewalld/direct.go
new file mode 100644
index 0000000000..b10f8746f8
--- /dev/null
+++ b/pkg/util/firewalld/direct.go
@@ -0,0 +1,55 @@
+package firewalld
+
+import (
+ "encoding/xml"
+)
+
+type Direct struct {
+ Rules []*Rule
+
+ XMLName struct{} `xml:"direct"`
+}
+
+func (d *Direct) String() string {
+ data, _ := xml.MarshalIndent(d, "", " ")
+ return string(data)
+}
+
+type Rule struct {
+ // required, smaller the number more front the rule in chain
+ Priority int `xml:"priority,attr"`
+ // required, netfilter table: "nat", "mangle", etc.
+ Table string `xml:"table,attr"`
+ // required, ip family: "ipv4", "ipv6", "eb"
+ IPv string `xml:"ipv,attr"`
+ // required, netfilter chain: "FORWARD", custom chain names
+ Chain string `xml:"chain,attr"`
+
+ // match and action command line options for {ip,ip6,eb}tables
+ Body string `xml:",chardata"`
+
+ XMLName struct{} `xml:"rule"`
+}
+
+func NewIP4Rule(prio int, table, chain, body string) *Rule {
+ r := &Rule{
+ Priority: prio,
+ IPv: "ipv4",
+ Table: table,
+ Chain: chain,
+ Body: body,
+ }
+ return r
+}
+
+func (r *Rule) String() string {
+ data, _ := xml.MarshalIndent(r, "", " ")
+ return string(data)
+}
+
+func NewDirect(rules ...*Rule) *Direct {
+ d := &Direct{
+ Rules: rules,
+ }
+ return d
+}
diff --git a/pkg/util/firewalld/direct_test.go b/pkg/util/firewalld/direct_test.go
new file mode 100644
index 0000000000..704c748d1c
--- /dev/null
+++ b/pkg/util/firewalld/direct_test.go
@@ -0,0 +1,34 @@
+package firewalld
+
+import (
+ "testing"
+)
+
+func TestDirect(t *testing.T) {
+ d := NewDirect(
+ NewIP4Rule(0, "nat", "PREROUTING", "-j DNAT --to-destination 10.168.222.99:1099"),
+ NewIP4Rule(0, "nat", "POSTROUTING", "-j SNAT --to-source :80"),
+ NewIP4Rule(100, "nat", "POSTROUTING", "-j wg0 -j MASQUERADE"),
+ )
+ ruleWant := []string{
+ `-j DNAT --to-destination 10.168.222.99:1099`,
+ `-j SNAT --to-source :80`,
+ `-j wg0 -j MASQUERADE`,
+ }
+ for i, r := range d.Rules {
+ got := r.String()
+ want := ruleWant[i]
+ if got != want {
+ t.Errorf("rule %d\n got\n %s\n want\n %s", i, got, want)
+ }
+ }
+ want := `
+ -j DNAT --to-destination 10.168.222.99:1099
+ -j SNAT --to-source :80
+ -j wg0 -j MASQUERADE
+`
+ got := d.String()
+ if got != want {
+ t.Errorf("direct:\n got:\n %s\n want:\n %s", got, want)
+ }
+}
diff --git a/pkg/util/firewalld/doc.go b/pkg/util/firewalld/doc.go
new file mode 100644
index 0000000000..b0f5293754
--- /dev/null
+++ b/pkg/util/firewalld/doc.go
@@ -0,0 +1 @@
+package firewalld // import "yunion.io/x/onecloud/pkg/util/firewalld"
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_darwin.go b/vendor/github.com/anacrolix/mmsg/socket/defs_darwin.go
deleted file mode 100644
index 14e28c0b45..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_darwin.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_dragonfly.go b/vendor/github.com/anacrolix/mmsg/socket/defs_dragonfly.go
deleted file mode 100644
index 14e28c0b45..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_dragonfly.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_freebsd.go b/vendor/github.com/anacrolix/mmsg/socket/defs_freebsd.go
deleted file mode 100644
index 14e28c0b45..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_freebsd.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_linux.go b/vendor/github.com/anacrolix/mmsg/socket/defs_linux.go
deleted file mode 100644
index ce9ec2f6d7..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_linux.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-#include
-
-#define _GNU_SOURCE
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type mmsghdr C.struct_mmsghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofMmsghdr = C.sizeof_struct_mmsghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_netbsd.go b/vendor/github.com/anacrolix/mmsg/socket/defs_netbsd.go
deleted file mode 100644
index 3f84335699..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_netbsd.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type mmsghdr C.struct_mmsghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofMmsghdr = C.sizeof_struct_mmsghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_openbsd.go b/vendor/github.com/anacrolix/mmsg/socket/defs_openbsd.go
deleted file mode 100644
index 14e28c0b45..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_openbsd.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/anacrolix/mmsg/socket/defs_solaris.go b/vendor/github.com/anacrolix/mmsg/socket/defs_solaris.go
deleted file mode 100644
index 14e28c0b45..0000000000
--- a/vendor/github.com/anacrolix/mmsg/socket/defs_solaris.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysAF_UNSPEC = C.AF_UNSPEC
- sysAF_INET = C.AF_INET
- sysAF_INET6 = C.AF_INET6
-
- sysSOCK_RAW = C.SOCK_RAW
-)
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/github.com/go-yaml/yaml/.travis.yml b/vendor/github.com/go-yaml/yaml/.travis.yml
new file mode 100644
index 0000000000..9f556934d8
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/.travis.yml
@@ -0,0 +1,12 @@
+language: go
+
+go:
+ - 1.4
+ - 1.5
+ - 1.6
+ - 1.7
+ - 1.8
+ - 1.9
+ - tip
+
+go_import_path: gopkg.in/yaml.v2
diff --git a/vendor/github.com/go-yaml/yaml/LICENSE b/vendor/github.com/go-yaml/yaml/LICENSE
new file mode 100644
index 0000000000..8dada3edaf
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/go-yaml/yaml/LICENSE.libyaml b/vendor/github.com/go-yaml/yaml/LICENSE.libyaml
new file mode 100644
index 0000000000..8da58fbf6f
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/LICENSE.libyaml
@@ -0,0 +1,31 @@
+The following files were ported to Go from C files of libyaml, and thus
+are still covered by their original copyright and license:
+
+ apic.go
+ emitterc.go
+ parserc.go
+ readerc.go
+ scannerc.go
+ writerc.go
+ yamlh.go
+ yamlprivateh.go
+
+Copyright (c) 2006 Kirill Simonov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/go-yaml/yaml/NOTICE b/vendor/github.com/go-yaml/yaml/NOTICE
new file mode 100644
index 0000000000..866d74a7ad
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/NOTICE
@@ -0,0 +1,13 @@
+Copyright 2011-2016 Canonical Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/vendor/github.com/go-yaml/yaml/README.md b/vendor/github.com/go-yaml/yaml/README.md
new file mode 100644
index 0000000000..2ed3314c73
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/README.md
@@ -0,0 +1,135 @@
+# YAML support for the Go language
+
+Introduction
+------------
+
+The yaml package enables Go programs to comfortably encode and decode YAML
+values. It was developed within [Canonical](https://www.canonical.com) as
+part of the [juju](https://juju.ubuntu.com) project, and is based on a
+pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
+C library to parse and generate YAML data quickly and reliably.
+
+Compatibility
+-------------
+
+The yaml package supports most of YAML 1.1 and 1.2, including support for
+anchors, tags, map merging, etc. Multi-document unmarshalling is not yet
+implemented, and base-60 floats from YAML 1.1 are purposefully not
+supported since they're a poor design and are gone in YAML 1.2.
+
+Installation and usage
+----------------------
+
+The import path for the package is *gopkg.in/yaml.v2*.
+
+To install it, run:
+
+ go get gopkg.in/yaml.v2
+
+API documentation
+-----------------
+
+If opened in a browser, the import path itself leads to the API documentation:
+
+ * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)
+
+API stability
+-------------
+
+The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in).
+
+
+License
+-------
+
+The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details.
+
+
+Example
+-------
+
+Some more examples can be found in the "examples" folder.
+
+```Go
+package main
+
+import (
+ "fmt"
+ "log"
+
+ "gopkg.in/yaml.v2"
+)
+
+var data = `
+a: Easy!
+b:
+ c: 2
+ d: [3, 4]
+`
+
+// Note: struct fields must be public in order for unmarshal to
+// correctly populate the data.
+type T struct {
+ A string
+ B struct {
+ RenamedC int `yaml:"c"`
+ D []int `yaml:",flow"`
+ }
+}
+
+func main() {
+ t := T{}
+
+ err := yaml.Unmarshal([]byte(data), &t)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- t:\n%v\n\n", t)
+
+ d, err := yaml.Marshal(&t)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- t dump:\n%s\n\n", string(d))
+
+ m := make(map[interface{}]interface{})
+
+ err = yaml.Unmarshal([]byte(data), &m)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- m:\n%v\n\n", m)
+
+ d, err = yaml.Marshal(&m)
+ if err != nil {
+ log.Fatalf("error: %v", err)
+ }
+ fmt.Printf("--- m dump:\n%s\n\n", string(d))
+}
+```
+
+This example will generate the following output:
+
+```
+--- t:
+{Easy! {2 [3 4]}}
+
+--- t dump:
+a: Easy!
+b:
+ c: 2
+ d: [3, 4]
+
+
+--- m:
+map[a:Easy! b:map[c:2 d:[3 4]]]
+
+--- m dump:
+a: Easy!
+b:
+ c: 2
+ d:
+ - 3
+ - 4
+```
+
diff --git a/vendor/github.com/go-yaml/yaml/apic.go b/vendor/github.com/go-yaml/yaml/apic.go
new file mode 100644
index 0000000000..3e24a0d7d2
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/apic.go
@@ -0,0 +1,739 @@
+package yaml
+
+import (
+ "io"
+)
+
+func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
+ //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
+
+ // Check if we can move the queue at the beginning of the buffer.
+ if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
+ if parser.tokens_head != len(parser.tokens) {
+ copy(parser.tokens, parser.tokens[parser.tokens_head:])
+ }
+ parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
+ parser.tokens_head = 0
+ }
+ parser.tokens = append(parser.tokens, *token)
+ if pos < 0 {
+ return
+ }
+ copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
+ parser.tokens[parser.tokens_head+pos] = *token
+}
+
+// Create a new parser object.
+func yaml_parser_initialize(parser *yaml_parser_t) bool {
+ *parser = yaml_parser_t{
+ raw_buffer: make([]byte, 0, input_raw_buffer_size),
+ buffer: make([]byte, 0, input_buffer_size),
+ }
+ return true
+}
+
+// Destroy a parser object.
+func yaml_parser_delete(parser *yaml_parser_t) {
+ *parser = yaml_parser_t{}
+}
+
+// String read handler.
+func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
+ if parser.input_pos == len(parser.input) {
+ return 0, io.EOF
+ }
+ n = copy(buffer, parser.input[parser.input_pos:])
+ parser.input_pos += n
+ return n, nil
+}
+
+// Reader read handler.
+func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
+ return parser.input_reader.Read(buffer)
+}
+
+// Set a string input.
+func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
+ if parser.read_handler != nil {
+ panic("must set the input source only once")
+ }
+ parser.read_handler = yaml_string_read_handler
+ parser.input = input
+ parser.input_pos = 0
+}
+
+// Set a file input.
+func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) {
+ if parser.read_handler != nil {
+ panic("must set the input source only once")
+ }
+ parser.read_handler = yaml_reader_read_handler
+ parser.input_reader = r
+}
+
+// Set the source encoding.
+func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) {
+ if parser.encoding != yaml_ANY_ENCODING {
+ panic("must set the encoding only once")
+ }
+ parser.encoding = encoding
+}
+
+// Create a new emitter object.
+func yaml_emitter_initialize(emitter *yaml_emitter_t) {
+ *emitter = yaml_emitter_t{
+ buffer: make([]byte, output_buffer_size),
+ raw_buffer: make([]byte, 0, output_raw_buffer_size),
+ states: make([]yaml_emitter_state_t, 0, initial_stack_size),
+ events: make([]yaml_event_t, 0, initial_queue_size),
+ }
+}
+
+// Destroy an emitter object.
+func yaml_emitter_delete(emitter *yaml_emitter_t) {
+ *emitter = yaml_emitter_t{}
+}
+
+// String write handler.
+func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
+ *emitter.output_buffer = append(*emitter.output_buffer, buffer...)
+ return nil
+}
+
+// yaml_writer_write_handler uses emitter.output_writer to write the
+// emitted text.
+func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
+ _, err := emitter.output_writer.Write(buffer)
+ return err
+}
+
+// Set a string output.
+func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) {
+ if emitter.write_handler != nil {
+ panic("must set the output target only once")
+ }
+ emitter.write_handler = yaml_string_write_handler
+ emitter.output_buffer = output_buffer
+}
+
+// Set a file output.
+func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) {
+ if emitter.write_handler != nil {
+ panic("must set the output target only once")
+ }
+ emitter.write_handler = yaml_writer_write_handler
+ emitter.output_writer = w
+}
+
+// Set the output encoding.
+func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) {
+ if emitter.encoding != yaml_ANY_ENCODING {
+ panic("must set the output encoding only once")
+ }
+ emitter.encoding = encoding
+}
+
+// Set the canonical output style.
+func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) {
+ emitter.canonical = canonical
+}
+
+//// Set the indentation increment.
+func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) {
+ if indent < 2 || indent > 9 {
+ indent = 2
+ }
+ emitter.best_indent = indent
+}
+
+// Set the preferred line width.
+func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) {
+ if width < 0 {
+ width = -1
+ }
+ emitter.best_width = width
+}
+
+// Set if unescaped non-ASCII characters are allowed.
+func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) {
+ emitter.unicode = unicode
+}
+
+// Set the preferred line break character.
+func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) {
+ emitter.line_break = line_break
+}
+
+///*
+// * Destroy a token object.
+// */
+//
+//YAML_DECLARE(void)
+//yaml_token_delete(yaml_token_t *token)
+//{
+// assert(token); // Non-NULL token object expected.
+//
+// switch (token.type)
+// {
+// case YAML_TAG_DIRECTIVE_TOKEN:
+// yaml_free(token.data.tag_directive.handle);
+// yaml_free(token.data.tag_directive.prefix);
+// break;
+//
+// case YAML_ALIAS_TOKEN:
+// yaml_free(token.data.alias.value);
+// break;
+//
+// case YAML_ANCHOR_TOKEN:
+// yaml_free(token.data.anchor.value);
+// break;
+//
+// case YAML_TAG_TOKEN:
+// yaml_free(token.data.tag.handle);
+// yaml_free(token.data.tag.suffix);
+// break;
+//
+// case YAML_SCALAR_TOKEN:
+// yaml_free(token.data.scalar.value);
+// break;
+//
+// default:
+// break;
+// }
+//
+// memset(token, 0, sizeof(yaml_token_t));
+//}
+//
+///*
+// * Check if a string is a valid UTF-8 sequence.
+// *
+// * Check 'reader.c' for more details on UTF-8 encoding.
+// */
+//
+//static int
+//yaml_check_utf8(yaml_char_t *start, size_t length)
+//{
+// yaml_char_t *end = start+length;
+// yaml_char_t *pointer = start;
+//
+// while (pointer < end) {
+// unsigned char octet;
+// unsigned int width;
+// unsigned int value;
+// size_t k;
+//
+// octet = pointer[0];
+// width = (octet & 0x80) == 0x00 ? 1 :
+// (octet & 0xE0) == 0xC0 ? 2 :
+// (octet & 0xF0) == 0xE0 ? 3 :
+// (octet & 0xF8) == 0xF0 ? 4 : 0;
+// value = (octet & 0x80) == 0x00 ? octet & 0x7F :
+// (octet & 0xE0) == 0xC0 ? octet & 0x1F :
+// (octet & 0xF0) == 0xE0 ? octet & 0x0F :
+// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
+// if (!width) return 0;
+// if (pointer+width > end) return 0;
+// for (k = 1; k < width; k ++) {
+// octet = pointer[k];
+// if ((octet & 0xC0) != 0x80) return 0;
+// value = (value << 6) + (octet & 0x3F);
+// }
+// if (!((width == 1) ||
+// (width == 2 && value >= 0x80) ||
+// (width == 3 && value >= 0x800) ||
+// (width == 4 && value >= 0x10000))) return 0;
+//
+// pointer += width;
+// }
+//
+// return 1;
+//}
+//
+
+// Create STREAM-START.
+func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) {
+ *event = yaml_event_t{
+ typ: yaml_STREAM_START_EVENT,
+ encoding: encoding,
+ }
+}
+
+// Create STREAM-END.
+func yaml_stream_end_event_initialize(event *yaml_event_t) {
+ *event = yaml_event_t{
+ typ: yaml_STREAM_END_EVENT,
+ }
+}
+
+// Create DOCUMENT-START.
+func yaml_document_start_event_initialize(
+ event *yaml_event_t,
+ version_directive *yaml_version_directive_t,
+ tag_directives []yaml_tag_directive_t,
+ implicit bool,
+) {
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_START_EVENT,
+ version_directive: version_directive,
+ tag_directives: tag_directives,
+ implicit: implicit,
+ }
+}
+
+// Create DOCUMENT-END.
+func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) {
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_END_EVENT,
+ implicit: implicit,
+ }
+}
+
+///*
+// * Create ALIAS.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t)
+//{
+// mark yaml_mark_t = { 0, 0, 0 }
+// anchor_copy *yaml_char_t = NULL
+//
+// assert(event) // Non-NULL event object is expected.
+// assert(anchor) // Non-NULL anchor is expected.
+//
+// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0
+//
+// anchor_copy = yaml_strdup(anchor)
+// if (!anchor_copy)
+// return 0
+//
+// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark)
+//
+// return 1
+//}
+
+// Create SCALAR.
+func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ anchor: anchor,
+ tag: tag,
+ value: value,
+ implicit: plain_implicit,
+ quoted_implicit: quoted_implicit,
+ style: yaml_style_t(style),
+ }
+ return true
+}
+
+// Create SEQUENCE-START.
+func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(style),
+ }
+ return true
+}
+
+// Create SEQUENCE-END.
+func yaml_sequence_end_event_initialize(event *yaml_event_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ }
+ return true
+}
+
+// Create MAPPING-START.
+func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) {
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(style),
+ }
+}
+
+// Create MAPPING-END.
+func yaml_mapping_end_event_initialize(event *yaml_event_t) {
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ }
+}
+
+// Destroy an event object.
+func yaml_event_delete(event *yaml_event_t) {
+ *event = yaml_event_t{}
+}
+
+///*
+// * Create a document object.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_initialize(document *yaml_document_t,
+// version_directive *yaml_version_directive_t,
+// tag_directives_start *yaml_tag_directive_t,
+// tag_directives_end *yaml_tag_directive_t,
+// start_implicit int, end_implicit int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// struct {
+// start *yaml_node_t
+// end *yaml_node_t
+// top *yaml_node_t
+// } nodes = { NULL, NULL, NULL }
+// version_directive_copy *yaml_version_directive_t = NULL
+// struct {
+// start *yaml_tag_directive_t
+// end *yaml_tag_directive_t
+// top *yaml_tag_directive_t
+// } tag_directives_copy = { NULL, NULL, NULL }
+// value yaml_tag_directive_t = { NULL, NULL }
+// mark yaml_mark_t = { 0, 0, 0 }
+//
+// assert(document) // Non-NULL document object is expected.
+// assert((tag_directives_start && tag_directives_end) ||
+// (tag_directives_start == tag_directives_end))
+// // Valid tag directives are expected.
+//
+// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
+//
+// if (version_directive) {
+// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
+// if (!version_directive_copy) goto error
+// version_directive_copy.major = version_directive.major
+// version_directive_copy.minor = version_directive.minor
+// }
+//
+// if (tag_directives_start != tag_directives_end) {
+// tag_directive *yaml_tag_directive_t
+// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
+// goto error
+// for (tag_directive = tag_directives_start
+// tag_directive != tag_directives_end; tag_directive ++) {
+// assert(tag_directive.handle)
+// assert(tag_directive.prefix)
+// if (!yaml_check_utf8(tag_directive.handle,
+// strlen((char *)tag_directive.handle)))
+// goto error
+// if (!yaml_check_utf8(tag_directive.prefix,
+// strlen((char *)tag_directive.prefix)))
+// goto error
+// value.handle = yaml_strdup(tag_directive.handle)
+// value.prefix = yaml_strdup(tag_directive.prefix)
+// if (!value.handle || !value.prefix) goto error
+// if (!PUSH(&context, tag_directives_copy, value))
+// goto error
+// value.handle = NULL
+// value.prefix = NULL
+// }
+// }
+//
+// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
+// tag_directives_copy.start, tag_directives_copy.top,
+// start_implicit, end_implicit, mark, mark)
+//
+// return 1
+//
+//error:
+// STACK_DEL(&context, nodes)
+// yaml_free(version_directive_copy)
+// while (!STACK_EMPTY(&context, tag_directives_copy)) {
+// value yaml_tag_directive_t = POP(&context, tag_directives_copy)
+// yaml_free(value.handle)
+// yaml_free(value.prefix)
+// }
+// STACK_DEL(&context, tag_directives_copy)
+// yaml_free(value.handle)
+// yaml_free(value.prefix)
+//
+// return 0
+//}
+//
+///*
+// * Destroy a document object.
+// */
+//
+//YAML_DECLARE(void)
+//yaml_document_delete(document *yaml_document_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// tag_directive *yaml_tag_directive_t
+//
+// context.error = YAML_NO_ERROR // Eliminate a compliler warning.
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// while (!STACK_EMPTY(&context, document.nodes)) {
+// node yaml_node_t = POP(&context, document.nodes)
+// yaml_free(node.tag)
+// switch (node.type) {
+// case YAML_SCALAR_NODE:
+// yaml_free(node.data.scalar.value)
+// break
+// case YAML_SEQUENCE_NODE:
+// STACK_DEL(&context, node.data.sequence.items)
+// break
+// case YAML_MAPPING_NODE:
+// STACK_DEL(&context, node.data.mapping.pairs)
+// break
+// default:
+// assert(0) // Should not happen.
+// }
+// }
+// STACK_DEL(&context, document.nodes)
+//
+// yaml_free(document.version_directive)
+// for (tag_directive = document.tag_directives.start
+// tag_directive != document.tag_directives.end
+// tag_directive++) {
+// yaml_free(tag_directive.handle)
+// yaml_free(tag_directive.prefix)
+// }
+// yaml_free(document.tag_directives.start)
+//
+// memset(document, 0, sizeof(yaml_document_t))
+//}
+//
+///**
+// * Get a document node.
+// */
+//
+//YAML_DECLARE(yaml_node_t *)
+//yaml_document_get_node(document *yaml_document_t, index int)
+//{
+// assert(document) // Non-NULL document object is expected.
+//
+// if (index > 0 && document.nodes.start + index <= document.nodes.top) {
+// return document.nodes.start + index - 1
+// }
+// return NULL
+//}
+//
+///**
+// * Get the root object.
+// */
+//
+//YAML_DECLARE(yaml_node_t *)
+//yaml_document_get_root_node(document *yaml_document_t)
+//{
+// assert(document) // Non-NULL document object is expected.
+//
+// if (document.nodes.top != document.nodes.start) {
+// return document.nodes.start
+// }
+// return NULL
+//}
+//
+///*
+// * Add a scalar node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_scalar(document *yaml_document_t,
+// tag *yaml_char_t, value *yaml_char_t, length int,
+// style yaml_scalar_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// value_copy *yaml_char_t = NULL
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+// assert(value) // Non-NULL value is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (length < 0) {
+// length = strlen((char *)value)
+// }
+//
+// if (!yaml_check_utf8(value, length)) goto error
+// value_copy = yaml_malloc(length+1)
+// if (!value_copy) goto error
+// memcpy(value_copy, value, length)
+// value_copy[length] = '\0'
+//
+// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// yaml_free(tag_copy)
+// yaml_free(value_copy)
+//
+// return 0
+//}
+//
+///*
+// * Add a sequence node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_sequence(document *yaml_document_t,
+// tag *yaml_char_t, style yaml_sequence_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// struct {
+// start *yaml_node_item_t
+// end *yaml_node_item_t
+// top *yaml_node_item_t
+// } items = { NULL, NULL, NULL }
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
+//
+// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
+// style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// STACK_DEL(&context, items)
+// yaml_free(tag_copy)
+//
+// return 0
+//}
+//
+///*
+// * Add a mapping node to a document.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_add_mapping(document *yaml_document_t,
+// tag *yaml_char_t, style yaml_mapping_style_t)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+// mark yaml_mark_t = { 0, 0, 0 }
+// tag_copy *yaml_char_t = NULL
+// struct {
+// start *yaml_node_pair_t
+// end *yaml_node_pair_t
+// top *yaml_node_pair_t
+// } pairs = { NULL, NULL, NULL }
+// node yaml_node_t
+//
+// assert(document) // Non-NULL document object is expected.
+//
+// if (!tag) {
+// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
+// }
+//
+// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
+// tag_copy = yaml_strdup(tag)
+// if (!tag_copy) goto error
+//
+// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
+//
+// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
+// style, mark, mark)
+// if (!PUSH(&context, document.nodes, node)) goto error
+//
+// return document.nodes.top - document.nodes.start
+//
+//error:
+// STACK_DEL(&context, pairs)
+// yaml_free(tag_copy)
+//
+// return 0
+//}
+//
+///*
+// * Append an item to a sequence node.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_append_sequence_item(document *yaml_document_t,
+// sequence int, item int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+//
+// assert(document) // Non-NULL document is required.
+// assert(sequence > 0
+// && document.nodes.start + sequence <= document.nodes.top)
+// // Valid sequence id is required.
+// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
+// // A sequence node is required.
+// assert(item > 0 && document.nodes.start + item <= document.nodes.top)
+// // Valid item id is required.
+//
+// if (!PUSH(&context,
+// document.nodes.start[sequence-1].data.sequence.items, item))
+// return 0
+//
+// return 1
+//}
+//
+///*
+// * Append a pair of a key and a value to a mapping node.
+// */
+//
+//YAML_DECLARE(int)
+//yaml_document_append_mapping_pair(document *yaml_document_t,
+// mapping int, key int, value int)
+//{
+// struct {
+// error yaml_error_type_t
+// } context
+//
+// pair yaml_node_pair_t
+//
+// assert(document) // Non-NULL document is required.
+// assert(mapping > 0
+// && document.nodes.start + mapping <= document.nodes.top)
+// // Valid mapping id is required.
+// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
+// // A mapping node is required.
+// assert(key > 0 && document.nodes.start + key <= document.nodes.top)
+// // Valid key id is required.
+// assert(value > 0 && document.nodes.start + value <= document.nodes.top)
+// // Valid value id is required.
+//
+// pair.key = key
+// pair.value = value
+//
+// if (!PUSH(&context,
+// document.nodes.start[mapping-1].data.mapping.pairs, pair))
+// return 0
+//
+// return 1
+//}
+//
+//
diff --git a/vendor/github.com/go-yaml/yaml/decode.go b/vendor/github.com/go-yaml/yaml/decode.go
new file mode 100644
index 0000000000..c8eac16428
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/decode.go
@@ -0,0 +1,764 @@
+package yaml
+
+import (
+ "encoding"
+ "encoding/base64"
+ "fmt"
+ "io"
+ "math"
+ "reflect"
+ "strconv"
+ "time"
+)
+
+const (
+ documentNode = 1 << iota
+ mappingNode
+ sequenceNode
+ scalarNode
+ aliasNode
+)
+
+type node struct {
+ kind int
+ line, column int
+ tag string
+ // For an alias node, alias holds the resolved alias.
+ alias *node
+ value string
+ implicit bool
+ children []*node
+ anchors map[string]*node
+}
+
+// ----------------------------------------------------------------------------
+// Parser, produces a node tree out of a libyaml event stream.
+
+type parser struct {
+ parser yaml_parser_t
+ event yaml_event_t
+ doc *node
+ doneInit bool
+}
+
+func newParser(b []byte) *parser {
+ p := parser{}
+ if !yaml_parser_initialize(&p.parser) {
+ panic("failed to initialize YAML emitter")
+ }
+ if len(b) == 0 {
+ b = []byte{'\n'}
+ }
+ yaml_parser_set_input_string(&p.parser, b)
+ return &p
+}
+
+func newParserFromReader(r io.Reader) *parser {
+ p := parser{}
+ if !yaml_parser_initialize(&p.parser) {
+ panic("failed to initialize YAML emitter")
+ }
+ yaml_parser_set_input_reader(&p.parser, r)
+ return &p
+}
+
+func (p *parser) init() {
+ if p.doneInit {
+ return
+ }
+ p.expect(yaml_STREAM_START_EVENT)
+ p.doneInit = true
+}
+
+func (p *parser) destroy() {
+ if p.event.typ != yaml_NO_EVENT {
+ yaml_event_delete(&p.event)
+ }
+ yaml_parser_delete(&p.parser)
+}
+
+// expect consumes an event from the event stream and
+// checks that it's of the expected type.
+func (p *parser) expect(e yaml_event_type_t) {
+ if p.event.typ == yaml_NO_EVENT {
+ if !yaml_parser_parse(&p.parser, &p.event) {
+ p.fail()
+ }
+ }
+ if p.event.typ == yaml_STREAM_END_EVENT {
+ failf("attempted to go past the end of stream; corrupted value?")
+ }
+ if p.event.typ != e {
+ p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ)
+ p.fail()
+ }
+ yaml_event_delete(&p.event)
+ p.event.typ = yaml_NO_EVENT
+}
+
+// peek peeks at the next event in the event stream,
+// puts the results into p.event and returns the event type.
+func (p *parser) peek() yaml_event_type_t {
+ if p.event.typ != yaml_NO_EVENT {
+ return p.event.typ
+ }
+ if !yaml_parser_parse(&p.parser, &p.event) {
+ p.fail()
+ }
+ return p.event.typ
+}
+
+func (p *parser) fail() {
+ var where string
+ var line int
+ if p.parser.problem_mark.line != 0 {
+ line = p.parser.problem_mark.line
+ } else if p.parser.context_mark.line != 0 {
+ line = p.parser.context_mark.line
+ }
+ if line != 0 {
+ where = "line " + strconv.Itoa(line) + ": "
+ }
+ var msg string
+ if len(p.parser.problem) > 0 {
+ msg = p.parser.problem
+ } else {
+ msg = "unknown problem parsing YAML content"
+ }
+ failf("%s%s", where, msg)
+}
+
+func (p *parser) anchor(n *node, anchor []byte) {
+ if anchor != nil {
+ p.doc.anchors[string(anchor)] = n
+ }
+}
+
+func (p *parser) parse() *node {
+ p.init()
+ switch p.peek() {
+ case yaml_SCALAR_EVENT:
+ return p.scalar()
+ case yaml_ALIAS_EVENT:
+ return p.alias()
+ case yaml_MAPPING_START_EVENT:
+ return p.mapping()
+ case yaml_SEQUENCE_START_EVENT:
+ return p.sequence()
+ case yaml_DOCUMENT_START_EVENT:
+ return p.document()
+ case yaml_STREAM_END_EVENT:
+ // Happens when attempting to decode an empty buffer.
+ return nil
+ default:
+ panic("attempted to parse unknown event: " + p.event.typ.String())
+ }
+}
+
+func (p *parser) node(kind int) *node {
+ return &node{
+ kind: kind,
+ line: p.event.start_mark.line,
+ column: p.event.start_mark.column,
+ }
+}
+
+func (p *parser) document() *node {
+ n := p.node(documentNode)
+ n.anchors = make(map[string]*node)
+ p.doc = n
+ p.expect(yaml_DOCUMENT_START_EVENT)
+ n.children = append(n.children, p.parse())
+ p.expect(yaml_DOCUMENT_END_EVENT)
+ return n
+}
+
+func (p *parser) alias() *node {
+ n := p.node(aliasNode)
+ n.value = string(p.event.anchor)
+ n.alias = p.doc.anchors[n.value]
+ if n.alias == nil {
+ failf("unknown anchor '%s' referenced", n.value)
+ }
+ p.expect(yaml_ALIAS_EVENT)
+ return n
+}
+
+func (p *parser) scalar() *node {
+ n := p.node(scalarNode)
+ n.value = string(p.event.value)
+ n.tag = string(p.event.tag)
+ n.implicit = p.event.implicit
+ p.anchor(n, p.event.anchor)
+ p.expect(yaml_SCALAR_EVENT)
+ return n
+}
+
+func (p *parser) sequence() *node {
+ n := p.node(sequenceNode)
+ p.anchor(n, p.event.anchor)
+ p.expect(yaml_SEQUENCE_START_EVENT)
+ for p.peek() != yaml_SEQUENCE_END_EVENT {
+ n.children = append(n.children, p.parse())
+ }
+ p.expect(yaml_SEQUENCE_END_EVENT)
+ return n
+}
+
+func (p *parser) mapping() *node {
+ n := p.node(mappingNode)
+ p.anchor(n, p.event.anchor)
+ p.expect(yaml_MAPPING_START_EVENT)
+ for p.peek() != yaml_MAPPING_END_EVENT {
+ n.children = append(n.children, p.parse(), p.parse())
+ }
+ p.expect(yaml_MAPPING_END_EVENT)
+ return n
+}
+
+// ----------------------------------------------------------------------------
+// Decoder, unmarshals a node into a provided value.
+
+type decoder struct {
+ doc *node
+ aliases map[*node]bool
+ mapType reflect.Type
+ terrors []string
+ strict bool
+}
+
+var (
+ mapItemType = reflect.TypeOf(MapItem{})
+ durationType = reflect.TypeOf(time.Duration(0))
+ defaultMapType = reflect.TypeOf(map[interface{}]interface{}{})
+ ifaceType = defaultMapType.Elem()
+ timeType = reflect.TypeOf(time.Time{})
+ ptrTimeType = reflect.TypeOf(&time.Time{})
+)
+
+func newDecoder(strict bool) *decoder {
+ d := &decoder{mapType: defaultMapType, strict: strict}
+ d.aliases = make(map[*node]bool)
+ return d
+}
+
+func (d *decoder) terror(n *node, tag string, out reflect.Value) {
+ if n.tag != "" {
+ tag = n.tag
+ }
+ value := n.value
+ if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG {
+ if len(value) > 10 {
+ value = " `" + value[:7] + "...`"
+ } else {
+ value = " `" + value + "`"
+ }
+ }
+ d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type()))
+}
+
+func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) {
+ terrlen := len(d.terrors)
+ err := u.UnmarshalYAML(func(v interface{}) (err error) {
+ defer handleErr(&err)
+ d.unmarshal(n, reflect.ValueOf(v))
+ if len(d.terrors) > terrlen {
+ issues := d.terrors[terrlen:]
+ d.terrors = d.terrors[:terrlen]
+ return &TypeError{issues}
+ }
+ return nil
+ })
+ if e, ok := err.(*TypeError); ok {
+ d.terrors = append(d.terrors, e.Errors...)
+ return false
+ }
+ if err != nil {
+ fail(err)
+ }
+ return true
+}
+
+// d.prepare initializes and dereferences pointers and calls UnmarshalYAML
+// if a value is found to implement it.
+// It returns the initialized and dereferenced out value, whether
+// unmarshalling was already done by UnmarshalYAML, and if so whether
+// its types unmarshalled appropriately.
+//
+// If n holds a null value, prepare returns before doing anything.
+func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
+ if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "~" || n.value == "" && n.implicit) {
+ return out, false, false
+ }
+ again := true
+ for again {
+ again = false
+ if out.Kind() == reflect.Ptr {
+ if out.IsNil() {
+ out.Set(reflect.New(out.Type().Elem()))
+ }
+ out = out.Elem()
+ again = true
+ }
+ if out.CanAddr() {
+ if u, ok := out.Addr().Interface().(Unmarshaler); ok {
+ good = d.callUnmarshaler(n, u)
+ return out, true, good
+ }
+ }
+ }
+ return out, false, false
+}
+
+func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
+ switch n.kind {
+ case documentNode:
+ return d.document(n, out)
+ case aliasNode:
+ return d.alias(n, out)
+ }
+ out, unmarshaled, good := d.prepare(n, out)
+ if unmarshaled {
+ return good
+ }
+ switch n.kind {
+ case scalarNode:
+ good = d.scalar(n, out)
+ case mappingNode:
+ good = d.mapping(n, out)
+ case sequenceNode:
+ good = d.sequence(n, out)
+ default:
+ panic("internal error: unknown node kind: " + strconv.Itoa(n.kind))
+ }
+ return good
+}
+
+func (d *decoder) document(n *node, out reflect.Value) (good bool) {
+ if len(n.children) == 1 {
+ d.doc = n
+ d.unmarshal(n.children[0], out)
+ return true
+ }
+ return false
+}
+
+func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
+ if d.aliases[n] {
+ // TODO this could actually be allowed in some circumstances.
+ failf("anchor '%s' value contains itself", n.value)
+ }
+ d.aliases[n] = true
+ good = d.unmarshal(n.alias, out)
+ delete(d.aliases, n)
+ return good
+}
+
+var zeroValue reflect.Value
+
+func resetMap(out reflect.Value) {
+ for _, k := range out.MapKeys() {
+ out.SetMapIndex(k, zeroValue)
+ }
+}
+
+func (d *decoder) scalar(n *node, out reflect.Value) bool {
+ var tag string
+ var resolved interface{}
+ if n.tag == "" && !n.implicit {
+ tag = yaml_STR_TAG
+ resolved = n.value
+ } else {
+ tag, resolved = resolve(n.tag, n.value)
+ if tag == yaml_BINARY_TAG {
+ data, err := base64.StdEncoding.DecodeString(resolved.(string))
+ if err != nil {
+ failf("!!binary value contains invalid base64 data")
+ }
+ resolved = string(data)
+ }
+ }
+ if resolved == nil {
+ if out.Kind() == reflect.Map && !out.CanAddr() {
+ resetMap(out)
+ } else {
+ out.Set(reflect.Zero(out.Type()))
+ }
+ return true
+ }
+ if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() {
+ // We've resolved to exactly the type we want, so use that.
+ out.Set(resolvedv)
+ return true
+ }
+ // Perhaps we can use the value as a TextUnmarshaler to
+ // set its value.
+ if out.CanAddr() {
+ u, ok := out.Addr().Interface().(encoding.TextUnmarshaler)
+ if ok {
+ var text []byte
+ if tag == yaml_BINARY_TAG {
+ text = []byte(resolved.(string))
+ } else {
+ // We let any value be unmarshaled into TextUnmarshaler.
+ // That might be more lax than we'd like, but the
+ // TextUnmarshaler itself should bowl out any dubious values.
+ text = []byte(n.value)
+ }
+ err := u.UnmarshalText(text)
+ if err != nil {
+ fail(err)
+ }
+ return true
+ }
+ }
+ switch out.Kind() {
+ case reflect.String:
+ if tag == yaml_BINARY_TAG {
+ out.SetString(resolved.(string))
+ return true
+ }
+ if resolved != nil {
+ out.SetString(n.value)
+ return true
+ }
+ case reflect.Interface:
+ if resolved == nil {
+ out.Set(reflect.Zero(out.Type()))
+ } else if tag == yaml_TIMESTAMP_TAG {
+ // It looks like a timestamp but for backward compatibility
+ // reasons we set it as a string, so that code that unmarshals
+ // timestamp-like values into interface{} will continue to
+ // see a string and not a time.Time.
+ out.Set(reflect.ValueOf(n.value))
+ } else {
+ out.Set(reflect.ValueOf(resolved))
+ }
+ return true
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ switch resolved := resolved.(type) {
+ case int:
+ if !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ return true
+ }
+ case int64:
+ if !out.OverflowInt(resolved) {
+ out.SetInt(resolved)
+ return true
+ }
+ case uint64:
+ if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ return true
+ }
+ case float64:
+ if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
+ out.SetInt(int64(resolved))
+ return true
+ }
+ case string:
+ if out.Type() == durationType {
+ d, err := time.ParseDuration(resolved)
+ if err == nil {
+ out.SetInt(int64(d))
+ return true
+ }
+ }
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ switch resolved := resolved.(type) {
+ case int:
+ if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case int64:
+ if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case uint64:
+ if !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ case float64:
+ if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) {
+ out.SetUint(uint64(resolved))
+ return true
+ }
+ }
+ case reflect.Bool:
+ switch resolved := resolved.(type) {
+ case bool:
+ out.SetBool(resolved)
+ return true
+ }
+ case reflect.Float32, reflect.Float64:
+ switch resolved := resolved.(type) {
+ case int:
+ out.SetFloat(float64(resolved))
+ return true
+ case int64:
+ out.SetFloat(float64(resolved))
+ return true
+ case uint64:
+ out.SetFloat(float64(resolved))
+ return true
+ case float64:
+ out.SetFloat(resolved)
+ return true
+ }
+ case reflect.Struct:
+ if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() {
+ out.Set(resolvedv)
+ return true
+ }
+ case reflect.Ptr:
+ if out.Type().Elem() == reflect.TypeOf(resolved) {
+ // TODO DOes this make sense? When is out a Ptr except when decoding a nil value?
+ elem := reflect.New(out.Type().Elem())
+ elem.Elem().Set(reflect.ValueOf(resolved))
+ out.Set(elem)
+ return true
+ }
+ }
+ d.terror(n, tag, out)
+ return false
+}
+
+func settableValueOf(i interface{}) reflect.Value {
+ v := reflect.ValueOf(i)
+ sv := reflect.New(v.Type()).Elem()
+ sv.Set(v)
+ return sv
+}
+
+func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
+ l := len(n.children)
+
+ var iface reflect.Value
+ switch out.Kind() {
+ case reflect.Slice:
+ out.Set(reflect.MakeSlice(out.Type(), l, l))
+ case reflect.Interface:
+ // No type hints. Will have to use a generic sequence.
+ iface = out
+ out = settableValueOf(make([]interface{}, l))
+ default:
+ d.terror(n, yaml_SEQ_TAG, out)
+ return false
+ }
+ et := out.Type().Elem()
+
+ j := 0
+ for i := 0; i < l; i++ {
+ e := reflect.New(et).Elem()
+ if ok := d.unmarshal(n.children[i], e); ok {
+ out.Index(j).Set(e)
+ j++
+ }
+ }
+ out.Set(out.Slice(0, j))
+ if iface.IsValid() {
+ iface.Set(out)
+ }
+ return true
+}
+
+func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
+ switch out.Kind() {
+ case reflect.Struct:
+ return d.mappingStruct(n, out)
+ case reflect.Slice:
+ return d.mappingSlice(n, out)
+ case reflect.Map:
+ // okay
+ case reflect.Interface:
+ if d.mapType.Kind() == reflect.Map {
+ iface := out
+ out = reflect.MakeMap(d.mapType)
+ iface.Set(out)
+ } else {
+ slicev := reflect.New(d.mapType).Elem()
+ if !d.mappingSlice(n, slicev) {
+ return false
+ }
+ out.Set(slicev)
+ return true
+ }
+ default:
+ d.terror(n, yaml_MAP_TAG, out)
+ return false
+ }
+ outt := out.Type()
+ kt := outt.Key()
+ et := outt.Elem()
+
+ mapType := d.mapType
+ if outt.Key() == ifaceType && outt.Elem() == ifaceType {
+ d.mapType = outt
+ }
+
+ if out.IsNil() {
+ out.Set(reflect.MakeMap(outt))
+ }
+ l := len(n.children)
+ for i := 0; i < l; i += 2 {
+ if isMerge(n.children[i]) {
+ d.merge(n.children[i+1], out)
+ continue
+ }
+ k := reflect.New(kt).Elem()
+ if d.unmarshal(n.children[i], k) {
+ kkind := k.Kind()
+ if kkind == reflect.Interface {
+ kkind = k.Elem().Kind()
+ }
+ if kkind == reflect.Map || kkind == reflect.Slice {
+ failf("invalid map key: %#v", k.Interface())
+ }
+ e := reflect.New(et).Elem()
+ if d.unmarshal(n.children[i+1], e) {
+ d.setMapIndex(n.children[i+1], out, k, e)
+ }
+ }
+ }
+ d.mapType = mapType
+ return true
+}
+
+func (d *decoder) setMapIndex(n *node, out, k, v reflect.Value) {
+ if d.strict && out.MapIndex(k) != zeroValue {
+ d.terrors = append(d.terrors, fmt.Sprintf("line %d: key %#v already set in map", n.line+1, k.Interface()))
+ return
+ }
+ out.SetMapIndex(k, v)
+}
+
+func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) {
+ outt := out.Type()
+ if outt.Elem() != mapItemType {
+ d.terror(n, yaml_MAP_TAG, out)
+ return false
+ }
+
+ mapType := d.mapType
+ d.mapType = outt
+
+ var slice []MapItem
+ var l = len(n.children)
+ for i := 0; i < l; i += 2 {
+ if isMerge(n.children[i]) {
+ d.merge(n.children[i+1], out)
+ continue
+ }
+ item := MapItem{}
+ k := reflect.ValueOf(&item.Key).Elem()
+ if d.unmarshal(n.children[i], k) {
+ v := reflect.ValueOf(&item.Value).Elem()
+ if d.unmarshal(n.children[i+1], v) {
+ slice = append(slice, item)
+ }
+ }
+ }
+ out.Set(reflect.ValueOf(slice))
+ d.mapType = mapType
+ return true
+}
+
+func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) {
+ sinfo, err := getStructInfo(out.Type())
+ if err != nil {
+ panic(err)
+ }
+ name := settableValueOf("")
+ l := len(n.children)
+
+ var inlineMap reflect.Value
+ var elemType reflect.Type
+ if sinfo.InlineMap != -1 {
+ inlineMap = out.Field(sinfo.InlineMap)
+ inlineMap.Set(reflect.New(inlineMap.Type()).Elem())
+ elemType = inlineMap.Type().Elem()
+ }
+
+ var doneFields []bool
+ if d.strict {
+ doneFields = make([]bool, len(sinfo.FieldsList))
+ }
+ for i := 0; i < l; i += 2 {
+ ni := n.children[i]
+ if isMerge(ni) {
+ d.merge(n.children[i+1], out)
+ continue
+ }
+ if !d.unmarshal(ni, name) {
+ continue
+ }
+ if info, ok := sinfo.FieldsMap[name.String()]; ok {
+ if d.strict {
+ if doneFields[info.Id] {
+ d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.line+1, name.String(), out.Type()))
+ continue
+ }
+ doneFields[info.Id] = true
+ }
+ var field reflect.Value
+ if info.Inline == nil {
+ field = out.Field(info.Num)
+ } else {
+ field = out.FieldByIndex(info.Inline)
+ }
+ d.unmarshal(n.children[i+1], field)
+ } else if sinfo.InlineMap != -1 {
+ if inlineMap.IsNil() {
+ inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
+ }
+ value := reflect.New(elemType).Elem()
+ d.unmarshal(n.children[i+1], value)
+ d.setMapIndex(n.children[i+1], inlineMap, name, value)
+ } else if d.strict {
+ d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.line+1, name.String(), out.Type()))
+ }
+ }
+ return true
+}
+
+func failWantMap() {
+ failf("map merge requires map or sequence of maps as the value")
+}
+
+func (d *decoder) merge(n *node, out reflect.Value) {
+ switch n.kind {
+ case mappingNode:
+ d.unmarshal(n, out)
+ case aliasNode:
+ an, ok := d.doc.anchors[n.value]
+ if ok && an.kind != mappingNode {
+ failWantMap()
+ }
+ d.unmarshal(n, out)
+ case sequenceNode:
+ // Step backwards as earlier nodes take precedence.
+ for i := len(n.children) - 1; i >= 0; i-- {
+ ni := n.children[i]
+ if ni.kind == aliasNode {
+ an, ok := d.doc.anchors[ni.value]
+ if ok && an.kind != mappingNode {
+ failWantMap()
+ }
+ } else if ni.kind != mappingNode {
+ failWantMap()
+ }
+ d.unmarshal(ni, out)
+ }
+ default:
+ failWantMap()
+ }
+}
+
+func isMerge(n *node) bool {
+ return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG)
+}
diff --git a/vendor/github.com/go-yaml/yaml/emitterc.go b/vendor/github.com/go-yaml/yaml/emitterc.go
new file mode 100644
index 0000000000..cf0db118ac
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/emitterc.go
@@ -0,0 +1,1685 @@
+package yaml
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// Flush the buffer if needed.
+func flush(emitter *yaml_emitter_t) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) {
+ return yaml_emitter_flush(emitter)
+ }
+ return true
+}
+
+// Put a character to the output buffer.
+func put(emitter *yaml_emitter_t, value byte) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
+ return false
+ }
+ emitter.buffer[emitter.buffer_pos] = value
+ emitter.buffer_pos++
+ emitter.column++
+ return true
+}
+
+// Put a line break to the output buffer.
+func put_break(emitter *yaml_emitter_t) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
+ return false
+ }
+ switch emitter.line_break {
+ case yaml_CR_BREAK:
+ emitter.buffer[emitter.buffer_pos] = '\r'
+ emitter.buffer_pos += 1
+ case yaml_LN_BREAK:
+ emitter.buffer[emitter.buffer_pos] = '\n'
+ emitter.buffer_pos += 1
+ case yaml_CRLN_BREAK:
+ emitter.buffer[emitter.buffer_pos+0] = '\r'
+ emitter.buffer[emitter.buffer_pos+1] = '\n'
+ emitter.buffer_pos += 2
+ default:
+ panic("unknown line break setting")
+ }
+ emitter.column = 0
+ emitter.line++
+ return true
+}
+
+// Copy a character from a string into buffer.
+func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
+ if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
+ return false
+ }
+ p := emitter.buffer_pos
+ w := width(s[*i])
+ switch w {
+ case 4:
+ emitter.buffer[p+3] = s[*i+3]
+ fallthrough
+ case 3:
+ emitter.buffer[p+2] = s[*i+2]
+ fallthrough
+ case 2:
+ emitter.buffer[p+1] = s[*i+1]
+ fallthrough
+ case 1:
+ emitter.buffer[p+0] = s[*i+0]
+ default:
+ panic("unknown character width")
+ }
+ emitter.column++
+ emitter.buffer_pos += w
+ *i += w
+ return true
+}
+
+// Write a whole string into buffer.
+func write_all(emitter *yaml_emitter_t, s []byte) bool {
+ for i := 0; i < len(s); {
+ if !write(emitter, s, &i) {
+ return false
+ }
+ }
+ return true
+}
+
+// Copy a line break character from a string into buffer.
+func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
+ if s[*i] == '\n' {
+ if !put_break(emitter) {
+ return false
+ }
+ *i++
+ } else {
+ if !write(emitter, s, i) {
+ return false
+ }
+ emitter.column = 0
+ emitter.line++
+ }
+ return true
+}
+
+// Set an emitter error and return false.
+func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
+ emitter.error = yaml_EMITTER_ERROR
+ emitter.problem = problem
+ return false
+}
+
+// Emit an event.
+func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ emitter.events = append(emitter.events, *event)
+ for !yaml_emitter_need_more_events(emitter) {
+ event := &emitter.events[emitter.events_head]
+ if !yaml_emitter_analyze_event(emitter, event) {
+ return false
+ }
+ if !yaml_emitter_state_machine(emitter, event) {
+ return false
+ }
+ yaml_event_delete(event)
+ emitter.events_head++
+ }
+ return true
+}
+
+// Check if we need to accumulate more events before emitting.
+//
+// We accumulate extra
+// - 1 event for DOCUMENT-START
+// - 2 events for SEQUENCE-START
+// - 3 events for MAPPING-START
+//
+func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
+ if emitter.events_head == len(emitter.events) {
+ return true
+ }
+ var accumulate int
+ switch emitter.events[emitter.events_head].typ {
+ case yaml_DOCUMENT_START_EVENT:
+ accumulate = 1
+ break
+ case yaml_SEQUENCE_START_EVENT:
+ accumulate = 2
+ break
+ case yaml_MAPPING_START_EVENT:
+ accumulate = 3
+ break
+ default:
+ return false
+ }
+ if len(emitter.events)-emitter.events_head > accumulate {
+ return false
+ }
+ var level int
+ for i := emitter.events_head; i < len(emitter.events); i++ {
+ switch emitter.events[i].typ {
+ case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
+ level++
+ case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
+ level--
+ }
+ if level == 0 {
+ return false
+ }
+ }
+ return true
+}
+
+// Append a directive to the directives stack.
+func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
+ for i := 0; i < len(emitter.tag_directives); i++ {
+ if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
+ if allow_duplicates {
+ return true
+ }
+ return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
+ }
+ }
+
+ // [Go] Do we actually need to copy this given garbage collection
+ // and the lack of deallocating destructors?
+ tag_copy := yaml_tag_directive_t{
+ handle: make([]byte, len(value.handle)),
+ prefix: make([]byte, len(value.prefix)),
+ }
+ copy(tag_copy.handle, value.handle)
+ copy(tag_copy.prefix, value.prefix)
+ emitter.tag_directives = append(emitter.tag_directives, tag_copy)
+ return true
+}
+
+// Increase the indentation level.
+func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
+ emitter.indents = append(emitter.indents, emitter.indent)
+ if emitter.indent < 0 {
+ if flow {
+ emitter.indent = emitter.best_indent
+ } else {
+ emitter.indent = 0
+ }
+ } else if !indentless {
+ emitter.indent += emitter.best_indent
+ }
+ return true
+}
+
+// State dispatcher.
+func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ switch emitter.state {
+ default:
+ case yaml_EMIT_STREAM_START_STATE:
+ return yaml_emitter_emit_stream_start(emitter, event)
+
+ case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
+ return yaml_emitter_emit_document_start(emitter, event, true)
+
+ case yaml_EMIT_DOCUMENT_START_STATE:
+ return yaml_emitter_emit_document_start(emitter, event, false)
+
+ case yaml_EMIT_DOCUMENT_CONTENT_STATE:
+ return yaml_emitter_emit_document_content(emitter, event)
+
+ case yaml_EMIT_DOCUMENT_END_STATE:
+ return yaml_emitter_emit_document_end(emitter, event)
+
+ case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
+ return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
+
+ case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
+ return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
+
+ case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
+ return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
+
+ case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
+ return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
+
+ case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
+ return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
+
+ case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
+ return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
+
+ case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
+ return yaml_emitter_emit_block_sequence_item(emitter, event, true)
+
+ case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
+ return yaml_emitter_emit_block_sequence_item(emitter, event, false)
+
+ case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return yaml_emitter_emit_block_mapping_key(emitter, event, true)
+
+ case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
+ return yaml_emitter_emit_block_mapping_key(emitter, event, false)
+
+ case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
+ return yaml_emitter_emit_block_mapping_value(emitter, event, true)
+
+ case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
+ return yaml_emitter_emit_block_mapping_value(emitter, event, false)
+
+ case yaml_EMIT_END_STATE:
+ return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
+ }
+ panic("invalid emitter state")
+}
+
+// Expect STREAM-START.
+func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if event.typ != yaml_STREAM_START_EVENT {
+ return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
+ }
+ if emitter.encoding == yaml_ANY_ENCODING {
+ emitter.encoding = event.encoding
+ if emitter.encoding == yaml_ANY_ENCODING {
+ emitter.encoding = yaml_UTF8_ENCODING
+ }
+ }
+ if emitter.best_indent < 2 || emitter.best_indent > 9 {
+ emitter.best_indent = 2
+ }
+ if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
+ emitter.best_width = 80
+ }
+ if emitter.best_width < 0 {
+ emitter.best_width = 1<<31 - 1
+ }
+ if emitter.line_break == yaml_ANY_BREAK {
+ emitter.line_break = yaml_LN_BREAK
+ }
+
+ emitter.indent = -1
+ emitter.line = 0
+ emitter.column = 0
+ emitter.whitespace = true
+ emitter.indention = true
+
+ if emitter.encoding != yaml_UTF8_ENCODING {
+ if !yaml_emitter_write_bom(emitter) {
+ return false
+ }
+ }
+ emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
+ return true
+}
+
+// Expect DOCUMENT-START or STREAM-END.
+func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+
+ if event.typ == yaml_DOCUMENT_START_EVENT {
+
+ if event.version_directive != nil {
+ if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
+ return false
+ }
+ }
+
+ for i := 0; i < len(event.tag_directives); i++ {
+ tag_directive := &event.tag_directives[i]
+ if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
+ return false
+ }
+ if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
+ return false
+ }
+ }
+
+ for i := 0; i < len(default_tag_directives); i++ {
+ tag_directive := &default_tag_directives[i]
+ if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
+ return false
+ }
+ }
+
+ implicit := event.implicit
+ if !first || emitter.canonical {
+ implicit = false
+ }
+
+ if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
+ if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+
+ if event.version_directive != nil {
+ implicit = false
+ if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+
+ if len(event.tag_directives) > 0 {
+ implicit = false
+ for i := 0; i < len(event.tag_directives); i++ {
+ tag_directive := &event.tag_directives[i]
+ if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
+ return false
+ }
+ if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ }
+
+ if yaml_emitter_check_empty_document(emitter) {
+ implicit = false
+ }
+ if !implicit {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
+ return false
+ }
+ if emitter.canonical {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ }
+
+ emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
+ return true
+ }
+
+ if event.typ == yaml_STREAM_END_EVENT {
+ if emitter.open_ended {
+ if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_flush(emitter) {
+ return false
+ }
+ emitter.state = yaml_EMIT_END_STATE
+ return true
+ }
+
+ return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
+}
+
+// Expect the root node.
+func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
+ return yaml_emitter_emit_node(emitter, event, true, false, false, false)
+}
+
+// Expect DOCUMENT-END.
+func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if event.typ != yaml_DOCUMENT_END_EVENT {
+ return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !event.implicit {
+ // [Go] Allocate the slice elsewhere.
+ if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_flush(emitter) {
+ return false
+ }
+ emitter.state = yaml_EMIT_DOCUMENT_START_STATE
+ emitter.tag_directives = emitter.tag_directives[:0]
+ return true
+}
+
+// Expect a flow item node.
+func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
+ return false
+ }
+ if !yaml_emitter_increase_indent(emitter, true, false) {
+ return false
+ }
+ emitter.flow_level++
+ }
+
+ if event.typ == yaml_SEQUENCE_END_EVENT {
+ emitter.flow_level--
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ if emitter.canonical && !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+
+ return true
+ }
+
+ if !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ }
+
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, true, false, false)
+}
+
+// Expect a flow key node.
+func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
+ return false
+ }
+ if !yaml_emitter_increase_indent(emitter, true, false) {
+ return false
+ }
+ emitter.flow_level++
+ }
+
+ if event.typ == yaml_MAPPING_END_EVENT {
+ emitter.flow_level--
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ if emitter.canonical && !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+
+ if !first {
+ if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
+ return false
+ }
+ }
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+
+ if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, true)
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a flow value node.
+func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
+ if simple {
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
+ return false
+ }
+ } else {
+ if emitter.canonical || emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
+ return false
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a block item node.
+func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
+ return false
+ }
+ }
+ if event.typ == yaml_SEQUENCE_END_EVENT {
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, true, false, false)
+}
+
+// Expect a block key node.
+func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
+ if first {
+ if !yaml_emitter_increase_indent(emitter, false, false) {
+ return false
+ }
+ }
+ if event.typ == yaml_MAPPING_END_EVENT {
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+ }
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if yaml_emitter_check_simple_key(emitter) {
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, true)
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
+ return false
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a block value node.
+func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
+ if simple {
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
+ return false
+ }
+ } else {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
+ return false
+ }
+ }
+ emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
+ return yaml_emitter_emit_node(emitter, event, false, false, true, false)
+}
+
+// Expect a node.
+func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
+ root bool, sequence bool, mapping bool, simple_key bool) bool {
+
+ emitter.root_context = root
+ emitter.sequence_context = sequence
+ emitter.mapping_context = mapping
+ emitter.simple_key_context = simple_key
+
+ switch event.typ {
+ case yaml_ALIAS_EVENT:
+ return yaml_emitter_emit_alias(emitter, event)
+ case yaml_SCALAR_EVENT:
+ return yaml_emitter_emit_scalar(emitter, event)
+ case yaml_SEQUENCE_START_EVENT:
+ return yaml_emitter_emit_sequence_start(emitter, event)
+ case yaml_MAPPING_START_EVENT:
+ return yaml_emitter_emit_mapping_start(emitter, event)
+ default:
+ return yaml_emitter_set_emitter_error(emitter,
+ fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ))
+ }
+}
+
+// Expect ALIAS.
+func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+}
+
+// Expect SCALAR.
+func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_select_scalar_style(emitter, event) {
+ return false
+ }
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ if !yaml_emitter_process_tag(emitter) {
+ return false
+ }
+ if !yaml_emitter_increase_indent(emitter, true, false) {
+ return false
+ }
+ if !yaml_emitter_process_scalar(emitter) {
+ return false
+ }
+ emitter.indent = emitter.indents[len(emitter.indents)-1]
+ emitter.indents = emitter.indents[:len(emitter.indents)-1]
+ emitter.state = emitter.states[len(emitter.states)-1]
+ emitter.states = emitter.states[:len(emitter.states)-1]
+ return true
+}
+
+// Expect SEQUENCE-START.
+func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ if !yaml_emitter_process_tag(emitter) {
+ return false
+ }
+ if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
+ yaml_emitter_check_empty_sequence(emitter) {
+ emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
+ } else {
+ emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
+ }
+ return true
+}
+
+// Expect MAPPING-START.
+func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+ if !yaml_emitter_process_anchor(emitter) {
+ return false
+ }
+ if !yaml_emitter_process_tag(emitter) {
+ return false
+ }
+ if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
+ yaml_emitter_check_empty_mapping(emitter) {
+ emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
+ } else {
+ emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
+ }
+ return true
+}
+
+// Check if the document content is an empty scalar.
+func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
+ return false // [Go] Huh?
+}
+
+// Check if the next events represent an empty sequence.
+func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
+ if len(emitter.events)-emitter.events_head < 2 {
+ return false
+ }
+ return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
+ emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
+}
+
+// Check if the next events represent an empty mapping.
+func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
+ if len(emitter.events)-emitter.events_head < 2 {
+ return false
+ }
+ return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
+ emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
+}
+
+// Check if the next node can be expressed as a simple key.
+func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
+ length := 0
+ switch emitter.events[emitter.events_head].typ {
+ case yaml_ALIAS_EVENT:
+ length += len(emitter.anchor_data.anchor)
+ case yaml_SCALAR_EVENT:
+ if emitter.scalar_data.multiline {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix) +
+ len(emitter.scalar_data.value)
+ case yaml_SEQUENCE_START_EVENT:
+ if !yaml_emitter_check_empty_sequence(emitter) {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix)
+ case yaml_MAPPING_START_EVENT:
+ if !yaml_emitter_check_empty_mapping(emitter) {
+ return false
+ }
+ length += len(emitter.anchor_data.anchor) +
+ len(emitter.tag_data.handle) +
+ len(emitter.tag_data.suffix)
+ default:
+ return false
+ }
+ return length <= 128
+}
+
+// Determine an acceptable scalar style.
+func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+
+ no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
+ if no_tag && !event.implicit && !event.quoted_implicit {
+ return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
+ }
+
+ style := event.scalar_style()
+ if style == yaml_ANY_SCALAR_STYLE {
+ style = yaml_PLAIN_SCALAR_STYLE
+ }
+ if emitter.canonical {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ if emitter.simple_key_context && emitter.scalar_data.multiline {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+
+ if style == yaml_PLAIN_SCALAR_STYLE {
+ if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
+ emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ if no_tag && !event.implicit {
+ style = yaml_SINGLE_QUOTED_SCALAR_STYLE
+ }
+ }
+ if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
+ if !emitter.scalar_data.single_quoted_allowed {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ }
+ if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
+ if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ }
+
+ if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
+ emitter.tag_data.handle = []byte{'!'}
+ }
+ emitter.scalar_data.style = style
+ return true
+}
+
+// Write an achor.
+func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
+ if emitter.anchor_data.anchor == nil {
+ return true
+ }
+ c := []byte{'&'}
+ if emitter.anchor_data.alias {
+ c[0] = '*'
+ }
+ if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
+ return false
+ }
+ return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
+}
+
+// Write a tag.
+func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
+ if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
+ return true
+ }
+ if len(emitter.tag_data.handle) > 0 {
+ if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
+ return false
+ }
+ if len(emitter.tag_data.suffix) > 0 {
+ if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
+ return false
+ }
+ }
+ } else {
+ // [Go] Allocate these slices elsewhere.
+ if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
+ return false
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
+ return false
+ }
+ }
+ return true
+}
+
+// Write a scalar.
+func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
+ switch emitter.scalar_data.style {
+ case yaml_PLAIN_SCALAR_STYLE:
+ return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_SINGLE_QUOTED_SCALAR_STYLE:
+ return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
+ return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
+
+ case yaml_LITERAL_SCALAR_STYLE:
+ return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
+
+ case yaml_FOLDED_SCALAR_STYLE:
+ return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
+ }
+ panic("unknown scalar style")
+}
+
+// Check if a %YAML directive is valid.
+func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
+ if version_directive.major != 1 || version_directive.minor != 1 {
+ return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
+ }
+ return true
+}
+
+// Check if a %TAG directive is valid.
+func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
+ handle := tag_directive.handle
+ prefix := tag_directive.prefix
+ if len(handle) == 0 {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
+ }
+ if handle[0] != '!' {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
+ }
+ if handle[len(handle)-1] != '!' {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
+ }
+ for i := 1; i < len(handle)-1; i += width(handle[i]) {
+ if !is_alpha(handle, i) {
+ return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
+ }
+ }
+ if len(prefix) == 0 {
+ return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
+ }
+ return true
+}
+
+// Check if an anchor is valid.
+func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
+ if len(anchor) == 0 {
+ problem := "anchor value must not be empty"
+ if alias {
+ problem = "alias value must not be empty"
+ }
+ return yaml_emitter_set_emitter_error(emitter, problem)
+ }
+ for i := 0; i < len(anchor); i += width(anchor[i]) {
+ if !is_alpha(anchor, i) {
+ problem := "anchor value must contain alphanumerical characters only"
+ if alias {
+ problem = "alias value must contain alphanumerical characters only"
+ }
+ return yaml_emitter_set_emitter_error(emitter, problem)
+ }
+ }
+ emitter.anchor_data.anchor = anchor
+ emitter.anchor_data.alias = alias
+ return true
+}
+
+// Check if a tag is valid.
+func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
+ if len(tag) == 0 {
+ return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
+ }
+ for i := 0; i < len(emitter.tag_directives); i++ {
+ tag_directive := &emitter.tag_directives[i]
+ if bytes.HasPrefix(tag, tag_directive.prefix) {
+ emitter.tag_data.handle = tag_directive.handle
+ emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
+ return true
+ }
+ }
+ emitter.tag_data.suffix = tag
+ return true
+}
+
+// Check if a scalar is valid.
+func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
+ var (
+ block_indicators = false
+ flow_indicators = false
+ line_breaks = false
+ special_characters = false
+
+ leading_space = false
+ leading_break = false
+ trailing_space = false
+ trailing_break = false
+ break_space = false
+ space_break = false
+
+ preceded_by_whitespace = false
+ followed_by_whitespace = false
+ previous_space = false
+ previous_break = false
+ )
+
+ emitter.scalar_data.value = value
+
+ if len(value) == 0 {
+ emitter.scalar_data.multiline = false
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = true
+ emitter.scalar_data.single_quoted_allowed = true
+ emitter.scalar_data.block_allowed = false
+ return true
+ }
+
+ if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
+ block_indicators = true
+ flow_indicators = true
+ }
+
+ preceded_by_whitespace = true
+ for i, w := 0, 0; i < len(value); i += w {
+ w = width(value[i])
+ followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
+
+ if i == 0 {
+ switch value[i] {
+ case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
+ flow_indicators = true
+ block_indicators = true
+ case '?', ':':
+ flow_indicators = true
+ if followed_by_whitespace {
+ block_indicators = true
+ }
+ case '-':
+ if followed_by_whitespace {
+ flow_indicators = true
+ block_indicators = true
+ }
+ }
+ } else {
+ switch value[i] {
+ case ',', '?', '[', ']', '{', '}':
+ flow_indicators = true
+ case ':':
+ flow_indicators = true
+ if followed_by_whitespace {
+ block_indicators = true
+ }
+ case '#':
+ if preceded_by_whitespace {
+ flow_indicators = true
+ block_indicators = true
+ }
+ }
+ }
+
+ if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
+ special_characters = true
+ }
+ if is_space(value, i) {
+ if i == 0 {
+ leading_space = true
+ }
+ if i+width(value[i]) == len(value) {
+ trailing_space = true
+ }
+ if previous_break {
+ break_space = true
+ }
+ previous_space = true
+ previous_break = false
+ } else if is_break(value, i) {
+ line_breaks = true
+ if i == 0 {
+ leading_break = true
+ }
+ if i+width(value[i]) == len(value) {
+ trailing_break = true
+ }
+ if previous_space {
+ space_break = true
+ }
+ previous_space = false
+ previous_break = true
+ } else {
+ previous_space = false
+ previous_break = false
+ }
+
+ // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
+ preceded_by_whitespace = is_blankz(value, i)
+ }
+
+ emitter.scalar_data.multiline = line_breaks
+ emitter.scalar_data.flow_plain_allowed = true
+ emitter.scalar_data.block_plain_allowed = true
+ emitter.scalar_data.single_quoted_allowed = true
+ emitter.scalar_data.block_allowed = true
+
+ if leading_space || leading_break || trailing_space || trailing_break {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ if trailing_space {
+ emitter.scalar_data.block_allowed = false
+ }
+ if break_space {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ emitter.scalar_data.single_quoted_allowed = false
+ }
+ if space_break || special_characters {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ emitter.scalar_data.single_quoted_allowed = false
+ emitter.scalar_data.block_allowed = false
+ }
+ if line_breaks {
+ emitter.scalar_data.flow_plain_allowed = false
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ if flow_indicators {
+ emitter.scalar_data.flow_plain_allowed = false
+ }
+ if block_indicators {
+ emitter.scalar_data.block_plain_allowed = false
+ }
+ return true
+}
+
+// Check if the event data is valid.
+func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
+
+ emitter.anchor_data.anchor = nil
+ emitter.tag_data.handle = nil
+ emitter.tag_data.suffix = nil
+ emitter.scalar_data.value = nil
+
+ switch event.typ {
+ case yaml_ALIAS_EVENT:
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
+ return false
+ }
+
+ case yaml_SCALAR_EVENT:
+ if len(event.anchor) > 0 {
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
+ if !yaml_emitter_analyze_tag(emitter, event.tag) {
+ return false
+ }
+ }
+ if !yaml_emitter_analyze_scalar(emitter, event.value) {
+ return false
+ }
+
+ case yaml_SEQUENCE_START_EVENT:
+ if len(event.anchor) > 0 {
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
+ if !yaml_emitter_analyze_tag(emitter, event.tag) {
+ return false
+ }
+ }
+
+ case yaml_MAPPING_START_EVENT:
+ if len(event.anchor) > 0 {
+ if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
+ return false
+ }
+ }
+ if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
+ if !yaml_emitter_analyze_tag(emitter, event.tag) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+// Write the BOM character.
+func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
+ if !flush(emitter) {
+ return false
+ }
+ pos := emitter.buffer_pos
+ emitter.buffer[pos+0] = '\xEF'
+ emitter.buffer[pos+1] = '\xBB'
+ emitter.buffer[pos+2] = '\xBF'
+ emitter.buffer_pos += 3
+ return true
+}
+
+func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
+ indent := emitter.indent
+ if indent < 0 {
+ indent = 0
+ }
+ if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ for emitter.column < indent {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ emitter.whitespace = true
+ emitter.indention = true
+ return true
+}
+
+func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
+ if need_whitespace && !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ if !write_all(emitter, indicator) {
+ return false
+ }
+ emitter.whitespace = is_whitespace
+ emitter.indention = (emitter.indention && is_indention)
+ emitter.open_ended = false
+ return true
+}
+
+func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
+ if !write_all(emitter, value) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
+ if !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ if !write_all(emitter, value) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
+ if need_whitespace && !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+ for i := 0; i < len(value); {
+ var must_write bool
+ switch value[i] {
+ case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
+ must_write = true
+ default:
+ must_write = is_alpha(value, i)
+ }
+ if must_write {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ } else {
+ w := width(value[i])
+ for k := 0; k < w; k++ {
+ octet := value[i]
+ i++
+ if !put(emitter, '%') {
+ return false
+ }
+
+ c := octet >> 4
+ if c < 10 {
+ c += '0'
+ } else {
+ c += 'A' - 10
+ }
+ if !put(emitter, c) {
+ return false
+ }
+
+ c = octet & 0x0f
+ if c < 10 {
+ c += '0'
+ } else {
+ c += 'A' - 10
+ }
+ if !put(emitter, c) {
+ return false
+ }
+ }
+ }
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
+ if !emitter.whitespace {
+ if !put(emitter, ' ') {
+ return false
+ }
+ }
+
+ spaces := false
+ breaks := false
+ for i := 0; i < len(value); {
+ if is_space(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ }
+ spaces = true
+ } else if is_break(value, i) {
+ if !breaks && value[i] == '\n' {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !write(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = false
+ spaces = false
+ breaks = false
+ }
+ }
+
+ emitter.whitespace = false
+ emitter.indention = false
+ if emitter.root_context {
+ emitter.open_ended = true
+ }
+
+ return true
+}
+
+func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
+
+ if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
+ return false
+ }
+
+ spaces := false
+ breaks := false
+ for i := 0; i < len(value); {
+ if is_space(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ }
+ spaces = true
+ } else if is_break(value, i) {
+ if !breaks && value[i] == '\n' {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if value[i] == '\'' {
+ if !put(emitter, '\'') {
+ return false
+ }
+ }
+ if !write(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = false
+ spaces = false
+ breaks = false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
+ spaces := false
+ if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
+ return false
+ }
+
+ for i := 0; i < len(value); {
+ if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
+ is_bom(value, i) || is_break(value, i) ||
+ value[i] == '"' || value[i] == '\\' {
+
+ octet := value[i]
+
+ var w int
+ var v rune
+ switch {
+ case octet&0x80 == 0x00:
+ w, v = 1, rune(octet&0x7F)
+ case octet&0xE0 == 0xC0:
+ w, v = 2, rune(octet&0x1F)
+ case octet&0xF0 == 0xE0:
+ w, v = 3, rune(octet&0x0F)
+ case octet&0xF8 == 0xF0:
+ w, v = 4, rune(octet&0x07)
+ }
+ for k := 1; k < w; k++ {
+ octet = value[i+k]
+ v = (v << 6) + (rune(octet) & 0x3F)
+ }
+ i += w
+
+ if !put(emitter, '\\') {
+ return false
+ }
+
+ var ok bool
+ switch v {
+ case 0x00:
+ ok = put(emitter, '0')
+ case 0x07:
+ ok = put(emitter, 'a')
+ case 0x08:
+ ok = put(emitter, 'b')
+ case 0x09:
+ ok = put(emitter, 't')
+ case 0x0A:
+ ok = put(emitter, 'n')
+ case 0x0b:
+ ok = put(emitter, 'v')
+ case 0x0c:
+ ok = put(emitter, 'f')
+ case 0x0d:
+ ok = put(emitter, 'r')
+ case 0x1b:
+ ok = put(emitter, 'e')
+ case 0x22:
+ ok = put(emitter, '"')
+ case 0x5c:
+ ok = put(emitter, '\\')
+ case 0x85:
+ ok = put(emitter, 'N')
+ case 0xA0:
+ ok = put(emitter, '_')
+ case 0x2028:
+ ok = put(emitter, 'L')
+ case 0x2029:
+ ok = put(emitter, 'P')
+ default:
+ if v <= 0xFF {
+ ok = put(emitter, 'x')
+ w = 2
+ } else if v <= 0xFFFF {
+ ok = put(emitter, 'u')
+ w = 4
+ } else {
+ ok = put(emitter, 'U')
+ w = 8
+ }
+ for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
+ digit := byte((v >> uint(k)) & 0x0F)
+ if digit < 10 {
+ ok = put(emitter, digit+'0')
+ } else {
+ ok = put(emitter, digit+'A'-10)
+ }
+ }
+ }
+ if !ok {
+ return false
+ }
+ spaces = false
+ } else if is_space(value, i) {
+ if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ if is_space(value, i+1) {
+ if !put(emitter, '\\') {
+ return false
+ }
+ }
+ i += width(value[i])
+ } else if !write(emitter, value, &i) {
+ return false
+ }
+ spaces = true
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ spaces = false
+ }
+ }
+ if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
+ return false
+ }
+ emitter.whitespace = false
+ emitter.indention = false
+ return true
+}
+
+func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
+ if is_space(value, 0) || is_break(value, 0) {
+ indent_hint := []byte{'0' + byte(emitter.best_indent)}
+ if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
+ return false
+ }
+ }
+
+ emitter.open_ended = false
+
+ var chomp_hint [1]byte
+ if len(value) == 0 {
+ chomp_hint[0] = '-'
+ } else {
+ i := len(value) - 1
+ for value[i]&0xC0 == 0x80 {
+ i--
+ }
+ if !is_break(value, i) {
+ chomp_hint[0] = '-'
+ } else if i == 0 {
+ chomp_hint[0] = '+'
+ emitter.open_ended = true
+ } else {
+ i--
+ for value[i]&0xC0 == 0x80 {
+ i--
+ }
+ if is_break(value, i) {
+ chomp_hint[0] = '+'
+ emitter.open_ended = true
+ }
+ }
+ }
+ if chomp_hint[0] != 0 {
+ if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
+ return false
+ }
+ }
+ return true
+}
+
+func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
+ if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_block_scalar_hints(emitter, value) {
+ return false
+ }
+ if !put_break(emitter) {
+ return false
+ }
+ emitter.indention = true
+ emitter.whitespace = true
+ breaks := true
+ for i := 0; i < len(value); {
+ if is_break(value, i) {
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ }
+ if !write(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+
+ return true
+}
+
+func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
+ if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
+ return false
+ }
+ if !yaml_emitter_write_block_scalar_hints(emitter, value) {
+ return false
+ }
+
+ if !put_break(emitter) {
+ return false
+ }
+ emitter.indention = true
+ emitter.whitespace = true
+
+ breaks := true
+ leading_spaces := true
+ for i := 0; i < len(value); {
+ if is_break(value, i) {
+ if !breaks && !leading_spaces && value[i] == '\n' {
+ k := 0
+ for is_break(value, k) {
+ k += width(value[k])
+ }
+ if !is_blankz(value, k) {
+ if !put_break(emitter) {
+ return false
+ }
+ }
+ }
+ if !write_break(emitter, value, &i) {
+ return false
+ }
+ emitter.indention = true
+ breaks = true
+ } else {
+ if breaks {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ leading_spaces = is_blank(value, i)
+ }
+ if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
+ if !yaml_emitter_write_indent(emitter) {
+ return false
+ }
+ i += width(value[i])
+ } else {
+ if !write(emitter, value, &i) {
+ return false
+ }
+ }
+ emitter.indention = false
+ breaks = false
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/go-yaml/yaml/encode.go b/vendor/github.com/go-yaml/yaml/encode.go
new file mode 100644
index 0000000000..1e730eff6a
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/encode.go
@@ -0,0 +1,358 @@
+package yaml
+
+import (
+ "encoding"
+ "fmt"
+ "io"
+ "reflect"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+ "unicode/utf8"
+)
+
+type encoder struct {
+ emitter yaml_emitter_t
+ event yaml_event_t
+ out []byte
+ flow bool
+ // doneInit holds whether the initial stream_start_event has been
+ // emitted.
+ doneInit bool
+}
+
+func newEncoder() *encoder {
+ e := &encoder{}
+ yaml_emitter_initialize(&e.emitter)
+ yaml_emitter_set_output_string(&e.emitter, &e.out)
+ yaml_emitter_set_unicode(&e.emitter, true)
+ return e
+}
+
+func newEncoderWithWriter(w io.Writer) *encoder {
+ e := &encoder{}
+ yaml_emitter_initialize(&e.emitter)
+ yaml_emitter_set_output_writer(&e.emitter, w)
+ yaml_emitter_set_unicode(&e.emitter, true)
+ return e
+}
+
+func (e *encoder) init() {
+ if e.doneInit {
+ return
+ }
+ yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)
+ e.emit()
+ e.doneInit = true
+}
+
+func (e *encoder) finish() {
+ e.emitter.open_ended = false
+ yaml_stream_end_event_initialize(&e.event)
+ e.emit()
+}
+
+func (e *encoder) destroy() {
+ yaml_emitter_delete(&e.emitter)
+}
+
+func (e *encoder) emit() {
+ // This will internally delete the e.event value.
+ e.must(yaml_emitter_emit(&e.emitter, &e.event))
+}
+
+func (e *encoder) must(ok bool) {
+ if !ok {
+ msg := e.emitter.problem
+ if msg == "" {
+ msg = "unknown problem generating YAML content"
+ }
+ failf("%s", msg)
+ }
+}
+
+func (e *encoder) marshalDoc(tag string, in reflect.Value) {
+ e.init()
+ yaml_document_start_event_initialize(&e.event, nil, nil, true)
+ e.emit()
+ e.marshal(tag, in)
+ yaml_document_end_event_initialize(&e.event, true)
+ e.emit()
+}
+
+func (e *encoder) marshal(tag string, in reflect.Value) {
+ if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() {
+ e.nilv()
+ return
+ }
+ iface := in.Interface()
+ switch m := iface.(type) {
+ case time.Time, *time.Time:
+ // Although time.Time implements TextMarshaler,
+ // we don't want to treat it as a string for YAML
+ // purposes because YAML has special support for
+ // timestamps.
+ case Marshaler:
+ v, err := m.MarshalYAML()
+ if err != nil {
+ fail(err)
+ }
+ if v == nil {
+ e.nilv()
+ return
+ }
+ in = reflect.ValueOf(v)
+ case encoding.TextMarshaler:
+ text, err := m.MarshalText()
+ if err != nil {
+ fail(err)
+ }
+ in = reflect.ValueOf(string(text))
+ case nil:
+ e.nilv()
+ return
+ }
+ switch in.Kind() {
+ case reflect.Interface:
+ e.marshal(tag, in.Elem())
+ case reflect.Map:
+ e.mapv(tag, in)
+ case reflect.Ptr:
+ if in.Type() == ptrTimeType {
+ e.timev(tag, in.Elem())
+ } else {
+ e.marshal(tag, in.Elem())
+ }
+ case reflect.Struct:
+ if in.Type() == timeType {
+ e.timev(tag, in)
+ } else {
+ e.structv(tag, in)
+ }
+ case reflect.Slice:
+ if in.Type().Elem() == mapItemType {
+ e.itemsv(tag, in)
+ } else {
+ e.slicev(tag, in)
+ }
+ case reflect.String:
+ e.stringv(tag, in)
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ if in.Type() == durationType {
+ e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String()))
+ } else {
+ e.intv(tag, in)
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ e.uintv(tag, in)
+ case reflect.Float32, reflect.Float64:
+ e.floatv(tag, in)
+ case reflect.Bool:
+ e.boolv(tag, in)
+ default:
+ panic("cannot marshal type: " + in.Type().String())
+ }
+}
+
+func (e *encoder) mapv(tag string, in reflect.Value) {
+ e.mappingv(tag, func() {
+ keys := keyList(in.MapKeys())
+ sort.Sort(keys)
+ for _, k := range keys {
+ e.marshal("", k)
+ e.marshal("", in.MapIndex(k))
+ }
+ })
+}
+
+func (e *encoder) itemsv(tag string, in reflect.Value) {
+ e.mappingv(tag, func() {
+ slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem)
+ for _, item := range slice {
+ e.marshal("", reflect.ValueOf(item.Key))
+ e.marshal("", reflect.ValueOf(item.Value))
+ }
+ })
+}
+
+func (e *encoder) structv(tag string, in reflect.Value) {
+ sinfo, err := getStructInfo(in.Type())
+ if err != nil {
+ panic(err)
+ }
+ e.mappingv(tag, func() {
+ for _, info := range sinfo.FieldsList {
+ var value reflect.Value
+ if info.Inline == nil {
+ value = in.Field(info.Num)
+ } else {
+ value = in.FieldByIndex(info.Inline)
+ }
+ if info.OmitEmpty && isZero(value) {
+ continue
+ }
+ e.marshal("", reflect.ValueOf(info.Key))
+ e.flow = info.Flow
+ e.marshal("", value)
+ }
+ if sinfo.InlineMap >= 0 {
+ m := in.Field(sinfo.InlineMap)
+ if m.Len() > 0 {
+ e.flow = false
+ keys := keyList(m.MapKeys())
+ sort.Sort(keys)
+ for _, k := range keys {
+ if _, found := sinfo.FieldsMap[k.String()]; found {
+ panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String()))
+ }
+ e.marshal("", k)
+ e.flow = false
+ e.marshal("", m.MapIndex(k))
+ }
+ }
+ }
+ })
+}
+
+func (e *encoder) mappingv(tag string, f func()) {
+ implicit := tag == ""
+ style := yaml_BLOCK_MAPPING_STYLE
+ if e.flow {
+ e.flow = false
+ style = yaml_FLOW_MAPPING_STYLE
+ }
+ yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)
+ e.emit()
+ f()
+ yaml_mapping_end_event_initialize(&e.event)
+ e.emit()
+}
+
+func (e *encoder) slicev(tag string, in reflect.Value) {
+ implicit := tag == ""
+ style := yaml_BLOCK_SEQUENCE_STYLE
+ if e.flow {
+ e.flow = false
+ style = yaml_FLOW_SEQUENCE_STYLE
+ }
+ e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
+ e.emit()
+ n := in.Len()
+ for i := 0; i < n; i++ {
+ e.marshal("", in.Index(i))
+ }
+ e.must(yaml_sequence_end_event_initialize(&e.event))
+ e.emit()
+}
+
+// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
+//
+// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
+// in YAML 1.2 and by this package, but these should be marshalled quoted for
+// the time being for compatibility with other parsers.
+func isBase60Float(s string) (result bool) {
+ // Fast path.
+ if s == "" {
+ return false
+ }
+ c := s[0]
+ if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 {
+ return false
+ }
+ // Do the full match.
+ return base60float.MatchString(s)
+}
+
+// From http://yaml.org/type/float.html, except the regular expression there
+// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
+var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`)
+
+func (e *encoder) stringv(tag string, in reflect.Value) {
+ var style yaml_scalar_style_t
+ s := in.String()
+ canUsePlain := true
+ switch {
+ case !utf8.ValidString(s):
+ if tag == yaml_BINARY_TAG {
+ failf("explicitly tagged !!binary data must be base64-encoded")
+ }
+ if tag != "" {
+ failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
+ }
+ // It can't be encoded directly as YAML so use a binary tag
+ // and encode it as base64.
+ tag = yaml_BINARY_TAG
+ s = encodeBase64(s)
+ case tag == "":
+ // Check to see if it would resolve to a specific
+ // tag when encoded unquoted. If it doesn't,
+ // there's no need to quote it.
+ rtag, _ := resolve("", s)
+ canUsePlain = rtag == yaml_STR_TAG && !isBase60Float(s)
+ }
+ // Note: it's possible for user code to emit invalid YAML
+ // if they explicitly specify a tag and a string containing
+ // text that's incompatible with that tag.
+ switch {
+ case strings.Contains(s, "\n"):
+ style = yaml_LITERAL_SCALAR_STYLE
+ case canUsePlain:
+ style = yaml_PLAIN_SCALAR_STYLE
+ default:
+ style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ e.emitScalar(s, "", tag, style)
+}
+
+func (e *encoder) boolv(tag string, in reflect.Value) {
+ var s string
+ if in.Bool() {
+ s = "true"
+ } else {
+ s = "false"
+ }
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) intv(tag string, in reflect.Value) {
+ s := strconv.FormatInt(in.Int(), 10)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) uintv(tag string, in reflect.Value) {
+ s := strconv.FormatUint(in.Uint(), 10)
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) timev(tag string, in reflect.Value) {
+ t := in.Interface().(time.Time)
+ if tag == "" {
+ tag = yaml_TIMESTAMP_TAG
+ }
+ e.emitScalar(t.Format(time.RFC3339Nano), "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) floatv(tag string, in reflect.Value) {
+ s := strconv.FormatFloat(in.Float(), 'g', -1, 64)
+ switch s {
+ case "+Inf":
+ s = ".inf"
+ case "-Inf":
+ s = "-.inf"
+ case "NaN":
+ s = ".nan"
+ }
+ e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) nilv() {
+ e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE)
+}
+
+func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) {
+ implicit := tag == ""
+ e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style))
+ e.emit()
+}
diff --git a/vendor/github.com/go-yaml/yaml/parserc.go b/vendor/github.com/go-yaml/yaml/parserc.go
new file mode 100644
index 0000000000..81d05dfe57
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/parserc.go
@@ -0,0 +1,1095 @@
+package yaml
+
+import (
+ "bytes"
+)
+
+// The parser implements the following grammar:
+//
+// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
+// implicit_document ::= block_node DOCUMENT-END*
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// block_node_or_indentless_sequence ::=
+// ALIAS
+// | properties (block_content | indentless_block_sequence)?
+// | block_content
+// | indentless_block_sequence
+// block_node ::= ALIAS
+// | properties block_content?
+// | block_content
+// flow_node ::= ALIAS
+// | properties flow_content?
+// | flow_content
+// properties ::= TAG ANCHOR? | ANCHOR TAG?
+// block_content ::= block_collection | flow_collection | SCALAR
+// flow_content ::= flow_collection | SCALAR
+// block_collection ::= block_sequence | block_mapping
+// flow_collection ::= flow_sequence | flow_mapping
+// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
+// block_mapping ::= BLOCK-MAPPING_START
+// ((KEY block_node_or_indentless_sequence?)?
+// (VALUE block_node_or_indentless_sequence?)?)*
+// BLOCK-END
+// flow_sequence ::= FLOW-SEQUENCE-START
+// (flow_sequence_entry FLOW-ENTRY)*
+// flow_sequence_entry?
+// FLOW-SEQUENCE-END
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// flow_mapping ::= FLOW-MAPPING-START
+// (flow_mapping_entry FLOW-ENTRY)*
+// flow_mapping_entry?
+// FLOW-MAPPING-END
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+
+// Peek the next token in the token queue.
+func peek_token(parser *yaml_parser_t) *yaml_token_t {
+ if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
+ return &parser.tokens[parser.tokens_head]
+ }
+ return nil
+}
+
+// Remove the next token from the queue (must be called after peek_token).
+func skip_token(parser *yaml_parser_t) {
+ parser.token_available = false
+ parser.tokens_parsed++
+ parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
+ parser.tokens_head++
+}
+
+// Get the next event.
+func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
+ // Erase the event object.
+ *event = yaml_event_t{}
+
+ // No events after the end of the stream or error.
+ if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
+ return true
+ }
+
+ // Generate the next event.
+ return yaml_parser_state_machine(parser, event)
+}
+
+// Set parser error.
+func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
+ parser.error = yaml_PARSER_ERROR
+ parser.problem = problem
+ parser.problem_mark = problem_mark
+ return false
+}
+
+func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool {
+ parser.error = yaml_PARSER_ERROR
+ parser.context = context
+ parser.context_mark = context_mark
+ parser.problem = problem
+ parser.problem_mark = problem_mark
+ return false
+}
+
+// State dispatcher.
+func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
+ //trace("yaml_parser_state_machine", "state:", parser.state.String())
+
+ switch parser.state {
+ case yaml_PARSE_STREAM_START_STATE:
+ return yaml_parser_parse_stream_start(parser, event)
+
+ case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+ return yaml_parser_parse_document_start(parser, event, true)
+
+ case yaml_PARSE_DOCUMENT_START_STATE:
+ return yaml_parser_parse_document_start(parser, event, false)
+
+ case yaml_PARSE_DOCUMENT_CONTENT_STATE:
+ return yaml_parser_parse_document_content(parser, event)
+
+ case yaml_PARSE_DOCUMENT_END_STATE:
+ return yaml_parser_parse_document_end(parser, event)
+
+ case yaml_PARSE_BLOCK_NODE_STATE:
+ return yaml_parser_parse_node(parser, event, true, false)
+
+ case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+ return yaml_parser_parse_node(parser, event, true, true)
+
+ case yaml_PARSE_FLOW_NODE_STATE:
+ return yaml_parser_parse_node(parser, event, false, false)
+
+ case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+ return yaml_parser_parse_block_sequence_entry(parser, event, true)
+
+ case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+ return yaml_parser_parse_block_sequence_entry(parser, event, false)
+
+ case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+ return yaml_parser_parse_indentless_sequence_entry(parser, event)
+
+ case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return yaml_parser_parse_block_mapping_key(parser, event, true)
+
+ case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
+ return yaml_parser_parse_block_mapping_key(parser, event, false)
+
+ case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
+ return yaml_parser_parse_block_mapping_value(parser, event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+ return yaml_parser_parse_flow_sequence_entry(parser, event, true)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+ return yaml_parser_parse_flow_sequence_entry(parser, event, false)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+ return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+ return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
+
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+ return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
+
+ case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+ return yaml_parser_parse_flow_mapping_key(parser, event, true)
+
+ case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
+ return yaml_parser_parse_flow_mapping_key(parser, event, false)
+
+ case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
+ return yaml_parser_parse_flow_mapping_value(parser, event, false)
+
+ case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+ return yaml_parser_parse_flow_mapping_value(parser, event, true)
+
+ default:
+ panic("invalid parser state")
+ }
+}
+
+// Parse the production:
+// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
+// ************
+func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_STREAM_START_TOKEN {
+ return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark)
+ }
+ parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
+ *event = yaml_event_t{
+ typ: yaml_STREAM_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ encoding: token.encoding,
+ }
+ skip_token(parser)
+ return true
+}
+
+// Parse the productions:
+// implicit_document ::= block_node DOCUMENT-END*
+// *
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// *************************
+func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ // Parse extra document end indicators.
+ if !implicit {
+ for token.typ == yaml_DOCUMENT_END_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+ }
+
+ if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
+ token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
+ token.typ != yaml_DOCUMENT_START_TOKEN &&
+ token.typ != yaml_STREAM_END_TOKEN {
+ // Parse an implicit document.
+ if !yaml_parser_process_directives(parser, nil, nil) {
+ return false
+ }
+ parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
+ parser.state = yaml_PARSE_BLOCK_NODE_STATE
+
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ } else if token.typ != yaml_STREAM_END_TOKEN {
+ // Parse an explicit document.
+ var version_directive *yaml_version_directive_t
+ var tag_directives []yaml_tag_directive_t
+ start_mark := token.start_mark
+ if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
+ return false
+ }
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_DOCUMENT_START_TOKEN {
+ yaml_parser_set_parser_error(parser,
+ "did not find expected ", token.start_mark)
+ return false
+ }
+ parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
+ parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
+ end_mark := token.end_mark
+
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ version_directive: version_directive,
+ tag_directives: tag_directives,
+ implicit: false,
+ }
+ skip_token(parser)
+
+ } else {
+ // Parse the stream end.
+ parser.state = yaml_PARSE_END_STATE
+ *event = yaml_event_t{
+ typ: yaml_STREAM_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ skip_token(parser)
+ }
+
+ return true
+}
+
+// Parse the productions:
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+// ***********
+//
+func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
+ token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
+ token.typ == yaml_DOCUMENT_START_TOKEN ||
+ token.typ == yaml_DOCUMENT_END_TOKEN ||
+ token.typ == yaml_STREAM_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ return yaml_parser_process_empty_scalar(parser, event,
+ token.start_mark)
+ }
+ return yaml_parser_parse_node(parser, event, true, false)
+}
+
+// Parse the productions:
+// implicit_document ::= block_node DOCUMENT-END*
+// *************
+// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+//
+func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ start_mark := token.start_mark
+ end_mark := token.start_mark
+
+ implicit := true
+ if token.typ == yaml_DOCUMENT_END_TOKEN {
+ end_mark = token.end_mark
+ skip_token(parser)
+ implicit = false
+ }
+
+ parser.tag_directives = parser.tag_directives[:0]
+
+ parser.state = yaml_PARSE_DOCUMENT_START_STATE
+ *event = yaml_event_t{
+ typ: yaml_DOCUMENT_END_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ implicit: implicit,
+ }
+ return true
+}
+
+// Parse the productions:
+// block_node_or_indentless_sequence ::=
+// ALIAS
+// *****
+// | properties (block_content | indentless_block_sequence)?
+// ********** *
+// | block_content | indentless_block_sequence
+// *
+// block_node ::= ALIAS
+// *****
+// | properties block_content?
+// ********** *
+// | block_content
+// *
+// flow_node ::= ALIAS
+// *****
+// | properties flow_content?
+// ********** *
+// | flow_content
+// *
+// properties ::= TAG ANCHOR? | ANCHOR TAG?
+// *************************
+// block_content ::= block_collection | flow_collection | SCALAR
+// ******
+// flow_content ::= flow_collection | SCALAR
+// ******
+func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
+ //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_ALIAS_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ *event = yaml_event_t{
+ typ: yaml_ALIAS_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ anchor: token.value,
+ }
+ skip_token(parser)
+ return true
+ }
+
+ start_mark := token.start_mark
+ end_mark := token.start_mark
+
+ var tag_token bool
+ var tag_handle, tag_suffix, anchor []byte
+ var tag_mark yaml_mark_t
+ if token.typ == yaml_ANCHOR_TOKEN {
+ anchor = token.value
+ start_mark = token.start_mark
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_TAG_TOKEN {
+ tag_token = true
+ tag_handle = token.value
+ tag_suffix = token.suffix
+ tag_mark = token.start_mark
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+ } else if token.typ == yaml_TAG_TOKEN {
+ tag_token = true
+ tag_handle = token.value
+ tag_suffix = token.suffix
+ start_mark = token.start_mark
+ tag_mark = token.start_mark
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_ANCHOR_TOKEN {
+ anchor = token.value
+ end_mark = token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+ }
+
+ var tag []byte
+ if tag_token {
+ if len(tag_handle) == 0 {
+ tag = tag_suffix
+ tag_suffix = nil
+ } else {
+ for i := range parser.tag_directives {
+ if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
+ tag = append([]byte(nil), parser.tag_directives[i].prefix...)
+ tag = append(tag, tag_suffix...)
+ break
+ }
+ }
+ if len(tag) == 0 {
+ yaml_parser_set_parser_error_context(parser,
+ "while parsing a node", start_mark,
+ "found undefined tag handle", tag_mark)
+ return false
+ }
+ }
+ }
+
+ implicit := len(tag) == 0
+ if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if token.typ == yaml_SCALAR_TOKEN {
+ var plain_implicit, quoted_implicit bool
+ end_mark = token.end_mark
+ if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
+ plain_implicit = true
+ } else if len(tag) == 0 {
+ quoted_implicit = true
+ }
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ value: token.value,
+ implicit: plain_implicit,
+ quoted_implicit: quoted_implicit,
+ style: yaml_style_t(token.style),
+ }
+ skip_token(parser)
+ return true
+ }
+ if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
+ // [Go] Some of the events below can be merged as they differ only on style.
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
+ }
+ return true
+ }
+ if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
+ }
+ return true
+ }
+ if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
+ end_mark = token.end_mark
+ parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
+ }
+ return true
+ }
+ if len(anchor) > 0 || len(tag) > 0 {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ anchor: anchor,
+ tag: tag,
+ implicit: implicit,
+ quoted_implicit: false,
+ style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
+ }
+ return true
+ }
+
+ context := "while parsing a flow node"
+ if block {
+ context = "while parsing a block node"
+ }
+ yaml_parser_set_parser_error_context(parser, context, start_mark,
+ "did not find expected node content", token.start_mark)
+ return false
+}
+
+// Parse the productions:
+// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+// ******************** *********** * *********
+//
+func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
+ return yaml_parser_parse_node(parser, event, true, false)
+ } else {
+ parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ }
+ if token.typ == yaml_BLOCK_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ skip_token(parser)
+ return true
+ }
+
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a block collection", context_mark,
+ "did not find expected '-' indicator", token.start_mark)
+}
+
+// Parse the productions:
+// indentless_sequence ::= (BLOCK-ENTRY block_node?)+
+// *********** *
+func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_BLOCK_ENTRY_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
+ token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
+ return yaml_parser_parse_node(parser, event, true, false)
+ }
+ parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark?
+ }
+ return true
+}
+
+// Parse the productions:
+// block_mapping ::= BLOCK-MAPPING_START
+// *******************
+// ((KEY block_node_or_indentless_sequence?)?
+// *** *
+// (VALUE block_node_or_indentless_sequence?)?)*
+//
+// BLOCK-END
+// *********
+//
+func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, true, true)
+ } else {
+ parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ } else if token.typ == yaml_BLOCK_END_TOKEN {
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ skip_token(parser)
+ return true
+ }
+
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a block mapping", context_mark,
+ "did not find expected key", token.start_mark)
+}
+
+// Parse the productions:
+// block_mapping ::= BLOCK-MAPPING_START
+//
+// ((KEY block_node_or_indentless_sequence?)?
+//
+// (VALUE block_node_or_indentless_sequence?)?)*
+// ***** *
+// BLOCK-END
+//
+//
+func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ mark := token.end_mark
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_KEY_TOKEN &&
+ token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_BLOCK_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
+ return yaml_parser_parse_node(parser, event, true, true)
+ }
+ parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+ }
+ parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+}
+
+// Parse the productions:
+// flow_sequence ::= FLOW-SEQUENCE-START
+// *******************
+// (flow_sequence_entry FLOW-ENTRY)*
+// * **********
+// flow_sequence_entry?
+// *
+// FLOW-SEQUENCE-END
+// *****************
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// *
+//
+func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ if !first {
+ if token.typ == yaml_FLOW_ENTRY_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ } else {
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a flow sequence", context_mark,
+ "did not find expected ',' or ']'", token.start_mark)
+ }
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_START_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ implicit: true,
+ style: yaml_style_t(yaml_FLOW_MAPPING_STYLE),
+ }
+ skip_token(parser)
+ return true
+ } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+
+ *event = yaml_event_t{
+ typ: yaml_SEQUENCE_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+
+ skip_token(parser)
+ return true
+}
+
+//
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// *** *
+//
+func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_FLOW_ENTRY_TOKEN &&
+ token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ mark := token.end_mark
+ skip_token(parser)
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
+ return yaml_parser_process_empty_scalar(parser, event, mark)
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// ***** *
+//
+func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ skip_token(parser)
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+}
+
+// Parse the productions:
+// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// *
+//
+func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.start_mark, // [Go] Shouldn't this be end_mark?
+ }
+ return true
+}
+
+// Parse the productions:
+// flow_mapping ::= FLOW-MAPPING-START
+// ******************
+// (flow_mapping_entry FLOW-ENTRY)*
+// * **********
+// flow_mapping_entry?
+// ******************
+// FLOW-MAPPING-END
+// ****************
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// * *** *
+//
+func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
+ if first {
+ token := peek_token(parser)
+ parser.marks = append(parser.marks, token.start_mark)
+ skip_token(parser)
+ }
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ if !first {
+ if token.typ == yaml_FLOW_ENTRY_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ } else {
+ context_mark := parser.marks[len(parser.marks)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ return yaml_parser_set_parser_error_context(parser,
+ "while parsing a flow mapping", context_mark,
+ "did not find expected ',' or '}'", token.start_mark)
+ }
+ }
+
+ if token.typ == yaml_KEY_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_VALUE_TOKEN &&
+ token.typ != yaml_FLOW_ENTRY_TOKEN &&
+ token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ } else {
+ parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+ }
+ } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+
+ parser.state = parser.states[len(parser.states)-1]
+ parser.states = parser.states[:len(parser.states)-1]
+ parser.marks = parser.marks[:len(parser.marks)-1]
+ *event = yaml_event_t{
+ typ: yaml_MAPPING_END_EVENT,
+ start_mark: token.start_mark,
+ end_mark: token.end_mark,
+ }
+ skip_token(parser)
+ return true
+}
+
+// Parse the productions:
+// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+// * ***** *
+//
+func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if empty {
+ parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+ }
+ if token.typ == yaml_VALUE_TOKEN {
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
+ parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
+ return yaml_parser_parse_node(parser, event, false, false)
+ }
+ }
+ parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
+ return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
+}
+
+// Generate an empty scalar event.
+func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
+ *event = yaml_event_t{
+ typ: yaml_SCALAR_EVENT,
+ start_mark: mark,
+ end_mark: mark,
+ value: nil, // Empty
+ implicit: true,
+ style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
+ }
+ return true
+}
+
+var default_tag_directives = []yaml_tag_directive_t{
+ {[]byte("!"), []byte("!")},
+ {[]byte("!!"), []byte("tag:yaml.org,2002:")},
+}
+
+// Parse directives.
+func yaml_parser_process_directives(parser *yaml_parser_t,
+ version_directive_ref **yaml_version_directive_t,
+ tag_directives_ref *[]yaml_tag_directive_t) bool {
+
+ var version_directive *yaml_version_directive_t
+ var tag_directives []yaml_tag_directive_t
+
+ token := peek_token(parser)
+ if token == nil {
+ return false
+ }
+
+ for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
+ if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
+ if version_directive != nil {
+ yaml_parser_set_parser_error(parser,
+ "found duplicate %YAML directive", token.start_mark)
+ return false
+ }
+ if token.major != 1 || token.minor != 1 {
+ yaml_parser_set_parser_error(parser,
+ "found incompatible YAML document", token.start_mark)
+ return false
+ }
+ version_directive = &yaml_version_directive_t{
+ major: token.major,
+ minor: token.minor,
+ }
+ } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
+ value := yaml_tag_directive_t{
+ handle: token.value,
+ prefix: token.prefix,
+ }
+ if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
+ return false
+ }
+ tag_directives = append(tag_directives, value)
+ }
+
+ skip_token(parser)
+ token = peek_token(parser)
+ if token == nil {
+ return false
+ }
+ }
+
+ for i := range default_tag_directives {
+ if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
+ return false
+ }
+ }
+
+ if version_directive_ref != nil {
+ *version_directive_ref = version_directive
+ }
+ if tag_directives_ref != nil {
+ *tag_directives_ref = tag_directives
+ }
+ return true
+}
+
+// Append a tag directive to the directives stack.
+func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
+ for i := range parser.tag_directives {
+ if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
+ if allow_duplicates {
+ return true
+ }
+ return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
+ }
+ }
+
+ // [Go] I suspect the copy is unnecessary. This was likely done
+ // because there was no way to track ownership of the data.
+ value_copy := yaml_tag_directive_t{
+ handle: make([]byte, len(value.handle)),
+ prefix: make([]byte, len(value.prefix)),
+ }
+ copy(value_copy.handle, value.handle)
+ copy(value_copy.prefix, value.prefix)
+ parser.tag_directives = append(parser.tag_directives, value_copy)
+ return true
+}
diff --git a/vendor/github.com/go-yaml/yaml/readerc.go b/vendor/github.com/go-yaml/yaml/readerc.go
new file mode 100644
index 0000000000..f450791717
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/readerc.go
@@ -0,0 +1,394 @@
+package yaml
+
+import (
+ "io"
+)
+
+// Set the reader error and return 0.
+func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool {
+ parser.error = yaml_READER_ERROR
+ parser.problem = problem
+ parser.problem_offset = offset
+ parser.problem_value = value
+ return false
+}
+
+// Byte order marks.
+const (
+ bom_UTF8 = "\xef\xbb\xbf"
+ bom_UTF16LE = "\xff\xfe"
+ bom_UTF16BE = "\xfe\xff"
+)
+
+// Determine the input stream encoding by checking the BOM symbol. If no BOM is
+// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
+func yaml_parser_determine_encoding(parser *yaml_parser_t) bool {
+ // Ensure that we had enough bytes in the raw buffer.
+ for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
+ if !yaml_parser_update_raw_buffer(parser) {
+ return false
+ }
+ }
+
+ // Determine the encoding.
+ buf := parser.raw_buffer
+ pos := parser.raw_buffer_pos
+ avail := len(buf) - pos
+ if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
+ parser.encoding = yaml_UTF16LE_ENCODING
+ parser.raw_buffer_pos += 2
+ parser.offset += 2
+ } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
+ parser.encoding = yaml_UTF16BE_ENCODING
+ parser.raw_buffer_pos += 2
+ parser.offset += 2
+ } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
+ parser.encoding = yaml_UTF8_ENCODING
+ parser.raw_buffer_pos += 3
+ parser.offset += 3
+ } else {
+ parser.encoding = yaml_UTF8_ENCODING
+ }
+ return true
+}
+
+// Update the raw buffer.
+func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool {
+ size_read := 0
+
+ // Return if the raw buffer is full.
+ if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
+ return true
+ }
+
+ // Return on EOF.
+ if parser.eof {
+ return true
+ }
+
+ // Move the remaining bytes in the raw buffer to the beginning.
+ if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
+ copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
+ }
+ parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
+ parser.raw_buffer_pos = 0
+
+ // Call the read handler to fill the buffer.
+ size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
+ parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
+ if err == io.EOF {
+ parser.eof = true
+ } else if err != nil {
+ return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1)
+ }
+ return true
+}
+
+// Ensure that the buffer contains at least `length` characters.
+// Return true on success, false on failure.
+//
+// The length is supposed to be significantly less that the buffer size.
+func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool {
+ if parser.read_handler == nil {
+ panic("read handler must be set")
+ }
+
+ // If the EOF flag is set and the raw buffer is empty, do nothing.
+ if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
+ return true
+ }
+
+ // Return if the buffer contains enough characters.
+ if parser.unread >= length {
+ return true
+ }
+
+ // Determine the input encoding if it is not known yet.
+ if parser.encoding == yaml_ANY_ENCODING {
+ if !yaml_parser_determine_encoding(parser) {
+ return false
+ }
+ }
+
+ // Move the unread characters to the beginning of the buffer.
+ buffer_len := len(parser.buffer)
+ if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
+ copy(parser.buffer, parser.buffer[parser.buffer_pos:])
+ buffer_len -= parser.buffer_pos
+ parser.buffer_pos = 0
+ } else if parser.buffer_pos == buffer_len {
+ buffer_len = 0
+ parser.buffer_pos = 0
+ }
+
+ // Open the whole buffer for writing, and cut it before returning.
+ parser.buffer = parser.buffer[:cap(parser.buffer)]
+
+ // Fill the buffer until it has enough characters.
+ first := true
+ for parser.unread < length {
+
+ // Fill the raw buffer if necessary.
+ if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
+ if !yaml_parser_update_raw_buffer(parser) {
+ parser.buffer = parser.buffer[:buffer_len]
+ return false
+ }
+ }
+ first = false
+
+ // Decode the raw buffer.
+ inner:
+ for parser.raw_buffer_pos != len(parser.raw_buffer) {
+ var value rune
+ var width int
+
+ raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
+
+ // Decode the next character.
+ switch parser.encoding {
+ case yaml_UTF8_ENCODING:
+ // Decode a UTF-8 character. Check RFC 3629
+ // (http://www.ietf.org/rfc/rfc3629.txt) for more details.
+ //
+ // The following table (taken from the RFC) is used for
+ // decoding.
+ //
+ // Char. number range | UTF-8 octet sequence
+ // (hexadecimal) | (binary)
+ // --------------------+------------------------------------
+ // 0000 0000-0000 007F | 0xxxxxxx
+ // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ //
+ // Additionally, the characters in the range 0xD800-0xDFFF
+ // are prohibited as they are reserved for use with UTF-16
+ // surrogate pairs.
+
+ // Determine the length of the UTF-8 sequence.
+ octet := parser.raw_buffer[parser.raw_buffer_pos]
+ switch {
+ case octet&0x80 == 0x00:
+ width = 1
+ case octet&0xE0 == 0xC0:
+ width = 2
+ case octet&0xF0 == 0xE0:
+ width = 3
+ case octet&0xF8 == 0xF0:
+ width = 4
+ default:
+ // The leading octet is invalid.
+ return yaml_parser_set_reader_error(parser,
+ "invalid leading UTF-8 octet",
+ parser.offset, int(octet))
+ }
+
+ // Check if the raw buffer contains an incomplete character.
+ if width > raw_unread {
+ if parser.eof {
+ return yaml_parser_set_reader_error(parser,
+ "incomplete UTF-8 octet sequence",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Decode the leading octet.
+ switch {
+ case octet&0x80 == 0x00:
+ value = rune(octet & 0x7F)
+ case octet&0xE0 == 0xC0:
+ value = rune(octet & 0x1F)
+ case octet&0xF0 == 0xE0:
+ value = rune(octet & 0x0F)
+ case octet&0xF8 == 0xF0:
+ value = rune(octet & 0x07)
+ default:
+ value = 0
+ }
+
+ // Check and decode the trailing octets.
+ for k := 1; k < width; k++ {
+ octet = parser.raw_buffer[parser.raw_buffer_pos+k]
+
+ // Check if the octet is valid.
+ if (octet & 0xC0) != 0x80 {
+ return yaml_parser_set_reader_error(parser,
+ "invalid trailing UTF-8 octet",
+ parser.offset+k, int(octet))
+ }
+
+ // Decode the octet.
+ value = (value << 6) + rune(octet&0x3F)
+ }
+
+ // Check the length of the sequence against the value.
+ switch {
+ case width == 1:
+ case width == 2 && value >= 0x80:
+ case width == 3 && value >= 0x800:
+ case width == 4 && value >= 0x10000:
+ default:
+ return yaml_parser_set_reader_error(parser,
+ "invalid length of a UTF-8 sequence",
+ parser.offset, -1)
+ }
+
+ // Check the range of the value.
+ if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
+ return yaml_parser_set_reader_error(parser,
+ "invalid Unicode character",
+ parser.offset, int(value))
+ }
+
+ case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
+ var low, high int
+ if parser.encoding == yaml_UTF16LE_ENCODING {
+ low, high = 0, 1
+ } else {
+ low, high = 1, 0
+ }
+
+ // The UTF-16 encoding is not as simple as one might
+ // naively think. Check RFC 2781
+ // (http://www.ietf.org/rfc/rfc2781.txt).
+ //
+ // Normally, two subsequent bytes describe a Unicode
+ // character. However a special technique (called a
+ // surrogate pair) is used for specifying character
+ // values larger than 0xFFFF.
+ //
+ // A surrogate pair consists of two pseudo-characters:
+ // high surrogate area (0xD800-0xDBFF)
+ // low surrogate area (0xDC00-0xDFFF)
+ //
+ // The following formulas are used for decoding
+ // and encoding characters using surrogate pairs:
+ //
+ // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF)
+ // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF)
+ // W1 = 110110yyyyyyyyyy
+ // W2 = 110111xxxxxxxxxx
+ //
+ // where U is the character value, W1 is the high surrogate
+ // area, W2 is the low surrogate area.
+
+ // Check for incomplete UTF-16 character.
+ if raw_unread < 2 {
+ if parser.eof {
+ return yaml_parser_set_reader_error(parser,
+ "incomplete UTF-16 character",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Get the character.
+ value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
+ (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
+
+ // Check for unexpected low surrogate area.
+ if value&0xFC00 == 0xDC00 {
+ return yaml_parser_set_reader_error(parser,
+ "unexpected low surrogate area",
+ parser.offset, int(value))
+ }
+
+ // Check for a high surrogate area.
+ if value&0xFC00 == 0xD800 {
+ width = 4
+
+ // Check for incomplete surrogate pair.
+ if raw_unread < 4 {
+ if parser.eof {
+ return yaml_parser_set_reader_error(parser,
+ "incomplete UTF-16 surrogate pair",
+ parser.offset, -1)
+ }
+ break inner
+ }
+
+ // Get the next character.
+ value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
+ (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
+
+ // Check for a low surrogate area.
+ if value2&0xFC00 != 0xDC00 {
+ return yaml_parser_set_reader_error(parser,
+ "expected low surrogate area",
+ parser.offset+2, int(value2))
+ }
+
+ // Generate the value of the surrogate pair.
+ value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
+ } else {
+ width = 2
+ }
+
+ default:
+ panic("impossible")
+ }
+
+ // Check if the character is in the allowed range:
+ // #x9 | #xA | #xD | [#x20-#x7E] (8 bit)
+ // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit)
+ // | [#x10000-#x10FFFF] (32 bit)
+ switch {
+ case value == 0x09:
+ case value == 0x0A:
+ case value == 0x0D:
+ case value >= 0x20 && value <= 0x7E:
+ case value == 0x85:
+ case value >= 0xA0 && value <= 0xD7FF:
+ case value >= 0xE000 && value <= 0xFFFD:
+ case value >= 0x10000 && value <= 0x10FFFF:
+ default:
+ return yaml_parser_set_reader_error(parser,
+ "control characters are not allowed",
+ parser.offset, int(value))
+ }
+
+ // Move the raw pointers.
+ parser.raw_buffer_pos += width
+ parser.offset += width
+
+ // Finally put the character into the buffer.
+ if value <= 0x7F {
+ // 0000 0000-0000 007F . 0xxxxxxx
+ parser.buffer[buffer_len+0] = byte(value)
+ buffer_len += 1
+ } else if value <= 0x7FF {
+ // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
+ parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
+ buffer_len += 2
+ } else if value <= 0xFFFF {
+ // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
+ parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
+ parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
+ buffer_len += 3
+ } else {
+ // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+ parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
+ parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
+ parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
+ parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
+ buffer_len += 4
+ }
+
+ parser.unread++
+ }
+
+ // On EOF, put NUL into the buffer and return.
+ if parser.eof {
+ parser.buffer[buffer_len] = 0
+ buffer_len++
+ parser.unread++
+ break
+ }
+ }
+ parser.buffer = parser.buffer[:buffer_len]
+ return true
+}
diff --git a/vendor/github.com/go-yaml/yaml/resolve.go b/vendor/github.com/go-yaml/yaml/resolve.go
new file mode 100644
index 0000000000..ea90bd5e0d
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/resolve.go
@@ -0,0 +1,245 @@
+package yaml
+
+import (
+ "encoding/base64"
+ "math"
+ "regexp"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type resolveMapItem struct {
+ value interface{}
+ tag string
+}
+
+var resolveTable = make([]byte, 256)
+var resolveMap = make(map[string]resolveMapItem)
+
+func init() {
+ t := resolveTable
+ t[int('+')] = 'S' // Sign
+ t[int('-')] = 'S'
+ for _, c := range "0123456789" {
+ t[int(c)] = 'D' // Digit
+ }
+ for _, c := range "yYnNtTfFoO~" {
+ t[int(c)] = 'M' // In map
+ }
+ t[int('.')] = '.' // Float (potentially in map)
+
+ var resolveMapList = []struct {
+ v interface{}
+ tag string
+ l []string
+ }{
+ {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}},
+ {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}},
+ {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}},
+ {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}},
+ {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}},
+ {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}},
+ {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}},
+ {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}},
+ {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}},
+ {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}},
+ {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}},
+ {"<<", yaml_MERGE_TAG, []string{"<<"}},
+ }
+
+ m := resolveMap
+ for _, item := range resolveMapList {
+ for _, s := range item.l {
+ m[s] = resolveMapItem{item.v, item.tag}
+ }
+ }
+}
+
+const longTagPrefix = "tag:yaml.org,2002:"
+
+func shortTag(tag string) string {
+ // TODO This can easily be made faster and produce less garbage.
+ if strings.HasPrefix(tag, longTagPrefix) {
+ return "!!" + tag[len(longTagPrefix):]
+ }
+ return tag
+}
+
+func longTag(tag string) string {
+ if strings.HasPrefix(tag, "!!") {
+ return longTagPrefix + tag[2:]
+ }
+ return tag
+}
+
+func resolvableTag(tag string) bool {
+ switch tag {
+ case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG, yaml_TIMESTAMP_TAG:
+ return true
+ }
+ return false
+}
+
+var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`)
+
+func resolve(tag string, in string) (rtag string, out interface{}) {
+ if !resolvableTag(tag) {
+ return tag, in
+ }
+
+ defer func() {
+ switch tag {
+ case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG:
+ return
+ }
+ failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
+ }()
+
+ // Any data is accepted as a !!str or !!binary.
+ // Otherwise, the prefix is enough of a hint about what it might be.
+ hint := byte('N')
+ if in != "" {
+ hint = resolveTable[in[0]]
+ }
+ if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG {
+ // Handle things we can lookup in a map.
+ if item, ok := resolveMap[in]; ok {
+ return item.tag, item.value
+ }
+
+ // Base 60 floats are a bad idea, were dropped in YAML 1.2, and
+ // are purposefully unsupported here. They're still quoted on
+ // the way out for compatibility with other parser, though.
+
+ switch hint {
+ case 'M':
+ // We've already checked the map above.
+
+ case '.':
+ // Not in the map, so maybe a normal float.
+ floatv, err := strconv.ParseFloat(in, 64)
+ if err == nil {
+ return yaml_FLOAT_TAG, floatv
+ }
+
+ case 'D', 'S':
+ // Int, float, or timestamp.
+ // Only try values as a timestamp if the value is unquoted or there's an explicit
+ // !!timestamp tag.
+ if tag == "" || tag == yaml_TIMESTAMP_TAG {
+ t, ok := parseTimestamp(in)
+ if ok {
+ return yaml_TIMESTAMP_TAG, t
+ }
+ }
+
+ plain := strings.Replace(in, "_", "", -1)
+ intv, err := strconv.ParseInt(plain, 0, 64)
+ if err == nil {
+ if intv == int64(int(intv)) {
+ return yaml_INT_TAG, int(intv)
+ } else {
+ return yaml_INT_TAG, intv
+ }
+ }
+ uintv, err := strconv.ParseUint(plain, 0, 64)
+ if err == nil {
+ return yaml_INT_TAG, uintv
+ }
+ if yamlStyleFloat.MatchString(plain) {
+ floatv, err := strconv.ParseFloat(plain, 64)
+ if err == nil {
+ return yaml_FLOAT_TAG, floatv
+ }
+ }
+ if strings.HasPrefix(plain, "0b") {
+ intv, err := strconv.ParseInt(plain[2:], 2, 64)
+ if err == nil {
+ if intv == int64(int(intv)) {
+ return yaml_INT_TAG, int(intv)
+ } else {
+ return yaml_INT_TAG, intv
+ }
+ }
+ uintv, err := strconv.ParseUint(plain[2:], 2, 64)
+ if err == nil {
+ return yaml_INT_TAG, uintv
+ }
+ } else if strings.HasPrefix(plain, "-0b") {
+ intv, err := strconv.ParseInt(plain[3:], 2, 64)
+ if err == nil {
+ if intv == int64(int(intv)) {
+ return yaml_INT_TAG, -int(intv)
+ } else {
+ return yaml_INT_TAG, -intv
+ }
+ }
+ }
+ default:
+ panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")")
+ }
+ }
+ return yaml_STR_TAG, in
+}
+
+// encodeBase64 encodes s as base64 that is broken up into multiple lines
+// as appropriate for the resulting length.
+func encodeBase64(s string) string {
+ const lineLen = 70
+ encLen := base64.StdEncoding.EncodedLen(len(s))
+ lines := encLen/lineLen + 1
+ buf := make([]byte, encLen*2+lines)
+ in := buf[0:encLen]
+ out := buf[encLen:]
+ base64.StdEncoding.Encode(in, []byte(s))
+ k := 0
+ for i := 0; i < len(in); i += lineLen {
+ j := i + lineLen
+ if j > len(in) {
+ j = len(in)
+ }
+ k += copy(out[k:], in[i:j])
+ if lines > 1 {
+ out[k] = '\n'
+ k++
+ }
+ }
+ return string(out[:k])
+}
+
+// This is a subset of the formats allowed by the regular expression
+// defined at http://yaml.org/type/timestamp.html.
+var allowedTimestampFormats = []string{
+ "2006-1-2T15:4:5Z07:00",
+ "2006-1-2t15:4:5Z07:00", // RFC3339 with lower-case "t".
+ "2006-1-2 15:4:5", // space separated with no time zone
+ "2006-1-2", // date only
+ // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5"
+ // from the set of examples.
+}
+
+// parseTimestamp parses s as a timestamp string and
+// returns the timestamp and reports whether it succeeded.
+// Timestamp formats are defined at http://yaml.org/type/timestamp.html
+func parseTimestamp(s string) (time.Time, bool) {
+ // TODO write code to check all the formats supported by
+ // http://yaml.org/type/timestamp.html instead of using time.Parse.
+
+ // Quick check: all date formats start with YYYY-.
+ i := 0
+ for ; i < len(s); i++ {
+ if c := s[i]; c < '0' || c > '9' {
+ break
+ }
+ }
+ if i != 4 || i == len(s) || s[i] != '-' {
+ return time.Time{}, false
+ }
+ for _, format := range allowedTimestampFormats {
+ if t, err := time.Parse(format, s); err == nil {
+ return t, true
+ }
+ }
+ return time.Time{}, false
+}
diff --git a/vendor/github.com/go-yaml/yaml/scannerc.go b/vendor/github.com/go-yaml/yaml/scannerc.go
new file mode 100644
index 0000000000..492a9845da
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/scannerc.go
@@ -0,0 +1,2702 @@
+package yaml
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// Introduction
+// ************
+//
+// The following notes assume that you are familiar with the YAML specification
+// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in
+// some cases we are less restrictive that it requires.
+//
+// The process of transforming a YAML stream into a sequence of events is
+// divided on two steps: Scanning and Parsing.
+//
+// The Scanner transforms the input stream into a sequence of tokens, while the
+// parser transform the sequence of tokens produced by the Scanner into a
+// sequence of parsing events.
+//
+// The Scanner is rather clever and complicated. The Parser, on the contrary,
+// is a straightforward implementation of a recursive-descendant parser (or,
+// LL(1) parser, as it is usually called).
+//
+// Actually there are two issues of Scanning that might be called "clever", the
+// rest is quite straightforward. The issues are "block collection start" and
+// "simple keys". Both issues are explained below in details.
+//
+// Here the Scanning step is explained and implemented. We start with the list
+// of all the tokens produced by the Scanner together with short descriptions.
+//
+// Now, tokens:
+//
+// STREAM-START(encoding) # The stream start.
+// STREAM-END # The stream end.
+// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive.
+// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive.
+// DOCUMENT-START # '---'
+// DOCUMENT-END # '...'
+// BLOCK-SEQUENCE-START # Indentation increase denoting a block
+// BLOCK-MAPPING-START # sequence or a block mapping.
+// BLOCK-END # Indentation decrease.
+// FLOW-SEQUENCE-START # '['
+// FLOW-SEQUENCE-END # ']'
+// BLOCK-SEQUENCE-START # '{'
+// BLOCK-SEQUENCE-END # '}'
+// BLOCK-ENTRY # '-'
+// FLOW-ENTRY # ','
+// KEY # '?' or nothing (simple keys).
+// VALUE # ':'
+// ALIAS(anchor) # '*anchor'
+// ANCHOR(anchor) # '&anchor'
+// TAG(handle,suffix) # '!handle!suffix'
+// SCALAR(value,style) # A scalar.
+//
+// The following two tokens are "virtual" tokens denoting the beginning and the
+// end of the stream:
+//
+// STREAM-START(encoding)
+// STREAM-END
+//
+// We pass the information about the input stream encoding with the
+// STREAM-START token.
+//
+// The next two tokens are responsible for tags:
+//
+// VERSION-DIRECTIVE(major,minor)
+// TAG-DIRECTIVE(handle,prefix)
+//
+// Example:
+//
+// %YAML 1.1
+// %TAG ! !foo
+// %TAG !yaml! tag:yaml.org,2002:
+// ---
+//
+// The correspoding sequence of tokens:
+//
+// STREAM-START(utf-8)
+// VERSION-DIRECTIVE(1,1)
+// TAG-DIRECTIVE("!","!foo")
+// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
+// DOCUMENT-START
+// STREAM-END
+//
+// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
+// line.
+//
+// The document start and end indicators are represented by:
+//
+// DOCUMENT-START
+// DOCUMENT-END
+//
+// Note that if a YAML stream contains an implicit document (without '---'
+// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
+// produced.
+//
+// In the following examples, we present whole documents together with the
+// produced tokens.
+//
+// 1. An implicit document:
+//
+// 'a scalar'
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// SCALAR("a scalar",single-quoted)
+// STREAM-END
+//
+// 2. An explicit document:
+//
+// ---
+// 'a scalar'
+// ...
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// DOCUMENT-START
+// SCALAR("a scalar",single-quoted)
+// DOCUMENT-END
+// STREAM-END
+//
+// 3. Several documents in a stream:
+//
+// 'a scalar'
+// ---
+// 'another scalar'
+// ---
+// 'yet another scalar'
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// SCALAR("a scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("another scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("yet another scalar",single-quoted)
+// STREAM-END
+//
+// We have already introduced the SCALAR token above. The following tokens are
+// used to describe aliases, anchors, tag, and scalars:
+//
+// ALIAS(anchor)
+// ANCHOR(anchor)
+// TAG(handle,suffix)
+// SCALAR(value,style)
+//
+// The following series of examples illustrate the usage of these tokens:
+//
+// 1. A recursive sequence:
+//
+// &A [ *A ]
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// ANCHOR("A")
+// FLOW-SEQUENCE-START
+// ALIAS("A")
+// FLOW-SEQUENCE-END
+// STREAM-END
+//
+// 2. A tagged scalar:
+//
+// !!float "3.14" # A good approximation.
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// TAG("!!","float")
+// SCALAR("3.14",double-quoted)
+// STREAM-END
+//
+// 3. Various scalar styles:
+//
+// --- # Implicit empty plain scalars do not produce tokens.
+// --- a plain scalar
+// --- 'a single-quoted scalar'
+// --- "a double-quoted scalar"
+// --- |-
+// a literal scalar
+// --- >-
+// a folded
+// scalar
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// DOCUMENT-START
+// DOCUMENT-START
+// SCALAR("a plain scalar",plain)
+// DOCUMENT-START
+// SCALAR("a single-quoted scalar",single-quoted)
+// DOCUMENT-START
+// SCALAR("a double-quoted scalar",double-quoted)
+// DOCUMENT-START
+// SCALAR("a literal scalar",literal)
+// DOCUMENT-START
+// SCALAR("a folded scalar",folded)
+// STREAM-END
+//
+// Now it's time to review collection-related tokens. We will start with
+// flow collections:
+//
+// FLOW-SEQUENCE-START
+// FLOW-SEQUENCE-END
+// FLOW-MAPPING-START
+// FLOW-MAPPING-END
+// FLOW-ENTRY
+// KEY
+// VALUE
+//
+// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
+// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
+// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the
+// indicators '?' and ':', which are used for denoting mapping keys and values,
+// are represented by the KEY and VALUE tokens.
+//
+// The following examples show flow collections:
+//
+// 1. A flow sequence:
+//
+// [item 1, item 2, item 3]
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// FLOW-SEQUENCE-START
+// SCALAR("item 1",plain)
+// FLOW-ENTRY
+// SCALAR("item 2",plain)
+// FLOW-ENTRY
+// SCALAR("item 3",plain)
+// FLOW-SEQUENCE-END
+// STREAM-END
+//
+// 2. A flow mapping:
+//
+// {
+// a simple key: a value, # Note that the KEY token is produced.
+// ? a complex key: another value,
+// }
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// FLOW-MAPPING-START
+// KEY
+// SCALAR("a simple key",plain)
+// VALUE
+// SCALAR("a value",plain)
+// FLOW-ENTRY
+// KEY
+// SCALAR("a complex key",plain)
+// VALUE
+// SCALAR("another value",plain)
+// FLOW-ENTRY
+// FLOW-MAPPING-END
+// STREAM-END
+//
+// A simple key is a key which is not denoted by the '?' indicator. Note that
+// the Scanner still produce the KEY token whenever it encounters a simple key.
+//
+// For scanning block collections, the following tokens are used (note that we
+// repeat KEY and VALUE here):
+//
+// BLOCK-SEQUENCE-START
+// BLOCK-MAPPING-START
+// BLOCK-END
+// BLOCK-ENTRY
+// KEY
+// VALUE
+//
+// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
+// increase that precedes a block collection (cf. the INDENT token in Python).
+// The token BLOCK-END denote indentation decrease that ends a block collection
+// (cf. the DEDENT token in Python). However YAML has some syntax pecularities
+// that makes detections of these tokens more complex.
+//
+// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
+// '-', '?', and ':' correspondingly.
+//
+// The following examples show how the tokens BLOCK-SEQUENCE-START,
+// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
+//
+// 1. Block sequences:
+//
+// - item 1
+// - item 2
+// -
+// - item 3.1
+// - item 3.2
+// -
+// key 1: value 1
+// key 2: value 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-ENTRY
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 3.1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 3.2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// 2. Block mappings:
+//
+// a simple key: a value # The KEY token is produced here.
+// ? a complex key
+// : another value
+// a mapping:
+// key 1: value 1
+// key 2: value 2
+// a sequence:
+// - item 1
+// - item 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("a simple key",plain)
+// VALUE
+// SCALAR("a value",plain)
+// KEY
+// SCALAR("a complex key",plain)
+// VALUE
+// SCALAR("another value",plain)
+// KEY
+// SCALAR("a mapping",plain)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// KEY
+// SCALAR("a sequence",plain)
+// VALUE
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// YAML does not always require to start a new block collection from a new
+// line. If the current line contains only '-', '?', and ':' indicators, a new
+// block collection may start at the current line. The following examples
+// illustrate this case:
+//
+// 1. Collections in a sequence:
+//
+// - - item 1
+// - item 2
+// - key 1: value 1
+// key 2: value 2
+// - ? complex key
+// : complex value
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-ENTRY
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("complex key")
+// VALUE
+// SCALAR("complex value")
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// 2. Collections in a mapping:
+//
+// ? a sequence
+// : - item 1
+// - item 2
+// ? a mapping
+// : key 1: value 1
+// key 2: value 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("a sequence",plain)
+// VALUE
+// BLOCK-SEQUENCE-START
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+// KEY
+// SCALAR("a mapping",plain)
+// VALUE
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key 1",plain)
+// VALUE
+// SCALAR("value 1",plain)
+// KEY
+// SCALAR("key 2",plain)
+// VALUE
+// SCALAR("value 2",plain)
+// BLOCK-END
+// BLOCK-END
+// STREAM-END
+//
+// YAML also permits non-indented sequences if they are included into a block
+// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced:
+//
+// key:
+// - item 1 # BLOCK-SEQUENCE-START is NOT produced here.
+// - item 2
+//
+// Tokens:
+//
+// STREAM-START(utf-8)
+// BLOCK-MAPPING-START
+// KEY
+// SCALAR("key",plain)
+// VALUE
+// BLOCK-ENTRY
+// SCALAR("item 1",plain)
+// BLOCK-ENTRY
+// SCALAR("item 2",plain)
+// BLOCK-END
+//
+
+// Ensure that the buffer contains the required number of characters.
+// Return true on success, false on failure (reader error or memory error).
+func cache(parser *yaml_parser_t, length int) bool {
+ // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
+ return parser.unread >= length || yaml_parser_update_buffer(parser, length)
+}
+
+// Advance the buffer pointer.
+func skip(parser *yaml_parser_t) {
+ parser.mark.index++
+ parser.mark.column++
+ parser.unread--
+ parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
+}
+
+func skip_line(parser *yaml_parser_t) {
+ if is_crlf(parser.buffer, parser.buffer_pos) {
+ parser.mark.index += 2
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread -= 2
+ parser.buffer_pos += 2
+ } else if is_break(parser.buffer, parser.buffer_pos) {
+ parser.mark.index++
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread--
+ parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
+ }
+}
+
+// Copy a character to a string buffer and advance pointers.
+func read(parser *yaml_parser_t, s []byte) []byte {
+ w := width(parser.buffer[parser.buffer_pos])
+ if w == 0 {
+ panic("invalid character sequence")
+ }
+ if len(s) == 0 {
+ s = make([]byte, 0, 32)
+ }
+ if w == 1 && len(s)+w <= cap(s) {
+ s = s[:len(s)+1]
+ s[len(s)-1] = parser.buffer[parser.buffer_pos]
+ parser.buffer_pos++
+ } else {
+ s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
+ parser.buffer_pos += w
+ }
+ parser.mark.index++
+ parser.mark.column++
+ parser.unread--
+ return s
+}
+
+// Copy a line break character to a string buffer and advance pointers.
+func read_line(parser *yaml_parser_t, s []byte) []byte {
+ buf := parser.buffer
+ pos := parser.buffer_pos
+ switch {
+ case buf[pos] == '\r' && buf[pos+1] == '\n':
+ // CR LF . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 2
+ parser.mark.index++
+ parser.unread--
+ case buf[pos] == '\r' || buf[pos] == '\n':
+ // CR|LF . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 1
+ case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
+ // NEL . LF
+ s = append(s, '\n')
+ parser.buffer_pos += 2
+ case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
+ // LS|PS . LS|PS
+ s = append(s, buf[parser.buffer_pos:pos+3]...)
+ parser.buffer_pos += 3
+ default:
+ return s
+ }
+ parser.mark.index++
+ parser.mark.column = 0
+ parser.mark.line++
+ parser.unread--
+ return s
+}
+
+// Get the next token.
+func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool {
+ // Erase the token object.
+ *token = yaml_token_t{} // [Go] Is this necessary?
+
+ // No tokens after STREAM-END or error.
+ if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
+ return true
+ }
+
+ // Ensure that the tokens queue contains enough tokens.
+ if !parser.token_available {
+ if !yaml_parser_fetch_more_tokens(parser) {
+ return false
+ }
+ }
+
+ // Fetch the next token from the queue.
+ *token = parser.tokens[parser.tokens_head]
+ parser.tokens_head++
+ parser.tokens_parsed++
+ parser.token_available = false
+
+ if token.typ == yaml_STREAM_END_TOKEN {
+ parser.stream_end_produced = true
+ }
+ return true
+}
+
+// Set the scanner error and return false.
+func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool {
+ parser.error = yaml_SCANNER_ERROR
+ parser.context = context
+ parser.context_mark = context_mark
+ parser.problem = problem
+ parser.problem_mark = parser.mark
+ return false
+}
+
+func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool {
+ context := "while parsing a tag"
+ if directive {
+ context = "while parsing a %TAG directive"
+ }
+ return yaml_parser_set_scanner_error(parser, context, context_mark, problem)
+}
+
+func trace(args ...interface{}) func() {
+ pargs := append([]interface{}{"+++"}, args...)
+ fmt.Println(pargs...)
+ pargs = append([]interface{}{"---"}, args...)
+ return func() { fmt.Println(pargs...) }
+}
+
+// Ensure that the tokens queue contains at least one token which can be
+// returned to the Parser.
+func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
+ // While we need more tokens to fetch, do it.
+ for {
+ // Check if we really need to fetch more tokens.
+ need_more_tokens := false
+
+ if parser.tokens_head == len(parser.tokens) {
+ // Queue is empty.
+ need_more_tokens = true
+ } else {
+ // Check if any potential simple key may occupy the head position.
+ if !yaml_parser_stale_simple_keys(parser) {
+ return false
+ }
+
+ for i := range parser.simple_keys {
+ simple_key := &parser.simple_keys[i]
+ if simple_key.possible && simple_key.token_number == parser.tokens_parsed {
+ need_more_tokens = true
+ break
+ }
+ }
+ }
+
+ // We are finished.
+ if !need_more_tokens {
+ break
+ }
+ // Fetch the next token.
+ if !yaml_parser_fetch_next_token(parser) {
+ return false
+ }
+ }
+
+ parser.token_available = true
+ return true
+}
+
+// The dispatcher for token fetchers.
+func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
+ // Ensure that the buffer is initialized.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ // Check if we just started scanning. Fetch STREAM-START then.
+ if !parser.stream_start_produced {
+ return yaml_parser_fetch_stream_start(parser)
+ }
+
+ // Eat whitespaces and comments until we reach the next token.
+ if !yaml_parser_scan_to_next_token(parser) {
+ return false
+ }
+
+ // Remove obsolete potential simple keys.
+ if !yaml_parser_stale_simple_keys(parser) {
+ return false
+ }
+
+ // Check the indentation level against the current column.
+ if !yaml_parser_unroll_indent(parser, parser.mark.column) {
+ return false
+ }
+
+ // Ensure that the buffer contains at least 4 characters. 4 is the length
+ // of the longest indicators ('--- ' and '... ').
+ if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
+ return false
+ }
+
+ // Is it the end of the stream?
+ if is_z(parser.buffer, parser.buffer_pos) {
+ return yaml_parser_fetch_stream_end(parser)
+ }
+
+ // Is it a directive?
+ if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
+ return yaml_parser_fetch_directive(parser)
+ }
+
+ buf := parser.buffer
+ pos := parser.buffer_pos
+
+ // Is it the document start indicator?
+ if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) {
+ return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN)
+ }
+
+ // Is it the document end indicator?
+ if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) {
+ return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN)
+ }
+
+ // Is it the flow sequence start indicator?
+ if buf[pos] == '[' {
+ return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN)
+ }
+
+ // Is it the flow mapping start indicator?
+ if parser.buffer[parser.buffer_pos] == '{' {
+ return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN)
+ }
+
+ // Is it the flow sequence end indicator?
+ if parser.buffer[parser.buffer_pos] == ']' {
+ return yaml_parser_fetch_flow_collection_end(parser,
+ yaml_FLOW_SEQUENCE_END_TOKEN)
+ }
+
+ // Is it the flow mapping end indicator?
+ if parser.buffer[parser.buffer_pos] == '}' {
+ return yaml_parser_fetch_flow_collection_end(parser,
+ yaml_FLOW_MAPPING_END_TOKEN)
+ }
+
+ // Is it the flow entry indicator?
+ if parser.buffer[parser.buffer_pos] == ',' {
+ return yaml_parser_fetch_flow_entry(parser)
+ }
+
+ // Is it the block entry indicator?
+ if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) {
+ return yaml_parser_fetch_block_entry(parser)
+ }
+
+ // Is it the key indicator?
+ if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
+ return yaml_parser_fetch_key(parser)
+ }
+
+ // Is it the value indicator?
+ if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
+ return yaml_parser_fetch_value(parser)
+ }
+
+ // Is it an alias?
+ if parser.buffer[parser.buffer_pos] == '*' {
+ return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN)
+ }
+
+ // Is it an anchor?
+ if parser.buffer[parser.buffer_pos] == '&' {
+ return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN)
+ }
+
+ // Is it a tag?
+ if parser.buffer[parser.buffer_pos] == '!' {
+ return yaml_parser_fetch_tag(parser)
+ }
+
+ // Is it a literal scalar?
+ if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
+ return yaml_parser_fetch_block_scalar(parser, true)
+ }
+
+ // Is it a folded scalar?
+ if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
+ return yaml_parser_fetch_block_scalar(parser, false)
+ }
+
+ // Is it a single-quoted scalar?
+ if parser.buffer[parser.buffer_pos] == '\'' {
+ return yaml_parser_fetch_flow_scalar(parser, true)
+ }
+
+ // Is it a double-quoted scalar?
+ if parser.buffer[parser.buffer_pos] == '"' {
+ return yaml_parser_fetch_flow_scalar(parser, false)
+ }
+
+ // Is it a plain scalar?
+ //
+ // A plain scalar may start with any non-blank characters except
+ //
+ // '-', '?', ':', ',', '[', ']', '{', '}',
+ // '#', '&', '*', '!', '|', '>', '\'', '\"',
+ // '%', '@', '`'.
+ //
+ // In the block context (and, for the '-' indicator, in the flow context
+ // too), it may also start with the characters
+ //
+ // '-', '?', ':'
+ //
+ // if it is followed by a non-space character.
+ //
+ // The last rule is more restrictive than the specification requires.
+ // [Go] Make this logic more reasonable.
+ //switch parser.buffer[parser.buffer_pos] {
+ //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
+ //}
+ if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
+ parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
+ parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
+ parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
+ parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
+ parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
+ parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
+ parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
+ parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
+ (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) ||
+ (parser.flow_level == 0 &&
+ (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
+ !is_blankz(parser.buffer, parser.buffer_pos+1)) {
+ return yaml_parser_fetch_plain_scalar(parser)
+ }
+
+ // If we don't determine the token type so far, it is an error.
+ return yaml_parser_set_scanner_error(parser,
+ "while scanning for the next token", parser.mark,
+ "found character that cannot start any token")
+}
+
+// Check the list of potential simple keys and remove the positions that
+// cannot contain simple keys anymore.
+func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool {
+ // Check for a potential simple key for each flow level.
+ for i := range parser.simple_keys {
+ simple_key := &parser.simple_keys[i]
+
+ // The specification requires that a simple key
+ //
+ // - is limited to a single line,
+ // - is shorter than 1024 characters.
+ if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) {
+
+ // Check if the potential simple key to be removed is required.
+ if simple_key.required {
+ return yaml_parser_set_scanner_error(parser,
+ "while scanning a simple key", simple_key.mark,
+ "could not find expected ':'")
+ }
+ simple_key.possible = false
+ }
+ }
+ return true
+}
+
+// Check if a simple key may start at the current position and add it if
+// needed.
+func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
+ // A simple key is required at the current position if the scanner is in
+ // the block context and the current column coincides with the indentation
+ // level.
+
+ required := parser.flow_level == 0 && parser.indent == parser.mark.column
+
+ // A simple key is required only when it is the first token in the current
+ // line. Therefore it is always allowed. But we add a check anyway.
+ if required && !parser.simple_key_allowed {
+ panic("should not happen")
+ }
+
+ //
+ // If the current position may start a simple key, save it.
+ //
+ if parser.simple_key_allowed {
+ simple_key := yaml_simple_key_t{
+ possible: true,
+ required: required,
+ token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
+ }
+ simple_key.mark = parser.mark
+
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+ parser.simple_keys[len(parser.simple_keys)-1] = simple_key
+ }
+ return true
+}
+
+// Remove a potential simple key at the current flow level.
+func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
+ i := len(parser.simple_keys) - 1
+ if parser.simple_keys[i].possible {
+ // If the key is required, it is an error.
+ if parser.simple_keys[i].required {
+ return yaml_parser_set_scanner_error(parser,
+ "while scanning a simple key", parser.simple_keys[i].mark,
+ "could not find expected ':'")
+ }
+ }
+ // Remove the key from the stack.
+ parser.simple_keys[i].possible = false
+ return true
+}
+
+// Increase the flow level and resize the simple key list if needed.
+func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
+ // Reset the simple key on the next level.
+ parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
+
+ // Increase the flow level.
+ parser.flow_level++
+ return true
+}
+
+// Decrease the flow level.
+func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
+ if parser.flow_level > 0 {
+ parser.flow_level--
+ parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1]
+ }
+ return true
+}
+
+// Push the current indentation level to the stack and set the new level
+// the current column is greater than the indentation level. In this case,
+// append or insert the specified token into the token queue.
+func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool {
+ // In the flow context, do nothing.
+ if parser.flow_level > 0 {
+ return true
+ }
+
+ if parser.indent < column {
+ // Push the current indentation level to the stack and set the new
+ // indentation level.
+ parser.indents = append(parser.indents, parser.indent)
+ parser.indent = column
+
+ // Create a token and insert it into the queue.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: mark,
+ end_mark: mark,
+ }
+ if number > -1 {
+ number -= parser.tokens_parsed
+ }
+ yaml_insert_token(parser, number, &token)
+ }
+ return true
+}
+
+// Pop indentation levels from the indents stack until the current level
+// becomes less or equal to the column. For each indentation level, append
+// the BLOCK-END token.
+func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool {
+ // In the flow context, do nothing.
+ if parser.flow_level > 0 {
+ return true
+ }
+
+ // Loop through the indentation levels in the stack.
+ for parser.indent > column {
+ // Create a token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_BLOCK_END_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+
+ // Pop the indentation level.
+ parser.indent = parser.indents[len(parser.indents)-1]
+ parser.indents = parser.indents[:len(parser.indents)-1]
+ }
+ return true
+}
+
+// Initialize the scanner and produce the STREAM-START token.
+func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
+
+ // Set the initial indentation.
+ parser.indent = -1
+
+ // Initialize the simple key stack.
+ parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
+
+ // A simple key is allowed at the beginning of the stream.
+ parser.simple_key_allowed = true
+
+ // We have started.
+ parser.stream_start_produced = true
+
+ // Create the STREAM-START token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_STREAM_START_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ encoding: parser.encoding,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the STREAM-END token and shut down the scanner.
+func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool {
+
+ // Force new line.
+ if parser.mark.column != 0 {
+ parser.mark.column = 0
+ parser.mark.line++
+ }
+
+ // Reset the indentation level.
+ if !yaml_parser_unroll_indent(parser, -1) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Create the STREAM-END token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_STREAM_END_TOKEN,
+ start_mark: parser.mark,
+ end_mark: parser.mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
+func yaml_parser_fetch_directive(parser *yaml_parser_t) bool {
+ // Reset the indentation level.
+ if !yaml_parser_unroll_indent(parser, -1) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
+ token := yaml_token_t{}
+ if !yaml_parser_scan_directive(parser, &token) {
+ return false
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the DOCUMENT-START or DOCUMENT-END token.
+func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // Reset the indentation level.
+ if !yaml_parser_unroll_indent(parser, -1) {
+ return false
+ }
+
+ // Reset simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ parser.simple_key_allowed = false
+
+ // Consume the token.
+ start_mark := parser.mark
+
+ skip(parser)
+ skip(parser)
+ skip(parser)
+
+ end_mark := parser.mark
+
+ // Create the DOCUMENT-START or DOCUMENT-END token.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
+func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // The indicators '[' and '{' may start a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // Increase the flow level.
+ if !yaml_parser_increase_flow_level(parser) {
+ return false
+ }
+
+ // A simple key may follow the indicators '[' and '{'.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
+func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // Reset any potential simple key on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Decrease the flow level.
+ if !yaml_parser_decrease_flow_level(parser) {
+ return false
+ }
+
+ // No simple keys after the indicators ']' and '}'.
+ parser.simple_key_allowed = false
+
+ // Consume the token.
+
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
+ token := yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ // Append the token to the queue.
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the FLOW-ENTRY token.
+func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool {
+ // Reset any potential simple keys on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Simple keys are allowed after ','.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the FLOW-ENTRY token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_FLOW_ENTRY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the BLOCK-ENTRY token.
+func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool {
+ // Check if the scanner is in the block context.
+ if parser.flow_level == 0 {
+ // Check if we are allowed to start a new entry.
+ if !parser.simple_key_allowed {
+ return yaml_parser_set_scanner_error(parser, "", parser.mark,
+ "block sequence entries are not allowed in this context")
+ }
+ // Add the BLOCK-SEQUENCE-START token if needed.
+ if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
+ return false
+ }
+ } else {
+ // It is an error for the '-' indicator to occur in the flow context,
+ // but we let the Parser detect and report about it because the Parser
+ // is able to point to the context.
+ }
+
+ // Reset any potential simple keys on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Simple keys are allowed after '-'.
+ parser.simple_key_allowed = true
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the BLOCK-ENTRY token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_BLOCK_ENTRY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the KEY token.
+func yaml_parser_fetch_key(parser *yaml_parser_t) bool {
+
+ // In the block context, additional checks are required.
+ if parser.flow_level == 0 {
+ // Check if we are allowed to start a new key (not nessesary simple).
+ if !parser.simple_key_allowed {
+ return yaml_parser_set_scanner_error(parser, "", parser.mark,
+ "mapping keys are not allowed in this context")
+ }
+ // Add the BLOCK-MAPPING-START token if needed.
+ if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
+ return false
+ }
+ }
+
+ // Reset any potential simple keys on the current flow level.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // Simple keys are allowed after '?' in the block context.
+ parser.simple_key_allowed = parser.flow_level == 0
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the KEY token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_KEY_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the VALUE token.
+func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
+
+ simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
+
+ // Have we found a simple key?
+ if simple_key.possible {
+ // Create the KEY token and insert it into the queue.
+ token := yaml_token_t{
+ typ: yaml_KEY_TOKEN,
+ start_mark: simple_key.mark,
+ end_mark: simple_key.mark,
+ }
+ yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token)
+
+ // In the block context, we may need to add the BLOCK-MAPPING-START token.
+ if !yaml_parser_roll_indent(parser, simple_key.mark.column,
+ simple_key.token_number,
+ yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
+ return false
+ }
+
+ // Remove the simple key.
+ simple_key.possible = false
+
+ // A simple key cannot follow another simple key.
+ parser.simple_key_allowed = false
+
+ } else {
+ // The ':' indicator follows a complex key.
+
+ // In the block context, extra checks are required.
+ if parser.flow_level == 0 {
+
+ // Check if we are allowed to start a complex value.
+ if !parser.simple_key_allowed {
+ return yaml_parser_set_scanner_error(parser, "", parser.mark,
+ "mapping values are not allowed in this context")
+ }
+
+ // Add the BLOCK-MAPPING-START token if needed.
+ if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
+ return false
+ }
+ }
+
+ // Simple keys after ':' are allowed in the block context.
+ parser.simple_key_allowed = parser.flow_level == 0
+ }
+
+ // Consume the token.
+ start_mark := parser.mark
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create the VALUE token and append it to the queue.
+ token := yaml_token_t{
+ typ: yaml_VALUE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the ALIAS or ANCHOR token.
+func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool {
+ // An anchor or an alias could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow an anchor or an alias.
+ parser.simple_key_allowed = false
+
+ // Create the ALIAS or ANCHOR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_anchor(parser, &token, typ) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the TAG token.
+func yaml_parser_fetch_tag(parser *yaml_parser_t) bool {
+ // A tag could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow a tag.
+ parser.simple_key_allowed = false
+
+ // Create the TAG token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_tag(parser, &token) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
+func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool {
+ // Remove any potential simple keys.
+ if !yaml_parser_remove_simple_key(parser) {
+ return false
+ }
+
+ // A simple key may follow a block scalar.
+ parser.simple_key_allowed = true
+
+ // Create the SCALAR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_block_scalar(parser, &token, literal) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
+func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool {
+ // A plain scalar could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow a flow scalar.
+ parser.simple_key_allowed = false
+
+ // Create the SCALAR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_flow_scalar(parser, &token, single) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Produce the SCALAR(...,plain) token.
+func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool {
+ // A plain scalar could be a simple key.
+ if !yaml_parser_save_simple_key(parser) {
+ return false
+ }
+
+ // A simple key cannot follow a flow scalar.
+ parser.simple_key_allowed = false
+
+ // Create the SCALAR token and append it to the queue.
+ var token yaml_token_t
+ if !yaml_parser_scan_plain_scalar(parser, &token) {
+ return false
+ }
+ yaml_insert_token(parser, -1, &token)
+ return true
+}
+
+// Eat whitespaces and comments until the next token is found.
+func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
+
+ // Until the next token is not found.
+ for {
+ // Allow the BOM mark to start a line.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ }
+
+ // Eat whitespaces.
+ // Tabs are allowed:
+ // - in the flow context
+ // - in the block context, but not at the beginning of the line or
+ // after '-', '?', or ':' (complex value).
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Eat a comment until a line break.
+ if parser.buffer[parser.buffer_pos] == '#' {
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ }
+
+ // If it is a line break, eat it.
+ if is_break(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ skip_line(parser)
+
+ // In the block context, a new line may start a simple key.
+ if parser.flow_level == 0 {
+ parser.simple_key_allowed = true
+ }
+ } else {
+ break // We have found a token.
+ }
+ }
+
+ return true
+}
+
+// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
+ // Eat '%'.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Scan the directive name.
+ var name []byte
+ if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
+ return false
+ }
+
+ // Is it a YAML directive?
+ if bytes.Equal(name, []byte("YAML")) {
+ // Scan the VERSION directive value.
+ var major, minor int8
+ if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
+ return false
+ }
+ end_mark := parser.mark
+
+ // Create a VERSION-DIRECTIVE token.
+ *token = yaml_token_t{
+ typ: yaml_VERSION_DIRECTIVE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ major: major,
+ minor: minor,
+ }
+
+ // Is it a TAG directive?
+ } else if bytes.Equal(name, []byte("TAG")) {
+ // Scan the TAG directive value.
+ var handle, prefix []byte
+ if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
+ return false
+ }
+ end_mark := parser.mark
+
+ // Create a TAG-DIRECTIVE token.
+ *token = yaml_token_t{
+ typ: yaml_TAG_DIRECTIVE_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: handle,
+ prefix: prefix,
+ }
+
+ // Unknown directive.
+ } else {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "found unknown directive name")
+ return false
+ }
+
+ // Eat the rest of the line including any comments.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ if parser.buffer[parser.buffer_pos] == '#' {
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ }
+
+ // Check if we are at the end of the line.
+ if !is_breakz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "did not find expected comment or line break")
+ return false
+ }
+
+ // Eat a line break.
+ if is_break(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ skip_line(parser)
+ }
+
+ return true
+}
+
+// Scan the directive name.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^^^^
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^
+//
+func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
+ // Consume the directive name.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ var s []byte
+ for is_alpha(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the name is empty.
+ if len(s) == 0 {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "could not find expected directive name")
+ return false
+ }
+
+ // Check for an blank character after the name.
+ if !is_blankz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a directive",
+ start_mark, "found unexpected non-alphabetical character")
+ return false
+ }
+ *name = s
+ return true
+}
+
+// Scan the value of VERSION-DIRECTIVE.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^^^^^^
+func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
+ // Eat whitespaces.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Consume the major version number.
+ if !yaml_parser_scan_version_directive_number(parser, start_mark, major) {
+ return false
+ }
+
+ // Eat '.'.
+ if parser.buffer[parser.buffer_pos] != '.' {
+ return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+ start_mark, "did not find expected digit or '.' character")
+ }
+
+ skip(parser)
+
+ // Consume the minor version number.
+ if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) {
+ return false
+ }
+ return true
+}
+
+const max_number_length = 2
+
+// Scan the version number of VERSION-DIRECTIVE.
+//
+// Scope:
+// %YAML 1.1 # a comment \n
+// ^
+// %YAML 1.1 # a comment \n
+// ^
+func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
+
+ // Repeat while the next character is digit.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ var value, length int8
+ for is_digit(parser.buffer, parser.buffer_pos) {
+ // Check if the number is too long.
+ length++
+ if length > max_number_length {
+ return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+ start_mark, "found extremely long version number")
+ }
+ value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the number was present.
+ if length == 0 {
+ return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+ start_mark, "did not find expected version number")
+ }
+ *number = value
+ return true
+}
+
+// Scan the value of a TAG-DIRECTIVE token.
+//
+// Scope:
+// %TAG !yaml! tag:yaml.org,2002: \n
+// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//
+func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
+ var handle_value, prefix_value []byte
+
+ // Eat whitespaces.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Scan a handle.
+ if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) {
+ return false
+ }
+
+ // Expect a whitespace.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if !is_blank(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
+ start_mark, "did not find expected whitespace")
+ return false
+ }
+
+ // Eat whitespaces.
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Scan a prefix.
+ if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) {
+ return false
+ }
+
+ // Expect a whitespace or line break.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if !is_blankz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
+ start_mark, "did not find expected whitespace or line break")
+ return false
+ }
+
+ *handle = handle_value
+ *prefix = prefix_value
+ return true
+}
+
+func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool {
+ var s []byte
+
+ // Eat the indicator character.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Consume the value.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_alpha(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ end_mark := parser.mark
+
+ /*
+ * Check if length of the anchor is greater than 0 and it is followed by
+ * a whitespace character or one of the indicators:
+ *
+ * '?', ':', ',', ']', '}', '%', '@', '`'.
+ */
+
+ if len(s) == 0 ||
+ !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
+ parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
+ parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
+ parser.buffer[parser.buffer_pos] == '`') {
+ context := "while scanning an alias"
+ if typ == yaml_ANCHOR_TOKEN {
+ context = "while scanning an anchor"
+ }
+ yaml_parser_set_scanner_error(parser, context, start_mark,
+ "did not find expected alphabetic or numeric character")
+ return false
+ }
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: typ,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ }
+
+ return true
+}
+
+/*
+ * Scan a TAG token.
+ */
+
+func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool {
+ var handle, suffix []byte
+
+ start_mark := parser.mark
+
+ // Check if the tag is in the canonical form.
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ if parser.buffer[parser.buffer_pos+1] == '<' {
+ // Keep the handle as ''
+
+ // Eat '!<'
+ skip(parser)
+ skip(parser)
+
+ // Consume the tag value.
+ if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
+ return false
+ }
+
+ // Check for '>' and eat it.
+ if parser.buffer[parser.buffer_pos] != '>' {
+ yaml_parser_set_scanner_error(parser, "while scanning a tag",
+ start_mark, "did not find the expected '>'")
+ return false
+ }
+
+ skip(parser)
+ } else {
+ // The tag has either the '!suffix' or the '!handle!suffix' form.
+
+ // First, try to scan a handle.
+ if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) {
+ return false
+ }
+
+ // Check if it is, indeed, handle.
+ if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
+ // Scan the suffix now.
+ if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
+ return false
+ }
+ } else {
+ // It wasn't a handle after all. Scan the rest of the tag.
+ if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) {
+ return false
+ }
+
+ // Set the handle to '!'.
+ handle = []byte{'!'}
+
+ // A special case: the '!' tag. Set the handle to '' and the
+ // suffix to '!'.
+ if len(suffix) == 0 {
+ handle, suffix = suffix, handle
+ }
+ }
+ }
+
+ // Check the character which ends the tag.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if !is_blankz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a tag",
+ start_mark, "did not find expected whitespace or line break")
+ return false
+ }
+
+ end_mark := parser.mark
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_TAG_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: handle,
+ suffix: suffix,
+ }
+ return true
+}
+
+// Scan a tag handle.
+func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
+ // Check the initial '!' character.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if parser.buffer[parser.buffer_pos] != '!' {
+ yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find expected '!'")
+ return false
+ }
+
+ var s []byte
+
+ // Copy the '!' character.
+ s = read(parser, s)
+
+ // Copy all subsequent alphabetical and numerical characters.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for is_alpha(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check if the trailing character is '!' and copy it.
+ if parser.buffer[parser.buffer_pos] == '!' {
+ s = read(parser, s)
+ } else {
+ // It's either the '!' tag or not really a tag handle. If it's a %TAG
+ // directive, it's an error. If it's a tag token, it must be a part of URI.
+ if directive && string(s) != "!" {
+ yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find expected '!'")
+ return false
+ }
+ }
+
+ *handle = s
+ return true
+}
+
+// Scan a tag.
+func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
+ //size_t length = head ? strlen((char *)head) : 0
+ var s []byte
+ hasTag := len(head) > 0
+
+ // Copy the head if needed.
+ //
+ // Note that we don't copy the leading '!' character.
+ if len(head) > 1 {
+ s = append(s, head[1:]...)
+ }
+
+ // Scan the tag.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ // The set of characters that may appear in URI is as follows:
+ //
+ // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
+ // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
+ // '%'.
+ // [Go] Convert this into more reasonable logic.
+ for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
+ parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
+ parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
+ parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
+ parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
+ parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
+ parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
+ parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
+ parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
+ parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
+ parser.buffer[parser.buffer_pos] == '%' {
+ // Check if it is a URI-escape sequence.
+ if parser.buffer[parser.buffer_pos] == '%' {
+ if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) {
+ return false
+ }
+ } else {
+ s = read(parser, s)
+ }
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ hasTag = true
+ }
+
+ if !hasTag {
+ yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find expected tag URI")
+ return false
+ }
+ *uri = s
+ return true
+}
+
+// Decode an URI-escape sequence corresponding to a single UTF-8 character.
+func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool {
+
+ // Decode the required number of characters.
+ w := 1024
+ for w > 0 {
+ // Check for a URI-escaped octet.
+ if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
+ return false
+ }
+
+ if !(parser.buffer[parser.buffer_pos] == '%' &&
+ is_hex(parser.buffer, parser.buffer_pos+1) &&
+ is_hex(parser.buffer, parser.buffer_pos+2)) {
+ return yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "did not find URI escaped octet")
+ }
+
+ // Get the octet.
+ octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2))
+
+ // If it is the leading octet, determine the length of the UTF-8 sequence.
+ if w == 1024 {
+ w = width(octet)
+ if w == 0 {
+ return yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "found an incorrect leading UTF-8 octet")
+ }
+ } else {
+ // Check if the trailing octet is correct.
+ if octet&0xC0 != 0x80 {
+ return yaml_parser_set_scanner_tag_error(parser, directive,
+ start_mark, "found an incorrect trailing UTF-8 octet")
+ }
+ }
+
+ // Copy the octet and move the pointers.
+ *s = append(*s, octet)
+ skip(parser)
+ skip(parser)
+ skip(parser)
+ w--
+ }
+ return true
+}
+
+// Scan a block scalar.
+func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool {
+ // Eat the indicator '|' or '>'.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Scan the additional block scalar indicators.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ // Check for a chomping indicator.
+ var chomping, increment int
+ if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
+ // Set the chomping method and eat the indicator.
+ if parser.buffer[parser.buffer_pos] == '+' {
+ chomping = +1
+ } else {
+ chomping = -1
+ }
+ skip(parser)
+
+ // Check for an indentation indicator.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if is_digit(parser.buffer, parser.buffer_pos) {
+ // Check that the indentation is greater than 0.
+ if parser.buffer[parser.buffer_pos] == '0' {
+ yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "found an indentation indicator equal to 0")
+ return false
+ }
+
+ // Get the indentation level and eat the indicator.
+ increment = as_digit(parser.buffer, parser.buffer_pos)
+ skip(parser)
+ }
+
+ } else if is_digit(parser.buffer, parser.buffer_pos) {
+ // Do the same as above, but in the opposite order.
+
+ if parser.buffer[parser.buffer_pos] == '0' {
+ yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "found an indentation indicator equal to 0")
+ return false
+ }
+ increment = as_digit(parser.buffer, parser.buffer_pos)
+ skip(parser)
+
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
+ if parser.buffer[parser.buffer_pos] == '+' {
+ chomping = +1
+ } else {
+ chomping = -1
+ }
+ skip(parser)
+ }
+ }
+
+ // Eat whitespaces and comments to the end of the line.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for is_blank(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ if parser.buffer[parser.buffer_pos] == '#' {
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ }
+
+ // Check if we are at the end of the line.
+ if !is_breakz(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "did not find expected comment or line break")
+ return false
+ }
+
+ // Eat a line break.
+ if is_break(parser.buffer, parser.buffer_pos) {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ skip_line(parser)
+ }
+
+ end_mark := parser.mark
+
+ // Set the indentation level if it was specified.
+ var indent int
+ if increment > 0 {
+ if parser.indent >= 0 {
+ indent = parser.indent + increment
+ } else {
+ indent = increment
+ }
+ }
+
+ // Scan the leading line breaks and determine the indentation level if needed.
+ var s, leading_break, trailing_breaks []byte
+ if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
+ return false
+ }
+
+ // Scan the block scalar content.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ var leading_blank, trailing_blank bool
+ for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) {
+ // We are at the beginning of a non-empty line.
+
+ // Is it a trailing whitespace?
+ trailing_blank = is_blank(parser.buffer, parser.buffer_pos)
+
+ // Check if we need to fold the leading line break.
+ if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
+ // Do we need to join the lines by space?
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ }
+ } else {
+ s = append(s, leading_break...)
+ }
+ leading_break = leading_break[:0]
+
+ // Append the remaining line breaks.
+ s = append(s, trailing_breaks...)
+ trailing_breaks = trailing_breaks[:0]
+
+ // Is it a leading whitespace?
+ leading_blank = is_blank(parser.buffer, parser.buffer_pos)
+
+ // Consume the current line.
+ for !is_breakz(parser.buffer, parser.buffer_pos) {
+ s = read(parser, s)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Consume the line break.
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ leading_break = read_line(parser, leading_break)
+
+ // Eat the following indentation spaces and line breaks.
+ if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
+ return false
+ }
+ }
+
+ // Chomp the tail.
+ if chomping != -1 {
+ s = append(s, leading_break...)
+ }
+ if chomping == 1 {
+ s = append(s, trailing_breaks...)
+ }
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_LITERAL_SCALAR_STYLE,
+ }
+ if !literal {
+ token.style = yaml_FOLDED_SCALAR_STYLE
+ }
+ return true
+}
+
+// Scan indentation spaces and line breaks for a block scalar. Determine the
+// indentation level if needed.
+func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool {
+ *end_mark = parser.mark
+
+ // Eat the indentation spaces and line breaks.
+ max_indent := 0
+ for {
+ // Eat the indentation spaces.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
+ skip(parser)
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+ if parser.mark.column > max_indent {
+ max_indent = parser.mark.column
+ }
+
+ // Check for a tab character messing the indentation.
+ if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) {
+ return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+ start_mark, "found a tab character where an indentation space is expected")
+ }
+
+ // Have we found a non-empty line?
+ if !is_break(parser.buffer, parser.buffer_pos) {
+ break
+ }
+
+ // Consume the line break.
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ // [Go] Should really be returning breaks instead.
+ *breaks = read_line(parser, *breaks)
+ *end_mark = parser.mark
+ }
+
+ // Determine the indentation level if needed.
+ if *indent == 0 {
+ *indent = max_indent
+ if *indent < parser.indent+1 {
+ *indent = parser.indent + 1
+ }
+ if *indent < 1 {
+ *indent = 1
+ }
+ }
+ return true
+}
+
+// Scan a quoted scalar.
+func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool {
+ // Eat the left quote.
+ start_mark := parser.mark
+ skip(parser)
+
+ // Consume the content of the quoted scalar.
+ var s, leading_break, trailing_breaks, whitespaces []byte
+ for {
+ // Check that there are no document indicators at the beginning of the line.
+ if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
+ return false
+ }
+
+ if parser.mark.column == 0 &&
+ ((parser.buffer[parser.buffer_pos+0] == '-' &&
+ parser.buffer[parser.buffer_pos+1] == '-' &&
+ parser.buffer[parser.buffer_pos+2] == '-') ||
+ (parser.buffer[parser.buffer_pos+0] == '.' &&
+ parser.buffer[parser.buffer_pos+1] == '.' &&
+ parser.buffer[parser.buffer_pos+2] == '.')) &&
+ is_blankz(parser.buffer, parser.buffer_pos+3) {
+ yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
+ start_mark, "found unexpected document indicator")
+ return false
+ }
+
+ // Check for EOF.
+ if is_z(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
+ start_mark, "found unexpected end of stream")
+ return false
+ }
+
+ // Consume non-blank characters.
+ leading_blanks := false
+ for !is_blankz(parser.buffer, parser.buffer_pos) {
+ if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
+ // Is is an escaped single quote.
+ s = append(s, '\'')
+ skip(parser)
+ skip(parser)
+
+ } else if single && parser.buffer[parser.buffer_pos] == '\'' {
+ // It is a right single quote.
+ break
+ } else if !single && parser.buffer[parser.buffer_pos] == '"' {
+ // It is a right double quote.
+ break
+
+ } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
+ // It is an escaped line break.
+ if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
+ return false
+ }
+ skip(parser)
+ skip_line(parser)
+ leading_blanks = true
+ break
+
+ } else if !single && parser.buffer[parser.buffer_pos] == '\\' {
+ // It is an escape sequence.
+ code_length := 0
+
+ // Check the escape character.
+ switch parser.buffer[parser.buffer_pos+1] {
+ case '0':
+ s = append(s, 0)
+ case 'a':
+ s = append(s, '\x07')
+ case 'b':
+ s = append(s, '\x08')
+ case 't', '\t':
+ s = append(s, '\x09')
+ case 'n':
+ s = append(s, '\x0A')
+ case 'v':
+ s = append(s, '\x0B')
+ case 'f':
+ s = append(s, '\x0C')
+ case 'r':
+ s = append(s, '\x0D')
+ case 'e':
+ s = append(s, '\x1B')
+ case ' ':
+ s = append(s, '\x20')
+ case '"':
+ s = append(s, '"')
+ case '\'':
+ s = append(s, '\'')
+ case '\\':
+ s = append(s, '\\')
+ case 'N': // NEL (#x85)
+ s = append(s, '\xC2')
+ s = append(s, '\x85')
+ case '_': // #xA0
+ s = append(s, '\xC2')
+ s = append(s, '\xA0')
+ case 'L': // LS (#x2028)
+ s = append(s, '\xE2')
+ s = append(s, '\x80')
+ s = append(s, '\xA8')
+ case 'P': // PS (#x2029)
+ s = append(s, '\xE2')
+ s = append(s, '\x80')
+ s = append(s, '\xA9')
+ case 'x':
+ code_length = 2
+ case 'u':
+ code_length = 4
+ case 'U':
+ code_length = 8
+ default:
+ yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+ start_mark, "found unknown escape character")
+ return false
+ }
+
+ skip(parser)
+ skip(parser)
+
+ // Consume an arbitrary escape code.
+ if code_length > 0 {
+ var value int
+
+ // Scan the character value.
+ if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
+ return false
+ }
+ for k := 0; k < code_length; k++ {
+ if !is_hex(parser.buffer, parser.buffer_pos+k) {
+ yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+ start_mark, "did not find expected hexdecimal number")
+ return false
+ }
+ value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k)
+ }
+
+ // Check the value and write the character.
+ if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
+ yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+ start_mark, "found invalid Unicode character escape code")
+ return false
+ }
+ if value <= 0x7F {
+ s = append(s, byte(value))
+ } else if value <= 0x7FF {
+ s = append(s, byte(0xC0+(value>>6)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ } else if value <= 0xFFFF {
+ s = append(s, byte(0xE0+(value>>12)))
+ s = append(s, byte(0x80+((value>>6)&0x3F)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ } else {
+ s = append(s, byte(0xF0+(value>>18)))
+ s = append(s, byte(0x80+((value>>12)&0x3F)))
+ s = append(s, byte(0x80+((value>>6)&0x3F)))
+ s = append(s, byte(0x80+(value&0x3F)))
+ }
+
+ // Advance the pointer.
+ for k := 0; k < code_length; k++ {
+ skip(parser)
+ }
+ }
+ } else {
+ // It is a non-escaped non-blank character.
+ s = read(parser, s)
+ }
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ }
+
+ // Check if we are at the end of the scalar.
+ if single {
+ if parser.buffer[parser.buffer_pos] == '\'' {
+ break
+ }
+ } else {
+ if parser.buffer[parser.buffer_pos] == '"' {
+ break
+ }
+ }
+
+ // Consume blank characters.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
+ if is_blank(parser.buffer, parser.buffer_pos) {
+ // Consume a space or a tab character.
+ if !leading_blanks {
+ whitespaces = read(parser, whitespaces)
+ } else {
+ skip(parser)
+ }
+ } else {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ // Check if it is a first line break.
+ if !leading_blanks {
+ whitespaces = whitespaces[:0]
+ leading_break = read_line(parser, leading_break)
+ leading_blanks = true
+ } else {
+ trailing_breaks = read_line(parser, trailing_breaks)
+ }
+ }
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Join the whitespaces or fold line breaks.
+ if leading_blanks {
+ // Do we need to fold line breaks?
+ if len(leading_break) > 0 && leading_break[0] == '\n' {
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ } else {
+ s = append(s, trailing_breaks...)
+ }
+ } else {
+ s = append(s, leading_break...)
+ s = append(s, trailing_breaks...)
+ }
+ trailing_breaks = trailing_breaks[:0]
+ leading_break = leading_break[:0]
+ } else {
+ s = append(s, whitespaces...)
+ whitespaces = whitespaces[:0]
+ }
+ }
+
+ // Eat the right quote.
+ skip(parser)
+ end_mark := parser.mark
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_SINGLE_QUOTED_SCALAR_STYLE,
+ }
+ if !single {
+ token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
+ }
+ return true
+}
+
+// Scan a plain scalar.
+func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool {
+
+ var s, leading_break, trailing_breaks, whitespaces []byte
+ var leading_blanks bool
+ var indent = parser.indent + 1
+
+ start_mark := parser.mark
+ end_mark := parser.mark
+
+ // Consume the content of the plain scalar.
+ for {
+ // Check for a document indicator.
+ if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
+ return false
+ }
+ if parser.mark.column == 0 &&
+ ((parser.buffer[parser.buffer_pos+0] == '-' &&
+ parser.buffer[parser.buffer_pos+1] == '-' &&
+ parser.buffer[parser.buffer_pos+2] == '-') ||
+ (parser.buffer[parser.buffer_pos+0] == '.' &&
+ parser.buffer[parser.buffer_pos+1] == '.' &&
+ parser.buffer[parser.buffer_pos+2] == '.')) &&
+ is_blankz(parser.buffer, parser.buffer_pos+3) {
+ break
+ }
+
+ // Check for a comment.
+ if parser.buffer[parser.buffer_pos] == '#' {
+ break
+ }
+
+ // Consume non-blank characters.
+ for !is_blankz(parser.buffer, parser.buffer_pos) {
+
+ // Check for indicators that may end a plain scalar.
+ if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) ||
+ (parser.flow_level > 0 &&
+ (parser.buffer[parser.buffer_pos] == ',' ||
+ parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' ||
+ parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
+ parser.buffer[parser.buffer_pos] == '}')) {
+ break
+ }
+
+ // Check if we need to join whitespaces and breaks.
+ if leading_blanks || len(whitespaces) > 0 {
+ if leading_blanks {
+ // Do we need to fold line breaks?
+ if leading_break[0] == '\n' {
+ if len(trailing_breaks) == 0 {
+ s = append(s, ' ')
+ } else {
+ s = append(s, trailing_breaks...)
+ }
+ } else {
+ s = append(s, leading_break...)
+ s = append(s, trailing_breaks...)
+ }
+ trailing_breaks = trailing_breaks[:0]
+ leading_break = leading_break[:0]
+ leading_blanks = false
+ } else {
+ s = append(s, whitespaces...)
+ whitespaces = whitespaces[:0]
+ }
+ }
+
+ // Copy the character.
+ s = read(parser, s)
+
+ end_mark = parser.mark
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+ }
+
+ // Is it the end?
+ if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) {
+ break
+ }
+
+ // Consume blank characters.
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+
+ for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
+ if is_blank(parser.buffer, parser.buffer_pos) {
+
+ // Check for tab character that abuse indentation.
+ if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) {
+ yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
+ start_mark, "found a tab character that violate indentation")
+ return false
+ }
+
+ // Consume a space or a tab character.
+ if !leading_blanks {
+ whitespaces = read(parser, whitespaces)
+ } else {
+ skip(parser)
+ }
+ } else {
+ if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
+ return false
+ }
+
+ // Check if it is a first line break.
+ if !leading_blanks {
+ whitespaces = whitespaces[:0]
+ leading_break = read_line(parser, leading_break)
+ leading_blanks = true
+ } else {
+ trailing_breaks = read_line(parser, trailing_breaks)
+ }
+ }
+ if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
+ return false
+ }
+ }
+
+ // Check indentation level.
+ if parser.flow_level == 0 && parser.mark.column < indent {
+ break
+ }
+ }
+
+ // Create a token.
+ *token = yaml_token_t{
+ typ: yaml_SCALAR_TOKEN,
+ start_mark: start_mark,
+ end_mark: end_mark,
+ value: s,
+ style: yaml_PLAIN_SCALAR_STYLE,
+ }
+
+ // Note that we change the 'simple_key_allowed' flag.
+ if leading_blanks {
+ parser.simple_key_allowed = true
+ }
+ return true
+}
diff --git a/vendor/github.com/go-yaml/yaml/sorter.go b/vendor/github.com/go-yaml/yaml/sorter.go
new file mode 100644
index 0000000000..5958822f9c
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/sorter.go
@@ -0,0 +1,104 @@
+package yaml
+
+import (
+ "reflect"
+ "unicode"
+)
+
+type keyList []reflect.Value
+
+func (l keyList) Len() int { return len(l) }
+func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
+func (l keyList) Less(i, j int) bool {
+ a := l[i]
+ b := l[j]
+ ak := a.Kind()
+ bk := b.Kind()
+ for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
+ a = a.Elem()
+ ak = a.Kind()
+ }
+ for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
+ b = b.Elem()
+ bk = b.Kind()
+ }
+ af, aok := keyFloat(a)
+ bf, bok := keyFloat(b)
+ if aok && bok {
+ if af != bf {
+ return af < bf
+ }
+ if ak != bk {
+ return ak < bk
+ }
+ return numLess(a, b)
+ }
+ if ak != reflect.String || bk != reflect.String {
+ return ak < bk
+ }
+ ar, br := []rune(a.String()), []rune(b.String())
+ for i := 0; i < len(ar) && i < len(br); i++ {
+ if ar[i] == br[i] {
+ continue
+ }
+ al := unicode.IsLetter(ar[i])
+ bl := unicode.IsLetter(br[i])
+ if al && bl {
+ return ar[i] < br[i]
+ }
+ if al || bl {
+ return bl
+ }
+ var ai, bi int
+ var an, bn int64
+ for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
+ an = an*10 + int64(ar[ai]-'0')
+ }
+ for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
+ bn = bn*10 + int64(br[bi]-'0')
+ }
+ if an != bn {
+ return an < bn
+ }
+ if ai != bi {
+ return ai < bi
+ }
+ return ar[i] < br[i]
+ }
+ return len(ar) < len(br)
+}
+
+// keyFloat returns a float value for v if it is a number/bool
+// and whether it is a number/bool or not.
+func keyFloat(v reflect.Value) (f float64, ok bool) {
+ switch v.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return float64(v.Int()), true
+ case reflect.Float32, reflect.Float64:
+ return v.Float(), true
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return float64(v.Uint()), true
+ case reflect.Bool:
+ if v.Bool() {
+ return 1, true
+ }
+ return 0, true
+ }
+ return 0, false
+}
+
+// numLess returns whether a < b.
+// a and b must necessarily have the same kind.
+func numLess(a, b reflect.Value) bool {
+ switch a.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return a.Int() < b.Int()
+ case reflect.Float32, reflect.Float64:
+ return a.Float() < b.Float()
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return a.Uint() < b.Uint()
+ case reflect.Bool:
+ return !a.Bool() && b.Bool()
+ }
+ panic("not a number")
+}
diff --git a/vendor/github.com/go-yaml/yaml/writerc.go b/vendor/github.com/go-yaml/yaml/writerc.go
new file mode 100644
index 0000000000..a2dde608cb
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/writerc.go
@@ -0,0 +1,26 @@
+package yaml
+
+// Set the writer error and return false.
+func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
+ emitter.error = yaml_WRITER_ERROR
+ emitter.problem = problem
+ return false
+}
+
+// Flush the output buffer.
+func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
+ if emitter.write_handler == nil {
+ panic("write handler not set")
+ }
+
+ // Check if the buffer is empty.
+ if emitter.buffer_pos == 0 {
+ return true
+ }
+
+ if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
+ return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
+ }
+ emitter.buffer_pos = 0
+ return true
+}
diff --git a/vendor/github.com/go-yaml/yaml/yaml.go b/vendor/github.com/go-yaml/yaml/yaml.go
new file mode 100644
index 0000000000..483aae5878
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/yaml.go
@@ -0,0 +1,466 @@
+// Package yaml implements YAML support for the Go language.
+//
+// Source code and other details for the project are available at GitHub:
+//
+// https://github.com/go-yaml/yaml
+//
+package yaml
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "reflect"
+ "strings"
+ "sync"
+)
+
+// MapSlice encodes and decodes as a YAML map.
+// The order of keys is preserved when encoding and decoding.
+type MapSlice []MapItem
+
+// MapItem is an item in a MapSlice.
+type MapItem struct {
+ Key, Value interface{}
+}
+
+// The Unmarshaler interface may be implemented by types to customize their
+// behavior when being unmarshaled from a YAML document. The UnmarshalYAML
+// method receives a function that may be called to unmarshal the original
+// YAML value into a field or variable. It is safe to call the unmarshal
+// function parameter more than once if necessary.
+type Unmarshaler interface {
+ UnmarshalYAML(unmarshal func(interface{}) error) error
+}
+
+// The Marshaler interface may be implemented by types to customize their
+// behavior when being marshaled into a YAML document. The returned value
+// is marshaled in place of the original value implementing Marshaler.
+//
+// If an error is returned by MarshalYAML, the marshaling procedure stops
+// and returns with the provided error.
+type Marshaler interface {
+ MarshalYAML() (interface{}, error)
+}
+
+// Unmarshal decodes the first document found within the in byte slice
+// and assigns decoded values into the out value.
+//
+// Maps and pointers (to a struct, string, int, etc) are accepted as out
+// values. If an internal pointer within a struct is not initialized,
+// the yaml package will initialize it if necessary for unmarshalling
+// the provided data. The out parameter must not be nil.
+//
+// The type of the decoded values should be compatible with the respective
+// values in out. If one or more values cannot be decoded due to a type
+// mismatches, decoding continues partially until the end of the YAML
+// content, and a *yaml.TypeError is returned with details for all
+// missed values.
+//
+// Struct fields are only unmarshalled if they are exported (have an
+// upper case first letter), and are unmarshalled using the field name
+// lowercased as the default key. Custom keys may be defined via the
+// "yaml" name in the field tag: the content preceding the first comma
+// is used as the key, and the following comma-separated options are
+// used to tweak the marshalling process (see Marshal).
+// Conflicting names result in a runtime error.
+//
+// For example:
+//
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// var t T
+// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
+//
+// See the documentation of Marshal for the format of tags and a list of
+// supported tag options.
+//
+func Unmarshal(in []byte, out interface{}) (err error) {
+ return unmarshal(in, out, false)
+}
+
+// UnmarshalStrict is like Unmarshal except that any fields that are found
+// in the data that do not have corresponding struct members, or mapping
+// keys that are duplicates, will result in
+// an error.
+func UnmarshalStrict(in []byte, out interface{}) (err error) {
+ return unmarshal(in, out, true)
+}
+
+// A Decorder reads and decodes YAML values from an input stream.
+type Decoder struct {
+ strict bool
+ parser *parser
+}
+
+// NewDecoder returns a new decoder that reads from r.
+//
+// The decoder introduces its own buffering and may read
+// data from r beyond the YAML values requested.
+func NewDecoder(r io.Reader) *Decoder {
+ return &Decoder{
+ parser: newParserFromReader(r),
+ }
+}
+
+// SetStrict sets whether strict decoding behaviour is enabled when
+// decoding items in the data (see UnmarshalStrict). By default, decoding is not strict.
+func (dec *Decoder) SetStrict(strict bool) {
+ dec.strict = strict
+}
+
+// Decode reads the next YAML-encoded value from its input
+// and stores it in the value pointed to by v.
+//
+// See the documentation for Unmarshal for details about the
+// conversion of YAML into a Go value.
+func (dec *Decoder) Decode(v interface{}) (err error) {
+ d := newDecoder(dec.strict)
+ defer handleErr(&err)
+ node := dec.parser.parse()
+ if node == nil {
+ return io.EOF
+ }
+ out := reflect.ValueOf(v)
+ if out.Kind() == reflect.Ptr && !out.IsNil() {
+ out = out.Elem()
+ }
+ d.unmarshal(node, out)
+ if len(d.terrors) > 0 {
+ return &TypeError{d.terrors}
+ }
+ return nil
+}
+
+func unmarshal(in []byte, out interface{}, strict bool) (err error) {
+ defer handleErr(&err)
+ d := newDecoder(strict)
+ p := newParser(in)
+ defer p.destroy()
+ node := p.parse()
+ if node != nil {
+ v := reflect.ValueOf(out)
+ if v.Kind() == reflect.Ptr && !v.IsNil() {
+ v = v.Elem()
+ }
+ d.unmarshal(node, v)
+ }
+ if len(d.terrors) > 0 {
+ return &TypeError{d.terrors}
+ }
+ return nil
+}
+
+// Marshal serializes the value provided into a YAML document. The structure
+// of the generated document will reflect the structure of the value itself.
+// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
+//
+// Struct fields are only unmarshalled if they are exported (have an upper case
+// first letter), and are unmarshalled using the field name lowercased as the
+// default key. Custom keys may be defined via the "yaml" name in the field
+// tag: the content preceding the first comma is used as the key, and the
+// following comma-separated options are used to tweak the marshalling process.
+// Conflicting names result in a runtime error.
+//
+// The field tag format accepted is:
+//
+// `(...) yaml:"[][,[,]]" (...)`
+//
+// The following flags are currently supported:
+//
+// omitempty Only include the field if it's not set to the zero
+// value for the type or to empty slices or maps.
+// Zero valued structs will be omitted if all their public
+// fields are zero, unless they implement an IsZero
+// method (see the IsZeroer interface type), in which
+// case the field will be included if that method returns true.
+//
+// flow Marshal using a flow style (useful for structs,
+// sequences and maps).
+//
+// inline Inline the field, which must be a struct or a map,
+// causing all of its fields or keys to be processed as if
+// they were part of the outer struct. For maps, keys must
+// not conflict with the yaml keys of other struct fields.
+//
+// In addition, if the key is "-", the field is ignored.
+//
+// For example:
+//
+// type T struct {
+// F int `yaml:"a,omitempty"`
+// B int
+// }
+// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
+// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
+//
+func Marshal(in interface{}) (out []byte, err error) {
+ defer handleErr(&err)
+ e := newEncoder()
+ defer e.destroy()
+ e.marshalDoc("", reflect.ValueOf(in))
+ e.finish()
+ out = e.out
+ return
+}
+
+// An Encoder writes YAML values to an output stream.
+type Encoder struct {
+ encoder *encoder
+}
+
+// NewEncoder returns a new encoder that writes to w.
+// The Encoder should be closed after use to flush all data
+// to w.
+func NewEncoder(w io.Writer) *Encoder {
+ return &Encoder{
+ encoder: newEncoderWithWriter(w),
+ }
+}
+
+// Encode writes the YAML encoding of v to the stream.
+// If multiple items are encoded to the stream, the
+// second and subsequent document will be preceded
+// with a "---" document separator, but the first will not.
+//
+// See the documentation for Marshal for details about the conversion of Go
+// values to YAML.
+func (e *Encoder) Encode(v interface{}) (err error) {
+ defer handleErr(&err)
+ e.encoder.marshalDoc("", reflect.ValueOf(v))
+ return nil
+}
+
+// Close closes the encoder by writing any remaining data.
+// It does not write a stream terminating string "...".
+func (e *Encoder) Close() (err error) {
+ defer handleErr(&err)
+ e.encoder.finish()
+ return nil
+}
+
+func handleErr(err *error) {
+ if v := recover(); v != nil {
+ if e, ok := v.(yamlError); ok {
+ *err = e.err
+ } else {
+ panic(v)
+ }
+ }
+}
+
+type yamlError struct {
+ err error
+}
+
+func fail(err error) {
+ panic(yamlError{err})
+}
+
+func failf(format string, args ...interface{}) {
+ panic(yamlError{fmt.Errorf("yaml: "+format, args...)})
+}
+
+// A TypeError is returned by Unmarshal when one or more fields in
+// the YAML document cannot be properly decoded into the requested
+// types. When this error is returned, the value is still
+// unmarshaled partially.
+type TypeError struct {
+ Errors []string
+}
+
+func (e *TypeError) Error() string {
+ return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n "))
+}
+
+// --------------------------------------------------------------------------
+// Maintain a mapping of keys to structure field indexes
+
+// The code in this section was copied from mgo/bson.
+
+// structInfo holds details for the serialization of fields of
+// a given struct.
+type structInfo struct {
+ FieldsMap map[string]fieldInfo
+ FieldsList []fieldInfo
+
+ // InlineMap is the number of the field in the struct that
+ // contains an ,inline map, or -1 if there's none.
+ InlineMap int
+}
+
+type fieldInfo struct {
+ Key string
+ Num int
+ OmitEmpty bool
+ Flow bool
+ // Id holds the unique field identifier, so we can cheaply
+ // check for field duplicates without maintaining an extra map.
+ Id int
+
+ // Inline holds the field index if the field is part of an inlined struct.
+ Inline []int
+}
+
+var structMap = make(map[reflect.Type]*structInfo)
+var fieldMapMutex sync.RWMutex
+
+func getStructInfo(st reflect.Type) (*structInfo, error) {
+ fieldMapMutex.RLock()
+ sinfo, found := structMap[st]
+ fieldMapMutex.RUnlock()
+ if found {
+ return sinfo, nil
+ }
+
+ n := st.NumField()
+ fieldsMap := make(map[string]fieldInfo)
+ fieldsList := make([]fieldInfo, 0, n)
+ inlineMap := -1
+ for i := 0; i != n; i++ {
+ field := st.Field(i)
+ if field.PkgPath != "" && !field.Anonymous {
+ continue // Private field
+ }
+
+ info := fieldInfo{Num: i}
+
+ tag := field.Tag.Get("yaml")
+ if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
+ tag = string(field.Tag)
+ }
+ if tag == "-" {
+ continue
+ }
+
+ inline := false
+ fields := strings.Split(tag, ",")
+ if len(fields) > 1 {
+ for _, flag := range fields[1:] {
+ switch flag {
+ case "omitempty":
+ info.OmitEmpty = true
+ case "flow":
+ info.Flow = true
+ case "inline":
+ inline = true
+ default:
+ return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st))
+ }
+ }
+ tag = fields[0]
+ }
+
+ if inline {
+ switch field.Type.Kind() {
+ case reflect.Map:
+ if inlineMap >= 0 {
+ return nil, errors.New("Multiple ,inline maps in struct " + st.String())
+ }
+ if field.Type.Key() != reflect.TypeOf("") {
+ return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String())
+ }
+ inlineMap = info.Num
+ case reflect.Struct:
+ sinfo, err := getStructInfo(field.Type)
+ if err != nil {
+ return nil, err
+ }
+ for _, finfo := range sinfo.FieldsList {
+ if _, found := fieldsMap[finfo.Key]; found {
+ msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String()
+ return nil, errors.New(msg)
+ }
+ if finfo.Inline == nil {
+ finfo.Inline = []int{i, finfo.Num}
+ } else {
+ finfo.Inline = append([]int{i}, finfo.Inline...)
+ }
+ finfo.Id = len(fieldsList)
+ fieldsMap[finfo.Key] = finfo
+ fieldsList = append(fieldsList, finfo)
+ }
+ default:
+ //return nil, errors.New("Option ,inline needs a struct value or map field")
+ return nil, errors.New("Option ,inline needs a struct value field")
+ }
+ continue
+ }
+
+ if tag != "" {
+ info.Key = tag
+ } else {
+ info.Key = strings.ToLower(field.Name)
+ }
+
+ if _, found = fieldsMap[info.Key]; found {
+ msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
+ return nil, errors.New(msg)
+ }
+
+ info.Id = len(fieldsList)
+ fieldsList = append(fieldsList, info)
+ fieldsMap[info.Key] = info
+ }
+
+ sinfo = &structInfo{
+ FieldsMap: fieldsMap,
+ FieldsList: fieldsList,
+ InlineMap: inlineMap,
+ }
+
+ fieldMapMutex.Lock()
+ structMap[st] = sinfo
+ fieldMapMutex.Unlock()
+ return sinfo, nil
+}
+
+// IsZeroer is used to check whether an object is zero to
+// determine whether it should be omitted when marshaling
+// with the omitempty flag. One notable implementation
+// is time.Time.
+type IsZeroer interface {
+ IsZero() bool
+}
+
+func isZero(v reflect.Value) bool {
+ kind := v.Kind()
+ if z, ok := v.Interface().(IsZeroer); ok {
+ if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() {
+ return true
+ }
+ return z.IsZero()
+ }
+ switch kind {
+ case reflect.String:
+ return len(v.String()) == 0
+ case reflect.Interface, reflect.Ptr:
+ return v.IsNil()
+ case reflect.Slice:
+ return v.Len() == 0
+ case reflect.Map:
+ return v.Len() == 0
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return v.Int() == 0
+ case reflect.Float32, reflect.Float64:
+ return v.Float() == 0
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return v.Uint() == 0
+ case reflect.Bool:
+ return !v.Bool()
+ case reflect.Struct:
+ vt := v.Type()
+ for i := v.NumField() - 1; i >= 0; i-- {
+ if vt.Field(i).PkgPath != "" {
+ continue // Private field
+ }
+ if !isZero(v.Field(i)) {
+ return false
+ }
+ }
+ return true
+ }
+ return false
+}
diff --git a/vendor/github.com/go-yaml/yaml/yamlh.go b/vendor/github.com/go-yaml/yaml/yamlh.go
new file mode 100644
index 0000000000..e25cee563b
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/yamlh.go
@@ -0,0 +1,738 @@
+package yaml
+
+import (
+ "fmt"
+ "io"
+)
+
+// The version directive data.
+type yaml_version_directive_t struct {
+ major int8 // The major version number.
+ minor int8 // The minor version number.
+}
+
+// The tag directive data.
+type yaml_tag_directive_t struct {
+ handle []byte // The tag handle.
+ prefix []byte // The tag prefix.
+}
+
+type yaml_encoding_t int
+
+// The stream encoding.
+const (
+ // Let the parser choose the encoding.
+ yaml_ANY_ENCODING yaml_encoding_t = iota
+
+ yaml_UTF8_ENCODING // The default UTF-8 encoding.
+ yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
+ yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
+)
+
+type yaml_break_t int
+
+// Line break types.
+const (
+ // Let the parser choose the break type.
+ yaml_ANY_BREAK yaml_break_t = iota
+
+ yaml_CR_BREAK // Use CR for line breaks (Mac style).
+ yaml_LN_BREAK // Use LN for line breaks (Unix style).
+ yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
+)
+
+type yaml_error_type_t int
+
+// Many bad things could happen with the parser and emitter.
+const (
+ // No error is produced.
+ yaml_NO_ERROR yaml_error_type_t = iota
+
+ yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory.
+ yaml_READER_ERROR // Cannot read or decode the input stream.
+ yaml_SCANNER_ERROR // Cannot scan the input stream.
+ yaml_PARSER_ERROR // Cannot parse the input stream.
+ yaml_COMPOSER_ERROR // Cannot compose a YAML document.
+ yaml_WRITER_ERROR // Cannot write to the output stream.
+ yaml_EMITTER_ERROR // Cannot emit a YAML stream.
+)
+
+// The pointer position.
+type yaml_mark_t struct {
+ index int // The position index.
+ line int // The position line.
+ column int // The position column.
+}
+
+// Node Styles
+
+type yaml_style_t int8
+
+type yaml_scalar_style_t yaml_style_t
+
+// Scalar styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota
+
+ yaml_PLAIN_SCALAR_STYLE // The plain scalar style.
+ yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
+ yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
+ yaml_LITERAL_SCALAR_STYLE // The literal scalar style.
+ yaml_FOLDED_SCALAR_STYLE // The folded scalar style.
+)
+
+type yaml_sequence_style_t yaml_style_t
+
+// Sequence styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota
+
+ yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
+ yaml_FLOW_SEQUENCE_STYLE // The flow sequence style.
+)
+
+type yaml_mapping_style_t yaml_style_t
+
+// Mapping styles.
+const (
+ // Let the emitter choose the style.
+ yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota
+
+ yaml_BLOCK_MAPPING_STYLE // The block mapping style.
+ yaml_FLOW_MAPPING_STYLE // The flow mapping style.
+)
+
+// Tokens
+
+type yaml_token_type_t int
+
+// Token types.
+const (
+ // An empty token.
+ yaml_NO_TOKEN yaml_token_type_t = iota
+
+ yaml_STREAM_START_TOKEN // A STREAM-START token.
+ yaml_STREAM_END_TOKEN // A STREAM-END token.
+
+ yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
+ yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token.
+ yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token.
+ yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token.
+
+ yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
+ yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token.
+ yaml_BLOCK_END_TOKEN // A BLOCK-END token.
+
+ yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
+ yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token.
+ yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token.
+ yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token.
+
+ yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
+ yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token.
+ yaml_KEY_TOKEN // A KEY token.
+ yaml_VALUE_TOKEN // A VALUE token.
+
+ yaml_ALIAS_TOKEN // An ALIAS token.
+ yaml_ANCHOR_TOKEN // An ANCHOR token.
+ yaml_TAG_TOKEN // A TAG token.
+ yaml_SCALAR_TOKEN // A SCALAR token.
+)
+
+func (tt yaml_token_type_t) String() string {
+ switch tt {
+ case yaml_NO_TOKEN:
+ return "yaml_NO_TOKEN"
+ case yaml_STREAM_START_TOKEN:
+ return "yaml_STREAM_START_TOKEN"
+ case yaml_STREAM_END_TOKEN:
+ return "yaml_STREAM_END_TOKEN"
+ case yaml_VERSION_DIRECTIVE_TOKEN:
+ return "yaml_VERSION_DIRECTIVE_TOKEN"
+ case yaml_TAG_DIRECTIVE_TOKEN:
+ return "yaml_TAG_DIRECTIVE_TOKEN"
+ case yaml_DOCUMENT_START_TOKEN:
+ return "yaml_DOCUMENT_START_TOKEN"
+ case yaml_DOCUMENT_END_TOKEN:
+ return "yaml_DOCUMENT_END_TOKEN"
+ case yaml_BLOCK_SEQUENCE_START_TOKEN:
+ return "yaml_BLOCK_SEQUENCE_START_TOKEN"
+ case yaml_BLOCK_MAPPING_START_TOKEN:
+ return "yaml_BLOCK_MAPPING_START_TOKEN"
+ case yaml_BLOCK_END_TOKEN:
+ return "yaml_BLOCK_END_TOKEN"
+ case yaml_FLOW_SEQUENCE_START_TOKEN:
+ return "yaml_FLOW_SEQUENCE_START_TOKEN"
+ case yaml_FLOW_SEQUENCE_END_TOKEN:
+ return "yaml_FLOW_SEQUENCE_END_TOKEN"
+ case yaml_FLOW_MAPPING_START_TOKEN:
+ return "yaml_FLOW_MAPPING_START_TOKEN"
+ case yaml_FLOW_MAPPING_END_TOKEN:
+ return "yaml_FLOW_MAPPING_END_TOKEN"
+ case yaml_BLOCK_ENTRY_TOKEN:
+ return "yaml_BLOCK_ENTRY_TOKEN"
+ case yaml_FLOW_ENTRY_TOKEN:
+ return "yaml_FLOW_ENTRY_TOKEN"
+ case yaml_KEY_TOKEN:
+ return "yaml_KEY_TOKEN"
+ case yaml_VALUE_TOKEN:
+ return "yaml_VALUE_TOKEN"
+ case yaml_ALIAS_TOKEN:
+ return "yaml_ALIAS_TOKEN"
+ case yaml_ANCHOR_TOKEN:
+ return "yaml_ANCHOR_TOKEN"
+ case yaml_TAG_TOKEN:
+ return "yaml_TAG_TOKEN"
+ case yaml_SCALAR_TOKEN:
+ return "yaml_SCALAR_TOKEN"
+ }
+ return ""
+}
+
+// The token structure.
+type yaml_token_t struct {
+ // The token type.
+ typ yaml_token_type_t
+
+ // The start/end of the token.
+ start_mark, end_mark yaml_mark_t
+
+ // The stream encoding (for yaml_STREAM_START_TOKEN).
+ encoding yaml_encoding_t
+
+ // The alias/anchor/scalar value or tag/tag directive handle
+ // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
+ value []byte
+
+ // The tag suffix (for yaml_TAG_TOKEN).
+ suffix []byte
+
+ // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
+ prefix []byte
+
+ // The scalar style (for yaml_SCALAR_TOKEN).
+ style yaml_scalar_style_t
+
+ // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
+ major, minor int8
+}
+
+// Events
+
+type yaml_event_type_t int8
+
+// Event types.
+const (
+ // An empty event.
+ yaml_NO_EVENT yaml_event_type_t = iota
+
+ yaml_STREAM_START_EVENT // A STREAM-START event.
+ yaml_STREAM_END_EVENT // A STREAM-END event.
+ yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
+ yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event.
+ yaml_ALIAS_EVENT // An ALIAS event.
+ yaml_SCALAR_EVENT // A SCALAR event.
+ yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
+ yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event.
+ yaml_MAPPING_START_EVENT // A MAPPING-START event.
+ yaml_MAPPING_END_EVENT // A MAPPING-END event.
+)
+
+var eventStrings = []string{
+ yaml_NO_EVENT: "none",
+ yaml_STREAM_START_EVENT: "stream start",
+ yaml_STREAM_END_EVENT: "stream end",
+ yaml_DOCUMENT_START_EVENT: "document start",
+ yaml_DOCUMENT_END_EVENT: "document end",
+ yaml_ALIAS_EVENT: "alias",
+ yaml_SCALAR_EVENT: "scalar",
+ yaml_SEQUENCE_START_EVENT: "sequence start",
+ yaml_SEQUENCE_END_EVENT: "sequence end",
+ yaml_MAPPING_START_EVENT: "mapping start",
+ yaml_MAPPING_END_EVENT: "mapping end",
+}
+
+func (e yaml_event_type_t) String() string {
+ if e < 0 || int(e) >= len(eventStrings) {
+ return fmt.Sprintf("unknown event %d", e)
+ }
+ return eventStrings[e]
+}
+
+// The event structure.
+type yaml_event_t struct {
+
+ // The event type.
+ typ yaml_event_type_t
+
+ // The start and end of the event.
+ start_mark, end_mark yaml_mark_t
+
+ // The document encoding (for yaml_STREAM_START_EVENT).
+ encoding yaml_encoding_t
+
+ // The version directive (for yaml_DOCUMENT_START_EVENT).
+ version_directive *yaml_version_directive_t
+
+ // The list of tag directives (for yaml_DOCUMENT_START_EVENT).
+ tag_directives []yaml_tag_directive_t
+
+ // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
+ anchor []byte
+
+ // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
+ tag []byte
+
+ // The scalar value (for yaml_SCALAR_EVENT).
+ value []byte
+
+ // Is the document start/end indicator implicit, or the tag optional?
+ // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
+ implicit bool
+
+ // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
+ quoted_implicit bool
+
+ // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
+ style yaml_style_t
+}
+
+func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) }
+func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) }
+func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) }
+
+// Nodes
+
+const (
+ yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null.
+ yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false.
+ yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values.
+ yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values.
+ yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values.
+ yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
+
+ yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
+ yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
+
+ // Not in original libyaml.
+ yaml_BINARY_TAG = "tag:yaml.org,2002:binary"
+ yaml_MERGE_TAG = "tag:yaml.org,2002:merge"
+
+ yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str.
+ yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
+ yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map.
+)
+
+type yaml_node_type_t int
+
+// Node types.
+const (
+ // An empty node.
+ yaml_NO_NODE yaml_node_type_t = iota
+
+ yaml_SCALAR_NODE // A scalar node.
+ yaml_SEQUENCE_NODE // A sequence node.
+ yaml_MAPPING_NODE // A mapping node.
+)
+
+// An element of a sequence node.
+type yaml_node_item_t int
+
+// An element of a mapping node.
+type yaml_node_pair_t struct {
+ key int // The key of the element.
+ value int // The value of the element.
+}
+
+// The node structure.
+type yaml_node_t struct {
+ typ yaml_node_type_t // The node type.
+ tag []byte // The node tag.
+
+ // The node data.
+
+ // The scalar parameters (for yaml_SCALAR_NODE).
+ scalar struct {
+ value []byte // The scalar value.
+ length int // The length of the scalar value.
+ style yaml_scalar_style_t // The scalar style.
+ }
+
+ // The sequence parameters (for YAML_SEQUENCE_NODE).
+ sequence struct {
+ items_data []yaml_node_item_t // The stack of sequence items.
+ style yaml_sequence_style_t // The sequence style.
+ }
+
+ // The mapping parameters (for yaml_MAPPING_NODE).
+ mapping struct {
+ pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value).
+ pairs_start *yaml_node_pair_t // The beginning of the stack.
+ pairs_end *yaml_node_pair_t // The end of the stack.
+ pairs_top *yaml_node_pair_t // The top of the stack.
+ style yaml_mapping_style_t // The mapping style.
+ }
+
+ start_mark yaml_mark_t // The beginning of the node.
+ end_mark yaml_mark_t // The end of the node.
+
+}
+
+// The document structure.
+type yaml_document_t struct {
+
+ // The document nodes.
+ nodes []yaml_node_t
+
+ // The version directive.
+ version_directive *yaml_version_directive_t
+
+ // The list of tag directives.
+ tag_directives_data []yaml_tag_directive_t
+ tag_directives_start int // The beginning of the tag directives list.
+ tag_directives_end int // The end of the tag directives list.
+
+ start_implicit int // Is the document start indicator implicit?
+ end_implicit int // Is the document end indicator implicit?
+
+ // The start/end of the document.
+ start_mark, end_mark yaml_mark_t
+}
+
+// The prototype of a read handler.
+//
+// The read handler is called when the parser needs to read more bytes from the
+// source. The handler should write not more than size bytes to the buffer.
+// The number of written bytes should be set to the size_read variable.
+//
+// [in,out] data A pointer to an application data specified by
+// yaml_parser_set_input().
+// [out] buffer The buffer to write the data from the source.
+// [in] size The size of the buffer.
+// [out] size_read The actual number of bytes read from the source.
+//
+// On success, the handler should return 1. If the handler failed,
+// the returned value should be 0. On EOF, the handler should set the
+// size_read to 0 and return 1.
+type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)
+
+// This structure holds information about a potential simple key.
+type yaml_simple_key_t struct {
+ possible bool // Is a simple key possible?
+ required bool // Is a simple key required?
+ token_number int // The number of the token.
+ mark yaml_mark_t // The position mark.
+}
+
+// The states of the parser.
+type yaml_parser_state_t int
+
+const (
+ yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota
+
+ yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document.
+ yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START.
+ yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document.
+ yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END.
+ yaml_PARSE_BLOCK_NODE_STATE // Expect a block node.
+ yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
+ yaml_PARSE_FLOW_NODE_STATE // Expect a flow node.
+ yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence.
+ yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence.
+ yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence.
+ yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
+ yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key.
+ yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value.
+ yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
+ yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry.
+ yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
+ yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping.
+ yaml_PARSE_END_STATE // Expect nothing.
+)
+
+func (ps yaml_parser_state_t) String() string {
+ switch ps {
+ case yaml_PARSE_STREAM_START_STATE:
+ return "yaml_PARSE_STREAM_START_STATE"
+ case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+ return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
+ case yaml_PARSE_DOCUMENT_START_STATE:
+ return "yaml_PARSE_DOCUMENT_START_STATE"
+ case yaml_PARSE_DOCUMENT_CONTENT_STATE:
+ return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
+ case yaml_PARSE_DOCUMENT_END_STATE:
+ return "yaml_PARSE_DOCUMENT_END_STATE"
+ case yaml_PARSE_BLOCK_NODE_STATE:
+ return "yaml_PARSE_BLOCK_NODE_STATE"
+ case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+ return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
+ case yaml_PARSE_FLOW_NODE_STATE:
+ return "yaml_PARSE_FLOW_NODE_STATE"
+ case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+ return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
+ case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
+ case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+ return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
+ case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
+ case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
+ case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
+ case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+ return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
+ case yaml_PARSE_END_STATE:
+ return "yaml_PARSE_END_STATE"
+ }
+ return ""
+}
+
+// This structure holds aliases data.
+type yaml_alias_data_t struct {
+ anchor []byte // The anchor.
+ index int // The node id.
+ mark yaml_mark_t // The anchor mark.
+}
+
+// The parser structure.
+//
+// All members are internal. Manage the structure using the
+// yaml_parser_ family of functions.
+type yaml_parser_t struct {
+
+ // Error handling
+
+ error yaml_error_type_t // Error type.
+
+ problem string // Error description.
+
+ // The byte about which the problem occurred.
+ problem_offset int
+ problem_value int
+ problem_mark yaml_mark_t
+
+ // The error context.
+ context string
+ context_mark yaml_mark_t
+
+ // Reader stuff
+
+ read_handler yaml_read_handler_t // Read handler.
+
+ input_reader io.Reader // File input data.
+ input []byte // String input data.
+ input_pos int
+
+ eof bool // EOF flag
+
+ buffer []byte // The working buffer.
+ buffer_pos int // The current position of the buffer.
+
+ unread int // The number of unread characters in the buffer.
+
+ raw_buffer []byte // The raw buffer.
+ raw_buffer_pos int // The current position of the buffer.
+
+ encoding yaml_encoding_t // The input encoding.
+
+ offset int // The offset of the current position (in bytes).
+ mark yaml_mark_t // The mark of the current position.
+
+ // Scanner stuff
+
+ stream_start_produced bool // Have we started to scan the input stream?
+ stream_end_produced bool // Have we reached the end of the input stream?
+
+ flow_level int // The number of unclosed '[' and '{' indicators.
+
+ tokens []yaml_token_t // The tokens queue.
+ tokens_head int // The head of the tokens queue.
+ tokens_parsed int // The number of tokens fetched from the queue.
+ token_available bool // Does the tokens queue contain a token ready for dequeueing.
+
+ indent int // The current indentation level.
+ indents []int // The indentation levels stack.
+
+ simple_key_allowed bool // May a simple key occur at the current position?
+ simple_keys []yaml_simple_key_t // The stack of simple keys.
+
+ // Parser stuff
+
+ state yaml_parser_state_t // The current parser state.
+ states []yaml_parser_state_t // The parser states stack.
+ marks []yaml_mark_t // The stack of marks.
+ tag_directives []yaml_tag_directive_t // The list of TAG directives.
+
+ // Dumper stuff
+
+ aliases []yaml_alias_data_t // The alias data.
+
+ document *yaml_document_t // The currently parsed document.
+}
+
+// Emitter Definitions
+
+// The prototype of a write handler.
+//
+// The write handler is called when the emitter needs to flush the accumulated
+// characters to the output. The handler should write @a size bytes of the
+// @a buffer to the output.
+//
+// @param[in,out] data A pointer to an application data specified by
+// yaml_emitter_set_output().
+// @param[in] buffer The buffer with bytes to be written.
+// @param[in] size The size of the buffer.
+//
+// @returns On success, the handler should return @c 1. If the handler failed,
+// the returned value should be @c 0.
+//
+type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
+
+type yaml_emitter_state_t int
+
+// The emitter states.
+const (
+ // Expect STREAM-START.
+ yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota
+
+ yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END.
+ yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END.
+ yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document.
+ yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END.
+ yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence.
+ yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence.
+ yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping.
+ yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping.
+ yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence.
+ yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence.
+ yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
+ yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping.
+ yaml_EMIT_END_STATE // Expect nothing.
+)
+
+// The emitter structure.
+//
+// All members are internal. Manage the structure using the @c yaml_emitter_
+// family of functions.
+type yaml_emitter_t struct {
+
+ // Error handling
+
+ error yaml_error_type_t // Error type.
+ problem string // Error description.
+
+ // Writer stuff
+
+ write_handler yaml_write_handler_t // Write handler.
+
+ output_buffer *[]byte // String output data.
+ output_writer io.Writer // File output data.
+
+ buffer []byte // The working buffer.
+ buffer_pos int // The current position of the buffer.
+
+ raw_buffer []byte // The raw buffer.
+ raw_buffer_pos int // The current position of the buffer.
+
+ encoding yaml_encoding_t // The stream encoding.
+
+ // Emitter stuff
+
+ canonical bool // If the output is in the canonical style?
+ best_indent int // The number of indentation spaces.
+ best_width int // The preferred width of the output lines.
+ unicode bool // Allow unescaped non-ASCII characters?
+ line_break yaml_break_t // The preferred line break.
+
+ state yaml_emitter_state_t // The current emitter state.
+ states []yaml_emitter_state_t // The stack of states.
+
+ events []yaml_event_t // The event queue.
+ events_head int // The head of the event queue.
+
+ indents []int // The stack of indentation levels.
+
+ tag_directives []yaml_tag_directive_t // The list of tag directives.
+
+ indent int // The current indentation level.
+
+ flow_level int // The current flow level.
+
+ root_context bool // Is it the document root context?
+ sequence_context bool // Is it a sequence context?
+ mapping_context bool // Is it a mapping context?
+ simple_key_context bool // Is it a simple mapping key context?
+
+ line int // The current line.
+ column int // The current column.
+ whitespace bool // If the last character was a whitespace?
+ indention bool // If the last character was an indentation character (' ', '-', '?', ':')?
+ open_ended bool // If an explicit document end is required?
+
+ // Anchor analysis.
+ anchor_data struct {
+ anchor []byte // The anchor value.
+ alias bool // Is it an alias?
+ }
+
+ // Tag analysis.
+ tag_data struct {
+ handle []byte // The tag handle.
+ suffix []byte // The tag suffix.
+ }
+
+ // Scalar analysis.
+ scalar_data struct {
+ value []byte // The scalar value.
+ multiline bool // Does the scalar contain line breaks?
+ flow_plain_allowed bool // Can the scalar be expessed in the flow plain style?
+ block_plain_allowed bool // Can the scalar be expressed in the block plain style?
+ single_quoted_allowed bool // Can the scalar be expressed in the single quoted style?
+ block_allowed bool // Can the scalar be expressed in the literal or folded styles?
+ style yaml_scalar_style_t // The output style.
+ }
+
+ // Dumper stuff
+
+ opened bool // If the stream was already opened?
+ closed bool // If the stream was already closed?
+
+ // The information associated with the document nodes.
+ anchors *struct {
+ references int // The number of references.
+ anchor int // The anchor id.
+ serialized bool // If the node has been emitted?
+ }
+
+ last_anchor_id int // The last assigned anchor id.
+
+ document *yaml_document_t // The currently emitted document.
+}
diff --git a/vendor/github.com/go-yaml/yaml/yamlprivateh.go b/vendor/github.com/go-yaml/yaml/yamlprivateh.go
new file mode 100644
index 0000000000..8110ce3c37
--- /dev/null
+++ b/vendor/github.com/go-yaml/yaml/yamlprivateh.go
@@ -0,0 +1,173 @@
+package yaml
+
+const (
+ // The size of the input raw buffer.
+ input_raw_buffer_size = 512
+
+ // The size of the input buffer.
+ // It should be possible to decode the whole raw buffer.
+ input_buffer_size = input_raw_buffer_size * 3
+
+ // The size of the output buffer.
+ output_buffer_size = 128
+
+ // The size of the output raw buffer.
+ // It should be possible to encode the whole output buffer.
+ output_raw_buffer_size = (output_buffer_size*2 + 2)
+
+ // The size of other stacks and queues.
+ initial_stack_size = 16
+ initial_queue_size = 16
+ initial_string_size = 16
+)
+
+// Check if the character at the specified position is an alphabetical
+// character, a digit, '_', or '-'.
+func is_alpha(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
+}
+
+// Check if the character at the specified position is a digit.
+func is_digit(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9'
+}
+
+// Get the value of a digit.
+func as_digit(b []byte, i int) int {
+ return int(b[i]) - '0'
+}
+
+// Check if the character at the specified position is a hex-digit.
+func is_hex(b []byte, i int) bool {
+ return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f'
+}
+
+// Get the value of a hex-digit.
+func as_hex(b []byte, i int) int {
+ bi := b[i]
+ if bi >= 'A' && bi <= 'F' {
+ return int(bi) - 'A' + 10
+ }
+ if bi >= 'a' && bi <= 'f' {
+ return int(bi) - 'a' + 10
+ }
+ return int(bi) - '0'
+}
+
+// Check if the character is ASCII.
+func is_ascii(b []byte, i int) bool {
+ return b[i] <= 0x7F
+}
+
+// Check if the character at the start of the buffer can be printed unescaped.
+func is_printable(b []byte, i int) bool {
+ return ((b[i] == 0x0A) || // . == #x0A
+ (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
+ (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
+ (b[i] > 0xC2 && b[i] < 0xED) ||
+ (b[i] == 0xED && b[i+1] < 0xA0) ||
+ (b[i] == 0xEE) ||
+ (b[i] == 0xEF && // #xE000 <= . <= #xFFFD
+ !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
+ !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
+}
+
+// Check if the character at the specified position is NUL.
+func is_z(b []byte, i int) bool {
+ return b[i] == 0x00
+}
+
+// Check if the beginning of the buffer is a BOM.
+func is_bom(b []byte, i int) bool {
+ return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
+}
+
+// Check if the character at the specified position is space.
+func is_space(b []byte, i int) bool {
+ return b[i] == ' '
+}
+
+// Check if the character at the specified position is tab.
+func is_tab(b []byte, i int) bool {
+ return b[i] == '\t'
+}
+
+// Check if the character at the specified position is blank (space or tab).
+func is_blank(b []byte, i int) bool {
+ //return is_space(b, i) || is_tab(b, i)
+ return b[i] == ' ' || b[i] == '\t'
+}
+
+// Check if the character at the specified position is a line break.
+func is_break(b []byte, i int) bool {
+ return (b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
+}
+
+func is_crlf(b []byte, i int) bool {
+ return b[i] == '\r' && b[i+1] == '\n'
+}
+
+// Check if the character is a line break or NUL.
+func is_breakz(b []byte, i int) bool {
+ //return is_break(b, i) || is_z(b, i)
+ return ( // is_break:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ // is_z:
+ b[i] == 0)
+}
+
+// Check if the character is a line break, space, or NUL.
+func is_spacez(b []byte, i int) bool {
+ //return is_space(b, i) || is_breakz(b, i)
+ return ( // is_space:
+ b[i] == ' ' ||
+ // is_breakz:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ b[i] == 0)
+}
+
+// Check if the character is a line break, space, tab, or NUL.
+func is_blankz(b []byte, i int) bool {
+ //return is_blank(b, i) || is_breakz(b, i)
+ return ( // is_blank:
+ b[i] == ' ' || b[i] == '\t' ||
+ // is_breakz:
+ b[i] == '\r' || // CR (#xD)
+ b[i] == '\n' || // LF (#xA)
+ b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
+ b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
+ b[i] == 0)
+}
+
+// Determine the width of the character.
+func width(b byte) int {
+ // Don't replace these by a switch without first
+ // confirming that it is being inlined.
+ if b&0x80 == 0x00 {
+ return 1
+ }
+ if b&0xE0 == 0xC0 {
+ return 2
+ }
+ if b&0xF0 == 0xE0 {
+ return 3
+ }
+ if b&0xF8 == 0xF0 {
+ return 4
+ }
+ return 0
+
+}
diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go
deleted file mode 100644
index cb95b7fa1b..0000000000
--- a/vendor/github.com/google/btree/btree_mem.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// +build ignore
-
-// This binary compares memory usage between btree and gollrb.
-package main
-
-import (
- "flag"
- "fmt"
- "math/rand"
- "runtime"
- "time"
-
- "github.com/google/btree"
- "github.com/petar/GoLLRB/llrb"
-)
-
-var (
- size = flag.Int("size", 1000000, "size of the tree to build")
- degree = flag.Int("degree", 8, "degree of btree")
- gollrb = flag.Bool("llrb", false, "use llrb instead of btree")
-)
-
-func main() {
- flag.Parse()
- vals := rand.Perm(*size)
- var t, v interface{}
- v = vals
- var stats runtime.MemStats
- for i := 0; i < 10; i++ {
- runtime.GC()
- }
- fmt.Println("-------- BEFORE ----------")
- runtime.ReadMemStats(&stats)
- fmt.Printf("%+v\n", stats)
- start := time.Now()
- if *gollrb {
- tr := llrb.New()
- for _, v := range vals {
- tr.ReplaceOrInsert(llrb.Int(v))
- }
- t = tr // keep it around
- } else {
- tr := btree.New(*degree)
- for _, v := range vals {
- tr.ReplaceOrInsert(btree.Int(v))
- }
- t = tr // keep it around
- }
- fmt.Printf("%v inserts in %v\n", *size, time.Since(start))
- fmt.Println("-------- AFTER ----------")
- runtime.ReadMemStats(&stats)
- fmt.Printf("%+v\n", stats)
- for i := 0; i < 10; i++ {
- runtime.GC()
- }
- fmt.Println("-------- AFTER GC ----------")
- runtime.ReadMemStats(&stats)
- fmt.Printf("%+v\n", stats)
- if t == v {
- fmt.Println("to make sure vals and tree aren't GC'd")
- }
-}
diff --git a/vendor/github.com/google/gopacket/layers/gen.go b/vendor/github.com/google/gopacket/layers/gen.go
deleted file mode 100644
index ab7a0c001f..0000000000
--- a/vendor/github.com/google/gopacket/layers/gen.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2012 Google, Inc. All rights reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the LICENSE file in the root of the source
-// tree.
-
-// +build ignore
-
-// This binary pulls known ports from IANA, and uses them to populate
-// iana_ports.go's TCPPortNames and UDPPortNames maps.
-//
-// go run gen.go | gofmt > iana_ports.go
-package main
-
-import (
- "bytes"
- "encoding/xml"
- "flag"
- "fmt"
- "io/ioutil"
- "net/http"
- "os"
- "strconv"
- "time"
-)
-
-const fmtString = `// Copyright 2012 Google, Inc. All rights reserved.
-
-package layers
-
-// Created by gen.go, don't edit manually
-// Generated at %s
-// Fetched from %q
-
-// TCPPortNames contains the port names for all TCP ports.
-var TCPPortNames = tcpPortNames
-
-// UDPPortNames contains the port names for all UDP ports.
-var UDPPortNames = udpPortNames
-
-// SCTPPortNames contains the port names for all SCTP ports.
-var SCTPPortNames = sctpPortNames
-
-var tcpPortNames = map[TCPPort]string{
-%s}
-var udpPortNames = map[UDPPort]string{
-%s}
-var sctpPortNames = map[SCTPPort]string{
-%s}
-`
-
-var url = flag.String("url", "http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml", "URL to grab port numbers from")
-
-func main() {
- fmt.Fprintf(os.Stderr, "Fetching ports from %q\n", *url)
- resp, err := http.Get(*url)
- if err != nil {
- panic(err)
- }
- defer resp.Body.Close()
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- panic(err)
- }
- fmt.Fprintln(os.Stderr, "Parsing XML")
- var registry struct {
- Records []struct {
- Protocol string `xml:"protocol"`
- Number string `xml:"number"`
- Name string `xml:"name"`
- } `xml:"record"`
- }
- xml.Unmarshal(body, ®istry)
- var tcpPorts bytes.Buffer
- var udpPorts bytes.Buffer
- var sctpPorts bytes.Buffer
- done := map[string]map[int]bool{
- "tcp": map[int]bool{},
- "udp": map[int]bool{},
- "sctp": map[int]bool{},
- }
- for _, r := range registry.Records {
- port, err := strconv.Atoi(r.Number)
- if err != nil {
- continue
- }
- if r.Name == "" {
- continue
- }
- var b *bytes.Buffer
- switch r.Protocol {
- case "tcp":
- b = &tcpPorts
- case "udp":
- b = &udpPorts
- case "sctp":
- b = &sctpPorts
- default:
- continue
- }
- if done[r.Protocol][port] {
- continue
- }
- done[r.Protocol][port] = true
- fmt.Fprintf(b, "\t%d: %q,\n", port, r.Name)
- }
- fmt.Fprintln(os.Stderr, "Writing results to stdout")
- fmt.Printf(fmtString, time.Now(), *url, tcpPorts.String(), udpPorts.String(), sctpPorts.String())
-}
diff --git a/vendor/github.com/google/gopacket/layers/gen2.go b/vendor/github.com/google/gopacket/layers/gen2.go
deleted file mode 100644
index 150cad77f8..0000000000
--- a/vendor/github.com/google/gopacket/layers/gen2.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2012 Google, Inc. All rights reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the LICENSE file in the root of the source
-// tree.
-
-// +build ignore
-
-// This binary handles creating string constants and function templates for enums.
-//
-// go run gen.go | gofmt > enums_generated.go
-package main
-
-import (
- "fmt"
- "log"
- "os"
- "text/template"
- "time"
-)
-
-const fmtString = `// Copyright 2012 Google, Inc. All rights reserved.
-
-package layers
-
-// Created by gen2.go, don't edit manually
-// Generated at %s
-
-import (
- "fmt"
-
- "github.com/google/gopacket"
-)
-
-`
-
-var funcsTmpl = template.Must(template.New("foo").Parse(`
-// Decoder calls {{.Name}}Metadata.DecodeWith's decoder.
-func (a {{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error {
- return {{.Name}}Metadata[a].DecodeWith.Decode(data, p)
-}
-// String returns {{.Name}}Metadata.Name.
-func (a {{.Name}}) String() string {
- return {{.Name}}Metadata[a].Name
-}
-// LayerType returns {{.Name}}Metadata.LayerType.
-func (a {{.Name}}) LayerType() gopacket.LayerType {
- return {{.Name}}Metadata[a].LayerType
-}
-
-type errorDecoderFor{{.Name}} int
-func (a *errorDecoderFor{{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error {
- return a
-}
-func (a *errorDecoderFor{{.Name}}) Error() string {
- return fmt.Sprintf("Unable to decode {{.Name}} %d", int(*a))
-}
-
-var errorDecodersFor{{.Name}} [{{.Num}}]errorDecoderFor{{.Name}}
-var {{.Name}}Metadata [{{.Num}}]EnumMetadata
-
-func initUnknownTypesFor{{.Name}}() {
- for i := 0; i < {{.Num}}; i++ {
- errorDecodersFor{{.Name}}[i] = errorDecoderFor{{.Name}}(i)
- {{.Name}}Metadata[i] = EnumMetadata{
- DecodeWith: &errorDecodersFor{{.Name}}[i],
- Name: "Unknown{{.Name}}",
- }
- }
-}
-`))
-
-func main() {
- fmt.Fprintf(os.Stderr, "Writing results to stdout\n")
- fmt.Printf(fmtString, time.Now())
- types := []struct {
- Name string
- Num int
- }{
- {"LinkType", 256},
- {"EthernetType", 65536},
- {"PPPType", 65536},
- {"IPProtocol", 256},
- {"SCTPChunkType", 256},
- {"PPPoECode", 256},
- {"FDDIFrameControl", 256},
- {"EAPOLType", 256},
- {"ProtocolFamily", 256},
- {"Dot11Type", 256},
- {"USBTransportType", 256},
- }
-
- fmt.Println("func init() {")
- for _, t := range types {
- fmt.Printf("initUnknownTypesFor%s()\n", t.Name)
- }
- fmt.Println("initActualTypeData()")
- fmt.Println("}")
- for _, t := range types {
- if err := funcsTmpl.Execute(os.Stdout, t); err != nil {
- log.Fatalf("Failed to execute template %s: %v", t.Name, err)
- }
- }
-}
diff --git a/vendor/github.com/kr/pty/types.go b/vendor/github.com/kr/pty/types.go
deleted file mode 100644
index 5aecb6bcdc..0000000000
--- a/vendor/github.com/kr/pty/types.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// +build ignore
-
-package pty
-
-import "C"
-
-type (
- _C_int C.int
- _C_uint C.uint
-)
diff --git a/vendor/github.com/kr/pty/types_dragonfly.go b/vendor/github.com/kr/pty/types_dragonfly.go
deleted file mode 100644
index 5c0493b851..0000000000
--- a/vendor/github.com/kr/pty/types_dragonfly.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// +build ignore
-
-package pty
-
-/*
-#define _KERNEL
-#include
-#include
-#include
-*/
-import "C"
-
-const (
- _C_SPECNAMELEN = C.SPECNAMELEN /* max length of devicename */
-)
-
-type fiodgnameArg C.struct_fiodname_args
diff --git a/vendor/github.com/kr/pty/types_freebsd.go b/vendor/github.com/kr/pty/types_freebsd.go
deleted file mode 100644
index ce3eb95181..0000000000
--- a/vendor/github.com/kr/pty/types_freebsd.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// +build ignore
-
-package pty
-
-/*
-#include
-#include
-*/
-import "C"
-
-const (
- _C_SPECNAMELEN = C.SPECNAMELEN /* max length of devicename */
-)
-
-type fiodgnameArg C.struct_fiodgname_arg
diff --git a/vendor/github.com/kr/pty/types_openbsd.go b/vendor/github.com/kr/pty/types_openbsd.go
deleted file mode 100644
index 47701b5f9e..0000000000
--- a/vendor/github.com/kr/pty/types_openbsd.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// +build ignore
-
-package pty
-
-/*
-#include
-#include
-#include
-*/
-import "C"
-
-type ptmget C.struct_ptmget
-
-var ioctl_PTMGET = C.PTMGET
diff --git a/vendor/github.com/miekg/dns/duplicate_generate.go b/vendor/github.com/miekg/dns/duplicate_generate.go
deleted file mode 100644
index 83ac1cf770..0000000000
--- a/vendor/github.com/miekg/dns/duplicate_generate.go
+++ /dev/null
@@ -1,158 +0,0 @@
-//+build ignore
-
-// types_generate.go is meant to run with go generate. It will use
-// go/{importer,types} to track down all the RR struct types. Then for each type
-// it will generate conversion tables (TypeToRR and TypeToString) and banal
-// methods (len, Header, copy) based on the struct tags. The generated source is
-// written to ztypes.go, and is meant to be checked into git.
-package main
-
-import (
- "bytes"
- "fmt"
- "go/format"
- "go/importer"
- "go/types"
- "log"
- "os"
-)
-
-var packageHdr = `
-// Code generated by "go run duplicate_generate.go"; DO NOT EDIT.
-
-package dns
-
-`
-
-func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) {
- st, ok := t.Underlying().(*types.Struct)
- if !ok {
- return nil, false
- }
- if st.Field(0).Type() == scope.Lookup("RR_Header").Type() {
- return st, false
- }
- if st.Field(0).Anonymous() {
- st, _ := getTypeStruct(st.Field(0).Type(), scope)
- return st, true
- }
- return nil, false
-}
-
-func main() {
- // Import and type-check the package
- pkg, err := importer.Default().Import("github.com/miekg/dns")
- fatalIfErr(err)
- scope := pkg.Scope()
-
- // Collect actual types (*X)
- var namedTypes []string
- for _, name := range scope.Names() {
- o := scope.Lookup(name)
- if o == nil || !o.Exported() {
- continue
- }
-
- if st, _ := getTypeStruct(o.Type(), scope); st == nil {
- continue
- }
-
- if name == "PrivateRR" || name == "RFC3597" {
- continue
- }
- if name == "OPT" || name == "ANY" || name == "IXFR" || name == "AXFR" {
- continue
- }
-
- namedTypes = append(namedTypes, o.Name())
- }
-
- b := &bytes.Buffer{}
- b.WriteString(packageHdr)
-
- // Generate the giant switch that calls the correct function for each type.
- fmt.Fprint(b, "// isDuplicateRdata calls the rdata specific functions\n")
- fmt.Fprint(b, "func isDuplicateRdata(r1, r2 RR) bool {\n")
- fmt.Fprint(b, "switch r1.Header().Rrtype {\n")
-
- for _, name := range namedTypes {
-
- o := scope.Lookup(name)
- _, isEmbedded := getTypeStruct(o.Type(), scope)
- if isEmbedded {
- continue
- }
- fmt.Fprintf(b, "case Type%s:\nreturn isDuplicate%s(r1.(*%s), r2.(*%s))\n", name, name, name, name)
- }
- fmt.Fprintf(b, "}\nreturn false\n}\n")
-
- // Generate the duplicate check for each type.
- fmt.Fprint(b, "// isDuplicate() functions\n\n")
- for _, name := range namedTypes {
-
- o := scope.Lookup(name)
- st, isEmbedded := getTypeStruct(o.Type(), scope)
- if isEmbedded {
- continue
- }
- fmt.Fprintf(b, "func isDuplicate%s(r1, r2 *%s) bool {\n", name, name)
- for i := 1; i < st.NumFields(); i++ {
- field := st.Field(i).Name()
- o2 := func(s string) { fmt.Fprintf(b, s+"\n", field, field) }
- o3 := func(s string) { fmt.Fprintf(b, s+"\n", field, field, field) }
-
- // For some reason, a and aaaa don't pop up as *types.Slice here (mostly like because the are
- // *indirectly* defined as a slice in the net package).
- if _, ok := st.Field(i).Type().(*types.Slice); ok || st.Tag(i) == `dns:"a"` || st.Tag(i) == `dns:"aaaa"` {
- o2("if len(r1.%s) != len(r2.%s) {\nreturn false\n}")
-
- if st.Tag(i) == `dns:"cdomain-name"` || st.Tag(i) == `dns:"domain-name"` {
- o3(`for i := 0; i < len(r1.%s); i++ {
- if !isDulicateName(r1.%s[i], r2.%s[i]) {
- return false
- }
- }`)
-
- continue
- }
-
- o3(`for i := 0; i < len(r1.%s); i++ {
- if r1.%s[i] != r2.%s[i] {
- return false
- }
- }`)
-
- continue
- }
-
- switch st.Tag(i) {
- case `dns:"-"`:
- // ignored
- case `dns:"cdomain-name"`, `dns:"domain-name"`:
- o2("if !isDulicateName(r1.%s, r2.%s) {\nreturn false\n}")
- default:
- o2("if r1.%s != r2.%s {\nreturn false\n}")
- }
- }
- fmt.Fprintf(b, "return true\n}\n\n")
- }
-
- // gofmt
- res, err := format.Source(b.Bytes())
- if err != nil {
- b.WriteTo(os.Stderr)
- log.Fatal(err)
- }
-
- // write result
- f, err := os.Create("zduplicate.go")
- fatalIfErr(err)
- defer f.Close()
- f.Write(res)
-}
-
-func fatalIfErr(err error) {
- if err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/github.com/miekg/dns/msg_generate.go b/vendor/github.com/miekg/dns/msg_generate.go
deleted file mode 100644
index 86ed04fcb8..0000000000
--- a/vendor/github.com/miekg/dns/msg_generate.go
+++ /dev/null
@@ -1,345 +0,0 @@
-//+build ignore
-
-// msg_generate.go is meant to run with go generate. It will use
-// go/{importer,types} to track down all the RR struct types. Then for each type
-// it will generate pack/unpack methods based on the struct tags. The generated source is
-// written to zmsg.go, and is meant to be checked into git.
-package main
-
-import (
- "bytes"
- "fmt"
- "go/format"
- "go/importer"
- "go/types"
- "log"
- "os"
- "strings"
-)
-
-var packageHdr = `
-// Code generated by "go run msg_generate.go"; DO NOT EDIT.
-
-package dns
-
-`
-
-// getTypeStruct will take a type and the package scope, and return the
-// (innermost) struct if the type is considered a RR type (currently defined as
-// those structs beginning with a RR_Header, could be redefined as implementing
-// the RR interface). The bool return value indicates if embedded structs were
-// resolved.
-func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) {
- st, ok := t.Underlying().(*types.Struct)
- if !ok {
- return nil, false
- }
- if st.Field(0).Type() == scope.Lookup("RR_Header").Type() {
- return st, false
- }
- if st.Field(0).Anonymous() {
- st, _ := getTypeStruct(st.Field(0).Type(), scope)
- return st, true
- }
- return nil, false
-}
-
-func main() {
- // Import and type-check the package
- pkg, err := importer.Default().Import("github.com/miekg/dns")
- fatalIfErr(err)
- scope := pkg.Scope()
-
- // Collect actual types (*X)
- var namedTypes []string
- for _, name := range scope.Names() {
- o := scope.Lookup(name)
- if o == nil || !o.Exported() {
- continue
- }
- if st, _ := getTypeStruct(o.Type(), scope); st == nil {
- continue
- }
- if name == "PrivateRR" {
- continue
- }
-
- // Check if corresponding TypeX exists
- if scope.Lookup("Type"+o.Name()) == nil && o.Name() != "RFC3597" {
- log.Fatalf("Constant Type%s does not exist.", o.Name())
- }
-
- namedTypes = append(namedTypes, o.Name())
- }
-
- b := &bytes.Buffer{}
- b.WriteString(packageHdr)
-
- fmt.Fprint(b, "// pack*() functions\n\n")
- for _, name := range namedTypes {
- o := scope.Lookup(name)
- st, _ := getTypeStruct(o.Type(), scope)
-
- fmt.Fprintf(b, "func (rr *%s) pack(msg []byte, off int, compression compressionMap, compress bool) (int, int, error) {\n", name)
- fmt.Fprint(b, `headerEnd, off, err := rr.Hdr.pack(msg, off, compression, compress)
-if err != nil {
- return headerEnd, off, err
-}
-`)
- for i := 1; i < st.NumFields(); i++ {
- o := func(s string) {
- fmt.Fprintf(b, s, st.Field(i).Name())
- fmt.Fprint(b, `if err != nil {
-return headerEnd, off, err
-}
-`)
- }
-
- if _, ok := st.Field(i).Type().(*types.Slice); ok {
- switch st.Tag(i) {
- case `dns:"-"`: // ignored
- case `dns:"txt"`:
- o("off, err = packStringTxt(rr.%s, msg, off)\n")
- case `dns:"opt"`:
- o("off, err = packDataOpt(rr.%s, msg, off)\n")
- case `dns:"nsec"`:
- o("off, err = packDataNsec(rr.%s, msg, off)\n")
- case `dns:"domain-name"`:
- o("off, err = packDataDomainNames(rr.%s, msg, off, compression, false)\n")
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- continue
- }
-
- switch {
- case st.Tag(i) == `dns:"-"`: // ignored
- case st.Tag(i) == `dns:"cdomain-name"`:
- o("off, _, err = packDomainName(rr.%s, msg, off, compression, compress)\n")
- case st.Tag(i) == `dns:"domain-name"`:
- o("off, _, err = packDomainName(rr.%s, msg, off, compression, false)\n")
- case st.Tag(i) == `dns:"a"`:
- o("off, err = packDataA(rr.%s, msg, off)\n")
- case st.Tag(i) == `dns:"aaaa"`:
- o("off, err = packDataAAAA(rr.%s, msg, off)\n")
- case st.Tag(i) == `dns:"uint48"`:
- o("off, err = packUint48(rr.%s, msg, off)\n")
- case st.Tag(i) == `dns:"txt"`:
- o("off, err = packString(rr.%s, msg, off)\n")
-
- case strings.HasPrefix(st.Tag(i), `dns:"size-base32`): // size-base32 can be packed just like base32
- fallthrough
- case st.Tag(i) == `dns:"base32"`:
- o("off, err = packStringBase32(rr.%s, msg, off)\n")
-
- case strings.HasPrefix(st.Tag(i), `dns:"size-base64`): // size-base64 can be packed just like base64
- fallthrough
- case st.Tag(i) == `dns:"base64"`:
- o("off, err = packStringBase64(rr.%s, msg, off)\n")
-
- case strings.HasPrefix(st.Tag(i), `dns:"size-hex:SaltLength`):
- // directly write instead of using o() so we get the error check in the correct place
- field := st.Field(i).Name()
- fmt.Fprintf(b, `// Only pack salt if value is not "-", i.e. empty
-if rr.%s != "-" {
- off, err = packStringHex(rr.%s, msg, off)
- if err != nil {
- return headerEnd, off, err
- }
-}
-`, field, field)
- continue
- case strings.HasPrefix(st.Tag(i), `dns:"size-hex`): // size-hex can be packed just like hex
- fallthrough
- case st.Tag(i) == `dns:"hex"`:
- o("off, err = packStringHex(rr.%s, msg, off)\n")
-
- case st.Tag(i) == `dns:"octet"`:
- o("off, err = packStringOctet(rr.%s, msg, off)\n")
- case st.Tag(i) == "":
- switch st.Field(i).Type().(*types.Basic).Kind() {
- case types.Uint8:
- o("off, err = packUint8(rr.%s, msg, off)\n")
- case types.Uint16:
- o("off, err = packUint16(rr.%s, msg, off)\n")
- case types.Uint32:
- o("off, err = packUint32(rr.%s, msg, off)\n")
- case types.Uint64:
- o("off, err = packUint64(rr.%s, msg, off)\n")
- case types.String:
- o("off, err = packString(rr.%s, msg, off)\n")
- default:
- log.Fatalln(name, st.Field(i).Name())
- }
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- }
- fmt.Fprintln(b, "return headerEnd, off, nil }\n")
- }
-
- fmt.Fprint(b, "// unpack*() functions\n\n")
- for _, name := range namedTypes {
- o := scope.Lookup(name)
- st, _ := getTypeStruct(o.Type(), scope)
-
- fmt.Fprintf(b, "func unpack%s(h RR_Header, msg []byte, off int) (RR, int, error) {\n", name)
- fmt.Fprintf(b, "rr := new(%s)\n", name)
- fmt.Fprint(b, "rr.Hdr = h\n")
- fmt.Fprint(b, `if noRdata(h) {
-return rr, off, nil
- }
-var err error
-rdStart := off
-_ = rdStart
-
-`)
- for i := 1; i < st.NumFields(); i++ {
- o := func(s string) {
- fmt.Fprintf(b, s, st.Field(i).Name())
- fmt.Fprint(b, `if err != nil {
-return rr, off, err
-}
-`)
- }
-
- // size-* are special, because they reference a struct member we should use for the length.
- if strings.HasPrefix(st.Tag(i), `dns:"size-`) {
- structMember := structMember(st.Tag(i))
- structTag := structTag(st.Tag(i))
- switch structTag {
- case "hex":
- fmt.Fprintf(b, "rr.%s, off, err = unpackStringHex(msg, off, off + int(rr.%s))\n", st.Field(i).Name(), structMember)
- case "base32":
- fmt.Fprintf(b, "rr.%s, off, err = unpackStringBase32(msg, off, off + int(rr.%s))\n", st.Field(i).Name(), structMember)
- case "base64":
- fmt.Fprintf(b, "rr.%s, off, err = unpackStringBase64(msg, off, off + int(rr.%s))\n", st.Field(i).Name(), structMember)
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- fmt.Fprint(b, `if err != nil {
-return rr, off, err
-}
-`)
- continue
- }
-
- if _, ok := st.Field(i).Type().(*types.Slice); ok {
- switch st.Tag(i) {
- case `dns:"-"`: // ignored
- case `dns:"txt"`:
- o("rr.%s, off, err = unpackStringTxt(msg, off)\n")
- case `dns:"opt"`:
- o("rr.%s, off, err = unpackDataOpt(msg, off)\n")
- case `dns:"nsec"`:
- o("rr.%s, off, err = unpackDataNsec(msg, off)\n")
- case `dns:"domain-name"`:
- o("rr.%s, off, err = unpackDataDomainNames(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- continue
- }
-
- switch st.Tag(i) {
- case `dns:"-"`: // ignored
- case `dns:"cdomain-name"`:
- fallthrough
- case `dns:"domain-name"`:
- o("rr.%s, off, err = UnpackDomainName(msg, off)\n")
- case `dns:"a"`:
- o("rr.%s, off, err = unpackDataA(msg, off)\n")
- case `dns:"aaaa"`:
- o("rr.%s, off, err = unpackDataAAAA(msg, off)\n")
- case `dns:"uint48"`:
- o("rr.%s, off, err = unpackUint48(msg, off)\n")
- case `dns:"txt"`:
- o("rr.%s, off, err = unpackString(msg, off)\n")
- case `dns:"base32"`:
- o("rr.%s, off, err = unpackStringBase32(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
- case `dns:"base64"`:
- o("rr.%s, off, err = unpackStringBase64(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
- case `dns:"hex"`:
- o("rr.%s, off, err = unpackStringHex(msg, off, rdStart + int(rr.Hdr.Rdlength))\n")
- case `dns:"octet"`:
- o("rr.%s, off, err = unpackStringOctet(msg, off)\n")
- case "":
- switch st.Field(i).Type().(*types.Basic).Kind() {
- case types.Uint8:
- o("rr.%s, off, err = unpackUint8(msg, off)\n")
- case types.Uint16:
- o("rr.%s, off, err = unpackUint16(msg, off)\n")
- case types.Uint32:
- o("rr.%s, off, err = unpackUint32(msg, off)\n")
- case types.Uint64:
- o("rr.%s, off, err = unpackUint64(msg, off)\n")
- case types.String:
- o("rr.%s, off, err = unpackString(msg, off)\n")
- default:
- log.Fatalln(name, st.Field(i).Name())
- }
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- // If we've hit len(msg) we return without error.
- if i < st.NumFields()-1 {
- fmt.Fprintf(b, `if off == len(msg) {
-return rr, off, nil
- }
-`)
- }
- }
- fmt.Fprintf(b, "return rr, off, err }\n\n")
- }
- // Generate typeToUnpack map
- fmt.Fprintln(b, "var typeToUnpack = map[uint16]func(RR_Header, []byte, int) (RR, int, error){")
- for _, name := range namedTypes {
- if name == "RFC3597" {
- continue
- }
- fmt.Fprintf(b, "Type%s: unpack%s,\n", name, name)
- }
- fmt.Fprintln(b, "}\n")
-
- // gofmt
- res, err := format.Source(b.Bytes())
- if err != nil {
- b.WriteTo(os.Stderr)
- log.Fatal(err)
- }
-
- // write result
- f, err := os.Create("zmsg.go")
- fatalIfErr(err)
- defer f.Close()
- f.Write(res)
-}
-
-// structMember will take a tag like dns:"size-base32:SaltLength" and return the last part of this string.
-func structMember(s string) string {
- fields := strings.Split(s, ":")
- if len(fields) == 0 {
- return ""
- }
- f := fields[len(fields)-1]
- // f should have a closing "
- if len(f) > 1 {
- return f[:len(f)-1]
- }
- return f
-}
-
-// structTag will take a tag like dns:"size-base32:SaltLength" and return base32.
-func structTag(s string) string {
- fields := strings.Split(s, ":")
- if len(fields) < 2 {
- return ""
- }
- return fields[1][len("\"size-"):]
-}
-
-func fatalIfErr(err error) {
- if err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/github.com/miekg/dns/types_generate.go b/vendor/github.com/miekg/dns/types_generate.go
deleted file mode 100644
index 8c897ec118..0000000000
--- a/vendor/github.com/miekg/dns/types_generate.go
+++ /dev/null
@@ -1,278 +0,0 @@
-//+build ignore
-
-// types_generate.go is meant to run with go generate. It will use
-// go/{importer,types} to track down all the RR struct types. Then for each type
-// it will generate conversion tables (TypeToRR and TypeToString) and banal
-// methods (len, Header, copy) based on the struct tags. The generated source is
-// written to ztypes.go, and is meant to be checked into git.
-package main
-
-import (
- "bytes"
- "fmt"
- "go/format"
- "go/importer"
- "go/types"
- "log"
- "os"
- "strings"
- "text/template"
-)
-
-var skipLen = map[string]struct{}{
- "NSEC": {},
- "NSEC3": {},
- "OPT": {},
- "CSYNC": {},
-}
-
-var packageHdr = `
-// Code generated by "go run types_generate.go"; DO NOT EDIT.
-
-package dns
-
-import (
- "encoding/base64"
- "net"
-)
-
-`
-
-var TypeToRR = template.Must(template.New("TypeToRR").Parse(`
-// TypeToRR is a map of constructors for each RR type.
-var TypeToRR = map[uint16]func() RR{
-{{range .}}{{if ne . "RFC3597"}} Type{{.}}: func() RR { return new({{.}}) },
-{{end}}{{end}} }
-
-`))
-
-var typeToString = template.Must(template.New("typeToString").Parse(`
-// TypeToString is a map of strings for each RR type.
-var TypeToString = map[uint16]string{
-{{range .}}{{if ne . "NSAPPTR"}} Type{{.}}: "{{.}}",
-{{end}}{{end}} TypeNSAPPTR: "NSAP-PTR",
-}
-
-`))
-
-var headerFunc = template.Must(template.New("headerFunc").Parse(`
-{{range .}} func (rr *{{.}}) Header() *RR_Header { return &rr.Hdr }
-{{end}}
-
-`))
-
-// getTypeStruct will take a type and the package scope, and return the
-// (innermost) struct if the type is considered a RR type (currently defined as
-// those structs beginning with a RR_Header, could be redefined as implementing
-// the RR interface). The bool return value indicates if embedded structs were
-// resolved.
-func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) {
- st, ok := t.Underlying().(*types.Struct)
- if !ok {
- return nil, false
- }
- if st.Field(0).Type() == scope.Lookup("RR_Header").Type() {
- return st, false
- }
- if st.Field(0).Anonymous() {
- st, _ := getTypeStruct(st.Field(0).Type(), scope)
- return st, true
- }
- return nil, false
-}
-
-func main() {
- // Import and type-check the package
- pkg, err := importer.Default().Import("github.com/miekg/dns")
- fatalIfErr(err)
- scope := pkg.Scope()
-
- // Collect constants like TypeX
- var numberedTypes []string
- for _, name := range scope.Names() {
- o := scope.Lookup(name)
- if o == nil || !o.Exported() {
- continue
- }
- b, ok := o.Type().(*types.Basic)
- if !ok || b.Kind() != types.Uint16 {
- continue
- }
- if !strings.HasPrefix(o.Name(), "Type") {
- continue
- }
- name := strings.TrimPrefix(o.Name(), "Type")
- if name == "PrivateRR" {
- continue
- }
- numberedTypes = append(numberedTypes, name)
- }
-
- // Collect actual types (*X)
- var namedTypes []string
- for _, name := range scope.Names() {
- o := scope.Lookup(name)
- if o == nil || !o.Exported() {
- continue
- }
- if st, _ := getTypeStruct(o.Type(), scope); st == nil {
- continue
- }
- if name == "PrivateRR" {
- continue
- }
-
- // Check if corresponding TypeX exists
- if scope.Lookup("Type"+o.Name()) == nil && o.Name() != "RFC3597" {
- log.Fatalf("Constant Type%s does not exist.", o.Name())
- }
-
- namedTypes = append(namedTypes, o.Name())
- }
-
- b := &bytes.Buffer{}
- b.WriteString(packageHdr)
-
- // Generate TypeToRR
- fatalIfErr(TypeToRR.Execute(b, namedTypes))
-
- // Generate typeToString
- fatalIfErr(typeToString.Execute(b, numberedTypes))
-
- // Generate headerFunc
- fatalIfErr(headerFunc.Execute(b, namedTypes))
-
- // Generate len()
- fmt.Fprint(b, "// len() functions\n")
- for _, name := range namedTypes {
- if _, ok := skipLen[name]; ok {
- continue
- }
- o := scope.Lookup(name)
- st, isEmbedded := getTypeStruct(o.Type(), scope)
- if isEmbedded {
- continue
- }
- fmt.Fprintf(b, "func (rr *%s) len(off int, compression map[string]struct{}) int {\n", name)
- fmt.Fprintf(b, "l := rr.Hdr.len(off, compression)\n")
- for i := 1; i < st.NumFields(); i++ {
- o := func(s string) { fmt.Fprintf(b, s, st.Field(i).Name()) }
-
- if _, ok := st.Field(i).Type().(*types.Slice); ok {
- switch st.Tag(i) {
- case `dns:"-"`:
- // ignored
- case `dns:"cdomain-name"`:
- o("for _, x := range rr.%s { l += domainNameLen(x, off+l, compression, true) }\n")
- case `dns:"domain-name"`:
- o("for _, x := range rr.%s { l += domainNameLen(x, off+l, compression, false) }\n")
- case `dns:"txt"`:
- o("for _, x := range rr.%s { l += len(x) + 1 }\n")
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- continue
- }
-
- switch {
- case st.Tag(i) == `dns:"-"`:
- // ignored
- case st.Tag(i) == `dns:"cdomain-name"`:
- o("l += domainNameLen(rr.%s, off+l, compression, true)\n")
- case st.Tag(i) == `dns:"domain-name"`:
- o("l += domainNameLen(rr.%s, off+l, compression, false)\n")
- case st.Tag(i) == `dns:"octet"`:
- o("l += len(rr.%s)\n")
- case strings.HasPrefix(st.Tag(i), `dns:"size-base64`):
- fallthrough
- case st.Tag(i) == `dns:"base64"`:
- o("l += base64.StdEncoding.DecodedLen(len(rr.%s))\n")
- case strings.HasPrefix(st.Tag(i), `dns:"size-hex:`): // this has an extra field where the length is stored
- o("l += len(rr.%s)/2\n")
- case strings.HasPrefix(st.Tag(i), `dns:"size-hex`):
- fallthrough
- case st.Tag(i) == `dns:"hex"`:
- o("l += len(rr.%s)/2 + 1\n")
- case st.Tag(i) == `dns:"a"`:
- o("l += net.IPv4len // %s\n")
- case st.Tag(i) == `dns:"aaaa"`:
- o("l += net.IPv6len // %s\n")
- case st.Tag(i) == `dns:"txt"`:
- o("for _, t := range rr.%s { l += len(t) + 1 }\n")
- case st.Tag(i) == `dns:"uint48"`:
- o("l += 6 // %s\n")
- case st.Tag(i) == "":
- switch st.Field(i).Type().(*types.Basic).Kind() {
- case types.Uint8:
- o("l++ // %s\n")
- case types.Uint16:
- o("l += 2 // %s\n")
- case types.Uint32:
- o("l += 4 // %s\n")
- case types.Uint64:
- o("l += 8 // %s\n")
- case types.String:
- o("l += len(rr.%s) + 1\n")
- default:
- log.Fatalln(name, st.Field(i).Name())
- }
- default:
- log.Fatalln(name, st.Field(i).Name(), st.Tag(i))
- }
- }
- fmt.Fprintf(b, "return l }\n")
- }
-
- // Generate copy()
- fmt.Fprint(b, "// copy() functions\n")
- for _, name := range namedTypes {
- o := scope.Lookup(name)
- st, isEmbedded := getTypeStruct(o.Type(), scope)
- if isEmbedded {
- continue
- }
- fmt.Fprintf(b, "func (rr *%s) copy() RR {\n", name)
- fields := []string{"rr.Hdr"}
- for i := 1; i < st.NumFields(); i++ {
- f := st.Field(i).Name()
- if sl, ok := st.Field(i).Type().(*types.Slice); ok {
- t := sl.Underlying().String()
- t = strings.TrimPrefix(t, "[]")
- if strings.Contains(t, ".") {
- splits := strings.Split(t, ".")
- t = splits[len(splits)-1]
- }
- fmt.Fprintf(b, "%s := make([]%s, len(rr.%s)); copy(%s, rr.%s)\n",
- f, t, f, f, f)
- fields = append(fields, f)
- continue
- }
- if st.Field(i).Type().String() == "net.IP" {
- fields = append(fields, "copyIP(rr."+f+")")
- continue
- }
- fields = append(fields, "rr."+f)
- }
- fmt.Fprintf(b, "return &%s{%s}\n", name, strings.Join(fields, ","))
- fmt.Fprintf(b, "}\n")
- }
-
- // gofmt
- res, err := format.Source(b.Bytes())
- if err != nil {
- b.WriteTo(os.Stderr)
- log.Fatal(err)
- }
-
- // write result
- f, err := os.Create("ztypes.go")
- fatalIfErr(err)
- defer f.Close()
- f.Write(res)
-}
-
-func fatalIfErr(err error) {
- if err != nil {
- log.Fatal(err)
- }
-}
diff --git a/vendor/github.com/shirou/gopsutil/host/types_darwin.go b/vendor/github.com/shirou/gopsutil/host/types_darwin.go
deleted file mode 100644
index b858227885..0000000000
--- a/vendor/github.com/shirou/gopsutil/host/types_darwin.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// +build ignore
-// plus hand editing about timeval
-
-/*
-Input to cgo -godefs.
-*/
-
-package host
-
-/*
-#include
-#include
-*/
-import "C"
-
-type Utmpx C.struct_utmpx
-type Timeval C.struct_timeval
diff --git a/vendor/github.com/shirou/gopsutil/host/types_freebsd.go b/vendor/github.com/shirou/gopsutil/host/types_freebsd.go
deleted file mode 100644
index e70677f681..0000000000
--- a/vendor/github.com/shirou/gopsutil/host/types_freebsd.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// +build ignore
-
-/*
-Input to cgo -godefs.
-*/
-
-package host
-
-/*
-#define KERNEL
-#include
-#include
-#include
-
-enum {
- sizeofPtr = sizeof(void*),
-};
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- sizeofPtr = C.sizeofPtr
- sizeofShort = C.sizeof_short
- sizeofInt = C.sizeof_int
- sizeofLong = C.sizeof_long
- sizeofLongLong = C.sizeof_longlong
- sizeOfUtmpx = C.sizeof_struct_utmpx
-)
-
-// Basic types
-
-type (
- _C_short C.short
- _C_int C.int
- _C_long C.long
- _C_long_long C.longlong
-)
-
-type Utmp C.struct_utmp
-type Utmpx C.struct_utmpx
-type Timeval C.struct_timeval
diff --git a/vendor/github.com/shirou/gopsutil/host/types_linux.go b/vendor/github.com/shirou/gopsutil/host/types_linux.go
deleted file mode 100644
index 8adecb6cfa..0000000000
--- a/vendor/github.com/shirou/gopsutil/host/types_linux.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// +build ignore
-
-/*
-Input to cgo -godefs.
-*/
-
-package host
-
-/*
-#include
-#include
-
-enum {
- sizeofPtr = sizeof(void*),
-};
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- sizeofPtr = C.sizeofPtr
- sizeofShort = C.sizeof_short
- sizeofInt = C.sizeof_int
- sizeofLong = C.sizeof_long
- sizeofLongLong = C.sizeof_longlong
- sizeOfUtmp = C.sizeof_struct_utmp
-)
-
-// Basic types
-
-type (
- _C_short C.short
- _C_int C.int
- _C_long C.long
- _C_long_long C.longlong
-)
-
-type utmp C.struct_utmp
-type exit_status C.struct_exit_status
-type timeval C.struct_timeval
diff --git a/vendor/github.com/shirou/gopsutil/host/types_openbsd.go b/vendor/github.com/shirou/gopsutil/host/types_openbsd.go
deleted file mode 100644
index 9ebb97ce52..0000000000
--- a/vendor/github.com/shirou/gopsutil/host/types_openbsd.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// +build ignore
-
-/*
-Input to cgo -godefs.
-*/
-
-package host
-
-/*
-#define KERNEL
-#include
-#include
-#include
-
-enum {
- sizeofPtr = sizeof(void*),
-};
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- sizeofPtr = C.sizeofPtr
- sizeofShort = C.sizeof_short
- sizeofInt = C.sizeof_int
- sizeofLong = C.sizeof_long
- sizeofLongLong = C.sizeof_longlong
- sizeOfUtmp = C.sizeof_struct_utmp
-)
-
-// Basic types
-
-type (
- _C_short C.short
- _C_int C.int
- _C_long C.long
- _C_long_long C.longlong
-)
-
-type Utmp C.struct_utmp
-type Timeval C.struct_timeval
diff --git a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go b/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go
deleted file mode 100644
index 83cb91a196..0000000000
--- a/vendor/github.com/shirou/gopsutil/mem/types_openbsd.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// +build ignore
-
-/*
-Input to cgo -godefs.
-*/
-
-package mem
-
-/*
-#include
-#include
-#include
-#include
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- CTLVm = 2
- CTLVfs = 10
- VmUvmexp = 4 // get uvmexp
- VfsGeneric = 0
- VfsBcacheStat = 3
-)
-
-const (
- sizeOfUvmexp = C.sizeof_struct_uvmexp
- sizeOfBcachestats = C.sizeof_struct_bcachestats
-)
-
-type Uvmexp C.struct_uvmexp
-type Bcachestats C.struct_bcachestats
diff --git a/vendor/github.com/shirou/gopsutil/process/types_darwin.go b/vendor/github.com/shirou/gopsutil/process/types_darwin.go
deleted file mode 100644
index 21216cd09a..0000000000
--- a/vendor/github.com/shirou/gopsutil/process/types_darwin.go
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Hand Writing
-// - all pointer in ExternProc to uint64
-
-// +build ignore
-
-/*
-Input to cgo -godefs.
-*/
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-// +godefs map struct_ [16]byte /* in6_addr */
-
-package process
-
-/*
-#define __DARWIN_UNIX03 0
-#define KERNEL
-#define _DARWIN_USE_64_BIT_INODE
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-enum {
- sizeofPtr = sizeof(void*),
-};
-
-union sockaddr_all {
- struct sockaddr s1; // this one gets used for fields
- struct sockaddr_in s2; // these pad it out
- struct sockaddr_in6 s3;
- struct sockaddr_un s4;
- struct sockaddr_dl s5;
-};
-
-struct sockaddr_any {
- struct sockaddr addr;
- char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
-};
-
-struct ucred_queue {
- struct ucred *tqe_next;
- struct ucred **tqe_prev;
- TRACEBUF
-};
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- sizeofPtr = C.sizeofPtr
- sizeofShort = C.sizeof_short
- sizeofInt = C.sizeof_int
- sizeofLong = C.sizeof_long
- sizeofLongLong = C.sizeof_longlong
-)
-
-// Basic types
-
-type (
- _C_short C.short
- _C_int C.int
- _C_long C.long
- _C_long_long C.longlong
-)
-
-// Time
-
-type Timespec C.struct_timespec
-
-type Timeval C.struct_timeval
-
-// Processes
-
-type Rusage C.struct_rusage
-
-type Rlimit C.struct_rlimit
-
-type UGid_t C.gid_t
-
-type KinfoProc C.struct_kinfo_proc
-
-type Eproc C.struct_eproc
-
-type Proc C.struct_proc
-
-type Session C.struct_session
-
-type ucred C.struct_ucred
-
-type Uucred C.struct__ucred
-
-type Upcred C.struct__pcred
-
-type Vmspace C.struct_vmspace
-
-type Sigacts C.struct_sigacts
-
-type ExternProc C.struct_extern_proc
-
-type Itimerval C.struct_itimerval
-
-type Vnode C.struct_vnode
-
-type Pgrp C.struct_pgrp
-
-type UserStruct C.struct_user
-
-type Au_session C.struct_au_session
-
-type Posix_cred C.struct_posix_cred
-
-type Label C.struct_label
-
-type AuditinfoAddr C.struct_auditinfo_addr
-type AuMask C.struct_au_mask
-type AuTidAddr C.struct_au_tid_addr
-
-// TAILQ(ucred)
-type UcredQueue C.struct_ucred_queue
diff --git a/vendor/github.com/shirou/gopsutil/process/types_freebsd.go b/vendor/github.com/shirou/gopsutil/process/types_freebsd.go
deleted file mode 100644
index aa7b3462de..0000000000
--- a/vendor/github.com/shirou/gopsutil/process/types_freebsd.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// +build ignore
-
-// We still need editing by hands.
-// go tool cgo -godefs types_freebsd.go | sed 's/\*int64/int64/' | sed 's/\*byte/int64/' > process_freebsd_amd64.go
-
-/*
-Input to cgo -godefs.
-*/
-
-// +godefs map struct_pargs int64 /* pargs */
-// +godefs map struct_proc int64 /* proc */
-// +godefs map struct_user int64 /* user */
-// +godefs map struct_vnode int64 /* vnode */
-// +godefs map struct_vnode int64 /* vnode */
-// +godefs map struct_filedesc int64 /* filedesc */
-// +godefs map struct_vmspace int64 /* vmspace */
-// +godefs map struct_pcb int64 /* pcb */
-// +godefs map struct_thread int64 /* thread */
-// +godefs map struct___sigset [16]byte /* sigset */
-
-package process
-
-/*
-#include
-#include
-
-enum {
- sizeofPtr = sizeof(void*),
-};
-
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- CTLKern = 1 // "high kernel": proc, limits
- KernProc = 14 // struct: process entries
- KernProcPID = 1 // by process id
- KernProcProc = 8 // only return procs
- KernProcPathname = 12 // path to executable
- KernProcArgs = 7 // get/set arguments/proctitle
-)
-
-const (
- sizeofPtr = C.sizeofPtr
- sizeofShort = C.sizeof_short
- sizeofInt = C.sizeof_int
- sizeofLong = C.sizeof_long
- sizeofLongLong = C.sizeof_longlong
-)
-
-const (
- sizeOfKinfoVmentry = C.sizeof_struct_kinfo_vmentry
- sizeOfKinfoProc = C.sizeof_struct_kinfo_proc
-)
-
-// from sys/proc.h
-const (
- SIDL = 1 /* Process being created by fork. */
- SRUN = 2 /* Currently runnable. */
- SSLEEP = 3 /* Sleeping on an address. */
- SSTOP = 4 /* Process debugging or suspension. */
- SZOMB = 5 /* Awaiting collection by parent. */
- SWAIT = 6 /* Waiting for interrupt. */
- SLOCK = 7 /* Blocked on a lock. */
-)
-
-// Basic types
-
-type (
- _C_short C.short
- _C_int C.int
- _C_long C.long
- _C_long_long C.longlong
-)
-
-// Time
-
-type Timespec C.struct_timespec
-
-type Timeval C.struct_timeval
-
-// Processes
-
-type Rusage C.struct_rusage
-
-type Rlimit C.struct_rlimit
-
-type KinfoProc C.struct_kinfo_proc
-
-type Priority C.struct_priority
-
-type KinfoVmentry C.struct_kinfo_vmentry
diff --git a/vendor/github.com/shirou/gopsutil/process/types_openbsd.go b/vendor/github.com/shirou/gopsutil/process/types_openbsd.go
deleted file mode 100644
index 09ac590288..0000000000
--- a/vendor/github.com/shirou/gopsutil/process/types_openbsd.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// +build ignore
-
-// We still need editing by hands.
-// go tool cgo -godefs types_openbsd.go | sed 's/\*int64/int64/' | sed 's/\*byte/int64/' > process_openbsd_amd64.go
-
-/*
-Input to cgo -godefs.
-*/
-
-// +godefs map struct_pargs int64 /* pargs */
-// +godefs map struct_proc int64 /* proc */
-// +godefs map struct_user int64 /* user */
-// +godefs map struct_vnode int64 /* vnode */
-// +godefs map struct_vnode int64 /* vnode */
-// +godefs map struct_filedesc int64 /* filedesc */
-// +godefs map struct_vmspace int64 /* vmspace */
-// +godefs map struct_pcb int64 /* pcb */
-// +godefs map struct_thread int64 /* thread */
-// +godefs map struct___sigset [16]byte /* sigset */
-
-package process
-
-/*
-#include
-#include
-#include
-
-enum {
- sizeofPtr = sizeof(void*),
-};
-
-
-*/
-import "C"
-
-// Machine characteristics; for internal use.
-
-const (
- CTLKern = 1 // "high kernel": proc, limits
- KernProc = 66 // struct: process entries
- KernProcAll = 0
- KernProcPID = 1 // by process id
- KernProcProc = 8 // only return procs
- KernProcPathname = 12 // path to executable
- KernProcArgs = 55 // get/set arguments/proctitle
- KernProcArgv = 1
- KernProcEnv = 3
-)
-
-const (
- ArgMax = 256 * 1024 // sys/syslimits.h:#define ARG_MAX
-)
-
-const (
- sizeofPtr = C.sizeofPtr
- sizeofShort = C.sizeof_short
- sizeofInt = C.sizeof_int
- sizeofLong = C.sizeof_long
- sizeofLongLong = C.sizeof_longlong
-)
-
-const (
- sizeOfKinfoVmentry = C.sizeof_struct_kinfo_vmentry
- sizeOfKinfoProc = C.sizeof_struct_kinfo_proc
-)
-
-// from sys/proc.h
-const (
- SIDL = 1 /* Process being created by fork. */
- SRUN = 2 /* Currently runnable. */
- SSLEEP = 3 /* Sleeping on an address. */
- SSTOP = 4 /* Process debugging or suspension. */
- SZOMB = 5 /* Awaiting collection by parent. */
- SDEAD = 6 /* Thread is almost gone */
- SONPROC = 7 /* Thread is currently on a CPU. */
-)
-
-// Basic types
-
-type (
- _C_short C.short
- _C_int C.int
- _C_long C.long
- _C_long_long C.longlong
-)
-
-// Time
-
-type Timespec C.struct_timespec
-
-type Timeval C.struct_timeval
-
-// Processes
-
-type Rusage C.struct_rusage
-
-type Rlimit C.struct_rlimit
-
-type KinfoProc C.struct_kinfo_proc
-
-type Priority C.struct_priority
-
-type KinfoVmentry C.struct_kinfo_vmentry
diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go
index e55fe0ad62..290382d059 100644
--- a/vendor/golang.org/x/crypto/ssh/common.go
+++ b/vendor/golang.org/x/crypto/ssh/common.go
@@ -58,6 +58,14 @@ var serverForbiddenKexAlgos = map[string]struct{}{
kexAlgoDHGEXSHA256: {}, // server half implementation is only minimal to satisfy the automated tests
}
+// preferredKexAlgos specifies the default preference for key-exchange algorithms
+// in preference order.
+var preferredKexAlgos = []string{
+ kexAlgoCurve25519SHA256,
+ kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521,
+ kexAlgoDH14SHA1,
+}
+
// supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods
// of authenticating servers) in preference order.
var supportedHostKeyAlgos = []string{
@@ -246,7 +254,7 @@ func (c *Config) SetDefaults() {
c.Ciphers = ciphers
if c.KeyExchanges == nil {
- c.KeyExchanges = supportedKexAlgos
+ c.KeyExchanges = preferredKexAlgos
}
if c.MACs == nil {
diff --git a/vendor/golang.org/x/net/bpf/vm_instructions.go b/vendor/golang.org/x/net/bpf/vm_instructions.go
index f0d2e55bdc..cf8947c332 100644
--- a/vendor/golang.org/x/net/bpf/vm_instructions.go
+++ b/vendor/golang.org/x/net/bpf/vm_instructions.go
@@ -129,7 +129,8 @@ func loadIndirect(ins LoadIndirect, in []byte, regX uint32) (uint32, bool) {
func loadMemShift(ins LoadMemShift, in []byte) (uint32, bool) {
offset := int(ins.Off)
- if !inBounds(len(in), offset, 0) {
+ // Size of LoadMemShift is always 1 byte
+ if !inBounds(len(in), offset, 1) {
return 0, false
}
diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go
index 1565cf2702..97f17831fc 100644
--- a/vendor/golang.org/x/net/http2/hpack/encode.go
+++ b/vendor/golang.org/x/net/http2/hpack/encode.go
@@ -150,7 +150,7 @@ func appendIndexed(dst []byte, i uint64) []byte {
// extended buffer.
//
// If f.Sensitive is true, "Never Indexed" representation is used. If
-// f.Sensitive is false and indexing is true, "Inremental Indexing"
+// f.Sensitive is false and indexing is true, "Incremental Indexing"
// representation is used.
func appendNewName(dst []byte, f HeaderField, indexing bool) []byte {
dst = append(dst, encodeTypeByte(indexing, f.Sensitive))
diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go
index d4abeb2b99..b7524ba268 100644
--- a/vendor/golang.org/x/net/http2/server.go
+++ b/vendor/golang.org/x/net/http2/server.go
@@ -52,10 +52,11 @@ import (
)
const (
- prefaceTimeout = 10 * time.Second
- firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway
- handlerChunkWriteSize = 4 << 10
- defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to?
+ prefaceTimeout = 10 * time.Second
+ firstSettingsTimeout = 2 * time.Second // should be in-flight with preface anyway
+ handlerChunkWriteSize = 4 << 10
+ defaultMaxStreams = 250 // TODO: make this 100 as the GFE seems to?
+ maxQueuedControlFrames = 10000
)
var (
@@ -163,6 +164,15 @@ func (s *Server) maxConcurrentStreams() uint32 {
return defaultMaxStreams
}
+// maxQueuedControlFrames is the maximum number of control frames like
+// SETTINGS, PING and RST_STREAM that will be queued for writing before
+// the connection is closed to prevent memory exhaustion attacks.
+func (s *Server) maxQueuedControlFrames() int {
+ // TODO: if anybody asks, add a Server field, and remember to define the
+ // behavior of negative values.
+ return maxQueuedControlFrames
+}
+
type serverInternalState struct {
mu sync.Mutex
activeConns map[*serverConn]struct{}
@@ -273,7 +283,20 @@ func ConfigureServer(s *http.Server, conf *Server) error {
if testHookOnConn != nil {
testHookOnConn()
}
+ // The TLSNextProto interface predates contexts, so
+ // the net/http package passes down its per-connection
+ // base context via an exported but unadvertised
+ // method on the Handler. This is for internal
+ // net/http<=>http2 use only.
+ var ctx context.Context
+ type baseContexter interface {
+ BaseContext() context.Context
+ }
+ if bc, ok := h.(baseContexter); ok {
+ ctx = bc.BaseContext()
+ }
conf.ServeConn(c, &ServeConnOpts{
+ Context: ctx,
Handler: h,
BaseConfig: hs,
})
@@ -284,6 +307,10 @@ func ConfigureServer(s *http.Server, conf *Server) error {
// ServeConnOpts are options for the Server.ServeConn method.
type ServeConnOpts struct {
+ // Context is the base context to use.
+ // If nil, context.Background is used.
+ Context context.Context
+
// BaseConfig optionally sets the base configuration
// for values. If nil, defaults are used.
BaseConfig *http.Server
@@ -294,6 +321,13 @@ type ServeConnOpts struct {
Handler http.Handler
}
+func (o *ServeConnOpts) context() context.Context {
+ if o != nil && o.Context != nil {
+ return o.Context
+ }
+ return context.Background()
+}
+
func (o *ServeConnOpts) baseConfig() *http.Server {
if o != nil && o.BaseConfig != nil {
return o.BaseConfig
@@ -439,7 +473,7 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
}
func serverConnBaseContext(c net.Conn, opts *ServeConnOpts) (ctx context.Context, cancel func()) {
- ctx, cancel = context.WithCancel(context.Background())
+ ctx, cancel = context.WithCancel(opts.context())
ctx = context.WithValue(ctx, http.LocalAddrContextKey, c.LocalAddr())
if hs := opts.baseConfig(); hs != nil {
ctx = context.WithValue(ctx, http.ServerContextKey, hs)
@@ -482,6 +516,7 @@ type serverConn struct {
sawFirstSettings bool // got the initial SETTINGS frame after the preface
needToSendSettingsAck bool
unackedSettings int // how many SETTINGS have we sent without ACKs?
+ queuedControlFrames int // control frames in the writeSched queue
clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit)
advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client
curClientStreams uint32 // number of open streams initiated by the client
@@ -870,6 +905,14 @@ func (sc *serverConn) serve() {
}
}
+ // If the peer is causing us to generate a lot of control frames,
+ // but not reading them from us, assume they are trying to make us
+ // run out of memory.
+ if sc.queuedControlFrames > sc.srv.maxQueuedControlFrames() {
+ sc.vlogf("http2: too many control frames in send queue, closing connection")
+ return
+ }
+
// Start the shutdown timer after sending a GOAWAY. When sending GOAWAY
// with no error code (graceful shutdown), don't start the timer until
// all open streams have been completed.
@@ -1069,6 +1112,14 @@ func (sc *serverConn) writeFrame(wr FrameWriteRequest) {
}
if !ignoreWrite {
+ if wr.isControl() {
+ sc.queuedControlFrames++
+ // For extra safety, detect wraparounds, which should not happen,
+ // and pull the plug.
+ if sc.queuedControlFrames < 0 {
+ sc.conn.Close()
+ }
+ }
sc.writeSched.Push(wr)
}
sc.scheduleFrameWrite()
@@ -1186,10 +1237,8 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) {
// If a frame is already being written, nothing happens. This will be called again
// when the frame is done being written.
//
-// If a frame isn't being written we need to send one, the best frame
-// to send is selected, preferring first things that aren't
-// stream-specific (e.g. ACKing settings), and then finding the
-// highest priority stream.
+// If a frame isn't being written and we need to send one, the best frame
+// to send is selected by writeSched.
//
// If a frame isn't being written and there's nothing else to send, we
// flush the write buffer.
@@ -1217,6 +1266,9 @@ func (sc *serverConn) scheduleFrameWrite() {
}
if !sc.inGoAway || sc.goAwayCode == ErrCodeNo {
if wr, ok := sc.writeSched.Pop(); ok {
+ if wr.isControl() {
+ sc.queuedControlFrames--
+ }
sc.startFrameWrite(wr)
continue
}
@@ -1509,6 +1561,8 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error {
if err := f.ForeachSetting(sc.processSetting); err != nil {
return err
}
+ // TODO: judging by RFC 7540, Section 6.5.3 each SETTINGS frame should be
+ // acknowledged individually, even if multiple are received before the ACK.
sc.needToSendSettingsAck = true
sc.scheduleFrameWrite()
return nil
@@ -2470,7 +2524,7 @@ const TrailerPrefix = "Trailer:"
// trailers. That worked for a while, until we found the first major
// user of Trailers in the wild: gRPC (using them only over http2),
// and gRPC libraries permit setting trailers mid-stream without
-// predeclarnig them. So: change of plans. We still permit the old
+// predeclaring them. So: change of plans. We still permit the old
// way, but we also permit this hack: if a Header() key begins with
// "Trailer:", the suffix of that key is a Trailer. Because ':' is an
// invalid token byte anyway, there is no ambiguity. (And it's already
@@ -2770,7 +2824,7 @@ func (sc *serverConn) startPush(msg *startPushRequest) {
// PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that
// is in either the "open" or "half-closed (remote)" state.
if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote {
- // responseWriter.Push checks that the stream is peer-initiaed.
+ // responseWriter.Push checks that the stream is peer-initiated.
msg.done <- errStreamClosed
return
}
diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go
index c0c80d8930..c51a73c069 100644
--- a/vendor/golang.org/x/net/http2/transport.go
+++ b/vendor/golang.org/x/net/http2/transport.go
@@ -992,7 +992,7 @@ func (cc *ClientConn) roundTrip(req *http.Request) (res *http.Response, gotErrAf
req.Method != "HEAD" {
// Request gzip only, not deflate. Deflate is ambiguous and
// not as universally supported anyway.
- // See: http://www.gzip.org/zlib/zlib_faq.html#faq38
+ // See: https://zlib.net/zlib_faq.html#faq39
//
// Note that we don't request this for HEAD requests,
// due to a bug in nginx:
@@ -1216,6 +1216,8 @@ var (
// abort request body write, but send stream reset of cancel.
errStopReqBodyWriteAndCancel = errors.New("http2: canceling request")
+
+ errReqBodyTooLong = errors.New("http2: request body larger than specified content length")
)
func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) {
@@ -1238,10 +1240,32 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
req := cs.req
hasTrailers := req.Trailer != nil
+ remainLen := actualContentLength(req)
+ hasContentLen := remainLen != -1
var sawEOF bool
for !sawEOF {
- n, err := body.Read(buf)
+ n, err := body.Read(buf[:len(buf)-1])
+ if hasContentLen {
+ remainLen -= int64(n)
+ if remainLen == 0 && err == nil {
+ // The request body's Content-Length was predeclared and
+ // we just finished reading it all, but the underlying io.Reader
+ // returned the final chunk with a nil error (which is one of
+ // the two valid things a Reader can do at EOF). Because we'd prefer
+ // to send the END_STREAM bit early, double-check that we're actually
+ // at EOF. Subsequent reads should return (0, EOF) at this point.
+ // If either value is different, we return an error in one of two ways below.
+ var n1 int
+ n1, err = body.Read(buf[n:])
+ remainLen -= int64(n1)
+ }
+ if remainLen < 0 {
+ err = errReqBodyTooLong
+ cc.writeStreamReset(cs.ID, ErrCodeCancel, err)
+ return err
+ }
+ }
if err == io.EOF {
sawEOF = true
err = nil
diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go
index 4fe3073073..f24d2b1e7d 100644
--- a/vendor/golang.org/x/net/http2/writesched.go
+++ b/vendor/golang.org/x/net/http2/writesched.go
@@ -32,7 +32,7 @@ type WriteScheduler interface {
// Pop dequeues the next frame to write. Returns false if no frames can
// be written. Frames with a given wr.StreamID() are Pop'd in the same
- // order they are Push'd.
+ // order they are Push'd. No frames should be discarded except by CloseStream.
Pop() (wr FrameWriteRequest, ok bool)
}
@@ -76,6 +76,12 @@ func (wr FrameWriteRequest) StreamID() uint32 {
return wr.stream.id
}
+// isControl reports whether wr is a control frame for MaxQueuedControlFrames
+// purposes. That includes non-stream frames and RST_STREAM frames.
+func (wr FrameWriteRequest) isControl() bool {
+ return wr.stream == nil
+}
+
// DataSize returns the number of flow control bytes that must be consumed
// to write this entire frame. This is 0 for non-DATA frames.
func (wr FrameWriteRequest) DataSize() int {
diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority.go
index 848fed6ec7..2618b2c11d 100644
--- a/vendor/golang.org/x/net/http2/writesched_priority.go
+++ b/vendor/golang.org/x/net/http2/writesched_priority.go
@@ -149,7 +149,7 @@ func (n *priorityNode) addBytes(b int64) {
}
// walkReadyInOrder iterates over the tree in priority order, calling f for each node
-// with a non-empty write queue. When f returns true, this funcion returns true and the
+// with a non-empty write queue. When f returns true, this function returns true and the
// walk halts. tmp is used as scratch space for sorting.
//
// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true
diff --git a/vendor/golang.org/x/net/http2/writesched_random.go b/vendor/golang.org/x/net/http2/writesched_random.go
index 36d7919f16..9a7b9e581c 100644
--- a/vendor/golang.org/x/net/http2/writesched_random.go
+++ b/vendor/golang.org/x/net/http2/writesched_random.go
@@ -19,7 +19,8 @@ type randomWriteScheduler struct {
zero writeQueue
// sq contains the stream-specific queues, keyed by stream ID.
- // When a stream is idle or closed, it's deleted from the map.
+ // When a stream is idle, closed, or emptied, it's deleted
+ // from the map.
sq map[uint32]*writeQueue
// pool of empty queues for reuse.
@@ -63,8 +64,12 @@ func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) {
return ws.zero.shift(), true
}
// Iterate over all non-idle streams until finding one that can be consumed.
- for _, q := range ws.sq {
+ for streamID, q := range ws.sq {
if wr, ok := q.consume(math.MaxInt32); ok {
+ if q.empty() {
+ delete(ws.sq, streamID)
+ ws.queuePool.put(q)
+ }
return wr, true
}
}
diff --git a/vendor/golang.org/x/net/internal/iana/gen.go b/vendor/golang.org/x/net/internal/iana/gen.go
deleted file mode 100644
index 2a7661c27b..0000000000
--- a/vendor/golang.org/x/net/internal/iana/gen.go
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-//go:generate go run gen.go
-
-// This program generates internet protocol constants and tables by
-// reading IANA protocol registries.
-package main
-
-import (
- "bytes"
- "encoding/xml"
- "fmt"
- "go/format"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "strconv"
- "strings"
-)
-
-var registries = []struct {
- url string
- parse func(io.Writer, io.Reader) error
-}{
- {
- "https://www.iana.org/assignments/dscp-registry/dscp-registry.xml",
- parseDSCPRegistry,
- },
- {
- "https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml",
- parseProtocolNumbers,
- },
- {
- "https://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml",
- parseAddrFamilyNumbers,
- },
-}
-
-func main() {
- var bb bytes.Buffer
- fmt.Fprintf(&bb, "// go generate gen.go\n")
- fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
- fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n")
- fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n")
- for _, r := range registries {
- resp, err := http.Get(r.url)
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- defer resp.Body.Close()
- if resp.StatusCode != http.StatusOK {
- fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url)
- os.Exit(1)
- }
- if err := r.parse(&bb, resp.Body); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- fmt.Fprintf(&bb, "\n")
- }
- b, err := format.Source(bb.Bytes())
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- if err := ioutil.WriteFile("const.go", b, 0644); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
-}
-
-func parseDSCPRegistry(w io.Writer, r io.Reader) error {
- dec := xml.NewDecoder(r)
- var dr dscpRegistry
- if err := dec.Decode(&dr); err != nil {
- return err
- }
- fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated)
- fmt.Fprintf(w, "const (\n")
- for _, dr := range dr.escapeDSCP() {
- fmt.Fprintf(w, "DiffServ%s = %#02x", dr.Name, dr.Value)
- fmt.Fprintf(w, "// %s\n", dr.OrigName)
- }
- for _, er := range dr.escapeECN() {
- fmt.Fprintf(w, "%s = %#02x", er.Descr, er.Value)
- fmt.Fprintf(w, "// %s\n", er.OrigDescr)
- }
- fmt.Fprintf(w, ")\n")
- return nil
-}
-
-type dscpRegistry struct {
- XMLName xml.Name `xml:"registry"`
- Title string `xml:"title"`
- Updated string `xml:"updated"`
- Note string `xml:"note"`
- Registries []struct {
- Title string `xml:"title"`
- Registries []struct {
- Title string `xml:"title"`
- Records []struct {
- Name string `xml:"name"`
- Space string `xml:"space"`
- } `xml:"record"`
- } `xml:"registry"`
- Records []struct {
- Value string `xml:"value"`
- Descr string `xml:"description"`
- } `xml:"record"`
- } `xml:"registry"`
-}
-
-type canonDSCPRecord struct {
- OrigName string
- Name string
- Value int
-}
-
-func (drr *dscpRegistry) escapeDSCP() []canonDSCPRecord {
- var drs []canonDSCPRecord
- for _, preg := range drr.Registries {
- if !strings.Contains(preg.Title, "Differentiated Services Field Codepoints") {
- continue
- }
- for _, reg := range preg.Registries {
- if !strings.Contains(reg.Title, "Pool 1 Codepoints") {
- continue
- }
- drs = make([]canonDSCPRecord, len(reg.Records))
- sr := strings.NewReplacer(
- "+", "",
- "-", "",
- "/", "",
- ".", "",
- " ", "",
- )
- for i, dr := range reg.Records {
- s := strings.TrimSpace(dr.Name)
- drs[i].OrigName = s
- drs[i].Name = sr.Replace(s)
- n, err := strconv.ParseUint(dr.Space, 2, 8)
- if err != nil {
- continue
- }
- drs[i].Value = int(n) << 2
- }
- }
- }
- return drs
-}
-
-type canonECNRecord struct {
- OrigDescr string
- Descr string
- Value int
-}
-
-func (drr *dscpRegistry) escapeECN() []canonECNRecord {
- var ers []canonECNRecord
- for _, reg := range drr.Registries {
- if !strings.Contains(reg.Title, "ECN Field") {
- continue
- }
- ers = make([]canonECNRecord, len(reg.Records))
- sr := strings.NewReplacer(
- "Capable", "",
- "Not-ECT", "",
- "ECT(1)", "",
- "ECT(0)", "",
- "CE", "",
- "(", "",
- ")", "",
- "+", "",
- "-", "",
- "/", "",
- ".", "",
- " ", "",
- )
- for i, er := range reg.Records {
- s := strings.TrimSpace(er.Descr)
- ers[i].OrigDescr = s
- ss := strings.Split(s, " ")
- if len(ss) > 1 {
- ers[i].Descr = strings.Join(ss[1:], " ")
- } else {
- ers[i].Descr = ss[0]
- }
- ers[i].Descr = sr.Replace(er.Descr)
- n, err := strconv.ParseUint(er.Value, 2, 8)
- if err != nil {
- continue
- }
- ers[i].Value = int(n)
- }
- }
- return ers
-}
-
-func parseProtocolNumbers(w io.Writer, r io.Reader) error {
- dec := xml.NewDecoder(r)
- var pn protocolNumbers
- if err := dec.Decode(&pn); err != nil {
- return err
- }
- prs := pn.escape()
- prs = append([]canonProtocolRecord{{
- Name: "IP",
- Descr: "IPv4 encapsulation, pseudo protocol number",
- Value: 0,
- }}, prs...)
- fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated)
- fmt.Fprintf(w, "const (\n")
- for _, pr := range prs {
- if pr.Name == "" {
- continue
- }
- fmt.Fprintf(w, "Protocol%s = %d", pr.Name, pr.Value)
- s := pr.Descr
- if s == "" {
- s = pr.OrigName
- }
- fmt.Fprintf(w, "// %s\n", s)
- }
- fmt.Fprintf(w, ")\n")
- return nil
-}
-
-type protocolNumbers struct {
- XMLName xml.Name `xml:"registry"`
- Title string `xml:"title"`
- Updated string `xml:"updated"`
- RegTitle string `xml:"registry>title"`
- Note string `xml:"registry>note"`
- Records []struct {
- Value string `xml:"value"`
- Name string `xml:"name"`
- Descr string `xml:"description"`
- } `xml:"registry>record"`
-}
-
-type canonProtocolRecord struct {
- OrigName string
- Name string
- Descr string
- Value int
-}
-
-func (pn *protocolNumbers) escape() []canonProtocolRecord {
- prs := make([]canonProtocolRecord, len(pn.Records))
- sr := strings.NewReplacer(
- "-in-", "in",
- "-within-", "within",
- "-over-", "over",
- "+", "P",
- "-", "",
- "/", "",
- ".", "",
- " ", "",
- )
- for i, pr := range pn.Records {
- if strings.Contains(pr.Name, "Deprecated") ||
- strings.Contains(pr.Name, "deprecated") {
- continue
- }
- prs[i].OrigName = pr.Name
- s := strings.TrimSpace(pr.Name)
- switch pr.Name {
- case "ISIS over IPv4":
- prs[i].Name = "ISIS"
- case "manet":
- prs[i].Name = "MANET"
- default:
- prs[i].Name = sr.Replace(s)
- }
- ss := strings.Split(pr.Descr, "\n")
- for i := range ss {
- ss[i] = strings.TrimSpace(ss[i])
- }
- if len(ss) > 1 {
- prs[i].Descr = strings.Join(ss, " ")
- } else {
- prs[i].Descr = ss[0]
- }
- prs[i].Value, _ = strconv.Atoi(pr.Value)
- }
- return prs
-}
-
-func parseAddrFamilyNumbers(w io.Writer, r io.Reader) error {
- dec := xml.NewDecoder(r)
- var afn addrFamilylNumbers
- if err := dec.Decode(&afn); err != nil {
- return err
- }
- afrs := afn.escape()
- fmt.Fprintf(w, "// %s, Updated: %s\n", afn.Title, afn.Updated)
- fmt.Fprintf(w, "const (\n")
- for _, afr := range afrs {
- if afr.Name == "" {
- continue
- }
- fmt.Fprintf(w, "AddrFamily%s = %d", afr.Name, afr.Value)
- fmt.Fprintf(w, "// %s\n", afr.Descr)
- }
- fmt.Fprintf(w, ")\n")
- return nil
-}
-
-type addrFamilylNumbers struct {
- XMLName xml.Name `xml:"registry"`
- Title string `xml:"title"`
- Updated string `xml:"updated"`
- RegTitle string `xml:"registry>title"`
- Note string `xml:"registry>note"`
- Records []struct {
- Value string `xml:"value"`
- Descr string `xml:"description"`
- } `xml:"registry>record"`
-}
-
-type canonAddrFamilyRecord struct {
- Name string
- Descr string
- Value int
-}
-
-func (afn *addrFamilylNumbers) escape() []canonAddrFamilyRecord {
- afrs := make([]canonAddrFamilyRecord, len(afn.Records))
- sr := strings.NewReplacer(
- "IP version 4", "IPv4",
- "IP version 6", "IPv6",
- "Identifier", "ID",
- "-", "",
- "-", "",
- "/", "",
- ".", "",
- " ", "",
- )
- for i, afr := range afn.Records {
- if strings.Contains(afr.Descr, "Unassigned") ||
- strings.Contains(afr.Descr, "Reserved") {
- continue
- }
- afrs[i].Descr = afr.Descr
- s := strings.TrimSpace(afr.Descr)
- switch s {
- case "IP (IP version 4)":
- afrs[i].Name = "IPv4"
- case "IP6 (IP version 6)":
- afrs[i].Name = "IPv6"
- case "AFI for L2VPN information":
- afrs[i].Name = "L2VPN"
- case "E.164 with NSAP format subaddress":
- afrs[i].Name = "E164withSubaddress"
- case "MT IP: Multi-Topology IP version 4":
- afrs[i].Name = "MTIPv4"
- case "MAC/24":
- afrs[i].Name = "MACFinal24bits"
- case "MAC/40":
- afrs[i].Name = "MACFinal40bits"
- case "IPv6/64":
- afrs[i].Name = "IPv6Initial64bits"
- default:
- n := strings.Index(s, "(")
- if n > 0 {
- s = s[:n]
- }
- n = strings.Index(s, ":")
- if n > 0 {
- s = s[:n]
- }
- afrs[i].Name = sr.Replace(s)
- }
- afrs[i].Value, _ = strconv.Atoi(afr.Value)
- }
- return afrs
-}
diff --git a/vendor/golang.org/x/net/internal/socket/defs_aix.go b/vendor/golang.org/x/net/internal/socket/defs_aix.go
deleted file mode 100644
index c9d05b2619..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_aix.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type mmsghdr C.struct_mmsghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofMmsghdr = C.sizeof_struct_mmsghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_darwin.go b/vendor/golang.org/x/net/internal/socket/defs_darwin.go
deleted file mode 100644
index b780bc67ab..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_darwin.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go b/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
deleted file mode 100644
index b780bc67ab..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_dragonfly.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_freebsd.go b/vendor/golang.org/x/net/internal/socket/defs_freebsd.go
deleted file mode 100644
index b780bc67ab..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_freebsd.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_linux.go b/vendor/golang.org/x/net/internal/socket/defs_linux.go
deleted file mode 100644
index 6c5c11dcc4..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_linux.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-#include
-
-#define _GNU_SOURCE
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type mmsghdr C.struct_mmsghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofMmsghdr = C.sizeof_struct_mmsghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_netbsd.go b/vendor/golang.org/x/net/internal/socket/defs_netbsd.go
deleted file mode 100644
index 3d3b776395..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_netbsd.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type mmsghdr C.struct_mmsghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofMmsghdr = C.sizeof_struct_mmsghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_openbsd.go b/vendor/golang.org/x/net/internal/socket/defs_openbsd.go
deleted file mode 100644
index b780bc67ab..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_openbsd.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/defs_solaris.go b/vendor/golang.org/x/net/internal/socket/defs_solaris.go
deleted file mode 100644
index b780bc67ab..0000000000
--- a/vendor/golang.org/x/net/internal/socket/defs_solaris.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package socket
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-type iovec C.struct_iovec
-
-type msghdr C.struct_msghdr
-
-type cmsghdr C.struct_cmsghdr
-
-type sockaddrInet C.struct_sockaddr_in
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-const (
- sizeofIovec = C.sizeof_struct_iovec
- sizeofMsghdr = C.sizeof_struct_msghdr
- sizeofCmsghdr = C.sizeof_struct_cmsghdr
-
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
-)
diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go
index 24fbb69678..22eae809c9 100644
--- a/vendor/golang.org/x/net/internal/socket/sys_posix.go
+++ b/vendor/golang.org/x/net/internal/socket/sys_posix.go
@@ -33,7 +33,7 @@ func marshalSockaddr(ip net.IP, port int, zone string) []byte {
if ip4 := ip.To4(); ip4 != nil {
b := make([]byte, sizeofSockaddrInet)
switch runtime.GOOS {
- case "android", "linux", "solaris", "windows":
+ case "android", "illumos", "linux", "solaris", "windows":
NativeEndian.PutUint16(b[:2], uint16(sysAF_INET))
default:
b[0] = sizeofSockaddrInet
@@ -46,7 +46,7 @@ func marshalSockaddr(ip net.IP, port int, zone string) []byte {
if ip6 := ip.To16(); ip6 != nil && ip.To4() == nil {
b := make([]byte, sizeofSockaddrInet6)
switch runtime.GOOS {
- case "android", "linux", "solaris", "windows":
+ case "android", "illumos", "linux", "solaris", "windows":
NativeEndian.PutUint16(b[:2], uint16(sysAF_INET6))
default:
b[0] = sizeofSockaddrInet6
@@ -68,7 +68,7 @@ func parseInetAddr(b []byte, network string) (net.Addr, error) {
}
var af int
switch runtime.GOOS {
- case "android", "linux", "solaris", "windows":
+ case "android", "illumos", "linux", "solaris", "windows":
af = int(NativeEndian.Uint16(b[:2]))
default:
af = int(b[1])
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go
index 813385a98b..e740c8f024 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go
@@ -53,7 +53,6 @@ type sockaddrInet6 struct {
const (
sizeofIovec = 0x10
sizeofMsghdr = 0x30
- sizeofMmsghdr = 0x38
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go
index 9c96042fe8..083bda51c3 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_darwin.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
index 356417125c..55c6c9f577 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_darwin.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go
index 9c96042fe8..083bda51c3 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_darwin.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
index 356417125c..55c6c9f577 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_darwin_arm64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_darwin.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
index 90a57f51f0..8b7d161d7d 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_dragonfly_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_dragonfly.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
index e5bc557e33..3e71ff5743 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
index cbf85af9aa..238d90de62 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
index e5bc557e33..3e71ff5743 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go
new file mode 100644
index 0000000000..238d90de62
--- /dev/null
+++ b/vendor/golang.org/x/net/internal/socket/zsys_freebsd_arm64.go
@@ -0,0 +1,53 @@
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
+// cgo -godefs defs_freebsd.go
+
+package socket
+
+type iovec struct {
+ Base *byte
+ Len uint64
+}
+
+type msghdr struct {
+ Name *byte
+ Namelen uint32
+ Pad_cgo_0 [4]byte
+ Iov *iovec
+ Iovlen int32
+ Pad_cgo_1 [4]byte
+ Control *byte
+ Controllen uint32
+ Flags int32
+}
+
+type cmsghdr struct {
+ Len uint32
+ Level int32
+ Type int32
+}
+
+type sockaddrInet struct {
+ Len uint8
+ Family uint8
+ Port uint16
+ Addr [4]byte /* in_addr */
+ Zero [8]int8
+}
+
+type sockaddrInet6 struct {
+ Len uint8
+ Family uint8
+ Port uint16
+ Flowinfo uint32
+ Addr [16]byte /* in6_addr */
+ Scope_id uint32
+}
+
+const (
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x30
+ sizeofCmsghdr = 0xc
+
+ sizeofSockaddrInet = 0x10
+ sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
index b7db0f0b34..d33025b70d 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -47,7 +47,6 @@ type sockaddrInet6 struct {
const (
sizeofIovec = 0x8
sizeofMsghdr = 0x1c
- sizeofMmsghdr = 0x20
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
index 87a4e0b266..b20d216774 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -50,7 +50,6 @@ type sockaddrInet6 struct {
const (
sizeofIovec = 0x10
sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
index b7db0f0b34..1bb10a4289 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -45,9 +45,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x8
- sizeofMsghdr = 0x1c
- sizeofMmsghdr = 0x20
+ sizeofIovec = 0x8
+ sizeofMsghdr = 0x1c
+
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
index 87a4e0b266..7f6e8a7fa4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_arm64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -48,9 +48,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
index b7db0f0b34..1bb10a4289 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -45,9 +45,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x8
- sizeofMsghdr = 0x1c
- sizeofMmsghdr = 0x20
+ sizeofIovec = 0x8
+ sizeofMsghdr = 0x1c
+
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
index 87a4e0b266..7f6e8a7fa4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -48,9 +48,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
index 87a4e0b266..7f6e8a7fa4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mips64le.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -48,9 +48,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
index b7db0f0b34..1bb10a4289 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_mipsle.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -45,9 +45,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x8
- sizeofMsghdr = 0x1c
- sizeofMmsghdr = 0x20
+ sizeofIovec = 0x8
+ sizeofMsghdr = 0x1c
+
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
index 87a4e0b266..7f6e8a7fa4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -48,9 +48,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
index 87a4e0b266..7f6e8a7fa4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_ppc64le.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -48,9 +48,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go
index dbff234fbd..f12a1d7682 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go
@@ -49,9 +49,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
index 87a4e0b266..7f6e8a7fa4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_s390x.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package socket
@@ -48,9 +48,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x38
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x38
+
sizeofCmsghdr = 0x10
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
index cd328440ab..7e258cec29 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_netbsd.go
package socket
@@ -47,9 +47,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x8
- sizeofMsghdr = 0x1c
- sizeofMmsghdr = 0x20
+ sizeofIovec = 0x8
+ sizeofMsghdr = 0x1c
+
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go
index fa88b66609..b3f9c0d7e5 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_netbsd.go
package socket
@@ -50,9 +50,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x10
- sizeofMsghdr = 0x30
- sizeofMmsghdr = 0x40
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x30
+
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go
index cd328440ab..7e258cec29 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_netbsd.go
package socket
@@ -47,9 +47,9 @@ type sockaddrInet6 struct {
}
const (
- sizeofIovec = 0x8
- sizeofMsghdr = 0x1c
- sizeofMmsghdr = 0x20
+ sizeofIovec = 0x8
+ sizeofMsghdr = 0x1c
+
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go
index a46eff9912..da26ef019c 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_netbsd_arm64.go
@@ -52,7 +52,6 @@ type sockaddrInet6 struct {
const (
sizeofIovec = 0x10
sizeofMsghdr = 0x30
- sizeofMmsghdr = 0x40
sizeofCmsghdr = 0xc
sizeofSockaddrInet = 0x10
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go
index 64e2ea8712..73655a14c4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_openbsd.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go
index 13554bee53..0a4de80f23 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_openbsd.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go
index 64e2ea8712..73655a14c4 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_openbsd.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go
new file mode 100644
index 0000000000..0a4de80f23
--- /dev/null
+++ b/vendor/golang.org/x/net/internal/socket/zsys_openbsd_arm64.go
@@ -0,0 +1,53 @@
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
+// cgo -godefs defs_openbsd.go
+
+package socket
+
+type iovec struct {
+ Base *byte
+ Len uint64
+}
+
+type msghdr struct {
+ Name *byte
+ Namelen uint32
+ Pad_cgo_0 [4]byte
+ Iov *iovec
+ Iovlen uint32
+ Pad_cgo_1 [4]byte
+ Control *byte
+ Controllen uint32
+ Flags int32
+}
+
+type cmsghdr struct {
+ Len uint32
+ Level int32
+ Type int32
+}
+
+type sockaddrInet struct {
+ Len uint8
+ Family uint8
+ Port uint16
+ Addr [4]byte /* in_addr */
+ Zero [8]int8
+}
+
+type sockaddrInet6 struct {
+ Len uint8
+ Family uint8
+ Port uint16
+ Flowinfo uint32
+ Addr [16]byte /* in6_addr */
+ Scope_id uint32
+}
+
+const (
+ sizeofIovec = 0x10
+ sizeofMsghdr = 0x30
+ sizeofCmsghdr = 0xc
+
+ sizeofSockaddrInet = 0x10
+ sizeofSockaddrInet6 = 0x1c
+)
diff --git a/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go
index a27d73ce7a..353cd5fb4e 100644
--- a/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go
+++ b/vendor/golang.org/x/net/internal/socket/zsys_solaris_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_solaris.go
package socket
diff --git a/vendor/golang.org/x/net/internal/socks/socks.go b/vendor/golang.org/x/net/internal/socks/socks.go
index 6929a9fd5c..97db2340ec 100644
--- a/vendor/golang.org/x/net/internal/socks/socks.go
+++ b/vendor/golang.org/x/net/internal/socks/socks.go
@@ -127,7 +127,7 @@ type Dialer struct {
// establishing the transport connection.
ProxyDial func(context.Context, string, string) (net.Conn, error)
- // AuthMethods specifies the list of request authention
+ // AuthMethods specifies the list of request authentication
// methods.
// If empty, SOCKS client requests only AuthMethodNotRequired.
AuthMethods []AuthMethod
diff --git a/vendor/golang.org/x/net/ipv4/defs_aix.go b/vendor/golang.org/x/net/ipv4/defs_aix.go
deleted file mode 100644
index 0f37211c64..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_aix.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- // IP_RECVIF is defined on AIX but doesn't work.
- // IP_RECVINTERFACE must be used instead.
- sysIP_RECVIF = C.IP_RECVINTERFACE
- sysIP_RECVTTL = C.IP_RECVTTL
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
-)
-
-type ipMreq C.struct_ip_mreq
diff --git a/vendor/golang.org/x/net/ipv4/defs_darwin.go b/vendor/golang.org/x/net/ipv4/defs_darwin.go
deleted file mode 100644
index c8f2e05b81..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_darwin.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_RECVIF = C.IP_RECVIF
- sysIP_STRIPHDR = C.IP_STRIPHDR
- sysIP_RECVTTL = C.IP_RECVTTL
- sysIP_BOUND_IF = C.IP_BOUND_IF
- sysIP_PKTINFO = C.IP_PKTINFO
- sysIP_RECVPKTINFO = C.IP_RECVPKTINFO
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
- sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF
- sysIP_MULTICAST_IFINDEX = C.IP_MULTICAST_IFINDEX
- sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
- sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
- sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
- sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofInetPktinfo = C.sizeof_struct_in_pktinfo
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
- sizeofIPMreqn = C.sizeof_struct_ip_mreqn
- sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet C.struct_sockaddr_in
-
-type inetPktinfo C.struct_in_pktinfo
-
-type ipMreq C.struct_ip_mreq
-
-type ipMreqn C.struct_ip_mreqn
-
-type ipMreqSource C.struct_ip_mreq_source
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
diff --git a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go b/vendor/golang.org/x/net/ipv4/defs_dragonfly.go
deleted file mode 100644
index f30544ea24..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_RECVIF = C.IP_RECVIF
- sysIP_RECVTTL = C.IP_RECVTTL
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
-)
-
-type ipMreq C.struct_ip_mreq
diff --git a/vendor/golang.org/x/net/ipv4/defs_freebsd.go b/vendor/golang.org/x/net/ipv4/defs_freebsd.go
deleted file mode 100644
index 4dd57d8653..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_freebsd.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_SENDSRCADDR = C.IP_SENDSRCADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_RECVIF = C.IP_RECVIF
- sysIP_ONESBCAST = C.IP_ONESBCAST
- sysIP_BINDANY = C.IP_BINDANY
- sysIP_RECVTTL = C.IP_RECVTTL
- sysIP_MINTTL = C.IP_MINTTL
- sysIP_DONTFRAG = C.IP_DONTFRAG
- sysIP_RECVTOS = C.IP_RECVTOS
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
- sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF
- sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
- sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
- sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
- sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
- sizeofIPMreqn = C.sizeof_struct_ip_mreqn
- sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet C.struct_sockaddr_in
-
-type ipMreq C.struct_ip_mreq
-
-type ipMreqn C.struct_ip_mreqn
-
-type ipMreqSource C.struct_ip_mreq_source
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
diff --git a/vendor/golang.org/x/net/ipv4/defs_linux.go b/vendor/golang.org/x/net/ipv4/defs_linux.go
deleted file mode 100644
index beb11071ad..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_linux.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-
-#include
-#include
-#include
-#include
-#include
-*/
-import "C"
-
-const (
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_ROUTER_ALERT = C.IP_ROUTER_ALERT
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_PKTINFO = C.IP_PKTINFO
- sysIP_PKTOPTIONS = C.IP_PKTOPTIONS
- sysIP_MTU_DISCOVER = C.IP_MTU_DISCOVER
- sysIP_RECVERR = C.IP_RECVERR
- sysIP_RECVTTL = C.IP_RECVTTL
- sysIP_RECVTOS = C.IP_RECVTOS
- sysIP_MTU = C.IP_MTU
- sysIP_FREEBIND = C.IP_FREEBIND
- sysIP_TRANSPARENT = C.IP_TRANSPARENT
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_ORIGDSTADDR = C.IP_ORIGDSTADDR
- sysIP_RECVORIGDSTADDR = C.IP_RECVORIGDSTADDR
- sysIP_MINTTL = C.IP_MINTTL
- sysIP_NODEFRAG = C.IP_NODEFRAG
- sysIP_UNICAST_IF = C.IP_UNICAST_IF
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
- sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
- sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
- sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
- sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
- sysIP_MSFILTER = C.IP_MSFILTER
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
- sysMCAST_MSFILTER = C.MCAST_MSFILTER
- sysIP_MULTICAST_ALL = C.IP_MULTICAST_ALL
-
- //sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT
- //sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT
- //sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO
- //sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE
- //sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE
- //sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT
-
- sysICMP_FILTER = C.ICMP_FILTER
-
- sysSO_EE_ORIGIN_NONE = C.SO_EE_ORIGIN_NONE
- sysSO_EE_ORIGIN_LOCAL = C.SO_EE_ORIGIN_LOCAL
- sysSO_EE_ORIGIN_ICMP = C.SO_EE_ORIGIN_ICMP
- sysSO_EE_ORIGIN_ICMP6 = C.SO_EE_ORIGIN_ICMP6
- sysSO_EE_ORIGIN_TXSTATUS = C.SO_EE_ORIGIN_TXSTATUS
- sysSO_EE_ORIGIN_TIMESTAMPING = C.SO_EE_ORIGIN_TIMESTAMPING
-
- sysSOL_SOCKET = C.SOL_SOCKET
- sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER
-
- sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofInetPktinfo = C.sizeof_struct_in_pktinfo
- sizeofSockExtendedErr = C.sizeof_struct_sock_extended_err
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
- sizeofIPMreqn = C.sizeof_struct_ip_mreqn
- sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-
- sizeofICMPFilter = C.sizeof_struct_icmp_filter
-
- sizeofSockFprog = C.sizeof_struct_sock_fprog
-)
-
-type kernelSockaddrStorage C.struct___kernel_sockaddr_storage
-
-type sockaddrInet C.struct_sockaddr_in
-
-type inetPktinfo C.struct_in_pktinfo
-
-type sockExtendedErr C.struct_sock_extended_err
-
-type ipMreq C.struct_ip_mreq
-
-type ipMreqn C.struct_ip_mreqn
-
-type ipMreqSource C.struct_ip_mreq_source
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
-
-type icmpFilter C.struct_icmp_filter
-
-type sockFProg C.struct_sock_fprog
-
-type sockFilter C.struct_sock_filter
diff --git a/vendor/golang.org/x/net/ipv4/defs_netbsd.go b/vendor/golang.org/x/net/ipv4/defs_netbsd.go
deleted file mode 100644
index 8f8af1b899..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_netbsd.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_RECVIF = C.IP_RECVIF
- sysIP_RECVTTL = C.IP_RECVTTL
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
-)
-
-type ipMreq C.struct_ip_mreq
diff --git a/vendor/golang.org/x/net/ipv4/defs_openbsd.go b/vendor/golang.org/x/net/ipv4/defs_openbsd.go
deleted file mode 100644
index 8f8af1b899..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_openbsd.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_RECVIF = C.IP_RECVIF
- sysIP_RECVTTL = C.IP_RECVTTL
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
-)
-
-type ipMreq C.struct_ip_mreq
diff --git a/vendor/golang.org/x/net/ipv4/defs_solaris.go b/vendor/golang.org/x/net/ipv4/defs_solaris.go
deleted file mode 100644
index aeb33e9c8f..0000000000
--- a/vendor/golang.org/x/net/ipv4/defs_solaris.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in_addr [4]byte /* in_addr */
-
-package ipv4
-
-/*
-#include
-
-#include
-*/
-import "C"
-
-const (
- sysIP_OPTIONS = C.IP_OPTIONS
- sysIP_HDRINCL = C.IP_HDRINCL
- sysIP_TOS = C.IP_TOS
- sysIP_TTL = C.IP_TTL
- sysIP_RECVOPTS = C.IP_RECVOPTS
- sysIP_RECVRETOPTS = C.IP_RECVRETOPTS
- sysIP_RECVDSTADDR = C.IP_RECVDSTADDR
- sysIP_RETOPTS = C.IP_RETOPTS
- sysIP_RECVIF = C.IP_RECVIF
- sysIP_RECVSLLA = C.IP_RECVSLLA
- sysIP_RECVTTL = C.IP_RECVTTL
-
- sysIP_MULTICAST_IF = C.IP_MULTICAST_IF
- sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL
- sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP
- sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP
- sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP
- sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE
- sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE
- sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP
- sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP
- sysIP_NEXTHOP = C.IP_NEXTHOP
-
- sysIP_PKTINFO = C.IP_PKTINFO
- sysIP_RECVPKTINFO = C.IP_RECVPKTINFO
- sysIP_DONTFRAG = C.IP_DONTFRAG
-
- sysIP_BOUND_IF = C.IP_BOUND_IF
- sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC
- sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL
- sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF
-
- sysIP_REUSEADDR = C.IP_REUSEADDR
- sysIP_DONTROUTE = C.IP_DONTROUTE
- sysIP_BROADCAST = C.IP_BROADCAST
-
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet = C.sizeof_struct_sockaddr_in
- sizeofInetPktinfo = C.sizeof_struct_in_pktinfo
-
- sizeofIPMreq = C.sizeof_struct_ip_mreq
- sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet C.struct_sockaddr_in
-
-type inetPktinfo C.struct_in_pktinfo
-
-type ipMreq C.struct_ip_mreq
-
-type ipMreqSource C.struct_ip_mreq_source
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
diff --git a/vendor/golang.org/x/net/ipv4/gen.go b/vendor/golang.org/x/net/ipv4/gen.go
deleted file mode 100644
index 1bb1737f67..0000000000
--- a/vendor/golang.org/x/net/ipv4/gen.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-//go:generate go run gen.go
-
-// This program generates system adaptation constants and types,
-// internet protocol constants and tables by reading template files
-// and IANA protocol registries.
-package main
-
-import (
- "bytes"
- "encoding/xml"
- "fmt"
- "go/format"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "os/exec"
- "runtime"
- "strconv"
- "strings"
-)
-
-func main() {
- if err := genzsys(); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- if err := geniana(); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
-}
-
-func genzsys() error {
- defs := "defs_" + runtime.GOOS + ".go"
- f, err := os.Open(defs)
- if err != nil {
- if os.IsNotExist(err) {
- return nil
- }
- return err
- }
- f.Close()
- cmd := exec.Command("go", "tool", "cgo", "-godefs", defs)
- b, err := cmd.Output()
- if err != nil {
- return err
- }
- b, err = format.Source(b)
- if err != nil {
- return err
- }
- zsys := "zsys_" + runtime.GOOS + ".go"
- switch runtime.GOOS {
- case "freebsd", "linux":
- zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go"
- }
- if err := ioutil.WriteFile(zsys, b, 0644); err != nil {
- return err
- }
- return nil
-}
-
-var registries = []struct {
- url string
- parse func(io.Writer, io.Reader) error
-}{
- {
- "https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml",
- parseICMPv4Parameters,
- },
-}
-
-func geniana() error {
- var bb bytes.Buffer
- fmt.Fprintf(&bb, "// go generate gen.go\n")
- fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
- fmt.Fprintf(&bb, "package ipv4\n\n")
- for _, r := range registries {
- resp, err := http.Get(r.url)
- if err != nil {
- return err
- }
- defer resp.Body.Close()
- if resp.StatusCode != http.StatusOK {
- return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url)
- }
- if err := r.parse(&bb, resp.Body); err != nil {
- return err
- }
- fmt.Fprintf(&bb, "\n")
- }
- b, err := format.Source(bb.Bytes())
- if err != nil {
- return err
- }
- if err := ioutil.WriteFile("iana.go", b, 0644); err != nil {
- return err
- }
- return nil
-}
-
-func parseICMPv4Parameters(w io.Writer, r io.Reader) error {
- dec := xml.NewDecoder(r)
- var icp icmpv4Parameters
- if err := dec.Decode(&icp); err != nil {
- return err
- }
- prs := icp.escape()
- fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
- fmt.Fprintf(w, "const (\n")
- for _, pr := range prs {
- if pr.Descr == "" {
- continue
- }
- fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value)
- fmt.Fprintf(w, "// %s\n", pr.OrigDescr)
- }
- fmt.Fprintf(w, ")\n\n")
- fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
- fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n")
- for _, pr := range prs {
- if pr.Descr == "" {
- continue
- }
- fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr))
- }
- fmt.Fprintf(w, "}\n")
- return nil
-}
-
-type icmpv4Parameters struct {
- XMLName xml.Name `xml:"registry"`
- Title string `xml:"title"`
- Updated string `xml:"updated"`
- Registries []struct {
- Title string `xml:"title"`
- Records []struct {
- Value string `xml:"value"`
- Descr string `xml:"description"`
- } `xml:"record"`
- } `xml:"registry"`
-}
-
-type canonICMPv4ParamRecord struct {
- OrigDescr string
- Descr string
- Value int
-}
-
-func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord {
- id := -1
- for i, r := range icp.Registries {
- if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") {
- id = i
- break
- }
- }
- if id < 0 {
- return nil
- }
- prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records))
- sr := strings.NewReplacer(
- "Messages", "",
- "Message", "",
- "ICMP", "",
- "+", "P",
- "-", "",
- "/", "",
- ".", "",
- " ", "",
- )
- for i, pr := range icp.Registries[id].Records {
- if strings.Contains(pr.Descr, "Reserved") ||
- strings.Contains(pr.Descr, "Unassigned") ||
- strings.Contains(pr.Descr, "Deprecated") ||
- strings.Contains(pr.Descr, "Experiment") ||
- strings.Contains(pr.Descr, "experiment") {
- continue
- }
- ss := strings.Split(pr.Descr, "\n")
- if len(ss) > 1 {
- prs[i].Descr = strings.Join(ss, " ")
- } else {
- prs[i].Descr = ss[0]
- }
- s := strings.TrimSpace(prs[i].Descr)
- prs[i].OrigDescr = s
- prs[i].Descr = sr.Replace(s)
- prs[i].Value, _ = strconv.Atoi(pr.Value)
- }
- return prs
-}
diff --git a/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/vendor/golang.org/x/net/ipv4/zsys_darwin.go
index c07cc883fc..e05a251ba0 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_darwin.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_darwin.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_darwin.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go
index c4365e9e71..6d65e9fcb8 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_dragonfly.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go
index 8c4aec94c8..136e2b8f1d 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go
index 4b10b7c575..4f730f19ef 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go
index 4b10b7c575..4f730f19ef 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go
index c0260f0ce3..43ef8e5922 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go
index c0260f0ce3..43ef8e5922 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go
index c0260f0ce3..43ef8e5922 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go
index c0260f0ce3..43ef8e5922 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mipsle.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go
index f65bd9a7a6..fa1b6bc61d 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go
index 9c967eaa64..ee8204da46 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go
index fd3624d93c..8cfc648ad7 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_netbsd.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go
index 12f36be759..37629cb0ab 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_openbsd.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/vendor/golang.org/x/net/ipv4/zsys_solaris.go
index 0a3875cc41..cb80a308b0 100644
--- a/vendor/golang.org/x/net/ipv4/zsys_solaris.go
+++ b/vendor/golang.org/x/net/ipv4/zsys_solaris.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_solaris.go
package ipv4
diff --git a/vendor/golang.org/x/net/ipv6/defs_aix.go b/vendor/golang.org/x/net/ipv6/defs_aix.go
deleted file mode 100644
index ea396a3cb8..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_aix.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-#include
-
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
- sysICMP6_FILTER = C.ICMP6_FILTER
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RTHDR = C.IPV6_RTHDR
-
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
-
- sysIPV6_TCLASS = C.IPV6_TCLASS
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type icmpv6Filter C.struct_icmp6_filter
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
diff --git a/vendor/golang.org/x/net/ipv6/defs_darwin.go b/vendor/golang.org/x/net/ipv6/defs_darwin.go
deleted file mode 100644
index 55ddc116fc..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_darwin.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#define __APPLE_USE_RFC_3542
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
-
- sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
- sysICMP6_FILTER = C.ICMP6_FILTER
- sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO
- sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT
- sysIPV6_2292NEXTHOP = C.IPV6_2292NEXTHOP
- sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS
- sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS
- sysIPV6_2292RTHDR = C.IPV6_2292RTHDR
-
- sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
-
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
- sysIPV6_TCLASS = C.IPV6_TCLASS
-
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
-
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
-
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RTHDR = C.IPV6_RTHDR
-
- sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
-
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
-
- sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR
-
- sysIPV6_MSFILTER = C.IPV6_MSFILTER
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
-
- sysIPV6_BOUND_IF = C.IPV6_BOUND_IF
-
- sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
- sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
- sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type icmpv6Filter C.struct_icmp6_filter
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
diff --git a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go b/vendor/golang.org/x/net/ipv6/defs_dragonfly.go
deleted file mode 100644
index a4c383a515..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-#include
-
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
- sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
- sysICMP6_FILTER = C.ICMP6_FILTER
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
-
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
-
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RTHDR = C.IPV6_RTHDR
-
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
-
- sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
-
- sysIPV6_TCLASS = C.IPV6_TCLASS
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
-
- sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR
-
- sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
- sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
- sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
-
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type icmpv6Filter C.struct_icmp6_filter
diff --git a/vendor/golang.org/x/net/ipv6/defs_freebsd.go b/vendor/golang.org/x/net/ipv6/defs_freebsd.go
deleted file mode 100644
index 53e625389a..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_freebsd.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-#include
-
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
- sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
- sysICMP6_FILTER = C.ICMP6_FILTER
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
-
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
-
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RTHDR = C.IPV6_RTHDR
-
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
-
- sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
-
- sysIPV6_TCLASS = C.IPV6_TCLASS
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
-
- sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR
-
- sysIPV6_BINDANY = C.IPV6_BINDANY
-
- sysIPV6_MSFILTER = C.IPV6_MSFILTER
-
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
-
- sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
- sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
- sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
-
-type icmpv6Filter C.struct_icmp6_filter
diff --git a/vendor/golang.org/x/net/ipv6/defs_linux.go b/vendor/golang.org/x/net/ipv6/defs_linux.go
deleted file mode 100644
index 3308cb2c38..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_linux.go
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-#include
-#include
-#include
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_ADDRFORM = C.IPV6_ADDRFORM
- sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO
- sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS
- sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS
- sysIPV6_2292RTHDR = C.IPV6_2292RTHDR
- sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_FLOWINFO = C.IPV6_FLOWINFO
-
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_ADD_MEMBERSHIP = C.IPV6_ADD_MEMBERSHIP
- sysIPV6_DROP_MEMBERSHIP = C.IPV6_DROP_MEMBERSHIP
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
- sysMCAST_MSFILTER = C.MCAST_MSFILTER
- sysIPV6_ROUTER_ALERT = C.IPV6_ROUTER_ALERT
- sysIPV6_MTU_DISCOVER = C.IPV6_MTU_DISCOVER
- sysIPV6_MTU = C.IPV6_MTU
- sysIPV6_RECVERR = C.IPV6_RECVERR
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
- sysIPV6_JOIN_ANYCAST = C.IPV6_JOIN_ANYCAST
- sysIPV6_LEAVE_ANYCAST = C.IPV6_LEAVE_ANYCAST
-
- //sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT
- //sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT
- //sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO
- //sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE
- //sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE
- //sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT
-
- sysIPV6_FLOWLABEL_MGR = C.IPV6_FLOWLABEL_MGR
- sysIPV6_FLOWINFO_SEND = C.IPV6_FLOWINFO_SEND
-
- sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
- sysIPV6_XFRM_POLICY = C.IPV6_XFRM_POLICY
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RTHDR = C.IPV6_RTHDR
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
-
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
- sysIPV6_TCLASS = C.IPV6_TCLASS
-
- sysIPV6_ADDR_PREFERENCES = C.IPV6_ADDR_PREFERENCES
-
- sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP
- sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC
- sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = C.IPV6_PREFER_SRC_PUBTMP_DEFAULT
- sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA
- sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME
- sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA
- sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA
-
- sysIPV6_MINHOPCOUNT = C.IPV6_MINHOPCOUNT
-
- sysIPV6_ORIGDSTADDR = C.IPV6_ORIGDSTADDR
- sysIPV6_RECVORIGDSTADDR = C.IPV6_RECVORIGDSTADDR
- sysIPV6_TRANSPARENT = C.IPV6_TRANSPARENT
- sysIPV6_UNICAST_IF = C.IPV6_UNICAST_IF
-
- sysICMPV6_FILTER = C.ICMPV6_FILTER
-
- sysICMPV6_FILTER_BLOCK = C.ICMPV6_FILTER_BLOCK
- sysICMPV6_FILTER_PASS = C.ICMPV6_FILTER_PASS
- sysICMPV6_FILTER_BLOCKOTHERS = C.ICMPV6_FILTER_BLOCKOTHERS
- sysICMPV6_FILTER_PASSONLY = C.ICMPV6_FILTER_PASSONLY
-
- sysSOL_SOCKET = C.SOL_SOCKET
- sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER
-
- sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
- sizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-
- sizeofSockFprog = C.sizeof_struct_sock_fprog
-)
-
-type kernelSockaddrStorage C.struct___kernel_sockaddr_storage
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6FlowlabelReq C.struct_in6_flowlabel_req
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
-
-type icmpv6Filter C.struct_icmp6_filter
-
-type sockFProg C.struct_sock_fprog
-
-type sockFilter C.struct_sock_filter
diff --git a/vendor/golang.org/x/net/ipv6/defs_netbsd.go b/vendor/golang.org/x/net/ipv6/defs_netbsd.go
deleted file mode 100644
index be9ceb9cc0..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_netbsd.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-#include
-
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
- sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
- sysICMP6_FILTER = C.ICMP6_FILTER
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY
-
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RTHDR = C.IPV6_RTHDR
-
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
-
- sysIPV6_TCLASS = C.IPV6_TCLASS
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
-
- sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
- sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
- sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
-
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type icmpv6Filter C.struct_icmp6_filter
diff --git a/vendor/golang.org/x/net/ipv6/defs_openbsd.go b/vendor/golang.org/x/net/ipv6/defs_openbsd.go
deleted file mode 100644
index 177ddf87d2..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_openbsd.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-#include
-
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
- sysIPV6_PORTRANGE = C.IPV6_PORTRANGE
- sysICMP6_FILTER = C.ICMP6_FILTER
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
-
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
- sysIPV6_RTHDR = C.IPV6_RTHDR
-
- sysIPV6_AUTH_LEVEL = C.IPV6_AUTH_LEVEL
- sysIPV6_ESP_TRANS_LEVEL = C.IPV6_ESP_TRANS_LEVEL
- sysIPV6_ESP_NETWORK_LEVEL = C.IPV6_ESP_NETWORK_LEVEL
- sysIPSEC6_OUTSA = C.IPSEC6_OUTSA
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
-
- sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL
- sysIPV6_IPCOMP_LEVEL = C.IPV6_IPCOMP_LEVEL
-
- sysIPV6_TCLASS = C.IPV6_TCLASS
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
- sysIPV6_PIPEX = C.IPV6_PIPEX
-
- sysIPV6_RTABLE = C.IPV6_RTABLE
-
- sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT
- sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH
- sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW
-
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type icmpv6Filter C.struct_icmp6_filter
diff --git a/vendor/golang.org/x/net/ipv6/defs_solaris.go b/vendor/golang.org/x/net/ipv6/defs_solaris.go
deleted file mode 100644
index 0f8ce2b46a..0000000000
--- a/vendor/golang.org/x/net/ipv6/defs_solaris.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// +godefs map struct_in6_addr [16]byte /* in6_addr */
-
-package ipv6
-
-/*
-#include
-
-#include
-#include
-*/
-import "C"
-
-const (
- sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS
- sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF
- sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS
- sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP
- sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP
- sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP
-
- sysIPV6_PKTINFO = C.IPV6_PKTINFO
-
- sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT
- sysIPV6_NEXTHOP = C.IPV6_NEXTHOP
- sysIPV6_HOPOPTS = C.IPV6_HOPOPTS
- sysIPV6_DSTOPTS = C.IPV6_DSTOPTS
-
- sysIPV6_RTHDR = C.IPV6_RTHDR
- sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS
-
- sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO
- sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT
- sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS
-
- sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR
-
- sysIPV6_RECVRTHDRDSTOPTS = C.IPV6_RECVRTHDRDSTOPTS
-
- sysIPV6_CHECKSUM = C.IPV6_CHECKSUM
- sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS
- sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU
- sysIPV6_DONTFRAG = C.IPV6_DONTFRAG
- sysIPV6_SEC_OPT = C.IPV6_SEC_OPT
- sysIPV6_SRC_PREFERENCES = C.IPV6_SRC_PREFERENCES
- sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU
- sysIPV6_PATHMTU = C.IPV6_PATHMTU
- sysIPV6_TCLASS = C.IPV6_TCLASS
- sysIPV6_V6ONLY = C.IPV6_V6ONLY
-
- sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS
-
- sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP
- sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP
- sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE
- sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE
- sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP
- sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP
-
- sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME
- sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA
- sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC
- sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP
- sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA
- sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA
-
- sysIPV6_PREFER_SRC_MIPMASK = C.IPV6_PREFER_SRC_MIPMASK
- sysIPV6_PREFER_SRC_MIPDEFAULT = C.IPV6_PREFER_SRC_MIPDEFAULT
- sysIPV6_PREFER_SRC_TMPMASK = C.IPV6_PREFER_SRC_TMPMASK
- sysIPV6_PREFER_SRC_TMPDEFAULT = C.IPV6_PREFER_SRC_TMPDEFAULT
- sysIPV6_PREFER_SRC_CGAMASK = C.IPV6_PREFER_SRC_CGAMASK
- sysIPV6_PREFER_SRC_CGADEFAULT = C.IPV6_PREFER_SRC_CGADEFAULT
-
- sysIPV6_PREFER_SRC_MASK = C.IPV6_PREFER_SRC_MASK
-
- sysIPV6_PREFER_SRC_DEFAULT = C.IPV6_PREFER_SRC_DEFAULT
-
- sysIPV6_BOUND_IF = C.IPV6_BOUND_IF
- sysIPV6_UNSPEC_SRC = C.IPV6_UNSPEC_SRC
-
- sysICMP6_FILTER = C.ICMP6_FILTER
-
- sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
- sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6
- sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
- sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo
-
- sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq
- sizeofGroupReq = C.sizeof_struct_group_req
- sizeofGroupSourceReq = C.sizeof_struct_group_source_req
-
- sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter
-)
-
-type sockaddrStorage C.struct_sockaddr_storage
-
-type sockaddrInet6 C.struct_sockaddr_in6
-
-type inet6Pktinfo C.struct_in6_pktinfo
-
-type ipv6Mtuinfo C.struct_ip6_mtuinfo
-
-type ipv6Mreq C.struct_ipv6_mreq
-
-type groupReq C.struct_group_req
-
-type groupSourceReq C.struct_group_source_req
-
-type icmpv6Filter C.struct_icmp6_filter
diff --git a/vendor/golang.org/x/net/ipv6/gen.go b/vendor/golang.org/x/net/ipv6/gen.go
deleted file mode 100644
index 5885664fbc..0000000000
--- a/vendor/golang.org/x/net/ipv6/gen.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-//go:generate go run gen.go
-
-// This program generates system adaptation constants and types,
-// internet protocol constants and tables by reading template files
-// and IANA protocol registries.
-package main
-
-import (
- "bytes"
- "encoding/xml"
- "fmt"
- "go/format"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "os/exec"
- "runtime"
- "strconv"
- "strings"
-)
-
-func main() {
- if err := genzsys(); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- if err := geniana(); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
-}
-
-func genzsys() error {
- defs := "defs_" + runtime.GOOS + ".go"
- f, err := os.Open(defs)
- if err != nil {
- if os.IsNotExist(err) {
- return nil
- }
- return err
- }
- f.Close()
- cmd := exec.Command("go", "tool", "cgo", "-godefs", defs)
- b, err := cmd.Output()
- if err != nil {
- return err
- }
- b, err = format.Source(b)
- if err != nil {
- return err
- }
- zsys := "zsys_" + runtime.GOOS + ".go"
- switch runtime.GOOS {
- case "freebsd", "linux":
- zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go"
- }
- if err := ioutil.WriteFile(zsys, b, 0644); err != nil {
- return err
- }
- return nil
-}
-
-var registries = []struct {
- url string
- parse func(io.Writer, io.Reader) error
-}{
- {
- "https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml",
- parseICMPv6Parameters,
- },
-}
-
-func geniana() error {
- var bb bytes.Buffer
- fmt.Fprintf(&bb, "// go generate gen.go\n")
- fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
- fmt.Fprintf(&bb, "package ipv6\n\n")
- for _, r := range registries {
- resp, err := http.Get(r.url)
- if err != nil {
- return err
- }
- defer resp.Body.Close()
- if resp.StatusCode != http.StatusOK {
- return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url)
- }
- if err := r.parse(&bb, resp.Body); err != nil {
- return err
- }
- fmt.Fprintf(&bb, "\n")
- }
- b, err := format.Source(bb.Bytes())
- if err != nil {
- return err
- }
- if err := ioutil.WriteFile("iana.go", b, 0644); err != nil {
- return err
- }
- return nil
-}
-
-func parseICMPv6Parameters(w io.Writer, r io.Reader) error {
- dec := xml.NewDecoder(r)
- var icp icmpv6Parameters
- if err := dec.Decode(&icp); err != nil {
- return err
- }
- prs := icp.escape()
- fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
- fmt.Fprintf(w, "const (\n")
- for _, pr := range prs {
- if pr.Name == "" {
- continue
- }
- fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value)
- fmt.Fprintf(w, "// %s\n", pr.OrigName)
- }
- fmt.Fprintf(w, ")\n\n")
- fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
- fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n")
- for _, pr := range prs {
- if pr.Name == "" {
- continue
- }
- fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName))
- }
- fmt.Fprintf(w, "}\n")
- return nil
-}
-
-type icmpv6Parameters struct {
- XMLName xml.Name `xml:"registry"`
- Title string `xml:"title"`
- Updated string `xml:"updated"`
- Registries []struct {
- Title string `xml:"title"`
- Records []struct {
- Value string `xml:"value"`
- Name string `xml:"name"`
- } `xml:"record"`
- } `xml:"registry"`
-}
-
-type canonICMPv6ParamRecord struct {
- OrigName string
- Name string
- Value int
-}
-
-func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord {
- id := -1
- for i, r := range icp.Registries {
- if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") {
- id = i
- break
- }
- }
- if id < 0 {
- return nil
- }
- prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records))
- sr := strings.NewReplacer(
- "Messages", "",
- "Message", "",
- "ICMP", "",
- "+", "P",
- "-", "",
- "/", "",
- ".", "",
- " ", "",
- )
- for i, pr := range icp.Registries[id].Records {
- if strings.Contains(pr.Name, "Reserved") ||
- strings.Contains(pr.Name, "Unassigned") ||
- strings.Contains(pr.Name, "Deprecated") ||
- strings.Contains(pr.Name, "Experiment") ||
- strings.Contains(pr.Name, "experiment") {
- continue
- }
- ss := strings.Split(pr.Name, "\n")
- if len(ss) > 1 {
- prs[i].Name = strings.Join(ss, " ")
- } else {
- prs[i].Name = ss[0]
- }
- s := strings.TrimSpace(prs[i].Name)
- prs[i].OrigName = s
- prs[i].Name = sr.Replace(s)
- prs[i].Value, _ = strconv.Atoi(pr.Value)
- }
- return prs
-}
diff --git a/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/vendor/golang.org/x/net/ipv6/zsys_darwin.go
index 6aab1dfab7..555744afd7 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_darwin.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_darwin.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_darwin.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go
index d2de804d88..cf3cc1024a 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_dragonfly.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go
index 919e572d4a..73f31b260e 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go
index cb8141f9c6..490ce7cf10 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go
index cb8141f9c6..490ce7cf10 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_freebsd.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go
index 73aa8c6dfc..14155dec21 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go
index 73aa8c6dfc..14155dec21 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go
index 73aa8c6dfc..14155dec21 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go
index 73aa8c6dfc..14155dec21 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go
index c9bf6a87ef..a51e142b42 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go
index b64f0157d7..9566d76468 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_linux.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go
index bcada13b7a..e39571e072 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_netbsd.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go
index 86cf3c6379..cc1899a630 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_openbsd.go
package ipv6
diff --git a/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/vendor/golang.org/x/net/ipv6/zsys_solaris.go
index cf1837dd2a..690eef9341 100644
--- a/vendor/golang.org/x/net/ipv6/zsys_solaris.go
+++ b/vendor/golang.org/x/net/ipv6/zsys_solaris.go
@@ -1,4 +1,4 @@
-// Created by cgo -godefs - DO NOT EDIT
+// Code generated by cmd/cgo -godefs; DO NOT EDIT.
// cgo -godefs defs_solaris.go
package ipv6
diff --git a/vendor/golang.org/x/net/publicsuffix/gen.go b/vendor/golang.org/x/net/publicsuffix/gen.go
deleted file mode 100644
index 372ffbb24c..0000000000
--- a/vendor/golang.org/x/net/publicsuffix/gen.go
+++ /dev/null
@@ -1,717 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-package main
-
-// This program generates table.go and table_test.go based on the authoritative
-// public suffix list at https://publicsuffix.org/list/effective_tld_names.dat
-//
-// The version is derived from
-// https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat
-// and a human-readable form is at
-// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat
-//
-// To fetch a particular git revision, such as 5c70ccd250, pass
-// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat"
-// and -version "an explicit version string".
-
-import (
- "bufio"
- "bytes"
- "flag"
- "fmt"
- "go/format"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "regexp"
- "sort"
- "strings"
-
- "golang.org/x/net/idna"
-)
-
-const (
- // These sum of these four values must be no greater than 32.
- nodesBitsChildren = 10
- nodesBitsICANN = 1
- nodesBitsTextOffset = 15
- nodesBitsTextLength = 6
-
- // These sum of these four values must be no greater than 32.
- childrenBitsWildcard = 1
- childrenBitsNodeType = 2
- childrenBitsHi = 14
- childrenBitsLo = 14
-)
-
-var (
- maxChildren int
- maxTextOffset int
- maxTextLength int
- maxHi uint32
- maxLo uint32
-)
-
-func max(a, b int) int {
- if a < b {
- return b
- }
- return a
-}
-
-func u32max(a, b uint32) uint32 {
- if a < b {
- return b
- }
- return a
-}
-
-const (
- nodeTypeNormal = 0
- nodeTypeException = 1
- nodeTypeParentOnly = 2
- numNodeType = 3
-)
-
-func nodeTypeStr(n int) string {
- switch n {
- case nodeTypeNormal:
- return "+"
- case nodeTypeException:
- return "!"
- case nodeTypeParentOnly:
- return "o"
- }
- panic("unreachable")
-}
-
-const (
- defaultURL = "https://publicsuffix.org/list/effective_tld_names.dat"
- gitCommitURL = "https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat"
-)
-
-var (
- labelEncoding = map[string]uint32{}
- labelsList = []string{}
- labelsMap = map[string]bool{}
- rules = []string{}
- numICANNRules = 0
-
- // validSuffixRE is used to check that the entries in the public suffix
- // list are in canonical form (after Punycode encoding). Specifically,
- // capital letters are not allowed.
- validSuffixRE = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`)
-
- shaRE = regexp.MustCompile(`"sha":"([^"]+)"`)
- dateRE = regexp.MustCompile(`"committer":{[^{]+"date":"([^"]+)"`)
-
- comments = flag.Bool("comments", false, "generate table.go comments, for debugging")
- subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging")
- url = flag.String("url", defaultURL, "URL of the publicsuffix.org list. If empty, stdin is read instead")
- v = flag.Bool("v", false, "verbose output (to stderr)")
- version = flag.String("version", "", "the effective_tld_names.dat version")
-)
-
-func main() {
- if err := main1(); err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
-}
-
-func main1() error {
- flag.Parse()
- if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 {
- return fmt.Errorf("not enough bits to encode the nodes table")
- }
- if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 {
- return fmt.Errorf("not enough bits to encode the children table")
- }
- if *version == "" {
- if *url != defaultURL {
- return fmt.Errorf("-version was not specified, and the -url is not the default one")
- }
- sha, date, err := gitCommit()
- if err != nil {
- return err
- }
- *version = fmt.Sprintf("publicsuffix.org's public_suffix_list.dat, git revision %s (%s)", sha, date)
- }
- var r io.Reader = os.Stdin
- if *url != "" {
- res, err := http.Get(*url)
- if err != nil {
- return err
- }
- if res.StatusCode != http.StatusOK {
- return fmt.Errorf("bad GET status for %s: %d", *url, res.Status)
- }
- r = res.Body
- defer res.Body.Close()
- }
-
- var root node
- icann := false
- br := bufio.NewReader(r)
- for {
- s, err := br.ReadString('\n')
- if err != nil {
- if err == io.EOF {
- break
- }
- return err
- }
- s = strings.TrimSpace(s)
- if strings.Contains(s, "BEGIN ICANN DOMAINS") {
- if len(rules) != 0 {
- return fmt.Errorf(`expected no rules before "BEGIN ICANN DOMAINS"`)
- }
- icann = true
- continue
- }
- if strings.Contains(s, "END ICANN DOMAINS") {
- icann, numICANNRules = false, len(rules)
- continue
- }
- if s == "" || strings.HasPrefix(s, "//") {
- continue
- }
- s, err = idna.ToASCII(s)
- if err != nil {
- return err
- }
- if !validSuffixRE.MatchString(s) {
- return fmt.Errorf("bad publicsuffix.org list data: %q", s)
- }
-
- if *subset {
- switch {
- case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"):
- case s == "ak.us" || strings.HasSuffix(s, ".ak.us"):
- case s == "ao" || strings.HasSuffix(s, ".ao"):
- case s == "ar" || strings.HasSuffix(s, ".ar"):
- case s == "arpa" || strings.HasSuffix(s, ".arpa"):
- case s == "cy" || strings.HasSuffix(s, ".cy"):
- case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"):
- case s == "jp":
- case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"):
- case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"):
- case s == "om" || strings.HasSuffix(s, ".om"):
- case s == "uk" || strings.HasSuffix(s, ".uk"):
- case s == "uk.com" || strings.HasSuffix(s, ".uk.com"):
- case s == "tw" || strings.HasSuffix(s, ".tw"):
- case s == "zw" || strings.HasSuffix(s, ".zw"):
- case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"):
- // xn--p1ai is Russian-Cyrillic "рф".
- default:
- continue
- }
- }
-
- rules = append(rules, s)
-
- nt, wildcard := nodeTypeNormal, false
- switch {
- case strings.HasPrefix(s, "*."):
- s, nt = s[2:], nodeTypeParentOnly
- wildcard = true
- case strings.HasPrefix(s, "!"):
- s, nt = s[1:], nodeTypeException
- }
- labels := strings.Split(s, ".")
- for n, i := &root, len(labels)-1; i >= 0; i-- {
- label := labels[i]
- n = n.child(label)
- if i == 0 {
- if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly {
- n.nodeType = nt
- }
- n.icann = n.icann && icann
- n.wildcard = n.wildcard || wildcard
- }
- labelsMap[label] = true
- }
- }
- labelsList = make([]string, 0, len(labelsMap))
- for label := range labelsMap {
- labelsList = append(labelsList, label)
- }
- sort.Strings(labelsList)
-
- if err := generate(printReal, &root, "table.go"); err != nil {
- return err
- }
- if err := generate(printTest, &root, "table_test.go"); err != nil {
- return err
- }
- return nil
-}
-
-func generate(p func(io.Writer, *node) error, root *node, filename string) error {
- buf := new(bytes.Buffer)
- if err := p(buf, root); err != nil {
- return err
- }
- b, err := format.Source(buf.Bytes())
- if err != nil {
- return err
- }
- return ioutil.WriteFile(filename, b, 0644)
-}
-
-func gitCommit() (sha, date string, retErr error) {
- res, err := http.Get(gitCommitURL)
- if err != nil {
- return "", "", err
- }
- if res.StatusCode != http.StatusOK {
- return "", "", fmt.Errorf("bad GET status for %s: %d", gitCommitURL, res.Status)
- }
- defer res.Body.Close()
- b, err := ioutil.ReadAll(res.Body)
- if err != nil {
- return "", "", err
- }
- if m := shaRE.FindSubmatch(b); m != nil {
- sha = string(m[1])
- }
- if m := dateRE.FindSubmatch(b); m != nil {
- date = string(m[1])
- }
- if sha == "" || date == "" {
- retErr = fmt.Errorf("could not find commit SHA and date in %s", gitCommitURL)
- }
- return sha, date, retErr
-}
-
-func printTest(w io.Writer, n *node) error {
- fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n")
- fmt.Fprintf(w, "package publicsuffix\n\nconst numICANNRules = %d\n\nvar rules = [...]string{\n", numICANNRules)
- for _, rule := range rules {
- fmt.Fprintf(w, "%q,\n", rule)
- }
- fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n")
- if err := n.walk(w, printNodeLabel); err != nil {
- return err
- }
- fmt.Fprintf(w, "}\n")
- return nil
-}
-
-func printReal(w io.Writer, n *node) error {
- const header = `// generated by go run gen.go; DO NOT EDIT
-
-package publicsuffix
-
-const version = %q
-
-const (
- nodesBitsChildren = %d
- nodesBitsICANN = %d
- nodesBitsTextOffset = %d
- nodesBitsTextLength = %d
-
- childrenBitsWildcard = %d
- childrenBitsNodeType = %d
- childrenBitsHi = %d
- childrenBitsLo = %d
-)
-
-const (
- nodeTypeNormal = %d
- nodeTypeException = %d
- nodeTypeParentOnly = %d
-)
-
-// numTLD is the number of top level domains.
-const numTLD = %d
-
-`
- fmt.Fprintf(w, header, *version,
- nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength,
- childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo,
- nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children))
-
- text := combineText(labelsList)
- if text == "" {
- return fmt.Errorf("internal error: makeText returned no text")
- }
- for _, label := range labelsList {
- offset, length := strings.Index(text, label), len(label)
- if offset < 0 {
- return fmt.Errorf("internal error: could not find %q in text %q", label, text)
- }
- maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length)
- if offset >= 1<= 1< 64 {
- n, plus = 64, " +"
- }
- fmt.Fprintf(w, "%q%s\n", text[:n], plus)
- text = text[n:]
- }
-
- if err := n.walk(w, assignIndexes); err != nil {
- return err
- }
-
- fmt.Fprintf(w, `
-
-// nodes is the list of nodes. Each node is represented as a uint32, which
-// encodes the node's children, wildcard bit and node type (as an index into
-// the children array), ICANN bit and text.
-//
-// If the table was generated with the -comments flag, there is a //-comment
-// after each node's data. In it is the nodes-array indexes of the children,
-// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The
-// nodeType is printed as + for normal, ! for exception, and o for parent-only
-// nodes that have children but don't match a domain label in their own right.
-// An I denotes an ICANN domain.
-//
-// The layout within the uint32, from MSB to LSB, is:
-// [%2d bits] unused
-// [%2d bits] children index
-// [%2d bits] ICANN bit
-// [%2d bits] text index
-// [%2d bits] text length
-var nodes = [...]uint32{
-`,
- 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength,
- nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength)
- if err := n.walk(w, printNode); err != nil {
- return err
- }
- fmt.Fprintf(w, `}
-
-// children is the list of nodes' children, the parent's wildcard bit and the
-// parent's node type. If a node has no children then their children index
-// will be in the range [0, 6), depending on the wildcard bit and node type.
-//
-// The layout within the uint32, from MSB to LSB, is:
-// [%2d bits] unused
-// [%2d bits] wildcard bit
-// [%2d bits] node type
-// [%2d bits] high nodes index (exclusive) of children
-// [%2d bits] low nodes index (inclusive) of children
-var children=[...]uint32{
-`,
- 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo,
- childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo)
- for i, c := range childrenEncoding {
- s := "---------------"
- lo := c & (1<> childrenBitsLo) & (1<>(childrenBitsLo+childrenBitsHi)) & (1<>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0
- if *comments {
- fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n",
- c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType))
- } else {
- fmt.Fprintf(w, "0x%x,\n", c)
- }
- }
- fmt.Fprintf(w, "}\n\n")
- fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<= 1<= 1<= 1< 0 && ss[0] == "" {
- ss = ss[1:]
- }
- return ss
-}
-
-// crush combines a list of strings, taking advantage of overlaps. It returns a
-// single string that contains each input string as a substring.
-func crush(ss []string) string {
- maxLabelLen := 0
- for _, s := range ss {
- if maxLabelLen < len(s) {
- maxLabelLen = len(s)
- }
- }
-
- for prefixLen := maxLabelLen; prefixLen > 0; prefixLen-- {
- prefixes := makePrefixMap(ss, prefixLen)
- for i, s := range ss {
- if len(s) <= prefixLen {
- continue
- }
- mergeLabel(ss, i, prefixLen, prefixes)
- }
- }
-
- return strings.Join(ss, "")
-}
-
-// mergeLabel merges the label at ss[i] with the first available matching label
-// in prefixMap, where the last "prefixLen" characters in ss[i] match the first
-// "prefixLen" characters in the matching label.
-// It will merge ss[i] repeatedly until no more matches are available.
-// All matching labels merged into ss[i] are replaced by "".
-func mergeLabel(ss []string, i, prefixLen int, prefixes prefixMap) {
- s := ss[i]
- suffix := s[len(s)-prefixLen:]
- for _, j := range prefixes[suffix] {
- // Empty strings mean "already used." Also avoid merging with self.
- if ss[j] == "" || i == j {
- continue
- }
- if *v {
- fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d): %q and %q share %q\n",
- prefixLen, i, j, ss[i], ss[j], suffix)
- }
- ss[i] += ss[j][prefixLen:]
- ss[j] = ""
- // ss[i] has a new suffix, so merge again if possible.
- // Note: we only have to merge again at the same prefix length. Shorter
- // prefix lengths will be handled in the next iteration of crush's for loop.
- // Can there be matches for longer prefix lengths, introduced by the merge?
- // I believe that any such matches would by necessity have been eliminated
- // during substring removal or merged at a higher prefix length. For
- // instance, in crush("abc", "cde", "bcdef"), combining "abc" and "cde"
- // would yield "abcde", which could be merged with "bcdef." However, in
- // practice "cde" would already have been elimintated by removeSubstrings.
- mergeLabel(ss, i, prefixLen, prefixes)
- return
- }
-}
-
-// prefixMap maps from a prefix to a list of strings containing that prefix. The
-// list of strings is represented as indexes into a slice of strings stored
-// elsewhere.
-type prefixMap map[string][]int
-
-// makePrefixMap constructs a prefixMap from a slice of strings.
-func makePrefixMap(ss []string, prefixLen int) prefixMap {
- prefixes := make(prefixMap)
- for i, s := range ss {
- // We use < rather than <= because if a label matches on a prefix equal to
- // its full length, that's actually a substring match handled by
- // removeSubstrings.
- if prefixLen < len(s) {
- prefix := s[:prefixLen]
- prefixes[prefix] = append(prefixes[prefix], i)
- }
- }
-
- return prefixes
-}
diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go
index 25674d1ad8..c1347ced4d 100644
--- a/vendor/golang.org/x/net/publicsuffix/table.go
+++ b/vendor/golang.org/x/net/publicsuffix/table.go
@@ -2,7 +2,7 @@
package publicsuffix
-const version = "publicsuffix.org's public_suffix_list.dat, git revision 0e2a405f597a3c1be456d704b42bdd5e0d4954bb (2019-02-21T09:23:55Z)"
+const version = "publicsuffix.org's public_suffix_list.dat, git revision 6f03f42a65d006c8ae657f125f14fb8f9d3337f4 (2019-05-31T16:38:49Z)"
const (
nodesBitsChildren = 10
@@ -23,483 +23,486 @@ const (
)
// numTLD is the number of top level domains.
-const numTLD = 1541
+const numTLD = 1539
// Text is the combined text of all labels.
-const text = "0emmafann-arboretumbriamallamaceiobirabogadodgeiseiyoichippubets" +
- "ubetsugarugbydgoszczecinemaceratabuseating-organicbcieszyn4t3l3p" +
- "0rtargets-itargivestbytemark120001wwwebredirectmemsettsupportarn" +
- "obrzegyptianatuurwetenschappenaumburg120389guacuiababia-goraclea" +
- "ningroks-theatreeastcoastaldefenceatonsberggfarmerseinebinagisob" +
- "etsumidatlanticaseihicampobassociatest-iservecounterstrikebinord" +
- "re-landd-dnshome-webservercelliguriagrocerybnikeisenbahnaval-d-a" +
- "osta-valleyokosukanzakiyokawarajudygarlanddnslivelanddnss3-ap-so" +
- "uth-16-baltimore-og-romsdalipayboltarumizusawabruzzoologicalvink" +
- "lein-addrammenuernbergdyniaetnadexeterepbodynamisches-dns3-ap-no" +
- "rtheast-1337bmwedeploybnpparibaselburgleezebnrwegroweibolognagat" +
- "orodoybomloabathsbcheltenham-radio-openairbusantiquest-a-la-mais" +
- "ondre-landroidrayddnsfreebox-osascoli-picenordlandraydnsupdaterb" +
- "ondrivefsnillfjordrobaknoluoktachikawakembuchikumagayagawakkanai" +
- "betsubamericanfamilydscloudcontrolapplicationcloudaccesscambridg" +
- "estoneat-urlimoliserniabonnishikatsuragit-repos3-website-ap-sout" +
- "heast-2bookingliwiceboomladbrokes3-website-eu-west-1boschaeffler" +
- "dalvdalaskanittedallasalleaseekloges3-website-sa-east-1bostikarm" +
- "oybostonakijinsekikogentinglobalashovhachinohedmarkarpaczeladzlg" +
- "loboavistaprintelligencebotanicalgardenishikawazukamitsuebotanic" +
- "gardenishimerabotanybouncemerckmsdnipropetrovskjervoyagebounty-f" +
- "ullensakerryproperties3-website-us-east-1boutiquebechernigovernm" +
- "entjeldsundruduns3-website-us-west-1bozen-sudtirolinkyard-cloudf" +
- "unctions3-website-us-west-2bozen-suedtirolivornobplacedekagamino" +
- "rd-odalwaysdatabaseballangenoamishirasatobishimaintenancertmgret" +
- "agajobojindustriesteamfamberkeleybrandywinevalleybrasiliabrindis" +
- "ibenikinderoybristoloseyouriparliamentjmaxxxboxenapponazure-mobi" +
- "lebritishcolumbialowiezachpomorskienishinomiyashironobroadcastle" +
- "btimnetzparmatta-varjjatjomemorialomzaporizhzhegurinfinitintuitj" +
- "xfinitybroadwaybroke-itkmaxxjavald-aostaples5ybrokerbronnoysundu" +
- "pontariodejaneirogersakyotanabellunombresciabrothermesaverdealst" +
- "ahaugesunderseaportsinfolldalondrinaplesalangenishinoomotegobrow" +
- "sersafetymarketsalondonetskaruizawabrumunddalorenskoglogoweirbru" +
- "nelasticbeanstalkarumaifarmsteadurbanamexnetlifyinuyamashinatsuk" +
- "igatakarazukamakurazakiwakunigamiharuconnectksatxn--0trq7p7nnish" +
- "inoshimatsushigebrusselsaltdalotenkawabruxellesaludurhamburglopp" +
- "enzaolbia-tempio-olbiatempioolbialystokkepnodumetlifeinsurancebr" +
- "yansklepparocherkasyno-dsalvadordalibabalsan-sudtirollagdenesnaa" +
- "seralingenkainanaejrietisalatinabenonichernihivgubarclaycards3-e" +
- "u-west-2brynewjerseybusinessebykleclerchernivtsiciliabuskerudine" +
- "wmexicoalottebuzentsujiiebuzzwfarsundyndns-at-homedepotenzamamid" +
- "sundyndns-at-workinggrouparsalzburglugmbhartiffanybwhalingminaka" +
- "michiharabzhitomirumalborkdalottokorozawabzzcolognextdirectozsde" +
- "ltaiwanairforcechireadthedocscappgafannakadomarinedre-eikercolon" +
- "ialwilliamsburgrongacoloradoplateaudiocolumbusheycommunitysvardo" +
- "haruovatrani-andria-barletta-trani-andriacomobaracomparemarkerry" +
- "hotelsannancompute-1computerhistoryofscience-fictioncomsecurityt" +
- "acticsannohelpagesanokashiwaracondoshichinohealth-carereforminam" +
- "idaitomandalucerneconferenceconstructionconsuladollsantabarbarac" +
- "onsultanthropologyconsultingrossetouchihayaakasakawaharacontactr" +
- "aniandriabarlettatraniandriacontagematsubaracontemporaryarteduca" +
- "tionalchikugodaddyn-vpndnsantacruzsantafedjejuifminamiechizencon" +
- "tractorskenconventureshinodearthdfcbankashiwazakiyosunndalukowii" +
- "heyakagecookingchannelsdvrdnsdojoetsuwanouchikujogaszkolahppiace" +
- "nzagancooluroycooperativano-frankivskolegallocus-2copenhagencycl" +
- "opedichitachinakagawassamukawataricohdatingmodellingmxn--11b4c3d" +
- "yndns-freeboxosloftranakasatsunairguardiannefrankfurtmpartinzais" +
- "-a-candidatecorsicafederationcorvettemasekasukabedzin-berlindasc" +
- "olipicenogataijis-a-chefashioncosenzakopanexus-3cosidnsfor-bette" +
- "r-thanawatchesantamariakecostumedicinakamurataitogitsuldalutskas" +
- "umigaurawa-mazowszextraspace-to-rentalstomakomaibaracouchpotatof" +
- "riesantoandreamhostersanukis-a-conservativegarsheis-a-cpadualsta" +
- "ckasuyameiwamarugame-hostrolekaminokawanishiaizubangecounciluxem" +
- "bourgroundhandlingroznycouponsaobernardocoursesaogoncartoonartde" +
- "cologiacq-acranbrookuwanalyticsaotomeloyalistoragecreditcardyndn" +
- "s-wikirkenesapporocreditunioncremonashgabadaddjaguarqhachiojiyah" +
- "oooshikamaishimodatecrewildlifedorainfracloudcontrolledogawarabi" +
- "komaezakirunordreisa-geekaszubycricketrzyncrimeast-kazakhstanang" +
- "ercrotonecrownipasadenaritakurashikis-a-cubicle-slavellinotaires" +
- "taurantranoycrsvpassagensardegnarusawacruisesardiniacryptonomich" +
- "igangwoncuisinellair-traffic-controlleyculturalcenternopilawawil" +
- "liamhilluxurycuneocupcakecuritibaghdadyndns-workisboringrpasseng" +
- "er-associationcxn--12c1fe0bradescorporationcyberlevagangaviikano" +
- "njis-a-democratransportecymrussiacyonabaruminamifuranocyouthewor" +
- "kpccwinbarclays3-eu-west-3ferrarissagamiharaferreroticanonoichin" +
- "omiyakefetsundyndns1fguitarsaudafhvalerfidontexistmein-iservebee" +
- "rfieldynnsarluzernfigueresinstagingujoinvilleitungsenfilateliafi" +
- "legear-audnedalnfilegear-deatnurembergulenfilegear-gbizfilegear-" +
- "iefilegear-jpmorganfilegear-sgunmapartmentsauheradynservebbsarps" +
- "borgruefilminamimakis-a-doctorayfinalfinancefineartsavannahgafin" +
- "landynufcfanfinnoyfirebaseapplinzis-a-financialadvisor-aurdalfir" +
- "enzefirestonefirmdalegojomedio-campidano-mediocampidanomediofish" +
- "ingokasells-itravelchannelfitjarfitnessettlementravelersinsuranc" +
- "efjalerflesberguovdageaidnulvikatowiceflickragerotikakamigaharaf" +
- "lightsaves-the-whalessandria-trani-barletta-andriatranibarlettaa" +
- "ndriaflirflogintogoldpoint2thisamitsukefloraflorencefloridattowe" +
- "bcampinashikiminohostfoldnavyfloripaderbornfloristanohatajiritto" +
- "guraflorokunohealthcareersavonarutomobellevuelosangelesjabbottrd" +
- "ynv6flowersaxofltrentin-sud-tirolflynnhosting-clusterflynnhubarg" +
- "ainstantcloudeitysfjordiscoveryolasiteu-4fndynvpnplus-4for-ourfo" +
- "r-somedizinhistorischeschoenbrunnfor-theaterforexrothachirogatak" +
- "amatsukawaforgotdnschokokekschokoladenforli-cesena-forlicesenafo" +
- "rlikescandynaliashorokanaieforsaleikangerforsandasuololfortalfor" +
- "tmissoulajollamericanexpressexyfortworthadanorthwesternmutualfor" +
- "umzfosnescholarshipschoolfotarivnefoxfordebianfozorafredrikstadt" +
- "vschulefreeddnsgeekgalaxyfreedesktoperauniteroizumizakiryuohkura" +
- "freemasonryfreesitevadsoccertificationfreetlschwarzgwangjuniperf" +
- "reiburgushikamifuranorth-kazakhstanfreightrentin-sudtirolfreseni" +
- "uscountryestateofdelawarezzoologyfribourgwiddleksvikatsushikabee" +
- "ldengeluidyroyrvikinguidegreefriuli-v-giuliafriuli-ve-giuliafriu" +
- "li-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiul" +
- "iafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuli" +
- "afriuliveneziagiuliafriulivgiuliafrlfroganschweizfrognfrolandfro" +
- "m-akrehamnfrom-alfrom-arfrom-azfrom-capebretonamicrosoftbankatsu" +
- "yamarumorimachidafrom-codyn-o-saurlandesciencecentersciencehisto" +
- "ryfrom-ctrentin-sued-tirolfrom-dchitosetogakushimotoganewyorkshi" +
- "recifedexhibitionishiokoppegardyndns-homednsampalacefrom-dedyn-b" +
- "erlincolnfrom-flanderscientistordalfrom-gausdalfrom-hichisochild" +
- "rensgardenfrom-iafrom-idfrom-ilfrom-in-brbarreauctionflfanfshost" +
- "rowiecasertaipeigersundishakotanhktattooddaustrheimatunduhrennes" +
- "oyokotebizenakatombetsumitakagiizehimejibigawaurskog-holandingje" +
- "mnes3-ap-southeast-2ix4432-bambleborkangereportashkentatamotors3" +
- "-ap-northeast-2from-kscjohnsonfrom-kyowariasahikawafrom-lancashi" +
- "recreationfrom-mamurogawafrom-mdfrom-meeresistancefrom-mifunefro" +
- "m-mnfrom-modalenfrom-mscotlandfrom-mtnfrom-nchocolatelemarkasaok" +
- "amiminersamsclubartowhoswhokksundyndns-ipartsamsungrimstadyndns-" +
- "mailouvrehabmerfrom-ndfrom-nefrom-nh-serveblogsiteleafamilycompa" +
- "nyminamiminowafrom-njaworznotogawafrom-nminamiogunicomcastresind" +
- "evicescrapper-sitefrom-nv-infoodnetworkshoppingxn--12co0c3b4eval" +
- "leaostaticscrappingfrom-nyfrom-ohtawaramotoineppuboliviajessheim" +
- "periafrom-oketohmangolffanscrysechofunatoriginstitutelevisionish" +
- "itosashimizunaminamibosogndalowiczest-le-patronishiwakis-a-cater" +
- "erfrom-orfrom-padovaksdalfrom-pratohnoshooguyfrom-ris-a-geekaufe" +
- "nfrom-schmidtre-gauldalfrom-sdfrom-tnfrom-txn--1ck2e1barrel-of-k" +
- "nowledgeologyombolzano-altoadigeverbankarasjohkamikoaniikappuebl" +
- "ockbustermezgorzeleccoffeedbackplaneapplefrakkestadisrechtrainin" +
- "gjerstadotsuruokakegawauthordalandeportenrightathomeftpalmaserat" +
- "ibmdevelopmentateshinanomachimkentateyamaustevoll-o-g-i-navigati" +
- "onavoi234lima-cityeatselinogradultatarantoyakokonoe12hpalermomah" +
- "achijolstereviewskrakowebspace164-bananarepublic66from-utazueric" +
- "hardlillehammerfeste-ipatriafrom-val-daostavalleyfrom-vtrentin-s" +
- "uedtirolfrom-wafrom-wielunnerfrom-wvalled-aostavangerfrom-wyfros" +
- "inonefrostalowa-wolawafroyahikobeardubaiduckdnserveminecraftrent" +
- "ino-a-adigefstcgroupaviancarrierfujiiderafujikawaguchikonefujimi" +
- "nokamoenairlinemurorangemologicallcube-serversaillest-mon-blogue" +
- "urovisionthewifiat-band-campaniafujinomiyadavvenjargaulardalfuji" +
- "okayamangyshlakasamatsudoomdnsiskinkyotobetsulikes-piedmonticell" +
- "odingenfujisatoshonairportland-4-salernoboribetsuckservemp3fujis" +
- "awafujishiroishidakabiratoridefensells-for-lesservep2pfizerfujit" +
- "surugashimaniwakuratexasiafujixeroxn--1ctwolominamatakkokaminoya" +
- "maxunusualpersonfujiyoshidavvesiidattorelayfukayabeatservepicser" +
- "vequakefukuchiyamadazaifudaigodonnakaniikawatanagurafukudominich" +
- "onanbuildingripefukuis-a-greenfukumitsubishigakisarazurecontaine" +
- "rdpolicefukuokazakishiwadafukuroishikarikaturindalfukusakisofuku" +
- "shimannore-og-uvdalfukuyamagatakaharunzenfunabashiriuchinadafuna" +
- "gatakahashimamakisosakitagawafunahashikamiamakusatsumasendaisenn" +
- "angonohejis-a-guruslivinghistoryfundaciofuoiskujukuriyamansionse" +
- "rvesarcasmatartanddesignfuosskoczowindmillfurnituredumbrellancas" +
- "terfurubirafurudonostiaafurukawairtelebitballooningfusodegaurafu" +
- "ssaikitahatakahatakaishimogosenfutabayamaguchinomigawafutboldlyg" +
- "oingnowhere-for-morenakatsugawafuttsurugiminamisanrikubetsurfast" +
- "ly-terrariuminamiiselectransurlvivanovodkamisatokamachintaifun-d" +
- "nsaliaskvollfuturecmservicesevastopolefuturehostingfuturemailing" +
- "fvgfylkesbiblackbaudcdn77-securebungoonord-frontierfyresdalhands" +
- "onhangglidinghangoutsystemscloudnsewindowsharis-a-knightpointtok" +
- "aizukameokameyamatotakadahannanmokuizumodenakayamarburghannosega" +
- "wahanyuzenhapmirhareidsbergenharstadharvestcelebrationhasamarche" +
- "apigeelvinckazohasaminami-alpsharpharmacienshawaiijimarnardalhas" +
- "hbanghasudahasura-appharmacyshellaspeziahasvikazunowruzhgorodeoh" +
- "atogayaitakamoriokalmykiahatoyamazakitakatakanabeautysneshimojis" +
- "-a-landscaperhatsukaichikaiseis-a-lawyerhattfjelldalhayashimamot" +
- "obulsan-suedtirolhazuminobusellsyourhomegoodshimokawahelsinkitak" +
- "yushuaiahembygdsforbundhemneshimokitayamahemsedalhepforgeherokus" +
- "sldheroyhgtvalledaostavernhigashiagatsumagoianiahigashichichibun" +
- "gotakadancehigashihiroshimanehigashiizumozakitamihamadahigashika" +
- "gawahigashikagurasoedahigashikawakitaaikitamotosumy-gatewayhigas" +
- "hikurumeethnologyhigashimatsushimaritimodernhigashimatsuyamakita" +
- "akitadaitoigawahigashimurayamamotorcycleshimonitayanagithubuserc" +
- "ontentrentino-aadigehigashinarusembokukitanakagusukumoduminamita" +
- "nehigashinehigashiomihachimanaustdalhigashiosakasayamanakakogawa" +
- "higashishirakawamatakanezawahigashisumiyoshikawaminamiaikitashio" +
- "barahigashitsunoshiroomurahigashiurausukitaurayasudahigashiyamat" +
- "okoriyamanashifteditchyouriphdhigashiyodogawahigashiyoshinogaris" +
- "-a-liberalhiraizumisatohobby-sitehirakatashinagawahiranairtraffi" +
- "cplexus-1hirarahiratsukagawahirayaizuwakamatsubushikusakadogawah" +
- "istorichouseshimonosekikawahitachiomiyagildeskaliszhitachiotagoo" +
- "glecodespotaruis-a-libertarianhitraeumtgeradelmenhorstalbanshimo" +
- "suwalkis-a-linux-useranishiaritabashijonawatehjartdalhjelmelandh" +
- "oleckobierzyceholidayhomeiphiladelphiaareadmyblogspotrentino-alt" +
- "o-adigehomelinkitoolsztynsettlershimotsukehomelinuxn--1lqs03nhom" +
- "eofficehomesecuritymacaparecidahomesecuritypchoseiroumuencheniss" +
- "andiegohomesenseminehomeunixn--1lqs71dhondahoneywellbeingzonehon" +
- "gopocznorfolkebibleirfjordhonjyoitakaokaluganskypehornindalhorse" +
- "oullensvanguardhorteneis-a-llamarriottrentino-altoadigehospitalh" +
- "oteleshimotsumahotmailhoyangerhoylandetroitskddielddanuorrikuzen" +
- "takatajimidoriopretogliattireshinichinanhumanitieshinjournalisma" +
- "ilillesandefjordhurdalhurumajis-a-musicianhyllestadhyogoris-a-na" +
- "scarfanhyugawarahyundaiwafuneis-very-niceis-very-sweetpepperis-w" +
- "ith-thebandownloadisleofmanchesterjewelryjewishartgalleryjfkhark" +
- "ivallee-aosteroyjgorajlljmphoenixn--1qqw23ajnjcphilipsynology-di" +
- "skstationjoyentrentino-sudtiroljoyokaichibalatinogiftshintomikas" +
- "aharajpnjprshinyoshitomiokamogawajurkoshunantankhersonkosugekoto" +
- "hiradomainsureggiocalabriakotourakouhokutamakis-a-republicancerr" +
- "esearchaeologicaliforniakounosupplieshirahamatonbetsurnadalkouya" +
- "mashikekouzushimashikis-a-rockstarachowicekozagawakozakis-a-soci" +
- "alistdlibestadkozowinnershirakoelnkpnkppspdnshiranukanagawakrasn" +
- "ikahokutokigawakrasnodarkredstonekristiansandcatshiraois-a-soxfa" +
- "nkristiansundkrodsheradkrokstadelvaldaostarnbergkryminamiuonumas" +
- "sa-carrara-massacarraramassabunkyonanaoshimageandsoundandvisionk" +
- "umatorinokumejimasoykumenantokonamegatakasugais-a-studentalkunis" +
- "akis-a-teacherkassymantechnologykunitachiarailwaykunitomigusukum" +
- "amotoyamashikokuchuokunneppugliakunstsammlungkunstunddesignkuokg" +
- "rouphotographysiokureggioemiliaromagnamsskoganeis-a-techietis-a-" +
- "nurservegame-serverkurgankurobelaudiblebesbyglandroverhalla-spez" +
- "iakurogiminamiashigarakuroisoftwarendalenugkuromatsunais-a-thera" +
- "pistoiakurotakikawasakis-an-accountantshinjukumanokushirogawakus" +
- "tanais-an-actorkusupplykutchanelkutnokuzumakis-an-actresshinkami" +
- "gotoyohashimotottoris-a-painteractivegaskimitsubatamibudejjuedis" +
- "chesapeakebayernrtrentino-s-tirolkvafjordkvalsundkvamlidlugoleka" +
- "fjordkvanangenkvinesdalkvinnheradkviteseidskogkvitsoykwpspectrum" +
- "inamiyamashirokawanabelembetsukubankhmelnitskiyamarylandkzmitour" +
- "ismolancomelbournemitoyoakemiuramiyazurewebsiteshikagamiishibuka" +
- "wamiyotamanomjondalenmlbfanmonstermontrealestatefarmequipmentren" +
- "tino-suedtirolmonza-brianzaporizhzhiamonza-e-della-brianzapposhi" +
- "ratakahagitlabormonzabrianzaptokyotangotsukitahiroshimaoris-an-e" +
- "ntertainermonzaebrianzaramonzaedellabrianzamoonscalevangermopara" +
- "chutingmordoviamoriyamatsumotofukemoriyoshiminamiawajikis-bytoma" +
- "ritimekeepingmormonmouthaebaruericssonyoursidell-ogliastradermor" +
- "oyamatsunomortgagemoscowioshishikuis-certifieducatorahimeshimama" +
- "teramobilymoseushistorymosjoenmoskeneshisognemosshisuifuelverumi" +
- "nanomosviklabudhabikinokawabarthadselfipgfoggiamoteginowaniihama" +
- "tamakawajimanxn--2scrj9christiansburgroks-thisayamanobeokakudama" +
- "tsuemoviemovimientolgamovistargardmozilla-iotrentinoa-adigemtran" +
- "bymuenstermuginozawaonsenmuikamisunagawamukodairamulhouservehalf" +
- "lifestylewismillermunakatanemuncienciamuosattemupictetrentinoaad" +
- "igemurmanskmpspbarrell-of-knowledgeometre-experts-comptables3-ex" +
- "ternal-1murotorcraftrentinoalto-adigemusashimurayamatsusakahogin" +
- "ankokubunjis-foundationmusashinoharamuseetrentinoaltoadigemuseum" +
- "verenigingmusicargoboatshitaramamutsuzawamy-vigorgemy-wanggouvic" +
- "enzamyactivedirectorymyasustor-elvdalmycdn77-sslattumincommbankh" +
- "melnytskyivalleeaosteinkjerusalembroiderymydattolocalhistorymydd" +
- "nskingmydissentrentinos-tirolmydobisshikis-gonemydroboehringerik" +
- "emydshizukuishimofusaitamatsukuris-into-animeguroroshinshinotsur" +
- "gerymyeffectrentinostirolmyfirewallonieruchomoscienceandindustry" +
- "nmyfritzmyftpaccesshizuokanazawamyhome-servermyjinomykolaivanylv" +
- "enicemymailermymediapchristmasakindlecznakaiwamizawatchandclocka" +
- "shibatakasakiyosatokashikiyosemitemyokohamamatsudamypepicturesho" +
- "ujis-into-carshinshiromypetshowamyphotoshibalestrandabergamoarek" +
- "emypiagetmyiphostre-totendofinternet-dnshowtimemergencyahabahcav" +
- "uotnagareyamaizuruhrmypsxn--30rr7ymysecuritycamerakermyshopblock" +
- "shriramsterdamnserverbaniamytis-a-bookkeeperugiamytuleapiemontem" +
- "yvnchromedicaltanissettairavennakamagayachtsandoymywireisenpiszp" +
- "ittsburghofficialpiwatepixolinopizzapkolobrzegersundplanetariumi" +
- "niserversicherungplantationplantsigdalplatformshangrilangevagrig" +
- "entomologyeonggiehtavuoatnagaivuotnagaokakyotambabyendoftheinter" +
- "netflixilovecollegefantasyleaguernseyplaystationplazaplchryslerp" +
- "lumbingoplurinacionalpodhalezajskomaganepodlasiellaktyubinskiptv" +
- "eterinairealmpmnpodzonepohlpoivronpokerpokrovskomakizunokunimima" +
- "takashimarylhurstjordalshalsenpoliticartierpolitiendapolkowicepo" +
- "ltavalle-aostarostwodzislawitdkomatsushimasfjordenpomorzeszowith" +
- "googleapisa-hockeynutsiracusakataketomisatotalponpesaro-urbino-p" +
- "esarourbinopesaromasvuotnaroypordenonepornporsangerporsangugepor" +
- "sgrunnanyokoshibahikariwanumatakazakis-into-cartoonshintokushima" +
- "poznanpraxis-a-bruinsfanprdpreservationpresidioprgmrprimelhusdec" +
- "orativeartsilkomforbarsycentertainmentaxihuanhlfanhs3-fips-us-go" +
- "v-west-1principeprivatizehealthinsuranceprochowiceproductionsimp" +
- "le-urlprofesionalprogressivenneslaskerrylogisticsirdalpromombets" +
- "urgeonshalloffameldalpropertyprotectionprotonetrentinosud-tirolp" +
- "rudentialpruszkowithyoutuberspacekitagatakinoueprzeworskogptplus" +
- "gardenpupilotsienarviikamitondabayashiogamagoriziapvhagakhanamig" +
- "awapvtrentinosudtirolpwchungnamdalseidfjordyndns-remotewdyndns-s" +
- "erverdalplfinancialpusercontentoyosatoyonakagyokutoyokawapzqldqp" +
- "oniatowadaqslingquicksytestingquipelementsjcbnlqvchurcharternidy" +
- "ndns-webhopencraftoyotapartystudynathomebuiltrentinsud-tirolstuf" +
- "f-4-salestufftoread-booksnesokndalstuttgartrentinsudtirolsusakis" +
- "-into-gamessinazawasusonosuzakaniepcesuzukanmakiwiensuzukis-leet" +
- "nedalsvalbardunloppacificircleverappspotagersveiosvelvikomvuxn--" +
- "2m4a15esvizzerasvn-reposolarssonswedenswidnicasacamdvrcampinagra" +
- "ndebugattipsseljeepsongdalenviknaharimalatvuopmicrolightingswidn" +
- "ikkofuefukihaboromskogswiebodzin-butterswiftcoverswinoujsciencea" +
- "ndhistoryswissmarterthanyousynology-dsolognetrvaporcloudtrysilja" +
- "ntulansolutionslupskommunalforbundtunesomatunkongsbergturystykan" +
- "oyakumoldeloittemp-dnsomnarvikomonowtvalleedaostetuscanytushuiss" +
- "ier-justicetuvalle-daostatic-accessootuxfamilytwmailvaroyvestfol" +
- "dvestnesopotrentinosued-tirolvestre-slidrepaircraftingvollombard" +
- "ynamic-dnsor-odalvestre-totennishiawakuravestvagoyvevelstadvibo-" +
- "valentiavibovalentiavideovillasnesoddenmarkhangelskjakdnepropetr" +
- "ovskiervaapsteiermarkongsvingervinnicasadelamonedapliernewspaper" +
- "vinnytsiavirginiavirtual-userveexchangevirtualuserveftpinknx-ser" +
- "verrankoshigayanagawavirtueeldomein-vigorlicevirtuelvisakegawavi" +
- "terboknowsitallvivoldavixn--32vp30hagebostadvlaanderenvladikavka" +
- "zimierz-dolnyvladimirvlogoipioneervminternationalfirearmshiraoka" +
- "naniimihoboleslawiechoyodobashichikashukujitawaraumalopolskanlan" +
- "dyndns-picsandnessjoenissayokkaichiropractichernovtsykkylvenetoe" +
- "iheijinvestmentsamegawavolkswagentsor-varangervologdanskoninjamb" +
- "ylvolvolkenkundenvolyngdalvossevangenvotevotingvotoyonowmflabsor" +
- "foldworldworse-thandawowiwatsukiyonoticiaskoyabearalvahkihokumak" +
- "ogenglandwpcomstagingwpdevcloudwritesthisblogsytewroclawloclawek" +
- "onskowolayangrouphonefosshiojirishirifujiedawtcmisakis-an-artist" +
- "gorywtfastpanelblagrarchaeologyeongbuklugsmileangaviikadenagaham" +
- "aroyerwuozuwzmiuwajimaxn--3pxu8konsulatrobeepilepsydneyxn--42c2d" +
- "9axn--45br5cylxn--45brj9cistrondheimmobilienissedalubindalublind" +
- "esnesandvikcoromantovalle-d-aostathellexn--45q11citadeliveryggee" +
- "xn--4gbriminingxn--4it168dxn--4it797konyvelombardiamondshioyanai" +
- "zutwentexn--4pvxs4allxn--54b7fta0ccitichirurgiens-dentistes-en-f" +
- "rancexn--55qw42gxn--55qx5dxn--5js045dxn--5rtp49civilaviationissh" +
- "ingucciprianiigataishinomakinkobayashikaoirmitakeharaxn--5rtq34k" +
- "ooris-a-personaltrainerxn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--" +
- "6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264civilisationiyodogawax" +
- "n--80adxhksorocabalsan-suedtirolkuszczytnoipirangap-northeast-3x" +
- "n--80ao21axn--80aqecdr1axn--80asehdbashkiriautoscanadaeguambulan" +
- "cempresashibetsukuiitatebayashiibajddarchitecturealtorlandgcagli" +
- "aribeiraokinawashirosatochigiessensiositelekommunikationayorovno" +
- "ceanographiquemrevistanbulsan-sudtirolavagiskeu-1xn--80aswgxn--8" +
- "0augustownproviderxn--8ltr62kopervikharkovallee-d-aosteigenxn--8" +
- "pvr4uxn--8y0a063axn--90a3academiamicaaarborteaches-yogasawaracin" +
- "gxn--90aeroportalabamagasakishimabaraogakibichuoxn--90aishobarak" +
- "awagoexn--90azhytomyravendbasilicataniaveroykeniwaizumiotsukumiy" +
- "amazonawsadoes-itvedestrandiscountyokozeu-2xn--9dbhblg6dietcimdb" +
- "asketballyngenvironmentalconservationikonanporomutashinaiiyamano" +
- "uchikuhokuryugasakitcheninohekinannestadivttasvuotnakanotoddenin" +
- "omiyakonojorpelandiyomitanoppdalavangenirasakin-the-bandain-vpnc" +
- "asinorddalazioxn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aro" +
- "port-byandexn--3bst00misasaguris-an-engineeringxn--asky-iraxn--a" +
- "urskog-hland-jnbatochiokinoshimakeupowiathletajimabaridagawakuya" +
- "bukijobserveronagarahkkeravjuegoshikikonaikawachinaganoharamcoac" +
- "hampionshiphoptobamadridvagsoygardenebakkeshibechambagriculturen" +
- "nebudapest-a-la-masionionjukudoyamagazinebraskaunjargalsacebetsu" +
- "ikidsmynasushiobarackmazerbaijan-mayengerdalaheadjudaicable-mode" +
- "mocraciavocatanzaroweddingjerdrumetacentrumeteorappalmspringsake" +
- "rhcloudyclusterxn--avery-yuasakuhokkaidovre-eikerxn--b-5gaxn--b4" +
- "w605ferdxn--balsan-sdtirol-nsbsorreisahayakawakamiichikawamisato" +
- "urslzxn--bck1b9a5dre4civilizationxn--bdddj-mrabdxn--bearalvhki-y" +
- "4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5" +
- "nachikatsuuraxn--bievt-0qa2xn--bjarky-fyaotsurreyxn--bjddar-ptam" +
- "ayufuettertdasnetzxn--blt-elabourxn--bmlo-graingerxn--bod-2nativ" +
- "eamericanantiquesortlandxn--bozen-sdtirol-2obanazawaxn--brnny-wu" +
- "academy-firewall-gatewayxn--brnnysund-m8accident-investigation-a" +
- "ptibleadpagespeedmobilizerochesterimo-i-ranaamesjevuemielno-ipif" +
- "onycivilwarmanagementoyotomiyazakis-a-celticsfanxn--brum-voagatr" +
- "entoyonezawaxn--btsfjord-9zaxn--bulsan-sdtirol-nsbatsfjordnpanam" +
- "atsuzakincheonishiazaindianapolis-a-bloggerxn--c1avgxn--c2br7gxn" +
- "--c3s14misawaxn--cck2b3bauhausposts-and-telecommunicationsncfdra" +
- "ngedalillyonagoyavoues3-eu-west-1xn--cesena-forl-mcbremangerxn--" +
- "cesenaforl-i8axn--cg4bkis-lostrodawaraxn--ciqpnxn--clchc0ea0b2g2" +
- "a9gcdxn--comunicaes-v6a2oxn--correios-e-telecomunicaes-ghc29axn-" +
- "-czr694bbvacationswatch-and-clockerxn--czrs0trevisohughesolundbe" +
- "ckommunexn--czru2dxn--czrw28beneventodayonaguniversityoriikarasj" +
- "okarasuyamarshallstatebankaratevje-og-hornnes3-sa-east-1xn--d1ac" +
- "j3bentleyoshiokaracoldwarmiastagexn--d1alfaromeoxn--d1atritonxn-" +
- "-d5qv7z876claimsanfranciscofreakuneuesuranceoxn--davvenjrga-y4ax" +
- "n--djrs72d6uyxn--djty4koryokamikawanehonbetsurutaharaxn--dnna-gr" +
- "ajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4clanbibaidarmen" +
- "iaxn--eckvdtc9dxn--efvn9soruminnesotaketakatoris-an-anarchistori" +
- "calsocietyxn--efvy88haibarakitakamiizumisanofidelityxn--ehqz56nx" +
- "n--elqq16hair-surveillancexn--estv75gxn--eveni-0qa01gaxn--f6qx53" +
- "axn--fct429kosaigawaxn--fhbeiarnxn--finny-yuaxn--fiq228c5hsoundc" +
- "astronomy-routerxn--fiq64beppublishproxyzjampagefrontappanasonic" +
- "ateringebuilderschlesisches3-us-east-2xn--fiqs8southcarolinatalx" +
- "n--fiqz9southwestfalenxn--fjord-lraxn--fjq720axn--fl-ziaxn--flor" +
- "-jraxn--flw351exn--forl-cesena-fcbsowaxn--forlcesena-c8axn--fpcr" +
- "j9c3dxn--frde-grandrapidspeedpartnersnoasaitoshimayfirstockholme" +
- "strandxn--frna-woaraisaijosoyrovigotembaixadaxn--frya-hraxn--fzc" +
- "2c9e2cldmailucaniaxn--fzys8d69uvgmailxn--g2xx48clickashiharaxn--" +
- "gckr3f0fastvps-serverisignxn--gecrj9clinichiryukyuragifuchungbuk" +
- "haranzanquanpachigasakievennodesaarlandyndns-blogdnsamnangerxn--" +
- "ggaviika-8ya47hakatanortonxn--gildeskl-g0axn--givuotna-8yasakaim" +
- "inatoyookannamilanotteroyxn--gjvik-wuaxn--gk3at1exn--gls-elacaix" +
- "axn--gmq050is-not-certifiedunetbankfhappousrlxn--gmqw5axn--h-2fa" +
- "ilxn--h1aeghakodatexn--h2breg3evenespjelkavikomorotsukamiokamiki" +
- "tayamatsuris-a-patsfanxn--h2brj9c8cliniquenoharaxn--h3cuzk1digit" +
- "alxn--hbmer-xqaxn--hcesuolo-7ya35beskidyn-ip24xn--hery-iraxn--hg" +
- "ebostad-g3axn--hmmrfeasta-s4accident-prevention-webhostingxn--hn" +
- "efoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--" +
- "hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-" +
- "fyasugivingxn--io0a7is-savedxn--j1aefauskedsmokorsetagayasells-f" +
- "or-ulminamiizukamishihoronobeauxartsandcraftsarufutsunomiyawakas" +
- "aikaitakoebenhavnxn--j1amhakonexn--j6w193gxn--jlq61u9w7bestbuysh" +
- "ouses3-us-gov-west-1xn--jlster-byasuokanraxn--jrpeland-54axn--jv" +
- "r189misconfusedxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4a" +
- "xn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klt" +
- "y5xn--3ds443gxn--koluokta-7ya57hakubahccavuotnagasakikuchikuseik" +
- "arugamvikautokeinow-dnsevenassisicilyxn--kprw13dxn--kpry57dxn--k" +
- "pu716fbsbxn--12cfi8ixb8lxn--kput3is-slickhakassiaxn--krager-gyat" +
- "omitamamuraxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--k" +
- "rjohka-hwab49jdfastlylbarefootballfinanzgoraustraliaisondriobran" +
- "conagawalesundds3-ca-central-1xn--ksnes-uuaxn--kvfjord-nxaxn--kv" +
- "itsy-fyatsukanumazuryxn--kvnangen-k0axn--l-1fairwindspreadbettin" +
- "gxn--l1accentureklamborghinikolaeventspydebergxn--laheadju-7yats" +
- "ushiroxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika-52" +
- "betainaboxfusejnynysagaeroclubmedecincinnationwidealerxn--lesund" +
- "-huaxn--lgbbat1ad8jelenia-goraxn--lgrd-poacctroandinosaureitrent" +
- "insued-tirolxn--lhppi-xqaxn--linds-pramericanartrogstadxn--lns-q" +
- "lanxessrtrentinosuedtirolxn--loabt-0qaxn--lrdal-sraxn--lrenskog-" +
- "54axn--lt-liaclintonoshoesangoxn--lten-granexn--lury-iraxn--m3ch" +
- "0j3axn--mely-iraxn--merker-kuaxn--mgb2ddesrvaoxn--mgb9awbfbx-osa" +
- "sayamaxn--mgba3a3ejtromsakakinokiaxn--mgba3a4f16axn--mgba3a4fran" +
- "amizuholdingstoregontrailroadxn--mgba7c0bbn0axn--mgbaakc7dvfbxos" +
- "asebofagexn--mgbaam7a8hakuis-a-hard-workerxn--mgbab2bdxn--mgbai9" +
- "a5eva00bhzcatholicaxiasdaburxn--mgbai9azgqp6jeonnamerikawauexn--" +
- "mgbayh7gpaleoxn--mgbb9fbpobihirosakikamijimatsuuraxn--mgbbh1a71e" +
- "xn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4a87gxn--mgberp4a5d4a" +
- "rxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2fhskydivingxn--mgbqly7c" +
- "0a67fbclothingdustkagoshimalselvendrelluccapitalonewportlligatoy" +
- "otsukaidoxn--mgbqly7cvafranziskanerimaringatlantakahamalvikosaka" +
- "erodromegallupinbarsyonlinewhollandivtasvuodnakanojohanamakinoha" +
- "rautomotiveconomiasakuchinotsuchiurakawalmartatsunoceanographics" +
- "3-eu-central-1xn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bieidsvol" +
- "limanowarudaxaustinnavuotnarashinobninskaragandaukraanghkeymachi" +
- "newhampshirealtychyattorneyagawalbrzycharitydalces3-ap-southeast" +
- "-1kappchizip6xn--mgbx4cd0abbvieeexn--mix082fedorapeoplegnicahces" +
- "uoloansaskatchewanxn--mix891fedoraprojectrapaniizaxn--mjndalen-6" +
- "4axn--mk0axin-dslgbtromsojamisonxn--mk1bu44cn-northwest-1xn--mkr" +
- "u45is-uberleetrentino-stirolxn--mlatvuopmi-s4axn--mli-tlapyxn--m" +
- "lselv-iuaxn--moreke-juaxn--mori-qsakuragawaxn--mosjen-eyawaraxn-" +
- "-mot-tlaquilanciaxn--mre-og-romsdal-qqbielawalterxn--msy-ula0hak" +
- "usanagochijiwadellogliastradingxn--mtta-vrjjat-k7aflakstadaokaga" +
- "kicks-assedicngrondarxn--muost-0qaxn--mxtq1mishimasudaxn--ngbc5a" +
- "zdxn--ngbe9e0axn--ngbrxn--3e0b707exn--nit225koseis-a-photographe" +
- "rokuapphilatelyxn--nmesjevuemie-tcbalsfjordxn--nnx388axn--nodess" +
- "akurais-very-badajozxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn" +
- "--ntsq17gxn--nttery-byaeservehumourxn--nvuotna-hwaxn--nyqy26axn-" +
- "-o1achaseljordxn--o3cw4haldenxn--o3cyx2axn--od0algxn--od0aq3biel" +
- "laakesvuemieleccexn--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-" +
- "fyawatahamaxn--osyro-wuaxn--otu796dxn--p1acfeiraquarelleasingles" +
- "assaris-a-designerxn--p1ais-very-evillagexn--pbt977cnpyatigorsko" +
- "djeffersonxn--pgbs0dhlxn--porsgu-sta26fermochizukirovogradoyxn--" +
- "pssu33lxn--pssy2uxn--q9jyb4cnsanjotoyouraxn--qcka1pmckinseyxn--q" +
- "qqt11missilelxn--qxamusementdllxn--rady-iraxn--rdal-poaxn--rde-u" +
- "larvikosherbrookegawaxn--rdy-0nabaris-very-goodyearxn--rennesy-v" +
- "1axn--rhkkervju-01aferraraxn--rholt-mragowoodsidemoneyxn--rhqv96" +
- "gxn--rht27zxn--rht3dxn--rht61exn--risa-5naturalhistorymuseumcent" +
- "erxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny3" +
- "1halsaintlouis-a-anarchistoireggio-calabriaxn--rovu88bieszczadyg" +
- "eyachimataikikugawarszawashingtondclkaratsuginamikatagamilitaryu" +
- "kindianmarketingjesdalimitedray-dnstracexn--rros-granvindafjordx" +
- "n--rskog-uuaxn--rst-0naturalsciencesnaturellestorfjordxn--rsta-f" +
- "rancaiseharaxn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1fait" +
- "hruherecipescaravantaarpippulawyxn--s9brj9cntoystre-slidrettozaw" +
- "axn--sandnessjen-ogbievatmallorcadaques3-us-west-1xn--sandy-yuax" +
- "n--sdtirol-n2axn--seral-lraxn--ses554gxn--sgne-gratangenxn--skie" +
- "rv-utazassnasabaerobaticketstorjdevcloudfrontdoorxn--skjervy-v1a" +
- "xn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5naturbruksgymn" +
- "xn--slt-elabcgxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snase-n" +
- "raxn--sndre-land-0cbifukagawashtenawdev-myqnapcloudappscbgjovika" +
- "reliancexn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1a" +
- "xn--sr-odal-q1axn--sr-varanger-ggbihorologyukuhashimoichinosekig" +
- "aharaxn--srfold-byaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn-" +
- "-stjrdal-s1axn--stjrdalshalsen-sqbikedaejeonbukariyaltakasagotpa" +
- "ntheonsitextileirvikarlsoyurihonjournalistjohnishigovtcp4xn--str" +
- "e-toten-zcbilbaogashimadachicago-vipsinaapparaglidingladefinimak" +
- "anegasakiraxn--t60b56axn--tckweatherchannelxn--tiq49xqyjetztrent" +
- "ino-sud-tirolxn--tjme-hraxn--tn0agrinet-freakstpetersburgxn--tns" +
- "berg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol-rzbillustra" +
- "tionishiharaxn--trentin-sdtirol-7vbioxn--trentino-sd-tirol-c3bir" +
- "dartcenterprisesakimobetsuitainaioirasebastopologyeongnamegawaka" +
- "yamagentositecnologiaxn--trentino-sdtirol-szbirkenesoddtangenova" +
- "raholtalenishiizunazukindigenaklodzkochikushinonsenergyusuharaxn" +
- "--trentinosd-tirol-rzbirthplacexn--trentinosdtirol-7vbjarkoyusui" +
- "sserveirchattanooganordkapparisor-fronishikatakatsukindustriaxn-" +
- "-trentinsd-tirol-6vbjerkreimbarcelonagasukeu-3utilitiesquare7xn-" +
- "-trentinsdtirol-nsbjugnieznord-aurdalpha-myqnapcloud66xn--trgsta" +
- "d-r1axn--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvareservehtt" +
- "pimientakayamattelefonicarbonia-iglesias-carboniaiglesiascarboni" +
- "axn--uc0ay4axn--uist22hammarfeastafricapetownnews-stagingxn--uis" +
- "z3gxn--unjrga-rtaobaomoriguchiharagusartstreamuneustarhubssokane" +
- "yamazoexn--unup4yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbcn-no" +
- "rth-1xn--valle-d-aoste-ehbodoesntexisteingeekoshimizumakis-a-pla" +
- "yerxn--valleaoste-e7axn--valledaoste-ebbtrusteexn--vard-jraxn--v" +
- "egrshei-c0axn--vermgensberater-ctblackfridayuu2-localhostrowwlkp" +
- "mglassassinationalheritagexn--vermgensberatung-pwbloombergbauern" +
- "uorockartuzyuzawaxn--vestvgy-ixa6oxn--vg-yiabkhaziaxn--vgan-qoax" +
- "n--vgsy-qoa0jevnakershuscultureggio-emilia-romagnamsosnowiechosh" +
- "ibuyachiyodatsunanjoburgriwataraidyndns-office-on-the-weberxn--v" +
- "gu402coguchikuzenxn--vhquvarggatrentinsuedtirolxn--vler-qoaxn--v" +
- "re-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bloxcms3-us-wes" +
- "t-2xn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1collection" +
- "xn--wgbl6axn--xhq521bluedagestangeorgeorgiaxn--xkc2al3hye2axn--x" +
- "kc2dl3a5ee0hamurakamigoris-a-hunterxn--y9a3aquariumisugitokuyama" +
- "tsumaebashikshacknetrentino-sued-tirolxn--yer-znaturhistorisches" +
- "tudioxn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn--3hcrj9circustom" +
- "erxn--ystre-slidre-ujbmoattachments3-website-ap-northeast-1xn--z" +
- "bx025dxn--zf0ao64axn--zf0avxn--3oq18vl8pn36axn--zfr164bms3-websi" +
- "te-ap-southeast-1xnbayxz"
+const text = "9guacuiababia-goracleaningroks-theatree164-baltimore-og-romsdali" +
+ "payboltateshinanomachimkentateyamagrocerybnikeisenbahnatuurweten" +
+ "schappenaumburggfarmerseineastcoastaldefenceatonsbergjemnes3-ap-" +
+ "southeast-2ix4432-balsfjordd-dnsiskinkyotobetsulikes-piedmontice" +
+ "llodingenaturhistorisches3-ap-south-16-b-datainaioirasebastopolo" +
+ "gyeongnamegawakembuchikumagayagawakkanaibetsubamericanfamilydscl" +
+ "oudeitychyattorneyagawakayamadridvagsoyereplanetariumemsettsuppo" +
+ "rtashkentatamotors3-ap-northeast-2038bloxcms3-website-us-east-1b" +
+ "luedancebmoattachments3-website-us-west-1bms3-website-us-west-2b" +
+ "mwegroweibolognagasakimobetsuitaipeiheijindianmarketinglitchasel" +
+ "jeepsongdalenviknagatorockartuzyuzawabnpparibaselburgliwicebnrwe" +
+ "irbomloabathsbcatholicaxiashorokanaiebondray-dnsupdaternopilawat" +
+ "ches5ybonnishiharabookinghostfoldnavyboomlahppiacenzachpomorskie" +
+ "nishiizunazukindigenaklodzkochikushinonsenergyboschaefflerdalimi" +
+ "tedrayddnsfreebox-osascoli-picenordre-landraydnsakyotanabellunor" +
+ "d-aurdalvdalaskanittedallasalleangaviikaascolipicenoduminamidait" +
+ "omandalimoldeloittemp-dnsalangenishikatakazakindustriabostikarel" +
+ "iancebostonakijinsekikogentinglobalashovhachinohedmarkariyamelbo" +
+ "urnebotanicalgardenishikatsuragit-reposalondonetskarlsoybotanicg" +
+ "ardenishikawazukamisunagawabotanybouncemerckmsdnipropetrovskjerv" +
+ "oyagebounty-fullensakerrypropertiesaltdalinkyard-cloudnsaludrive" +
+ "fsnillfjordrobaknoluoktagajobojindustriesteamfamberkeleyboutique" +
+ "becheltenham-radio-openairbusantiquest-a-la-maisondre-landroidru" +
+ "dunsalvadordalibabalestrandabergamo-siemensncfdupontariodejaneir" +
+ "odoybozen-sudtirolivornobozen-suedtirolombardynaliaskimitsubatam" +
+ "ibugattiffanynysadoes-itvedestrandurbanamexnetlifyinfinitintuitj" +
+ "omemorialomzaporizhzhegurinuyamashinatsukigatakasakitchenishimer" +
+ "abplacedogawarabikomaezakirunorddalondrinamsskoganeinvestmentsal" +
+ "zburgloboavistaprintelligencebrandywinevalleybrasiliabrindisiben" +
+ "ikinderoybristoloseyouriparliamentjxfinitybritishcolumbialowieza" +
+ "ganquanpachigasakievennodesabaerobaticketsamegawabroadcastlecler" +
+ "chernihivgubananarepublicasadelamonedatingjesdalavangenayorovnoc" +
+ "eanographics3-fips-us-gov-west-1broadwaybroke-itkmaxxjavald-aost" +
+ "aplesamnangerbrokerbronnoysundurhamburglogowfarmsteadweberbrothe" +
+ "rmesaverdealstahaugesunderseaportsinfolldalorenskogloppenzaolbia" +
+ "-tempio-olbiatempioolbialystokkepnogataijinzais-a-candidatebrows" +
+ "ersafetymarketsampalacebrumunddalotenkawabrunelasticbeanstalkarm" +
+ "oybrusselsamsclubartowhalinglugmbhartipscbgminakamichiharabruxel" +
+ "lesamsungmodalenishinomiyashironobryansklepparmattelefonicarboni" +
+ "a-iglesias-carboniaiglesiascarboniabrynewjerseybuskerudinewportl" +
+ "ligatksatxn--0trq7p7nnishinoomotegobuzentsujiiebuzzlgmxn--11b4c3" +
+ "dynathomebuiltmparochernigovernmentoyosatoyokawabwhoswhokksundyn" +
+ "dns-at-homedepotenzamamidsundyndns-at-workisboringrimstadyndns-b" +
+ "logdnsandnessjoenishinoshimatsuurabzhitomirumalatvuopmicrolighti" +
+ "ngripebzzparsandoycolognexus-2colonialwilliamsburgrongausdalucan" +
+ "iacoloradoplateaudiocolumbusheycommunecommunitycomoarekecomparem" +
+ "arkerryhotelsaobernardocompute-1computerhistoryofscience-fiction" +
+ "comsecuritytacticsaogoncartiercondoshichinohealth-carereforminam" +
+ "iiselectraniandriabarlettatraniandriaconferenceconstructionconsu" +
+ "ladonnakamagayahabaghdadyndns-wikirkenesaotomembersapporoconsult" +
+ "anthropologyconsultingrossetouchihayaakasakawaharacontactranoyco" +
+ "ntagematsubaracontemporaryarteducationalchikugodaddyn-vpndnsarde" +
+ "gnaroycontractorskenconventureshinodebalancertificationcookingch" +
+ "annelsdvrdnsfor-better-thanawatchandclockashiharacooluccapitalon" +
+ "ewspapercooperativano-frankivskolegallocus-3copenhagencyclopedic" +
+ "hiryukyuragifuchungbukharaumalborkarpaczeladzwiiheyakumoduminami" +
+ "echizenishiokoppegardyndns-freeboxosloftranakanojoetsuwanouchiku" +
+ "jogaszkolajollamericanexpressexycorsicafederationcorvettemasekas" +
+ "hiwaracosenzakopanecosidnshome-webserverdalucernecostumedio-camp" +
+ "idano-mediocampidanomediocouchpotatofriesardiniacouncilukowildli" +
+ "fedorainfraclouderacouponsarluroycq-acranbrookuwanalyticsarpsbor" +
+ "groundhandlingroznycrdyndns-workshoppingrpasadenarashinocreditca" +
+ "rdyndns1creditunioncremonashgabadaddjaguarqhachirogatakanezawacr" +
+ "ewilliamhillutskashiwazakiyosatokamachintaifun-dnsdojolstercrick" +
+ "etrzyncrimeast-kazakhstanangercrotonecrownipassagensarufutsunomi" +
+ "yawakasaikaitakoelncrsvpassenger-associationcruisesasayamacrypto" +
+ "nomichigangwoncuisinellair-traffic-controlleyculturalcentertainm" +
+ "entransportecuneocupcakecuritibahcavuotnagaivuotnagaokakyotambab" +
+ "yeniwaizumiotsukumiyamazonawsagaeroclubmedecincinnationwidealeri" +
+ "mo-i-ranaamesjevuemielno-ipifonychitachinakagawashtenawdev-myqna" +
+ "pcloudcontrolledekagaminogiftsandvikcoromantovalle-d-aostathelle" +
+ "cxn--12c1fe0bradescorporationcymrussiacyonabaruminamiizukamiokam" +
+ "eokameyamatotakadacyoutheworkpccwinbanzaicloudcontrolappleborkda" +
+ "lpha-myqnapcloud66ferrerotikagoshimalselvendrelluzernfetsundynse" +
+ "rvebbsaskatchewanfguitarsavannahgafhvalerfidoomdnstracefieldynuc" +
+ "onnectransurluxembourgruefigueresinstagingujohanamakinoharafilat" +
+ "eliafilegear-audnedalnfilegear-deatnurembergulenfilegear-gbizfil" +
+ "egear-iefilegear-jpmorganfilegear-sgunmaoris-a-financialadvisor-" +
+ "aurdalvivanovoldafilminamiminowafinalfinancefineartsaves-the-wha" +
+ "lessandria-trani-barletta-andriatranibarlettaandriafinlandynv6fi" +
+ "nnoyfirebaseapplinzis-a-geekasukabedzin-berlindasdaburfirenzefir" +
+ "estonefirmdalegokasells-itravelchannelfishingoldpoint2thisamitsu" +
+ "kefitjarvodkafjordynvpnplus-4fitnessettlementravelersinsurancefj" +
+ "alerflesberguovdageaidnulminamioguni5flickragerogersavonarusawaf" +
+ "lightsaxoflirfloginlinefloraflorencefloridattorelayfloripaderbor" +
+ "nfloristanohatakahamalvikasumigaurawa-mazowszextraspace-to-renta" +
+ "lstomakomaibaraflorokunohealthcareerschoenbrunnflowerschokokeksc" +
+ "hokoladenfltrdyroyrvikinguidegreeflynnhosting-clusterflynnhubarc" +
+ "laycards3-sa-east-1fndfor-ourfor-someeresistancefor-theaterforex" +
+ "rothadanorthwesternmutualforgotdnscholarshipschoolforli-cesena-f" +
+ "orlicesenaforlikescandyn53forsaleikangerforsandasuologoipatriafo" +
+ "rtalfortmissoulancashirecreationfortworthadselfipaviancarrdforum" +
+ "zfosneschulefotaris-a-greenfoxfordebianfozorafredrikstadtvschwar" +
+ "zgwangjuniperfreeddnsgeekgalaxyfreedesktopocznore-og-uvdalfreema" +
+ "sonryfreesitevadsoccertmgretakahashimamakirovogradoyfreetlschwei" +
+ "zfreiburgushikamifuranorth-kazakhstanfreightrentin-sud-tirolfres" +
+ "eniuscountryestateofdelawarezzoologyfribourgwiddleitungsenfriuli" +
+ "-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-giuliafri" +
+ "uli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriulive-giuliafriu" +
+ "livegiuliafriulivenezia-giuliafriuliveneziagiuliafriulivgiuliafr" +
+ "lfrogansciencecentersciencehistoryfrognfrolandfrom-akrehamnfrom-" +
+ "alfrom-arfrom-azimuthdfcbankasuyanagawafrom-capebretonamicrosoft" +
+ "bankaszubyfrom-codyn-o-saurlandescientistordalfrom-ctrentin-sudt" +
+ "irolfrom-dchitosetogitsuldalottefrom-dedyn-berlincolnfrom-flande" +
+ "rscjohnsonfrom-gaulardalfrom-hichisochildrensgardenfrom-iafrom-i" +
+ "dfrom-ilfrom-in-brbarclays3-us-east-2from-kscotlandfrom-kyowaria" +
+ "sahikawawindmillfrom-lancasterfrom-mamurogawafrom-mdfrom-meethno" +
+ "logyfrom-mifunefrom-mnfrom-mochizukiryuohdattowebcampinashikimin" +
+ "ohostre-totendofinternet-dnsaliasiafrom-mscrapper-sitefrom-mtnfr" +
+ "om-nctulanciafrom-ndfrom-nefrom-nh-serveblogsiteleafamilycompany" +
+ "minamisanrikubetsurfastly-terrariuminamimakis-a-designerfrom-nja" +
+ "worznoticiasnesoddenmarkhangelskjakdnepropetrovskiervaapsteierma" +
+ "rkatowicefrom-nminamitanefrom-nvalled-aostavangerfrom-nyfrom-ohk" +
+ "urafrom-oketogurafrom-orfrom-padovaksdalfrom-pratohmangolffanscr" +
+ "appingxn--12co0c3b4evalleaostaticscrysechocolatelemarkaruizawafr" +
+ "om-ris-a-gurulvikatsushikabeeldengeluidfrom-schmidtre-gauldalfro" +
+ "m-sdfrom-tnfrom-txn--1ck2e1barefootballfinanzgoraustraliaisondri" +
+ "obranconagawalbrzycharitysfjordds3-eu-west-1from-utazuerichardli" +
+ "llehammerfeste-ipfizerfrom-val-daostavalleyfrom-vtrentin-sued-ti" +
+ "rolfrom-wafrom-wielunnerfrom-wvalledaostavernfrom-wyfrosinonefro" +
+ "stalowa-wolawafroyahooguyfstcgroupgfoggiafujiiderafujikawaguchik" +
+ "onefujiminokamoenairlinedre-eikerfujinomiyadavvenjargap-northeas" +
+ "t-3fujiokayamangyshlakasamatsudovre-eikerfujisatoshonairportland" +
+ "-4-salernoboribetsuckserveminecraftrentin-suedtirolfujisawafujis" +
+ "hiroishidakabiratoridefensells-for-lesservemp3fujitsurugashimani" +
+ "wakuratexaskoyabearalvahkihokumakogengerdalcesurancechirealmpmnf" +
+ "ujixeroxn--1ctwolominamataobaomoriguchiharagusartservep2pharmaci" +
+ "enservepicservequakefujiyoshidavvesiidatsunanjoburgfukayabeatser" +
+ "vesarcasmatartanddesignfukuchiyamadazaifudaigodontexistmein-iser" +
+ "vebeerfukudominichofunatoriginstitutelevisionishitosashimizunami" +
+ "namibosogndalottokonamegatakatsukis-a-catererfukuis-a-hard-worke" +
+ "rservicesevastopolefukumitsubishigakisarazurecontainerdpolicefuk" +
+ "uokazakishiwadafukuroishikarikaturindalfukusakisofukushimannorfo" +
+ "lkebibleirfjordfukuyamagatakahatakaishimogosenfunabashiriuchinad" +
+ "afunagatakamatsukawafunahashikamiamakusatsumasendaisennangonohej" +
+ "is-a-hunterfundaciofuoiskujukuriyamansionsevenassisicilyfuosskoc" +
+ "zowindowsewinnersharis-a-knightpointtohobby-sitefurnitureggio-ca" +
+ "labriafurubirafurudonostiaafurukawairtelebitballooningfusodegaur" +
+ "afussaikisosakitagawafutabayamaguchinomigawafutboldlygoingnowher" +
+ "e-for-morenakatombetsumitakagiizefuttsurugimperiafuturecmsharpha" +
+ "rmacyshawaiijimarnardalfuturehostingfuturemailingfvgfylkesbiblac" +
+ "kbaudcdn77-securebungoonord-odalwaysdatabaseballangenoamishirasa" +
+ "tochigiessensiositelekommunikationionjukudoyamaintenanceofyresda" +
+ "lhangglidinghangoutsystemscloudyclusterhannanmokuizumodellinghan" +
+ "nosegawahanyuzenhapmirhareidsbergenharstadharvestcelebrationhasa" +
+ "marburghasaminami-alpshimojis-a-liberalhashbanghasudahasura-apph" +
+ "dhasvikatsuyamarylandhatogayaizuwakamatsubushikusakadogawahatoya" +
+ "mazakitakamiizumisanofidelityhatsukaichikaiseis-a-libertarianhat" +
+ "tfjelldalhayashimamotobungotakadapliernewmexicoalhazuminobusells" +
+ "yourhomegoodshimokawahelsinkitakatakaokalmykiahembygdsforbundhem" +
+ "neshimokitayamahemsedalhepforgeherokussldheroyhgtvallee-aosteroy" +
+ "higashiagatsumagoianiahigashichichibunkyonanaoshimageandsoundand" +
+ "visionhigashihiroshimanehigashiizumozakitakyushuaiahigashikagawa" +
+ "higashikagurasoedahigashikawakitaaikitamihamadahigashikurumeguro" +
+ "roshimonitayanagithubusercontentrentino-a-adigehigashimatsushima" +
+ "rcheapigeelvinckaufenhigashimatsuyamakitaakitadaitoigawahigashim" +
+ "urayamamotorcycleshimonosekikawahigashinarusembokukitamotosumy-g" +
+ "atewayhigashinehigashiomihachimanaustdalhigashiosakasayamanakako" +
+ "gawahigashishirakawamatakarazukaluganskypehigashisumiyoshikawami" +
+ "namiaikitanakagusukumodenakayamaritimodernhigashitsunoshiroomura" +
+ "higashiurausukitashiobarahigashiyamatokoriyamanashifteditchyouri" +
+ "philadelphiaareadmyblogspotrentino-aadigehigashiyodogawahigashiy" +
+ "oshinogaris-a-linux-useranishiaritabashijonawatehiraizumisatohno" +
+ "shoooshikamaishimodatehirakatashinagawahiranairtrafficplexus-1hi" +
+ "rarahiratsukagawahirayakagehistorichouseshimosuwalkis-a-llamarri" +
+ "ottrentino-alto-adigehitachiomiyagildeskaliszhitachiotagooglecod" +
+ "espotaruis-a-musicianhitraeumtgeradelmenhorstalbanshimotsukehjar" +
+ "tdalhjelmelandholeckobierzyceholidayhomeiphilatelyhomelinkitools" +
+ "ztynsettlershimotsumahomelinuxn--1lqs03nhomeofficehomesecurityma" +
+ "caparecidahomesecuritypchonanbulsan-suedtirolouvreisenishiwakis-" +
+ "a-celticsfanissandiegohomesenseminehomeunixn--1lqs71dhondahoneyw" +
+ "ellbeingzonehongoppdalhonjyoitakasagotembaixadahornindalhorseoul" +
+ "lensvanguardhorteneis-a-nascarfanhospitalhoteleshinichinanhotmai" +
+ "lhoyangerhoylandetroitskautokeinotteroyhumanitieshinjournalismai" +
+ "lillesandefjordhurdalhurumajis-a-nurservegame-serverhyllestadhyo" +
+ "goris-a-painteractivegaskvollhyugawarahyundaiwafuneis-very-sweet" +
+ "pepperis-with-thebandoisleofmanchesterjewelryjewishartgalleryjfk" +
+ "fhappounzenjgorajlljmphonefosshioyanaizuslivinghistoryjnjcphoeni" +
+ "xn--1qqw23ajoyentrentino-stiroljoyokaichibalatinoipirangamvikhak" +
+ "assiajpnjprshirahamatonbetsurnadaljurkoseis-a-photographerokuapp" +
+ "hilipsyno-dshinjukumanowtvallee-d-aosteigenkosherbrookegawakoshi" +
+ "mizumakiyosunndalkoshunantankharkovalleedaostekosugekotohiradoma" +
+ "insureggioemiliaromagnamsosnowiechoseiroumuenchenissayokkaichiro" +
+ "practichernivtsiciliakotourakouhokutamakizunokunimimatakatoris-a" +
+ "-playerkounosupplieshiranukamitsuekouyamashikekouzushimashikis-a" +
+ "-republicancerresearchaeologicaliforniakozagawakozakis-a-rocksta" +
+ "rachowicekozowioshiraois-a-socialistdlibestadkpnkppspdnshiraokam" +
+ "ogawakrasnikahokutokashikis-a-soxfankrasnodarkredstonekristiansa" +
+ "ndcatshiratakahagitlaborkristiansundkrodsheradkrokstadelvaldaost" +
+ "arnbergkryminamiuonumassa-carrara-massacarraramassabusinessebykl" +
+ "ecznagasukekumatorinokumejimasoykumenantokigawakunisakis-a-stude" +
+ "ntalkunitachiarailwaykunitomigusukumamotoyamashikokuchuokunneppu" +
+ "eblockbustermezkunstsammlungkunstunddesignkuokgroupictetrentino-" +
+ "sud-tirolkurehabmerkurgankurobelaudibleasingleshishikuis-a-teach" +
+ "erkassyncloudkurogiminamiashigarakuroisoftwarendalenugkuromatsun" +
+ "ais-a-techietis-a-patsfankurotakikawasakis-a-therapistoiakushiro" +
+ "gawakustanais-an-accountantshinkamigotoyohashimototalkusupplykut" +
+ "chanelkutnokuzumakis-an-actorkvafjordkvalsundkvamlidlugolekadena" +
+ "gahamaroygardenebakkeshibechambagriculturennebudejjuedischesapea" +
+ "kebayernuorochesterkvanangenkvinesdalkvinnheradkviteseidskogkvit" +
+ "soykwpspectruminamiyamashirokawanabelembetsukubankhersonkzmisugi" +
+ "tokorozawamitourismolangevagrigentomologyeonggiehtavuoatnadexete" +
+ "rmitoyoakemiuramiyazurewebsiteshikagamiishibukawamiyotamanomjond" +
+ "alenmlbfanmombetsurgeonshalloffamelhusdecorativeartshisuifuelver" +
+ "uminanomonstermontrealestatefarmequipmentrentino-sued-tirolmonza" +
+ "-brianzapposhitaramamonza-e-della-brianzaptokuyamatsumotofukemon" +
+ "zabrianzaramonzaebrianzamonzaedellabrianzamoonscalevangermoparac" +
+ "hutingmordoviamoriyamatsunomoriyoshiminamiawajikis-an-artistgory" +
+ "mormonmouthagakhanamigawamoroyamatsusakahoginankokubunjis-an-eng" +
+ "ineeringmortgagemoscowitdkhmelnitskiyamarylhurstjordalshalsenmos" +
+ "eushistorymosjoenmoskeneshizukuishimofusaitamatsukuris-an-entert" +
+ "ainermosshizuokanagawamosvikhmelnytskyivanylvenicemoteginowaniih" +
+ "amatamakawajimanxn--2scrj9choshibuyachtsanfranciscofreakunemuror" +
+ "angeiseiyoichippubetsubetsugarugbydgoszczecinemagentositecnologi" +
+ "amoviemovimientokyotangotsukitahatakamoriokakegawamovistargardmo" +
+ "zilla-iotrentino-suedtirolmtranbymuenstermuginozawaonsenmuikamis" +
+ "atokaizukamikitayamatsuris-bytomaritimekeepingmukodairamulhouser" +
+ "vehalflifestylewismillermunakatanemuncienciamuosattemupicturesho" +
+ "ujis-certifieducatorahimeshimamateramobaramurmanskhplaystationmu" +
+ "rotorcraftrentinoa-adigemusashimurayamatsushigemusashinoharamuse" +
+ "etrentinoaadigemuseumverenigingmusicargoboatshowamutsuzawamy-vig" +
+ "orgemy-wanggouvichoyodobashichikashukujitawaravennaharimalopolsk" +
+ "anlandyndns-homednsangomyactivedirectorymyasustor-elvdalmycdn77-" +
+ "sslattumincomcastresindevicenzaporizhzhiamydattolocalhistorymydd" +
+ "nskingmydissentrentinoalto-adigemydobisshikis-foundationmydroboe" +
+ "hringerikemydshowtimemergencyahikobeardubaiduckdnshriramsterdamn" +
+ "serverbaniamyeffectrentinoaltoadigemyfirewallonieruchomosciencea" +
+ "ndindustrynmyfritzmyftpaccessienarutolgamyhome-servermyjinomykol" +
+ "aivaomymailermymediapchristiansburgriwataraidyndns-ipartis-a-che" +
+ "farsundyndns-mailowiczest-le-patronissedalplfinancialpuserconten" +
+ "toyotapartsanjotoyotomiyazakis-a-conservativegarsheis-a-cpaduals" +
+ "tackhero-networkinggroupartymyokohamamatsudamypepiemontemypetsig" +
+ "dalmyphotoshibalena-devicesilklabudhabikinokawabarthaebaruericss" +
+ "onyoursidell-ogliastradermypiagetmyiphostrodawaramypsxn--30rr7ym" +
+ "ysecuritycamerakermyshopblocksimple-urlmytis-a-bookkeeperugiamyt" +
+ "uleapilotsirdalmyvnchristmasakindlefrakkestadyndns-office-on-the" +
+ "-webhopencraftoyotsukaidomywireitrentinos-tirolpiszpittsburghoff" +
+ "icialpiwatepixolinopizzapknx-serversailleshirakofuefukihaboromsk" +
+ "ogplantationplantsjcbnlplatformshangrilanslupskolobrzegersundpla" +
+ "zaplcube-serversicherungplumbingoplurinacionalpodhalezajskomagan" +
+ "epodlasiellaktyubinskiptveterinaireadthedocscappgafannefrankfurt" +
+ "rentinosud-tirolpodzonepohlpoivronpokerpokrovskomakiyosemitepoli" +
+ "ticarrierpolitiendapolkowicepoltavalle-aostarostwodzislawithgoog" +
+ "leapisa-hockeynutsiracusakatakkoebenhavnpomorzeszowithyoutubersp" +
+ "acekitagatamayufuettertdasnetzponpesaro-urbino-pesarourbinopesar" +
+ "omasvuotnaritakurashikis-goneponypordenonepornporsangerporsangug" +
+ "eporsgrunnanyokoshibahikariwanumatakinouepoznanpraxis-a-bruinsfa" +
+ "nprdpreservationpresidioprgmrprimeloyalistorageprincipeprivatize" +
+ "healthinsuranceprochowiceproductionslzprofesionalprogressivennes" +
+ "laskerrylogisticsnoasaitoshimayfirstockholmestrandpromomahachijo" +
+ "invilleksvikomatsushimasfjordenpropertyprotectionprotonetrentino" +
+ "sudtirolprudentialpruszkowiwatsukiyonotairestaurantrentinosued-t" +
+ "irolprvcyberlevagangaviikanonjis-into-animeiwamarshallstatebanka" +
+ "zoprzeworskogptplusgardenpupimientaketomisatomobellevuelosangele" +
+ "sjabbottrentinostirolpvhagebostadpvtrentinosuedtirolpwchromedici" +
+ "nakaiwamizawassamukawataricoharuovatoyourapzqldqponiatowadaqslin" +
+ "gquicksytestingquipelementsokananiimihoboleslawiechryslerqvchung" +
+ "namdalseidfjordyndns-picsannanisshingucciprianiigataishinomakink" +
+ "obayashikaoirmitakeharasuzakanazawasuzukaneyamazoesuzukis-into-g" +
+ "amessinazawasvalbardunloppacificircleverappsseljordyndns-webhost" +
+ "ingroks-thisayamanobeokakudamatsuesveiosvelvikomonowruzhgorodeos" +
+ "vizzerasvn-reposomnarviikamishihoronobeauxartsandcraftsolarssons" +
+ "wedenswidnicartoonartdecologiaswidnikkokaminokawanishiaizubanges" +
+ "wiebodzin-butterswiftcoverswinoujscienceandhistoryswissmartertha" +
+ "nyousrcfastpanelblagrarchaeologyeongbuk0emmafann-arboretumbriama" +
+ "llamaceiobbcg120001wwwebspace12hpalermoliserniabogadodgehirnrt3l" +
+ "3p0rtarnobrzegyptian4tarumizusawabruzzoologicalvinklein-addramme" +
+ "nuernbergdyniaetnabudapest-a-la-masion-webredirectmedicaltanisse" +
+ "ttachikawafflecellclaims3-ap-northeast-1337synology-diskstations" +
+ "ynology-dsootunesor-varangertunkomorotsukaminoyamaxunjargaturyst" +
+ "ykanmakiwientuscanytushuissier-justicetuvalle-daostatic-accessor" +
+ "foldtuxfamilytwmailvestfoldvestnesorocabalsan-sudtirollagdenesna" +
+ "aseralingenkainanaejrietisalatinabenonichurcharternidyndns-remot" +
+ "ewdyndns-serverisigniyodogawavestre-slidrepbodynamic-dnsorreisah" +
+ "ayakawakamiichikawamisatottoris-into-carshinshirovestre-totennis" +
+ "hiawakuravestvagoyvevelstadvibo-valentiavibovalentiavideovillaso" +
+ "rtlandvinnicasacamdvrcampinagrandebuilderschlesischesoruminiserv" +
+ "ervinnytsiavirginiavirtual-userveexchangevirtualservervirtualuse" +
+ "rveftpioneervirtueeldomein-vigorlicevirtuelvisakegawaviterboknow" +
+ "sitallvivolkenkundenvixn--32vp30haibarakitahiroshimapartmentshel" +
+ "laspeziavlaanderenvladikavkazimierz-dolnyvladimirvlogintoyonezaw" +
+ "avminnesotaketakayamasudavologdanskomvuxn--2m4a15evolvolkswagent" +
+ "soundcastronomy-routervolyngdalvoorloperauniterois-leetnedalvoss" +
+ "evangenvotevotingvotoyonownextdirectrentoyonakagyokutoyakokonoew" +
+ "orldworse-thandawowloclawekongsbergwpcomstagingwpdevcloudwritest" +
+ "hisblogsytewroclawmflabsouthcarolinarvikommunalforbundwtcmintern" +
+ "ationalfirearmshisognewtfastvps-serveronakasatsunairguardiannaka" +
+ "domarinebraskauniversitydalaheadjudaicable-modemocraciawuozustka" +
+ "nnamilanotogawawzmiuwajimaxn--3pxu8kongsvingerxn--42c2d9axn--45b" +
+ "r5cylxn--45brj9cistrondheimmobilienxn--45q11citadeliveryggeexn--" +
+ "4gbriminingxn--4it168dxn--4it797koninjambylxn--4pvxs4allxn--54b7" +
+ "fta0ccitichernovtsymantechnologyxn--55qw42gxn--55qx5dxn--5js045d" +
+ "xn--5rtp49civilaviationxn--5rtq34konskowolayangrouphotographysio" +
+ "xn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6q" +
+ "q986b3xlxn--7t0a264civilisationxn--80adxhksouthwestfalenxn--80ao" +
+ "21axn--80aqecdr1axn--80asehdbarrell-of-knowledgeologyonagoyautom" +
+ "otiveconomiasakuchinotsuchiurakawalesundevelopmentattoobninskara" +
+ "coldwarmiastagebizenakanotoddenavuotnaples3-eu-west-2xn--80aswgx" +
+ "n--80augustownproviderxn--8ltr62konsulatrobeepilepsykkylvenetoei" +
+ "dsvollxn--8pvr4utwentexn--8y0a063axn--90a3academiamicaaarborteac" +
+ "hes-yogasawaracingxn--90aeroportalabamagasakishimabaraogakibichu" +
+ "oxn--90aishobarakawagoexn--90azhytomyravendbarsycenterprisesakik" +
+ "ugawalmartaxihuanflfanfshostrowwlkpmgjovikaragandautoscanadaegua" +
+ "mbulancehimejibmdgcagliaribeiraokinawashirosatochiokinoshimaizur" +
+ "uhreviewskrakoweddingjerstadotsuruokakamigaharaurskog-holandingj" +
+ "erdrumetacentrumeteorappalmaserati234lima-cityeatselinogradultat" +
+ "arantours3-ap-southeast-1kappchizip6xn--9dbhblg6dietcimdbarsyonl" +
+ "inewhampshirealtysnes3-us-gov-west-1xn--9dbq2axn--9et52uxn--9krt" +
+ "00axn--andy-iraxn--aroport-byandexn--3bst00misakis-an-actresshin" +
+ "shinotsurgeryxn--asky-iraxn--aurskog-hland-jnbashkiriaveroykengl" +
+ "andiscountyolasitempresashibetsukuiitatebayashiibajddarchitectur" +
+ "ealtorlandiscourses3-eu-west-3utilitiesquare7xn--avery-yuasakuho" +
+ "kkaidownloadxn--b-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbsowaxn-" +
+ "-bck1b9a5dre4civilizationxn--bdddj-mrabdxn--bearalvhki-y4axn--be" +
+ "rlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikat" +
+ "suuraxn--bievt-0qa2xn--bjarky-fyaotsurreyxn--bjddar-ptargets-itr" +
+ "evisohughesopotrentinsud-tirolxn--blt-elabourxn--bmlo-graingerxn" +
+ "--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuacademy-fire" +
+ "wall-gatewayxn--brnnysund-m8accident-investigation-aptibleadpage" +
+ "st-mon-blogueurovision-rancherkasydneyxn--brum-voagatritonxn--bt" +
+ "sfjord-9zaxn--bulsan-sdtirol-nsbasicservercelliguriavocatanzarow" +
+ "edeployombolzano-altoadigemrevistanbulsan-sudtirolavagiskeu-1xn-" +
+ "-c1avgxn--c2br7gxn--c3s14misasaguris-an-anarchistoricalsocietyxn" +
+ "--cck2b3basilicataniavoues3-external-1xn--cesena-forl-mcbremange" +
+ "rxn--cesenaforl-i8axn--cg4bkis-lostrolekamakurazakiwakunigamihar" +
+ "unusualpersonxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a2o" +
+ "xn--correios-e-telecomunicaes-ghc29axn--czr694basketballyngenvir" +
+ "onmentalconservationrenderxn--czrs0troandinosaurepaircraftingvol" +
+ "lombardiamondsor-odalxn--czru2dxn--czrw28batodayonagunicommbanka" +
+ "rasjohkamikoaniikappuboliviajessheimetlifeinsuranceu-4xn--d1acj3" +
+ "batsfjordishakotanhktcp4xn--d1alfaromeoxn--d1atrogstadxn--d5qv7z" +
+ "876civilwarmanagementoystre-slidrettozawaxn--davvenjrga-y4axn--d" +
+ "jrs72d6uyxn--djty4konyvelolxn--dnna-grajewolterskluwerxn--drbak-" +
+ "wuaxn--dyry-iraxn--e1a4clanbibaidarmeniaxn--eckvdtc9dxn--efvn9sp" +
+ "eedpartnersolognexn--efvy88hair-surveillancexn--ehqz56nxn--elqq1" +
+ "6hakatanortonxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429ko" +
+ "oris-a-personaltrainerxn--fhbeiarnxn--finny-yuaxn--fiq228c5hspje" +
+ "lkavikommunexn--fiq64bauhausposts-and-telecommunicationswatch-an" +
+ "d-clockerxn--fiqs8spreadbettingxn--fiqz9spydebergxn--fjord-lraxn" +
+ "--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-cesena-fcbsrl" +
+ "xn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandrapidsrtrentinsudti" +
+ "rolxn--frna-woaraisaijosoyrovigotpantheonsitextileirvikopervikha" +
+ "rkivalleeaosteinkjerusalembroideryxn--frya-hraxn--fzc2c9e2cldmai" +
+ "lubindalublindesnesannohelpagesanokarumaifashionxn--fzys8d69uvgm" +
+ "ailxn--g2xx48clickasaokamiminersantabarbaraxn--gckr3f0fauskedsmo" +
+ "korsetagayasells-for-ufcfanxn--gecrj9clinichirurgiens-dentistes-" +
+ "en-francexn--ggaviika-8ya47hakodatexn--gildeskl-g0axn--givuotna-" +
+ "8yasakaiminatoyookaniepcexn--gjvik-wuaxn--gk3at1exn--gls-elacaix" +
+ "axn--gmq050is-not-certifiedugit-pagespeedmobilizeroticahcesuoloa" +
+ "nshintomikasaharaxn--gmqw5axn--h-2failxn--h1aeghakonexn--h2breg3" +
+ "evenesrvaporcloudxn--h2brj9c8cliniquenoharaxn--h3cuzk1digitalxn-" +
+ "-hbmer-xqaxn--hcesuolo-7ya35beneventogakushimotoganewhollandisre" +
+ "chtrainingladefinimakanegasakiraxaustevoll-o-g-i-naval-d-aosta-v" +
+ "alleyokosukanumazuryokotebinagisobetsumidatlantic66xn--hery-irax" +
+ "n--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accident-prevent" +
+ "ion-riopretobamaceratabuseating-organicbcn-north-1xn--hnefoss-q1" +
+ "axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-" +
+ "q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-fyasugiv" +
+ "ingxn--io0a7is-savedunetbankazunow-dnshinyoshitomiokamitondabaya" +
+ "shiogamagoriziaxn--j1aefbsbxn--12cfi8ixb8luxuryxn--j1amhakubahcc" +
+ "avuotnagarahkkeravjuegoshikikuchikuseikarugalsacexn--j6w193gxn--" +
+ "jlq61u9w7bentleyoriikarasjokarasuyamarumorimachidaxn--jlster-bya" +
+ "suokanoyaltakashimarugame-hostrowieclintonoshoesantacruzsantafed" +
+ "jejuifminamifuranoxn--jrpeland-54axn--jvr189misawaxn--k7yn95exn-" +
+ "-karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn-" +
+ "-klt787dxn--kltp7dxn--kltx9axn--klty5xn--3ds443gxn--koluokta-7ya" +
+ "57hakuis-a-landscaperxn--kprw13dxn--kpry57dxn--kpu716fbx-osassar" +
+ "is-a-doctorayxn--kput3is-slickddielddanuorrikuzentakatajimidoris" +
+ "sagamiharaxn--krager-gyatomitamamuraxn--kranghke-b0axn--krdshera" +
+ "d-m8axn--krehamn-dxaxn--krjohka-hwab49jdfastlylbarcelonagareyama" +
+ "keupowiat-band-campaniaustinnavigationavoizumizakibigawajudygarl" +
+ "anddnslivelanddnss3-ca-central-1xn--ksnes-uuaxn--kvfjord-nxaxn--" +
+ "kvitsy-fyatsukanraxn--kvnangen-k0axn--l-1fairwindstorfjordxn--l1" +
+ "accentureklamborghinikolaeventstorjdevcloudfunctionshiojirishiri" +
+ "fujiedaxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcvr32dxn--ldi" +
+ "ngen-q1axn--leagaviika-52beppublishproxyzgorzeleccoffeedbackplan" +
+ "eapplicationcloudaccesscambridgestonewyorkshirecifedexhibitionhl" +
+ "fanhs3-us-west-1xn--lesund-huaxn--lgbbat1ad8jelenia-goraxn--lgrd" +
+ "-poacctromsakakinokiaxn--lhppi-xqaxn--linds-pramericanartromsoja" +
+ "misonxn--lns-qlanxesstpetersburgxn--loabt-0qaxn--lrdal-sraxn--lr" +
+ "enskog-54axn--lt-liaclothingdustdataitogliattiresantamariakexn--" +
+ "lten-granexn--lury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--" +
+ "mgb2ddestreamuneuesolundbeckomforbarreauctionredumbrella-speziau" +
+ "strheimatunduhrennesoyokozebinordreisa-geek12xn--mgb9awbfbxosaud" +
+ "axn--mgba3a3ejtrusteexn--mgba3a4f16axn--mgba3a4franamizuholdings" +
+ "tudioxn--mgba7c0bbn0axn--mgbaakc7dvfedorapeoplegnicanonoichinomi" +
+ "yakexn--mgbaam7a8hakusanagochijiwadellogliastradingxn--mgbab2bdx" +
+ "n--mgbai9a5eva00beskidyn-ip24xn--mgbai9azgqp6jeonnamerikawauexn-" +
+ "-mgbayh7gpaleoxn--mgbb9fbpobihirosakikamijimatsuzakis-uberleetre" +
+ "ntino-altoadigexn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mg" +
+ "berp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--" +
+ "mgbpl2fhskydivingxn--mgbqly7c0a67fbcn-northwest-1xn--mgbqly7cvaf" +
+ "ranziskanerimaringatlantakaharuxn--mgbt3dhdxn--mgbtf8flatangerxn" +
+ "--mgbtx2bestbuyshouses3-us-west-2xn--mgbx4cd0abbvieeexn--mix082f" +
+ "edoraprojectrapaniizaxn--mix891feiraquarelleaseeklogesauheradynn" +
+ "sasebofageorgeorgiaxn--mjndalen-64axn--mk0axin-dslgbtrvareserveh" +
+ "ttpinkmpspbargainstantcloudfrontdoorhcloudiscoveryomitanoceanogr" +
+ "aphiqueu-3xn--mk1bu44cngrondarxn--mkru45is-very-badajozxn--mlatv" +
+ "uopmi-s4axn--mli-tlapyxn--mlselv-iuaxn--moreke-juaxn--mori-qsaku" +
+ "ragawaxn--mosjen-eyawaraxn--mot-tlaquilancomeldalxn--mre-og-roms" +
+ "dal-qqbetainaboxfusejnyoshiokanzakiyokawaraxn--msy-ula0haldenxn-" +
+ "-mtta-vrjjat-k7aflakstadaokagakicks-assnasaarlandxn--muost-0qaxn" +
+ "--mxtq1misconfusedxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3e0b707exn" +
+ "--nit225koryokamikawanehonbetsurutaharaxn--nmesjevuemie-tcbalsan" +
+ "-suedtirolkuszczytnombresciaxn--nnx388axn--nodessakurais-very-ev" +
+ "illagexn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--n" +
+ "ttery-byaeservehumourxn--nvuotna-hwaxn--nyqy26axn--o1achattanoog" +
+ "anordlandxn--o3cw4halsaintlouis-a-anarchistoireggio-emilia-romag" +
+ "nakatsugawaxn--o3cyx2axn--od0algxn--od0aq3bhzcaseihicampobassoci" +
+ "atest-iservecounterstrikeverbankaratevje-og-hornnes3-website-ap-" +
+ "northeast-1xn--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawat" +
+ "ahamaxn--osyro-wuaxn--otu796dxn--p1acfermobilyxn--p1ais-very-goo" +
+ "dyearxn--pbt977cnpyatigorskodjeffersonxn--pgbs0dhlxn--porsgu-sta" +
+ "26ferraraxn--pssu33lxn--pssy2uxn--q9jyb4cnsantoandreamhostersanu" +
+ "kis-a-cubicle-slavellinodearthachiojiyaitakanabeautysvardoesntex" +
+ "isteingeekashibatakasugais-a-democratozsdeltaiwanairforcebetsuik" +
+ "idsmynasushiobarackmazerbaijan-mayendoftheinternetflixilovecolle" +
+ "gefantasyleaguernseyxn--qcka1pmckinseyxn--qqqt11mishimatsumaebas" +
+ "hikshacknetrentino-sudtirolxn--qxamusementdllxn--rady-iraxn--rda" +
+ "l-poaxn--rde-ularvikosaigawaxn--rdy-0nabaris-very-nicexn--rennes" +
+ "y-v1axn--rhkkervju-01aferrarivnexn--rholt-mragowoodsidemoneyxn--" +
+ "rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeamericananti" +
+ "questudynamisches-dnsolutionsokndalxn--risr-iraxn--rland-uuaxn--" +
+ "rlingen-mxaxn--rmskog-byaxn--rny31hammarfeastafricapetownnews-st" +
+ "agingxn--rovu88bieigersundivtasvuodnakamuratajirittogojomedizinh" +
+ "istorisches3-website-ap-southeast-1xn--rros-granvindafjordxn--rs" +
+ "kog-uuaxn--rst-0naturalhistorymuseumcenterxn--rsta-francaisehara" +
+ "xn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithruherecipes" +
+ "caravantaarpippulawyxn--s9brj9cntrani-andria-barletta-trani-andr" +
+ "iaxn--sandnessjen-ogbielawalterxn--sandy-yuaxn--sdtirol-n2axn--s" +
+ "eral-lraxn--ses554gxn--sgne-gratangenxn--skierv-utazastuff-4-sal" +
+ "exn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat" +
+ "-5naturalsciencesnaturellestufftoread-booksnesomaxn--slt-elabcie" +
+ "szynxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snase-nraxn--sndr" +
+ "e-land-0cbielladbrokes3-website-ap-southeast-2xn--snes-poaxn--sn" +
+ "sa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-vara" +
+ "nger-ggbieszczadygeyachiyodaejeonbuklugsmilebtimnetzjampagefront" +
+ "appanamatta-varjjatjeldsundivttasvuotnakaniikawatanaguraxn--srfo" +
+ "ld-byaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stjrdal-s1ax" +
+ "n--stjrdalshalsen-sqbievathletajimabaridagawakuyabukijobserverra" +
+ "nkoshigayachimataikikonaikawachinaganoharamcoachampionshiphoptob" +
+ "ishimagazineat-urlillyukiiyamanouchikuhokuryugasakitaurayasudaxn" +
+ "--stre-toten-zcbifukagawarszawashingtondclkaratsuginamikatagamil" +
+ "itaryukuhashimoichinosekigaharaxn--t60b56axn--tckweatherchannelx" +
+ "n--tiq49xqyjetztrentino-s-tirolxn--tjme-hraxn--tn0agrinet-freaks" +
+ "tuttgartrentinsued-tirolxn--tnsberg-q1axn--tor131oxn--trany-yuax" +
+ "n--trentin-sd-tirol-rzbigv-infoodnetworkangerxn--trentin-sdtirol" +
+ "-7vbihorologyurihonjournalistjohnikonanporohtawaramotoineppuglia" +
+ "xn--trentino-sd-tirol-c3bikedagestangeometre-experts-comptables3" +
+ "-website-eu-west-1xn--trentino-sdtirol-szbilbaogashimadachicago-" +
+ "vipsinaappanasonicasertairanzaninohekinannestadiyusuharaxn--tren" +
+ "tinosd-tirol-rzbillustrationthewifiatmallorcadaques3-website-sa-" +
+ "east-1xn--trentinosdtirol-7vbiomutashinain-the-bandain-vpncasino" +
+ "rdkapparaglidinglassassinationalheritagexn--trentinsd-tirol-6vbi" +
+ "rdartcenterprisecloudappspotagerxn--trentinsdtirol-nsbirkenesodd" +
+ "tangenovaraholtaleninomiyakonojorpelandnparisor-fronirasakincheo" +
+ "nishiazaindianapolis-a-bloggerxn--trgstad-r1axn--trna-woaxn--tro" +
+ "ms-zuaxn--tysvr-vraxn--uc0atvarggatrentinsuedtirolxn--uc0ay4axn-" +
+ "-uist22hamurakamigoris-a-lawyerxn--uisz3gxn--unjrga-rtargivestby" +
+ "temarkosakaerodromegallupinbarrel-of-knowledgemologicallazioddau" +
+ "thordalandeportenrightathomeftpalmspringsakereportatsunobiraukra" +
+ "anghkeymachineustarhubss3-eu-central-1xn--unup4yxn--uuwu58axn--v" +
+ "ads-jraxn--valle-aoste-ebbtrysiljanxn--valle-d-aoste-ehbodollsus" +
+ "akis-into-cartoonshintokushimaxn--valleaoste-e7axn--valledaoste-" +
+ "ebbvacationsusonoxn--vard-jraxn--vegrshei-c0axn--vermgensberater" +
+ "-ctbirthplacexn--vermgensberatung-pwbjarkoyusuisserveircateringe" +
+ "buildingleezexn--vestvgy-ixa6oxn--vg-yiabkhaziaxn--vgan-qoaxn--v" +
+ "gsy-qoa0jevnakershuscultureggiocalabriaxn--vgu402coguchikuzenxn-" +
+ "-vhquvaroyxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla" +
+ "5gxn--vuq861bjerkreimbamblebesbyglandroverhallaakesvuemielecceu-" +
+ "2xn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1collectionxn" +
+ "--wgbl6axn--xhq521bjugnieznord-frontierxn--xkc2al3hye2axn--xkc2d" +
+ "l3a5ee0handsonxn--y9a3aquariumissilelxn--yer-znaturbruksgymnxn--" +
+ "yfro4i67oxn--ygarden-p1axn--ygbi2ammxn--3hcrj9circustomerxn--yst" +
+ "re-slidre-ujblackfridayuu2-localhostoregontrailroadrangedalimano" +
+ "warudaxn--zbx025dxn--zf0ao64axn--zf0avxn--3oq18vl8pn36axn--zfr16" +
+ "4bloombergbauernishigovtjmaxxxboxenapponazure-mobilexnbayxz"
// nodes is the list of nodes. Each node is represented as a uint32, which
// encodes the node's children, wildcard bit and node type (as an index into
@@ -519,8757 +522,8860 @@ const text = "0emmafann-arboretumbriamallamaceiobirabogadodgeiseiyoichippubets"
// [15 bits] text index
// [ 6 bits] text length
var nodes = [...]uint32{
- 0x331903,
- 0x3ac504,
- 0x2dc686,
- 0x257e03,
- 0x257e06,
- 0x390646,
- 0x3b1283,
- 0x2e1dc4,
- 0x200947,
- 0x2dc2c8,
- 0x1a00742,
- 0x1f47007,
- 0x37a1c9,
- 0x2cd70a,
- 0x2cd70b,
- 0x22c4c3,
- 0x2cf7c6,
- 0x234085,
- 0x2200a42,
- 0x3b8584,
- 0x260503,
- 0x280745,
- 0x2609682,
- 0x32cd43,
- 0x2b321c4,
- 0x209685,
- 0x2e00102,
- 0x274d0e,
+ 0x32bd43,
+ 0x3ac204,
+ 0x2e8b86,
+ 0x2fe083,
+ 0x2fe086,
+ 0x389b46,
+ 0x3b0ec3,
+ 0x31f984,
+ 0x309b87,
+ 0x2e87c8,
+ 0x1a000c2,
+ 0x1f3dd07,
+ 0x375009,
+ 0x2c444a,
+ 0x2c444b,
+ 0x22d043,
+ 0x2342c5,
+ 0x2206702,
+ 0x2483c4,
+ 0x25ba43,
+ 0x331e45,
+ 0x260dcc2,
+ 0x32eec3,
+ 0x2a1e744,
+ 0x30b345,
+ 0x2e240c2,
+ 0x26dc8e,
0x253f83,
- 0x3c6846,
- 0x3204e82,
- 0x303d47,
- 0x236e06,
- 0x360b9c2,
- 0x28d683,
- 0x28d684,
- 0x20b9c6,
- 0x22b1c8,
- 0x2947c6,
- 0x314d04,
- 0x3a00602,
- 0x3539c9,
- 0x225847,
- 0x208646,
- 0x3777c9,
- 0x352388,
- 0x335184,
- 0x33dd46,
- 0x23c906,
- 0x3e00582,
- 0x25d34f,
- 0x20e18e,
- 0x221944,
- 0x219505,
- 0x331805,
- 0x2f0149,
- 0x240589,
- 0x20c1c7,
- 0x363186,
- 0x207443,
- 0x4206fc2,
- 0x2240c3,
- 0x24e84a,
- 0x4603643,
- 0x27d905,
- 0x306242,
- 0x39ebc9,
- 0x4e00282,
- 0x22a184,
- 0x33be06,
- 0x32d945,
- 0x3717c4,
- 0x5612cc4,
- 0x229a43,
- 0x232e04,
- 0x5a04442,
- 0x385544,
- 0x5e8b584,
- 0x2056ca,
- 0x6201782,
- 0x33a9c7,
- 0x38f4c8,
- 0x7203782,
- 0x26cb87,
- 0x22c844,
- 0x2cb807,
- 0x22c845,
- 0x34c6c7,
- 0x27e586,
- 0x32cac4,
- 0x32cac5,
- 0x285507,
- 0x8207682,
- 0x334183,
- 0x21aa02,
- 0x38e2c3,
- 0x8613b82,
- 0x21ad85,
- 0x8a03c82,
- 0x2f4bc4,
- 0x284945,
- 0x221887,
- 0x28188e,
- 0x2874c4,
- 0x2348c4,
- 0x226c43,
- 0x3c2709,
- 0x226c4b,
- 0x24a1c8,
- 0x377588,
- 0x258f08,
- 0x2183c8,
- 0x334fca,
- 0x34c5c7,
- 0x2d0286,
- 0x8e4ee42,
- 0x3c8e43,
- 0x3ca983,
- 0x3501c4,
- 0x3b12c3,
- 0x3c8e83,
- 0x1742942,
- 0x9200f02,
- 0x28cc45,
- 0x29fbc6,
- 0x24bf44,
- 0x353087,
- 0x239d86,
- 0x2c3204,
- 0x36fdc7,
- 0x200f03,
- 0x96d45c2,
- 0x9b29902,
- 0x9e299c2,
- 0x2299c6,
- 0xa200882,
- 0x2b6385,
- 0x343e83,
- 0x3b6844,
- 0x2f60c4,
- 0x2f60c5,
- 0x3bc883,
- 0xa64dd03,
- 0xab447c2,
- 0x2992c5,
- 0x3cb84b,
- 0x27cf8b,
- 0x274a84,
- 0x3ccc49,
- 0x3d3504,
- 0xae0a302,
- 0x3d8d83,
- 0x20a303,
- 0xb206ac2,
- 0x306b03,
- 0x20a58a,
- 0xb600302,
- 0x2e44c5,
- 0x2e7d0a,
- 0x3840c4,
- 0x20b183,
- 0x20cfc4,
- 0x2101c3,
- 0x2101c4,
- 0x2101c7,
- 0x210d05,
- 0x211dc6,
- 0x212086,
- 0x213603,
- 0x215a48,
- 0x20c643,
- 0xba004c2,
- 0x248688,
- 0x20eecb,
- 0x21d1c8,
- 0x21db86,
- 0x21eb07,
- 0x223408,
- 0xca064c2,
- 0xce1c002,
- 0x33d088,
- 0x30c0c7,
- 0x28e105,
- 0x35c208,
- 0xd227508,
- 0x36fec3,
- 0x228644,
- 0x350202,
- 0xd629c82,
- 0xda012c2,
- 0xe22a242,
- 0x22a243,
- 0xe605382,
- 0x32b383,
- 0x239444,
- 0x208e43,
- 0x286784,
- 0x208e4b,
- 0x205543,
- 0x2efb06,
- 0x205544,
- 0x2c0e4e,
- 0x24ad45,
- 0x3c6948,
- 0x389a47,
- 0x389a4a,
- 0x226e03,
- 0x3ac307,
- 0x226e05,
- 0x22fc84,
- 0x2574c6,
- 0x2574c7,
- 0x2ed284,
- 0x2f8907,
- 0x30bb04,
- 0x205384,
- 0x205386,
- 0x270ec4,
- 0x337fc6,
- 0x20e9c3,
- 0x35bfc8,
- 0x385288,
- 0x234883,
- 0x306ac3,
- 0x34dc84,
- 0x35e803,
- 0xea0ecc2,
- 0xee99502,
- 0x210483,
- 0x246bc6,
- 0x354a83,
- 0x230344,
- 0xf250202,
- 0x250203,
- 0x34cec3,
- 0x213fc2,
- 0xf600d82,
- 0x2ce686,
- 0x2353c7,
- 0x38f947,
- 0x39c105,
- 0x3c1204,
- 0x29cf45,
- 0x297d07,
- 0x2eb549,
- 0x2f10c6,
- 0x2f5dc8,
- 0x306c46,
- 0xfa01542,
- 0x328148,
- 0x30a606,
- 0x354585,
- 0x324c07,
- 0x326884,
- 0x326885,
- 0x280384,
- 0x280388,
- 0xfe14742,
- 0x10203f02,
- 0x354286,
- 0x203f08,
- 0x361bc5,
- 0x362906,
- 0x368888,
- 0x389188,
- 0x1060e585,
- 0x10a73304,
- 0x37c687,
- 0x10e98482,
- 0x11392ac2,
- 0x12604502,
- 0x33bf05,
- 0x2b00c5,
- 0x27d506,
- 0x2f5307,
- 0x22ab07,
- 0x12e2cc43,
- 0x275cc7,
- 0x2e5dc8,
- 0x1c62cc49,
- 0x274ec7,
- 0x22dc47,
- 0x22e508,
- 0x22ed06,
- 0x22f786,
- 0x23070c,
- 0x23148a,
- 0x231e07,
- 0x233f4b,
- 0x235207,
- 0x23520e,
- 0x1ca36184,
- 0x236384,
- 0x239307,
- 0x262087,
- 0x23f5c6,
- 0x23f5c7,
- 0x23fa07,
- 0x1ce33782,
- 0x240c86,
- 0x240c8a,
- 0x24148b,
- 0x2437c7,
- 0x244245,
- 0x245303,
- 0x245986,
- 0x245987,
- 0x22b6c3,
- 0x1d203b82,
- 0x24620a,
- 0x1d77b682,
- 0x1da4a0c2,
- 0x1de48382,
- 0x1e236f02,
- 0x249605,
- 0x249d84,
- 0x1ea01482,
- 0x3855c5,
- 0x233343,
- 0x2a4185,
- 0x2182c4,
- 0x20ce84,
- 0x237946,
- 0x3cf286,
- 0x2b2483,
- 0x3a8844,
- 0x378343,
- 0x1fa046c2,
- 0x21ee84,
- 0x37cc06,
- 0x21ee85,
- 0x2635c6,
- 0x324d08,
- 0x237b44,
- 0x310208,
- 0x22af85,
- 0x2491c8,
- 0x2c7d46,
- 0x326c87,
- 0x293484,
- 0x20e93486,
- 0x275fc3,
- 0x3a04c3,
- 0x325c08,
- 0x334dc4,
- 0x368ec7,
- 0x21202a46,
- 0x2e5309,
- 0x334688,
- 0x259588,
- 0x26d584,
- 0x337443,
- 0x233a42,
- 0x216979c2,
- 0x21a12b82,
- 0x34ae43,
- 0x21e00a82,
- 0x22b644,
- 0x24f606,
- 0x200a85,
- 0x242d83,
- 0x22cf84,
- 0x2c0107,
- 0x27e1c3,
- 0x2bc288,
- 0x20d085,
- 0x25ef83,
- 0x2848c5,
- 0x284a04,
- 0x30a306,
- 0x216344,
- 0x21df86,
- 0x2217c6,
- 0x33c5c4,
- 0x2355c3,
- 0x22212f02,
- 0x226346c5,
- 0x201903,
- 0x22e01502,
- 0x205b03,
- 0x217d45,
- 0x232ec3,
- 0x23232ec9,
- 0x236043c2,
- 0x23e03102,
- 0x298e05,
- 0x214646,
- 0x3bfc46,
- 0x339908,
- 0x33990b,
- 0x3bd14b,
- 0x30c445,
- 0x2d4d09,
- 0x1601702,
- 0x2d9788,
- 0x20f484,
- 0x24601d42,
- 0x3c2d43,
- 0x24e62246,
- 0x354908,
- 0x252003c2,
- 0x226548,
- 0x25610ac2,
- 0x286fca,
- 0x25adb343,
- 0x2637a806,
- 0x27c7c8,
- 0x3167c8,
- 0x2e1a86,
- 0x388607,
- 0x25d547,
- 0x23c48a,
- 0x384144,
- 0x366f84,
- 0x379b09,
- 0x267abf05,
- 0x20e386,
- 0x200143,
- 0x2785c4,
- 0x26a04b04,
- 0x204b07,
- 0x23a5c7,
- 0x296f04,
- 0x26a105,
- 0x27d5c8,
- 0x24a687,
- 0x24ab07,
- 0x26e1cd02,
- 0x287384,
- 0x358b08,
- 0x24b9c4,
- 0x24f1c4,
- 0x24f805,
- 0x24f947,
- 0x27250989,
- 0x250484,
- 0x251109,
- 0x251348,
- 0x251f04,
- 0x251f07,
- 0x27652683,
- 0x252807,
- 0x160d342,
- 0x16bce82,
- 0x253986,
- 0x253fc7,
- 0x255144,
- 0x256ac7,
- 0x258107,
- 0x258843,
- 0x233bc2,
- 0x21f582,
- 0x276703,
- 0x276704,
- 0x27670b,
- 0x377688,
- 0x25e944,
- 0x25ab05,
- 0x25c6c7,
- 0x25df45,
- 0x2e334a,
- 0x25e883,
- 0x27a0c542,
- 0x20c544,
- 0x261e49,
- 0x266843,
- 0x266907,
- 0x3afa09,
- 0x299ac8,
- 0x238443,
- 0x28aec7,
- 0x28b689,
- 0x216fc3,
- 0x292804,
- 0x293a89,
- 0x295d86,
- 0x221b83,
- 0x200a02,
- 0x236a03,
- 0x2bcc87,
- 0x236a05,
- 0x38b206,
- 0x23e404,
- 0x309185,
- 0x32bc03,
- 0x213846,
- 0x201282,
- 0x24dcc4,
- 0x27e09542,
- 0x28363c03,
- 0x28600b42,
- 0x24d083,
- 0x212504,
- 0x212507,
- 0x3d3806,
- 0x204ac2,
- 0x28a04a82,
- 0x324f04,
- 0x28e47842,
- 0x29202382,
- 0x2bec44,
- 0x2bec45,
- 0x202385,
- 0x36d146,
- 0x2960a942,
- 0x3b8d05,
- 0x3cc045,
- 0x20a943,
- 0x212686,
- 0x212fc5,
- 0x229942,
- 0x361805,
- 0x229944,
- 0x237a83,
- 0x237cc3,
- 0x29a0ae82,
- 0x2332c7,
- 0x255444,
- 0x255449,
- 0x2784c4,
- 0x2998c3,
- 0x3a3ac8,
- 0x29eaff44,
- 0x2aff46,
- 0x2b6003,
- 0x25b343,
- 0x215e43,
- 0x2a2f3402,
- 0x3063c2,
- 0x2a6040c2,
- 0x345a88,
- 0x38ce08,
- 0x3b18c6,
- 0x28e645,
- 0x28e2c5,
- 0x206907,
- 0x229505,
- 0x24cc42,
- 0x2aaa3242,
- 0x2ae03ac2,
- 0x238888,
- 0x328085,
- 0x2fbe44,
- 0x263505,
- 0x24b547,
- 0x292384,
- 0x246102,
- 0x2b203142,
- 0x359244,
- 0x223d47,
- 0x29a347,
- 0x34c684,
- 0x3c9603,
- 0x2347c4,
- 0x2347c8,
- 0x22fac6,
- 0x25734a,
- 0x22f284,
- 0x2a1d48,
- 0x2961c4,
- 0x21ec06,
- 0x2a3204,
- 0x33c206,
- 0x255709,
- 0x237187,
- 0x226b03,
- 0x2b65fec2,
- 0x26d803,
- 0x2783c2,
- 0x2ba06d82,
- 0x2fa306,
- 0x383148,
- 0x2b2387,
- 0x228b89,
- 0x2a1909,
- 0x2b41c5,
- 0x2b51c9,
- 0x2b5985,
- 0x2b5ac9,
- 0x2b6ec5,
- 0x2b7dc8,
- 0x2be3d3c4,
- 0x2c258987,
- 0x22e003,
- 0x2b7fc7,
- 0x22e006,
- 0x2b83c7,
- 0x2af1c5,
- 0x2c2903,
- 0x2c631242,
- 0x20b3c4,
- 0x2ca540c2,
- 0x2ce58e82,
- 0x350cc6,
- 0x38f445,
- 0x2bb407,
- 0x27f003,
- 0x201c04,
- 0x20c9c3,
- 0x33cdc3,
- 0x2d205142,
- 0x2da01d02,
- 0x390744,
- 0x233b83,
- 0x248ec5,
- 0x2de0d282,
- 0x2e6082c2,
- 0x2daec6,
- 0x334f04,
- 0x323884,
- 0x32388a,
- 0x2ee01582,
- 0x26b0c3,
- 0x21920a,
- 0x21cc88,
- 0x2f21f504,
- 0x2019c3,
- 0x208f43,
- 0x278b09,
- 0x224d49,
- 0x2c0206,
- 0x2f613303,
- 0x213305,
- 0x31990d,
- 0x21ce46,
- 0x31c14b,
- 0x2fa00802,
- 0x32ba88,
- 0x3220bc02,
- 0x326008c2,
- 0x320745,
- 0x32a00bc2,
- 0x297447,
- 0x2b9f07,
- 0x213183,
- 0x32f488,
- 0x32e02282,
- 0x2aba04,
- 0x3343c3,
- 0x38c205,
- 0x241b86,
- 0x21d704,
- 0x306a83,
- 0x2bdb43,
- 0x33214bc2,
- 0x30c3c4,
- 0x3b9dc5,
- 0x2bc887,
- 0x287f83,
- 0x2bd543,
- 0x161a982,
- 0x2bd603,
- 0x2bdac3,
- 0x3360d382,
- 0x33b104,
- 0x3cf486,
- 0x3a1803,
- 0x2be243,
- 0x33a4e2c2,
- 0x24e2c8,
- 0x2bf204,
- 0x33b6c6,
- 0x260e07,
- 0x27aec6,
- 0x2b8b04,
- 0x41605e02,
- 0x22decb,
- 0x3008ce,
- 0x2151cf,
- 0x366883,
- 0x41e5f482,
- 0x1643dc2,
- 0x42207542,
- 0x29f583,
- 0x2562c3,
- 0x21a146,
- 0x2eb7c6,
- 0x336447,
- 0x309b84,
- 0x42614782,
- 0x42a0d582,
- 0x2c3745,
- 0x2f9787,
- 0x3a3146,
- 0x42e4a002,
- 0x3cbf84,
- 0x2c3883,
- 0x43253a82,
- 0x437767c3,
- 0x2c4604,
- 0x2c9ec9,
- 0x43ad1d42,
- 0x43e16d02,
- 0x2888c5,
- 0x442d2e02,
- 0x44600682,
- 0x365e87,
- 0x210609,
- 0x37a44b,
- 0x25d305,
- 0x293e89,
- 0x3952c6,
- 0x2d3107,
- 0x44a060c4,
- 0x2cbb49,
- 0x37f007,
- 0x2114c7,
- 0x226683,
- 0x2beac6,
- 0x322907,
- 0x246e43,
- 0x2a0886,
- 0x4520a842,
- 0x45633142,
- 0x216143,
- 0x211605,
- 0x227807,
- 0x27d9c6,
- 0x236985,
- 0x2514c4,
- 0x2ae085,
- 0x392404,
- 0x45a06742,
- 0x377c47,
- 0x2d0d44,
- 0x224c44,
- 0x224c4d,
- 0x2e0009,
- 0x30ccc8,
- 0x25c044,
- 0x34d145,
- 0x3a9547,
- 0x20f2c4,
- 0x26b087,
- 0x323f05,
- 0x45e16c44,
- 0x2bdc85,
- 0x207b44,
- 0x2924c6,
- 0x2f5105,
- 0x462213c2,
- 0x286803,
- 0x391084,
- 0x391085,
- 0x350746,
- 0x236ac5,
- 0x2383c4,
- 0x25cd03,
- 0x220446,
- 0x228205,
- 0x22a705,
- 0x2f5204,
- 0x2f3943,
- 0x3051cc,
- 0x466bc982,
- 0x46a1ef42,
- 0x46e08242,
- 0x223643,
- 0x223644,
- 0x4720d642,
- 0x350e88,
- 0x38b2c5,
- 0x23eec4,
- 0x2471c6,
- 0x47608ec2,
- 0x47a0e482,
- 0x47e000c2,
- 0x29e605,
- 0x33c486,
- 0x221504,
- 0x20bf06,
- 0x33a786,
- 0x230183,
- 0x483492ca,
- 0x278405,
- 0x24e803,
- 0x220246,
- 0x3a91c9,
- 0x220247,
- 0x2b7788,
- 0x352249,
- 0x27ee48,
- 0x3c5306,
- 0x2e5e83,
- 0x48675d42,
- 0x3a1cc8,
- 0x48a51402,
- 0x48e02bc2,
- 0x228c03,
- 0x2eb3c5,
- 0x2a6184,
- 0x2d3249,
- 0x2eeb44,
- 0x21c688,
- 0x2092c3,
- 0x496092c4,
- 0x214688,
- 0x224b87,
- 0x49a18ec2,
- 0x23d382,
- 0x331785,
- 0x267bc9,
- 0x20e403,
- 0x28de84,
- 0x3198c4,
- 0x213cc3,
- 0x28e88a,
- 0x49e7f742,
- 0x4a20b202,
- 0x2d4543,
- 0x393fc3,
- 0x1600082,
- 0x200083,
- 0x4a61c0c2,
- 0x4aa08302,
- 0x4ae1af04,
- 0x21af06,
- 0x2db106,
- 0x242384,
- 0x286103,
- 0x3b4cc3,
- 0x280ec3,
- 0x241806,
- 0x3a4c45,
- 0x2d46c7,
- 0x2d7e85,
- 0x2d9346,
- 0x2da288,
- 0x2da486,
- 0x269c04,
- 0x2a778b,
- 0x2de103,
- 0x2de105,
- 0x2de588,
- 0x2055c2,
- 0x366182,
- 0x4b249682,
- 0x4b602c42,
- 0x208583,
- 0x4ba728c2,
- 0x2728c3,
- 0x2deec3,
- 0x4c220982,
- 0x4c6e3e86,
- 0x25ddc6,
- 0x4cae3fc2,
- 0x4ce0a342,
- 0x4d237d02,
- 0x4d69f502,
- 0x4da1c8c2,
- 0x4de032c2,
- 0x21e6c3,
- 0x209745,
- 0x34d2c6,
- 0x4e221904,
- 0x37ca0a,
- 0x3a5a06,
- 0x256644,
- 0x206cc3,
- 0x4ee047c2,
- 0x2015c2,
- 0x222a03,
- 0x4f21c103,
- 0x366707,
- 0x2f5007,
- 0x50a76807,
- 0x3c7bc7,
- 0x2272c3,
- 0x38b64a,
- 0x315dc4,
- 0x22ac44,
- 0x22ac4a,
- 0x23aa45,
- 0x50e0e342,
- 0x256a83,
- 0x51201a02,
- 0x252043,
- 0x26d7c3,
- 0x51a01bc2,
- 0x275c44,
- 0x206b04,
- 0x335905,
- 0x31ce45,
- 0x2b4f06,
- 0x31b546,
- 0x51e4ffc2,
- 0x52202fc2,
- 0x382745,
- 0x25dad2,
- 0x364506,
- 0x275283,
- 0x29ec46,
- 0x310845,
- 0x160a5c2,
- 0x5a60ab02,
- 0x3709c3,
- 0x20ab03,
- 0x29aec3,
- 0x5aa09342,
- 0x23f543,
- 0x5ae07482,
- 0x200843,
- 0x33b148,
- 0x27d543,
- 0x2b4046,
- 0x32e207,
- 0x320186,
- 0x32018b,
- 0x256587,
- 0x312dc4,
- 0x5b606342,
- 0x38b145,
- 0x5ba0f0c3,
- 0x22c403,
- 0x33d505,
- 0x38b543,
- 0x5bf8b546,
- 0x2d990a,
- 0x242003,
- 0x20b8c4,
- 0x203e46,
- 0x286486,
- 0x5c201ac3,
- 0x201ac7,
- 0x278a07,
- 0x2a9ac5,
- 0x367c46,
- 0x228243,
- 0x5ee128c3,
- 0x5f208702,
- 0x22f344,
- 0x35bdc9,
- 0x3c1685,
- 0x229604,
- 0x35f748,
- 0x273a05,
- 0x5f7075c5,
- 0x245409,
- 0x208703,
- 0x24a044,
- 0x5fa036c2,
- 0x2149c3,
- 0x5fe8ad42,
- 0x28ad46,
- 0x162b802,
- 0x6029d842,
- 0x29e508,
- 0x2ac6c3,
- 0x2bdbc7,
- 0x320405,
- 0x2ca0c5,
- 0x2ca0cb,
- 0x2ed886,
- 0x2ca2c6,
- 0x2ee0c6,
- 0x28ce84,
- 0x2e0c06,
- 0x606ecd88,
- 0x251883,
- 0x256103,
- 0x276ac4,
- 0x316d84,
- 0x3196c7,
- 0x2f27c5,
- 0x60af2902,
- 0x60e0a482,
- 0x61617c45,
- 0x2f5944,
- 0x2f594b,
- 0x2f5fc8,
- 0x259c44,
- 0x61a4e302,
- 0x61e24a42,
- 0x337f43,
- 0x2f75c4,
- 0x2f7885,
- 0x2f8ac7,
- 0x2fb984,
- 0x34c784,
- 0x62213282,
- 0x37e8c9,
- 0x2fd185,
- 0x25d5c5,
- 0x2fdd05,
- 0x62614903,
- 0x2ffc84,
- 0x2ffc8b,
- 0x300184,
- 0x30044b,
- 0x300d85,
- 0x21530a,
- 0x301548,
- 0x30174a,
- 0x301fc3,
- 0x301fca,
- 0x62e4ef82,
- 0x632031c2,
- 0x63600e83,
- 0x63b04542,
- 0x304543,
- 0x63f7a982,
- 0x64344602,
- 0x305f84,
- 0x215b86,
- 0x20bc45,
- 0x306bc3,
- 0x331ec6,
- 0x20b745,
- 0x3cf784,
- 0x64600382,
- 0x22b484,
- 0x2d498a,
- 0x32dbc7,
- 0x38f286,
- 0x3ac147,
- 0x2029c3,
- 0x2c4648,
- 0x293c4b,
- 0x2741c5,
- 0x2f1d45,
- 0x2f1d46,
- 0x37de04,
- 0x3b3008,
- 0x220b83,
- 0x23c804,
- 0x23c807,
- 0x312a06,
- 0x26fa46,
- 0x2c0c8a,
- 0x244f44,
- 0x244f4a,
- 0x64a81286,
- 0x281287,
- 0x25ab87,
- 0x281f44,
- 0x281f49,
- 0x237805,
- 0x27ea4b,
- 0x2f3cc3,
- 0x21e143,
- 0x64e1a683,
- 0x328a84,
- 0x65204102,
- 0x225286,
- 0x656c2685,
- 0x29ee85,
- 0x21e3c6,
- 0x2ab4c4,
- 0x65a04c42,
- 0x245344,
- 0x65e01202,
- 0x201205,
- 0x2ef404,
- 0x66a20f83,
- 0x66e03402,
- 0x203403,
- 0x362b06,
- 0x67208a82,
- 0x3637c8,
- 0x2200c4,
- 0x2200c6,
- 0x394846,
- 0x25c784,
- 0x2203c5,
- 0x273208,
- 0x273b07,
- 0x324107,
- 0x32410f,
- 0x358a06,
- 0x2412c3,
- 0x24c244,
- 0x20c783,
- 0x21ed44,
- 0x258284,
- 0x67604982,
- 0x299203,
- 0x341703,
- 0x67a03582,
- 0x20edc3,
- 0x3b2d83,
- 0x210d8a,
- 0x27b187,
- 0x25e20c,
- 0x25e4c6,
- 0x25f046,
- 0x260b07,
- 0x67e2e947,
- 0x270549,
- 0x2487c4,
- 0x272584,
- 0x682085c2,
- 0x68600c02,
- 0x2c1046,
- 0x2018c4,
- 0x299686,
- 0x22edc8,
- 0x2116c4,
- 0x297486,
- 0x3bfc05,
- 0x298508,
- 0x23fb03,
- 0x374585,
- 0x29a843,
- 0x25d6c3,
- 0x25d6c4,
- 0x20c503,
- 0x68a4e702,
- 0x68e062c2,
- 0x2f3b89,
- 0x29d745,
- 0x29dac4,
- 0x29e705,
- 0x23ea44,
- 0x3d5207,
- 0x380545,
- 0x692769c4,
- 0x2769c8,
- 0x2ecf46,
- 0x2ed6c4,
- 0x2ee9c8,
- 0x2f0007,
- 0x6960fd02,
- 0x2fe284,
- 0x3092c4,
- 0x39ee47,
- 0x69a0fd04,
- 0x257d82,
- 0x69e11202,
- 0x21b7c3,
- 0x2887c4,
- 0x2b6b43,
- 0x2b6b45,
- 0x6a207b02,
- 0x3062c5,
- 0x293202,
- 0x30e345,
- 0x321a45,
- 0x6a60d202,
- 0x34ce44,
- 0x6aa04f42,
- 0x260586,
- 0x2c2f06,
- 0x267d08,
- 0x2cc6c8,
- 0x350c44,
- 0x30b5c5,
- 0x30f189,
- 0x30c4c4,
- 0x2d98c4,
- 0x26dfc3,
- 0x6ae3c5c5,
- 0x249485,
- 0x2b01c4,
- 0x379d0d,
- 0x27dd02,
- 0x366a83,
- 0x37f183,
- 0x6b202482,
- 0x396d85,
- 0x21d947,
- 0x2c2784,
- 0x3c7c87,
- 0x352449,
- 0x2d4ac9,
- 0x204483,
- 0x285308,
- 0x35fd89,
- 0x240ac7,
- 0x383305,
- 0x3c7a06,
- 0x3d5fc6,
- 0x307705,
- 0x2e0105,
- 0x6b600fc2,
- 0x289bc5,
- 0x2c1748,
- 0x2ce446,
- 0x6ba02d87,
- 0x296e44,
- 0x2e8f47,
- 0x309d06,
- 0x6be2ce82,
- 0x350446,
- 0x30d9ca,
- 0x30e245,
- 0x6c2ef5c2,
- 0x6c625482,
- 0x322c46,
- 0x2c8448,
- 0x6ca9a507,
- 0x6ce01402,
- 0x2017c3,
- 0x26d286,
- 0x221344,
- 0x3c73c6,
- 0x202086,
- 0x26fd4a,
- 0x280845,
- 0x26d886,
- 0x2fe943,
- 0x2fe944,
- 0x2044c2,
- 0x334e83,
- 0x6d223682,
- 0x2f9703,
- 0x219484,
- 0x2c8584,
- 0x6d6c858a,
- 0x213383,
- 0x3c53ca,
- 0x2398c7,
- 0x313686,
- 0x260444,
- 0x256502,
- 0x2b0982,
- 0x6da04242,
- 0x234783,
- 0x25a947,
- 0x204247,
- 0x294504,
- 0x3af547,
- 0x2f8bc6,
- 0x229ac7,
- 0x30c204,
- 0x2b9645,
- 0x216b45,
- 0x6de16082,
- 0x21a946,
- 0x21cf83,
- 0x21d582,
- 0x21d586,
- 0x6e205202,
- 0x6e602b82,
- 0x3ad605,
- 0x6ea09702,
- 0x6ee048c2,
- 0x3518c5,
- 0x2d6745,
- 0x2b3405,
- 0x6f25f843,
- 0x24f6c5,
- 0x2ed947,
- 0x2faa45,
- 0x341f85,
- 0x330184,
- 0x307446,
- 0x3acb04,
- 0x6f604342,
- 0x702d9dc5,
- 0x396607,
- 0x27de48,
- 0x252346,
- 0x25234d,
- 0x252bc9,
- 0x252bd2,
- 0x3caa05,
- 0x30eb03,
- 0x70602d02,
- 0x3025c4,
- 0x21cec3,
- 0x30f885,
- 0x310e05,
- 0x70a5efc2,
- 0x25efc3,
- 0x70e5d882,
- 0x7161c182,
- 0x71a03b02,
- 0x2d27c5,
- 0x3c7dc3,
- 0x222908,
- 0x71e01142,
- 0x722073c2,
- 0x275c06,
- 0x351b0a,
- 0x21e843,
- 0x25cc83,
- 0x30f403,
- 0x73601882,
- 0x81a21c82,
- 0x82208c02,
- 0x206e42,
- 0x350249,
- 0x2d1184,
- 0x2b71c8,
- 0x82706c02,
- 0x82a02402,
- 0x2cf8c5,
- 0x234388,
- 0x362488,
- 0x2f314c,
- 0x239803,
- 0x82e26b82,
- 0x83208f02,
- 0x277d46,
- 0x314505,
- 0x27fe83,
- 0x2633c6,
- 0x314646,
- 0x208f03,
- 0x3b8843,
- 0x316246,
- 0x317d04,
- 0x278dc6,
- 0x21314a,
- 0x2977c4,
- 0x3183c4,
- 0x318b0a,
- 0x8365e7c2,
- 0x297945,
- 0x31c5ca,
- 0x31d085,
- 0x31d944,
- 0x31da46,
- 0x31dbc4,
- 0x214c86,
- 0x83a57a82,
- 0x257a86,
- 0x378185,
- 0x38c987,
- 0x395ac6,
- 0x260d04,
- 0x2e4d87,
- 0x349206,
- 0x23b1c5,
- 0x23b1c7,
- 0x3b9747,
- 0x3b974e,
- 0x255f86,
- 0x3cfd85,
- 0x20fc47,
- 0x20a383,
- 0x33f4c7,
- 0x20acc5,
- 0x220e44,
- 0x228742,
- 0x273507,
- 0x309c04,
- 0x241084,
- 0x246f4b,
- 0x2199c3,
- 0x29a8c7,
- 0x2199c4,
- 0x2c3487,
- 0x228003,
- 0x3560cd,
- 0x3a4a48,
- 0x229344,
- 0x2768c5,
- 0x31e105,
- 0x31e543,
- 0x83e1ffc2,
- 0x320b03,
- 0x321103,
- 0x21aac4,
- 0x28b785,
- 0x21d007,
- 0x2fe9c6,
- 0x392283,
- 0x237d4b,
- 0x27bacb,
- 0x2bd80b,
- 0x2dd34b,
- 0x2ef60a,
- 0x3392cb,
- 0x37308b,
- 0x39858c,
- 0x3d6b4b,
- 0x3d86d1,
- 0x32258a,
- 0x322dcb,
- 0x32308c,
- 0x32338b,
- 0x3249ca,
- 0x32500a,
- 0x32654e,
- 0x32714b,
- 0x32740a,
- 0x3295d1,
- 0x329a0a,
- 0x329f0b,
- 0x32a44e,
- 0x32afcc,
- 0x32bfcb,
- 0x32c28e,
- 0x32c60c,
- 0x32fc4a,
- 0x33114c,
- 0x8433144a,
- 0x332048,
- 0x332c09,
- 0x33838a,
- 0x33860a,
- 0x33888b,
- 0x340e8e,
- 0x342151,
- 0x34bac9,
- 0x34bd0a,
- 0x34c34b,
- 0x34e38a,
- 0x34ebd6,
- 0x34ff4b,
- 0x3508ca,
- 0x35120a,
- 0x352e0b,
- 0x353849,
- 0x356a49,
- 0x35708d,
- 0x35828b,
- 0x35968b,
- 0x35a04b,
- 0x35a509,
- 0x35ab4e,
- 0x35b40a,
- 0x35c98a,
- 0x35cfca,
- 0x35d8cb,
- 0x35e10b,
- 0x35ee0d,
- 0x360e4d,
- 0x361490,
- 0x36194b,
- 0x361f0c,
- 0x36268b,
- 0x36598b,
- 0x3674ce,
- 0x36858b,
- 0x36858d,
- 0x36bc4b,
- 0x36c6cf,
- 0x36ca8b,
- 0x36d2ca,
- 0x36d709,
- 0x36f449,
- 0x8476f7cb,
- 0x36fa8e,
- 0x370e8b,
- 0x371c4f,
- 0x37494b,
- 0x374c0b,
- 0x374ecb,
- 0x37560a,
- 0x37a049,
- 0x37d10f,
- 0x38178c,
- 0x381b8c,
- 0x38218e,
- 0x38288f,
- 0x382c4e,
- 0x383750,
- 0x383b4f,
- 0x38424e,
- 0x384a8c,
- 0x384d92,
- 0x385711,
- 0x385f0e,
- 0x38634e,
- 0x386c8b,
- 0x386c8e,
- 0x38700f,
- 0x3873ce,
- 0x387753,
- 0x387c11,
- 0x38804c,
- 0x38834e,
- 0x3887cc,
- 0x388d13,
- 0x38a250,
- 0x38d38c,
- 0x38d68c,
- 0x38db4b,
- 0x39034e,
- 0x39084b,
- 0x39148b,
- 0x39280c,
- 0x39788a,
- 0x397d8c,
- 0x39808c,
- 0x398389,
- 0x399acb,
- 0x399d88,
- 0x39a509,
- 0x39a50f,
- 0x39bc8b,
- 0x84b9c38a,
- 0x39d44c,
- 0x39e60b,
- 0x39e8c9,
- 0x39f488,
- 0x39fa4b,
- 0x3a028b,
- 0x3a11ca,
- 0x3a144b,
- 0x3a1a4c,
- 0x3a2348,
- 0x3a4d8b,
- 0x3a7acb,
- 0x3ab30e,
- 0x3ac80b,
- 0x3ae6cb,
- 0x3b92cb,
- 0x3b9589,
- 0x3b9acd,
- 0x3c81ca,
- 0x3cb2d7,
- 0x3cc698,
- 0x3d0449,
- 0x3d19cb,
- 0x3d20d4,
- 0x3d25cb,
- 0x3d2b4a,
- 0x3d300a,
- 0x3d328b,
- 0x3d3ad0,
- 0x3d3ed1,
- 0x3d48ca,
- 0x3d614d,
- 0x3d684d,
- 0x3d8b0b,
- 0x21aa43,
- 0x84f5b983,
- 0x2f1986,
- 0x241f45,
- 0x28bf87,
- 0x339186,
- 0x1662202,
- 0x31a589,
- 0x331cc4,
- 0x2ec8c8,
- 0x21a5c3,
- 0x302507,
- 0x202542,
- 0x2bb443,
- 0x852074c2,
- 0x2d5e06,
- 0x2d7544,
- 0x3485c4,
- 0x390243,
- 0x85ad2e42,
- 0x85eb5e44,
- 0x281e87,
- 0x86228702,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0xf2248,
- 0x21ba03,
- 0x200742,
- 0xb2b48,
- 0x204502,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x203583,
- 0x347a16,
- 0x36a713,
- 0x3af3c9,
- 0x37c588,
- 0x38afc9,
- 0x31c746,
- 0x359290,
- 0x246453,
- 0x312ac8,
- 0x286207,
- 0x2894c7,
- 0x2addca,
- 0x32ce49,
- 0x3a24c9,
- 0x2480cb,
- 0x27e586,
- 0x294a4a,
- 0x21db86,
- 0x3318c3,
- 0x2e4385,
- 0x35bfc8,
- 0x26064d,
- 0x33bfcc,
- 0x306d47,
- 0x327bcd,
- 0x273304,
- 0x23048a,
- 0x230fca,
- 0x23148a,
- 0x20e6c7,
- 0x23ed47,
- 0x242504,
- 0x293486,
- 0x32de44,
- 0x2dab08,
- 0x2eeb89,
- 0x339906,
- 0x339908,
- 0x2fe64d,
- 0x2d4d09,
- 0x3167c8,
- 0x25d547,
- 0x2394ca,
- 0x253fc6,
- 0x2618c7,
- 0x2dbd84,
- 0x29a187,
- 0x215e4a,
- 0x23f10e,
- 0x229505,
- 0x29a08b,
- 0x307909,
- 0x224d49,
- 0x2b9d47,
- 0x3b780a,
- 0x39ed87,
- 0x300a09,
- 0x33d848,
- 0x218b8b,
- 0x2eb3c5,
- 0x30cb8a,
- 0x237ac9,
- 0x27fe0a,
- 0x2d7f0b,
- 0x3b8a8b,
- 0x247e55,
- 0x303205,
- 0x25d5c5,
- 0x2ffc8a,
- 0x27100a,
- 0x209947,
- 0x21e983,
- 0x2c0fc8,
- 0x2e228a,
- 0x2200c6,
- 0x26b549,
- 0x298508,
- 0x2ed6c4,
- 0x388ac9,
- 0x2cc6c8,
- 0x2c7c87,
- 0x2d9dc6,
- 0x396607,
- 0x329407,
- 0x241605,
- 0x22934c,
- 0x2768c5,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x204502,
- 0x22cc43,
- 0x21c103,
- 0x21ba03,
- 0x201ac3,
- 0x22cc43,
- 0x21c103,
- 0x1ba03,
- 0x27d543,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0xb2b48,
- 0x204502,
- 0x202a02,
- 0x312d42,
- 0x202282,
- 0x2009c2,
- 0x2099c2,
- 0x9e2c6,
- 0x4820f83,
- 0x94887,
- 0x101,
- 0x522cc43,
- 0x232ec3,
- 0x21fe83,
- 0x215e43,
- 0x213303,
- 0x20e403,
- 0x2e4286,
- 0x21c103,
- 0x201ac3,
- 0x234443,
- 0xb2b48,
- 0x281744,
- 0x209087,
- 0x390283,
- 0x320744,
- 0x206803,
- 0x293ac3,
- 0x215e43,
- 0x9a6c7,
- 0x80cc4,
- 0x6f4c3,
- 0x80205,
- 0x200742,
- 0x4dd03,
- 0x6604502,
- 0x6898309,
- 0x9898d,
- 0x98ccd,
- 0x312d42,
- 0x1f504,
- 0x80249,
- 0x200342,
- 0x6e1f408,
- 0xff404,
- 0xb2b48,
- 0x1409802,
- 0x1401582,
- 0x1409802,
- 0x151d2c6,
- 0x22f003,
- 0x2c3f43,
- 0x762cc43,
- 0x230484,
- 0x7a32ec3,
- 0x7e15e43,
- 0x205142,
- 0x21f504,
- 0x21c103,
- 0x30b7c3,
- 0x2052c2,
- 0x201ac3,
- 0x216942,
- 0x305ec3,
- 0x208a82,
- 0x26fb83,
- 0x276043,
- 0x2076c2,
- 0xb2b48,
- 0x22f003,
- 0x30b7c3,
- 0x2052c2,
- 0x305ec3,
- 0x208a82,
- 0x26fb83,
- 0x276043,
- 0x2076c2,
- 0x305ec3,
- 0x208a82,
- 0x26fb83,
- 0x276043,
- 0x2076c2,
- 0x22cc43,
- 0x24dd03,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x213303,
- 0x20e403,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x200e42,
- 0x214903,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x24dd03,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x21c103,
- 0x201ac3,
- 0x383305,
- 0x25efc2,
- 0x200742,
- 0xb2b48,
- 0x14975c8,
- 0x16ac0a,
- 0x215e43,
- 0x200001,
- 0x202701,
- 0x202741,
- 0x201f01,
- 0x201e81,
- 0x21db01,
- 0x208141,
- 0x20a2c1,
- 0x203a41,
- 0x203a81,
- 0x200101,
- 0x200301,
- 0xfe4c5,
- 0xb2b48,
- 0x200781,
- 0x200a81,
- 0x200041,
- 0x200141,
- 0x200a01,
- 0x200dc1,
- 0x200541,
- 0x2077c1,
- 0x2026c1,
- 0x200641,
- 0x200081,
- 0x2001c1,
- 0x200341,
- 0x200e41,
- 0x20bc41,
- 0x2002c1,
- 0x200c01,
- 0x200401,
- 0x200441,
- 0x202401,
- 0x202881,
- 0x209841,
- 0x200cc1,
- 0x201441,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x200342,
- 0x201ac3,
- 0x9a6c7,
- 0xe507,
- 0x28906,
- 0x3adca,
- 0x96308,
- 0x59f88,
- 0x5a847,
- 0x86,
- 0xea205,
- 0x148e45,
- 0xdc886,
- 0x107146,
- 0x2056c4,
- 0x26ca47,
- 0xb2b48,
- 0x2e4e84,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x331648,
- 0x2068c4,
- 0x232e04,
- 0x274a84,
- 0x277c47,
- 0x2e07c7,
- 0x22cc43,
- 0x23638b,
- 0x33ef8a,
- 0x27e847,
- 0x23ffc8,
- 0x38c288,
- 0x232ec3,
- 0x32d047,
- 0x21fe83,
- 0x3bf588,
- 0x3c1d09,
- 0x21f504,
- 0x213303,
- 0x23b788,
- 0x20e403,
- 0x2de24a,
- 0x2e4286,
- 0x3a5a07,
- 0x21c103,
- 0x21e886,
- 0x31e888,
- 0x201ac3,
- 0x282586,
- 0x2f620d,
- 0x2f8788,
- 0x30018b,
- 0x27cec6,
- 0x32f3c7,
- 0x223b85,
- 0x3be2ca,
- 0x222ac5,
- 0x24938a,
- 0x25efc2,
- 0x202903,
- 0x241084,
- 0x203a86,
- 0x3b1283,
- 0x2b2a43,
- 0x250bc3,
- 0x2068c3,
- 0x207783,
- 0x200582,
- 0x319fc5,
- 0x2b4589,
- 0x241c83,
- 0x229a43,
- 0x204883,
- 0x200301,
- 0x2d9687,
- 0x2d2505,
- 0x3851c3,
- 0x3bc883,
- 0x274a84,
- 0x27f043,
- 0x213088,
- 0x375183,
- 0x30bd8d,
- 0x256048,
- 0x385446,
- 0x334ec3,
- 0x397303,
- 0x3aca83,
- 0xbe2cc43,
- 0x232708,
- 0x236384,
- 0x2437c3,
- 0x203b86,
- 0x247648,
- 0x2046c3,
- 0x3be303,
- 0x205b03,
- 0x232ec3,
- 0x2242c3,
- 0x247f43,
- 0x2b0183,
- 0x334e43,
- 0x226543,
- 0x204b03,
- 0x39eac5,
- 0x255244,
- 0x256747,
- 0x233bc2,
- 0x259a43,
- 0x25cdc6,
- 0x25e643,
- 0x25eb83,
- 0x2852c3,
- 0x203903,
- 0x204a83,
- 0x2a3a47,
- 0xc215e43,
- 0x24f0c3,
- 0x3c2683,
- 0x219203,
- 0x21cc83,
- 0x257dc3,
- 0x35ba45,
- 0x377343,
- 0x24c909,
- 0x20d383,
- 0x311103,
- 0xc636983,
- 0x3a2283,
- 0x21f708,
- 0x2b44c6,
- 0x200706,
- 0x2a9686,
- 0x38a907,
- 0x21c2c3,
- 0x228c03,
- 0x20e403,
- 0x296406,
- 0x2055c2,
- 0x2ba883,
- 0x35ce85,
- 0x21c103,
- 0x25fa07,
- 0x161ba03,
- 0x244e03,
- 0x20e743,
- 0x20b083,
- 0x22c403,
- 0x201ac3,
- 0x20c746,
- 0x27ed86,
- 0x37d9c3,
- 0x22b7c3,
- 0x214903,
- 0x25e483,
- 0x3b88c3,
- 0x303c83,
- 0x306283,
- 0x20b745,
- 0x202ac3,
- 0x26a006,
- 0x32e048,
- 0x21e143,
- 0x377e49,
- 0x2b9308,
- 0x225608,
- 0x26aac5,
- 0x23b34a,
- 0x23d0ca,
- 0x23f74b,
- 0x23fb88,
- 0x306a43,
- 0x3923c3,
- 0x342083,
- 0x32b288,
- 0x381a43,
- 0x2fe944,
- 0x262343,
- 0x204243,
- 0x238d03,
- 0x257f43,
- 0x234443,
- 0x25efc2,
- 0x227ec3,
- 0x239803,
- 0x318583,
- 0x319544,
- 0x241084,
- 0x212f43,
- 0xb2b48,
- 0x200742,
- 0x200602,
- 0x200582,
- 0x203642,
- 0x203c82,
- 0x200782,
- 0x216f82,
- 0x201d42,
- 0x201382,
- 0x2000c2,
- 0x218ec2,
- 0x202c42,
- 0x2728c2,
- 0x208702,
- 0x2099c2,
- 0x2036c2,
- 0x20c982,
- 0x213282,
- 0x21c4c2,
- 0x202f82,
- 0x204102,
- 0x215242,
- 0x204c42,
- 0x203582,
- 0x200c02,
- 0x23c5c2,
- 0x2048c2,
- 0x742,
- 0x602,
- 0x582,
- 0x3642,
- 0x3c82,
- 0x782,
- 0x16f82,
- 0x1d42,
- 0x1382,
- 0xc2,
- 0x18ec2,
- 0x2c42,
- 0x728c2,
- 0x8702,
- 0x99c2,
- 0x36c2,
- 0xc982,
- 0x13282,
- 0x1c4c2,
- 0x2f82,
- 0x4102,
- 0x15242,
- 0x4c42,
- 0x3582,
- 0xc02,
- 0x3c5c2,
- 0x48c2,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x2902,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x4502,
- 0x204502,
- 0x201ac3,
- 0xde2cc43,
- 0x215e43,
- 0x20e403,
- 0x75003,
- 0x22e8c2,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0x74c2,
- 0x200942,
- 0x15b2885,
- 0x201c82,
- 0xb2b48,
- 0x4502,
- 0x235382,
- 0x200482,
- 0x206cc2,
- 0x20e342,
- 0x24ffc2,
- 0x148e45,
- 0x203542,
- 0x2052c2,
- 0x209342,
- 0x204902,
- 0x2036c2,
- 0x3a1b42,
- 0x211202,
- 0x227782,
- 0x9a6c7,
- 0xf54cd,
- 0xea289,
- 0xcb20b,
- 0xed808,
- 0x77289,
- 0x111b86,
- 0x215e43,
- 0xb2b48,
- 0x80cc4,
- 0x6f4c3,
- 0x80205,
- 0xb2b48,
- 0xe6fc7,
- 0x5b346,
- 0x80249,
- 0x16c4e,
- 0x1c2d87,
- 0x200742,
- 0x2056c4,
- 0x204502,
- 0x22cc43,
- 0x202a02,
- 0x232ec3,
- 0x201382,
- 0x2e4e84,
- 0x213303,
- 0x251402,
- 0x21c103,
- 0x200342,
- 0x201ac3,
- 0x25d5c6,
- 0x338e4f,
- 0x602883,
- 0xb2b48,
- 0x204502,
- 0x21fe83,
- 0x215e43,
- 0x20e403,
- 0x1ba03,
- 0x16c48,
- 0x15be08b,
- 0x152e7ca,
- 0x1477107,
- 0xade8b,
- 0x10eb85,
- 0xfe4c5,
- 0x9a6c7,
- 0x204502,
- 0x22cc43,
- 0x215e43,
- 0x21c103,
- 0x200742,
- 0x206d42,
- 0x3447c2,
- 0x1162cc43,
- 0x2401c2,
- 0x232ec3,
- 0x20d342,
- 0x209542,
- 0x215e43,
- 0x24cc42,
- 0x276b82,
- 0x2b5e02,
- 0x203602,
- 0x29e002,
- 0x204282,
- 0x200dc2,
- 0x25fec2,
- 0x2882c2,
- 0x206d82,
- 0x5904c,
- 0x2bd542,
- 0x2f6782,
- 0x21cfc2,
- 0x24d382,
- 0x20e403,
- 0x208302,
- 0x21c103,
- 0x215f82,
- 0x2dd302,
- 0x201ac3,
- 0x241d02,
- 0x203582,
- 0x2085c2,
- 0x2062c2,
- 0x20d202,
- 0x2ef5c2,
- 0x216082,
- 0x25d882,
- 0x21d6c2,
- 0x32740a,
- 0x36d2ca,
- 0x39ca0a,
- 0x3d9582,
- 0x201e02,
- 0x35ba02,
- 0x11b34009,
- 0x11fc8eca,
- 0x142e2c7,
- 0x12202942,
- 0x140a803,
- 0x7e02,
- 0x1c8eca,
- 0x192ace,
- 0x24fc04,
- 0x12a2cc43,
- 0x232ec3,
- 0x251344,
- 0x1b8786,
- 0x215e43,
- 0x21f504,
- 0x213303,
- 0x148109,
- 0x2f306,
- 0x20e403,
- 0xee044,
- 0x1e43,
- 0x21c103,
- 0x24a85,
- 0x21ba03,
- 0x201ac3,
- 0x1507504,
- 0x202ac3,
- 0x202903,
- 0xb2b48,
- 0x27c6,
- 0x1400004,
- 0x190045,
- 0x1c2b4a,
- 0x1310c2,
- 0x1c6846,
- 0x1c38d1,
- 0x13334009,
- 0x1900c8,
- 0x50688,
- 0x10a847,
- 0x282,
- 0xfe4cb,
- 0x18b40b,
- 0x17c00a,
- 0x9498a,
- 0x163b47,
- 0xb2b48,
- 0x11fa48,
- 0x1d1c47,
- 0x19c14e0b,
- 0x17c07,
- 0x4c2,
- 0x2b347,
- 0x15458a,
- 0xe58f,
- 0x42a0f,
- 0x192ac2,
- 0x4502,
- 0xb00c8,
- 0xf02ca,
- 0xe6aca,
- 0x8c84a,
- 0x55e48,
- 0xc448,
- 0x5f2c8,
- 0xe6f88,
- 0x7a48,
- 0x46c2,
- 0x1b290f,
- 0xac44b,
- 0x97fc8,
- 0x35687,
- 0x886ca,
- 0x1c96cb,
- 0x4ba49,
- 0x885c7,
- 0xc348,
- 0x3d28c,
- 0x13e0c7,
- 0x6860a,
- 0x5c248,
- 0x2890e,
- 0x290ce,
- 0x16398b,
- 0x37fcb,
- 0x6a78b,
- 0x73809,
- 0x73e4b,
- 0x1cf84d,
- 0x11b00b,
- 0x104a8d,
- 0x104e0d,
- 0x106f8a,
- 0x40ecb,
- 0x4794b,
- 0x4c145,
- 0x1a021050,
- 0xbccf,
- 0x13d1cf,
- 0x7988d,
- 0x86c90,
- 0x10ac2,
- 0x1a7635c8,
- 0xe388,
- 0x96f10,
- 0x1621ce,
- 0x1ab75145,
- 0x5048b,
- 0x147210,
- 0x58d48,
- 0xc54a,
- 0x38189,
- 0x66f47,
- 0x67287,
- 0x67447,
- 0x677c7,
- 0x69087,
- 0x69687,
- 0x6ad07,
- 0x6b247,
- 0x6b8c7,
- 0x6bbc7,
- 0x6c287,
- 0x6c447,
- 0x6c607,
- 0x6c7c7,
- 0x703c7,
- 0x70787,
- 0x71287,
- 0x71647,
- 0x71c87,
- 0x71f47,
- 0x72107,
- 0x72407,
- 0x72787,
- 0x72987,
- 0x743c7,
- 0x74587,
- 0x74747,
- 0x75387,
- 0x75887,
- 0x76487,
- 0x77687,
- 0x78147,
- 0x7a087,
- 0x7a247,
- 0x7a647,
- 0x7ab47,
- 0x7b047,
- 0x7b5c7,
- 0x7b787,
- 0x7b947,
- 0x81c87,
- 0x82707,
- 0x82c47,
- 0x83207,
- 0x833c7,
- 0x83747,
- 0x83d47,
- 0x1282,
- 0x5f3ca,
- 0xee187,
- 0x6e745,
- 0xa7d51,
- 0xa946,
- 0xfa00a,
- 0xaff4a,
- 0x5b346,
- 0x1b6ecb,
- 0x40c2,
- 0x2fad1,
- 0x198f89,
- 0xa2e49,
- 0x5fec2,
- 0xad5ca,
- 0xb3a89,
- 0xb41cf,
- 0xb47ce,
- 0xb5508,
- 0x58e82,
- 0x549,
- 0x1a730e,
- 0x14b7cc,
- 0xf074f,
- 0x1b19ce,
- 0x79d8c,
- 0x3a3c9,
- 0x3d691,
- 0x3dc48,
- 0x448d2,
- 0x4908d,
- 0x19f14d,
- 0x4f4cb,
- 0x50855,
- 0x7acc9,
- 0x8e50a,
- 0x92249,
- 0x184690,
- 0x1d460b,
- 0x9ff8f,
- 0xa074b,
- 0xacf8c,
- 0xb0390,
- 0xb758a,
- 0xba74d,
- 0xbae4e,
- 0xcaeca,
- 0xcf4cc,
- 0x1290d4,
- 0x198c11,
- 0x1c9e0b,
- 0xc0b4f,
- 0xc254d,
- 0xc2dce,
- 0xc7b4c,
- 0xc808c,
- 0xcabcb,
- 0xccd8e,
- 0xcd590,
- 0xce10b,
- 0xceb0d,
- 0x157b8f,
- 0x120d0c,
- 0x13978e,
- 0xd6e51,
- 0xda88c,
- 0xe7a07,
- 0xe880d,
- 0xed08c,
- 0xfc910,
- 0x108f8d,
- 0x109e47,
- 0x1662d0,
- 0x175848,
- 0x1930cb,
- 0xbbf0f,
- 0x43448,
- 0xfa20d,
- 0x10e2d0,
- 0x1af7c9,
- 0x1aebe246,
- 0xbf143,
- 0xc3385,
- 0x53a82,
- 0x88b49,
- 0x5c04a,
- 0x1b2f72c4,
- 0x119586,
- 0x1a4ca,
- 0x10548d,
- 0x1b53fa89,
- 0x21983,
- 0xf2f8a,
- 0xe5111,
- 0xe5549,
- 0xe6a47,
- 0xe7748,
- 0xe7bc7,
- 0xee248,
- 0x1b2a0b,
- 0x133489,
- 0xef890,
- 0xefd4c,
- 0xf0c08,
- 0xf0fc5,
- 0xf108,
- 0x1ba90a,
- 0x21a47,
- 0x6ce47,
- 0x2fc2,
- 0x147f0a,
- 0x871c9,
- 0x7aa05,
- 0x5f88a,
- 0x9a44f,
- 0x1301cb,
- 0x15bb0c,
- 0x148212,
- 0xdc9c5,
- 0xf25c8,
- 0x5554a,
- 0x1bafdbc5,
- 0x15b70c,
- 0x144603,
- 0x1a1b42,
- 0x10640a,
- 0x150678c,
- 0x13e448,
- 0x104c48,
- 0x140007,
- 0x1202,
- 0x8a82,
- 0x54150,
- 0x78687,
- 0x2edcf,
- 0xdc886,
- 0x8a84e,
- 0x16de4b,
- 0x4ed08,
- 0x4be09,
- 0x5a12,
- 0x11668d,
- 0x116bc8,
- 0xcb0c9,
- 0xdfdcd,
- 0x1c4e09,
- 0x19b60b,
- 0x1c1048,
- 0x89cc8,
- 0x8ab88,
- 0x8cd49,
- 0x8cf4a,
- 0x92f8c,
- 0xfff0a,
- 0x1b8907,
- 0x3c5cd,
- 0x1bec30c6,
- 0x10820b,
- 0x131acc,
- 0x110388,
- 0x49e89,
- 0x1c6a50,
- 0x73c2,
- 0x8c0cd,
- 0x1882,
- 0x21c82,
- 0x1b884a,
- 0xf9f0a,
- 0x10240b,
- 0x47b0c,
- 0x11f24c,
- 0x11f54a,
- 0x11f7ce,
- 0x1ab8d,
- 0x1c1d9445,
- 0x59788,
- 0x74c2,
- 0x13609ece,
- 0x13e7004e,
- 0x14607eca,
- 0x14f8fd0e,
- 0x1560fe4e,
- 0x15f7848c,
- 0x142e2c7,
- 0x142e2c9,
- 0x140a803,
- 0x1678d08c,
- 0x16e10ac9,
- 0x17626fc9,
- 0x17e4a449,
- 0x7e02,
- 0x9e11,
- 0x6ff91,
- 0x7e0d,
- 0x18fc51,
- 0x6f0d1,
- 0x1783cf,
- 0x18cfcf,
- 0x14d54c,
- 0x26f0c,
- 0x4a38c,
- 0xe1ecd,
- 0xfecd5,
- 0x152b0c,
- 0x15c68c,
- 0x170110,
- 0x1ad98c,
- 0x1d1dcc,
- 0x1d7899,
- 0x1d8e19,
- 0xfb99,
- 0x10814,
- 0x118d4,
- 0x15554,
- 0x16414,
- 0x171d4,
- 0x18611b89,
- 0x18c15809,
- 0x1975c749,
- 0x13a3de49,
- 0x7e02,
- 0x1423de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x14a3de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x1523de49,
- 0x7e02,
- 0x15a3de49,
- 0x7e02,
- 0x1623de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x16a3de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x1723de49,
- 0x7e02,
- 0x17a3de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x1823de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x18a3de49,
- 0x7e02,
- 0x1923de49,
- 0x7e02,
- 0x19a3de49,
- 0x7e02,
- 0xfb8a,
- 0x7e02,
- 0x1c38c5,
- 0x17c004,
- 0x9ece,
- 0x7004e,
- 0x12bc4e,
- 0x7eca,
- 0x18fd0e,
- 0xfe4e,
- 0x17848c,
- 0x18d08c,
- 0x10ac9,
- 0x26fc9,
- 0x4a449,
- 0x11b89,
- 0x15809,
- 0x15c749,
- 0xfeecd,
- 0x166c9,
- 0x17489,
- 0x12fb44,
- 0x1349c4,
- 0x1c2a84,
- 0x59944,
- 0xae144,
- 0x36b84,
- 0x3ab04,
- 0x59cc4,
- 0x10a844,
- 0x15a16c3,
- 0x3643,
- 0x10ac2,
- 0x1ab83,
- 0x9d003,
- 0x1513c2,
- 0x1cbb48,
- 0x133507,
- 0x46c2,
- 0x200742,
- 0x204502,
- 0x202a02,
- 0x21cd02,
- 0x201382,
- 0x200342,
- 0x208a82,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21cc83,
- 0x21c103,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x21c103,
- 0x201ac3,
- 0xb343,
- 0x215e43,
- 0x1f504,
- 0x200742,
- 0x24dd03,
- 0x1e62cc43,
- 0x211747,
- 0x215e43,
- 0x223643,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x21a70a,
- 0x25d5c5,
- 0x214903,
- 0x202b82,
- 0xb2b48,
- 0xb2b48,
- 0x4502,
- 0x1424c2,
- 0x1ef3f80b,
- 0x1f22cd04,
- 0xf7205,
- 0xe585,
- 0x1d6e86,
- 0x1f60e585,
- 0x58383,
- 0x166a43,
- 0x80cc4,
- 0x6f4c3,
- 0x80205,
- 0xfe4c5,
- 0xb2b48,
- 0x17c07,
- 0x2cc43,
- 0x1fe3ac07,
- 0x6186,
- 0x20007d05,
- 0x6247,
- 0xcd4a,
- 0x1a96c8,
- 0xcc47,
- 0x6aeca,
- 0x169988,
- 0x33407,
- 0x9a8f,
- 0x4b347,
- 0x59ac6,
- 0x147210,
- 0x1450cf,
- 0xf989,
- 0x119604,
- 0x2040630e,
- 0x39cc9,
- 0x6c906,
- 0x10d789,
- 0x1922c6,
- 0x137e46,
- 0xee70c,
- 0x1c98ca,
- 0x4bbc7,
- 0x18ee0a,
- 0x7fc09,
- 0x8684c,
- 0x1bf8a,
- 0x4caca,
- 0x80249,
- 0x119586,
- 0x4bc8a,
- 0x1177ca,
- 0xa5c4a,
- 0x15b1c9,
- 0xe4a48,
- 0xe4cc6,
- 0xea80d,
- 0xc3a05,
- 0x20b5f60c,
- 0x1c2d87,
- 0x10b3c9,
- 0x25487,
- 0xbdd54,
- 0x10e6cb,
- 0x97e0a,
- 0x588a,
- 0xb080d,
- 0x1502609,
- 0x11644c,
- 0x1169cb,
- 0x9583,
- 0x9583,
- 0x28906,
- 0x9583,
- 0x1d6e88,
- 0x1c7e03,
- 0x121189,
- 0x4dd03,
- 0xb2b48,
- 0x4502,
- 0x51344,
- 0xc0303,
- 0x183305,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x229a43,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x2a3003,
- 0x202903,
- 0x229a43,
- 0x2056c4,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x231303,
- 0x229b2c85,
- 0x142aa43,
- 0x22cc43,
- 0x232ec3,
- 0x21cd03,
- 0x21fe83,
- 0x215e43,
- 0x21f504,
- 0x2026c3,
- 0x228c03,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x214903,
- 0x4502,
- 0x26d2c3,
- 0x23a2cc43,
- 0x232ec3,
- 0x24c043,
- 0x215e43,
- 0x225883,
- 0x228c03,
- 0x201ac3,
- 0x213283,
- 0x351dc4,
- 0xb2b48,
- 0x2422cc43,
- 0x232ec3,
- 0x2b55c3,
- 0x215e43,
- 0x20e403,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x21ea03,
- 0xb2b48,
- 0x24a2cc43,
- 0x232ec3,
- 0x21fe83,
- 0x21ba03,
- 0x201ac3,
- 0xb2b48,
- 0x142e2c7,
- 0x24dd03,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0xfe4c5,
- 0x9a6c7,
- 0xbdf8b,
- 0xe5944,
- 0xc3a05,
- 0x14975c8,
- 0xb5c0d,
- 0x25f075c5,
- 0xa7ec4,
- 0x4502,
- 0x8783,
- 0x1af6c5,
- 0x27e745,
- 0xb2b48,
- 0x7842,
- 0x1a103,
- 0x4502,
- 0x102e86,
- 0x3321c8,
- 0x397187,
- 0x2056c4,
- 0x33f1c6,
- 0x34d406,
- 0xb2b48,
- 0x326843,
- 0x33cbc9,
- 0x326995,
- 0x12699f,
- 0x22cc43,
- 0x2e1a92,
- 0x181e46,
- 0x183ec5,
- 0xc54a,
- 0x38189,
- 0x2e184f,
- 0x2e4e84,
- 0x218f05,
- 0x310ed0,
- 0x37c787,
- 0x21ba03,
- 0x244e08,
- 0x16ab46,
- 0x29d84a,
- 0x202e44,
- 0x2fd603,
- 0x25d5c6,
- 0x202b82,
- 0x2f6fcb,
- 0x1ba03,
- 0x19fcc4,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x3040c3,
- 0x204502,
- 0xeed43,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x223643,
- 0x237ac3,
- 0x201ac3,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x200742,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0xe585,
- 0x2056c4,
- 0x22cc43,
- 0x232ec3,
- 0x21af04,
- 0x21c103,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x219203,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x32cdc4,
- 0x21f504,
- 0x21c103,
- 0x201ac3,
- 0x202903,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x33c583,
- 0x6b0c3,
- 0x23643,
- 0x21c103,
- 0x201ac3,
- 0x32740a,
- 0x34e989,
- 0x36604b,
- 0x366b4a,
- 0x36d2ca,
- 0x37b54b,
- 0x39208a,
- 0x39788a,
- 0x39ca0a,
- 0x39cc8b,
- 0x3ba649,
- 0x3c4aca,
- 0x3c604b,
- 0x3d288b,
- 0x3d848a,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0xeb4b,
- 0x602c8,
- 0xdff04,
- 0x1b2b46,
- 0x107249,
- 0xb2b48,
- 0x22cc43,
- 0x266f44,
- 0x2089c2,
- 0x221904,
- 0x280745,
- 0x229a43,
- 0x2056c4,
- 0x22cc43,
- 0x236384,
- 0x232ec3,
- 0x251344,
- 0x2e4e84,
- 0x21f504,
- 0x228c03,
- 0x21c103,
- 0x201ac3,
- 0x28c285,
- 0x231303,
- 0x214903,
- 0x27be03,
- 0x2769c4,
- 0x202744,
- 0x321445,
- 0xb2b48,
- 0x2087c4,
- 0x337fc6,
- 0x280384,
- 0x204502,
- 0x24ac07,
- 0x253b87,
- 0x24f1c4,
- 0x25df45,
- 0x309185,
- 0x22e005,
- 0x21f504,
- 0x38a9c8,
- 0x235bc6,
- 0x325908,
- 0x288305,
- 0x2eb3c5,
- 0x315dc4,
- 0x201ac3,
- 0x2ff404,
- 0x37a386,
- 0x25d6c3,
- 0x2769c4,
- 0x249485,
- 0x288ac4,
- 0x23c404,
- 0x202b82,
- 0x22ae86,
- 0x3af0c6,
- 0x314505,
- 0x200742,
- 0x24dd03,
- 0x2d604502,
- 0x363744,
- 0x201382,
- 0x20e403,
- 0x29f502,
- 0x21c103,
- 0x200342,
- 0x2fab86,
- 0x203583,
- 0x202903,
- 0xb5e44,
- 0xb2b48,
- 0xb2b48,
- 0x215e43,
- 0x75003,
- 0x200742,
- 0x2e204502,
- 0x215e43,
- 0x26c583,
- 0x2026c3,
- 0x22cd04,
- 0x21c103,
- 0x201ac3,
- 0xb2b48,
- 0x200742,
- 0x2ea04502,
- 0x22cc43,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x4102,
- 0x202d02,
- 0x25efc2,
- 0x223643,
- 0x2f5d43,
- 0x200742,
- 0xfe4c5,
- 0xb2b48,
- 0x9a6c7,
- 0x204502,
- 0x232ec3,
- 0x251344,
- 0x212503,
- 0x215e43,
- 0x219203,
- 0x20e403,
- 0x21c103,
- 0x201bc3,
- 0x201ac3,
- 0x21e983,
- 0x7bd53,
- 0xe13d4,
- 0xfe4c5,
- 0x9a6c7,
- 0x10bcc6,
- 0x112fcb,
- 0x28906,
- 0x59dc7,
- 0x5df46,
- 0x40c9,
- 0xdd90a,
- 0x961cd,
- 0xf51cc,
- 0x11814a,
- 0x15fc08,
- 0x148e45,
- 0xcd88,
- 0xdc886,
- 0x76606,
- 0x107146,
- 0x210ac2,
- 0x3984,
- 0x9d006,
- 0xe890,
- 0x8ecce,
- 0x7d6cc,
- 0xfe4c5,
- 0x17c1c7,
- 0x1ff11,
- 0x10a6ca,
- 0x22cc43,
- 0x6ae45,
- 0x1b8dc8,
- 0x16284,
- 0x2fc26846,
- 0xa7d46,
- 0xd6206,
- 0x9e2ca,
- 0x185203,
- 0x30246404,
- 0x4085,
- 0x106f03,
- 0x30634607,
- 0x24a85,
- 0x1b6f8c,
- 0x1019c8,
- 0x2b48b,
- 0x75e8b,
- 0x30a4c5cc,
- 0x141dac3,
- 0xc4a48,
- 0x2b705,
- 0xac2c9,
- 0x102708,
- 0x141a406,
- 0x94887,
- 0x30f89249,
- 0x126047,
- 0x10eb8a,
- 0xa388,
- 0x1d6e88,
- 0x10a844,
- 0x153705,
- 0x75fc7,
- 0x31275fc3,
- 0x3167dc86,
- 0x31affc84,
- 0x31f065c7,
- 0x1d6e84,
- 0x1d6e84,
- 0x1d6e84,
- 0x1d6e84,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x200742,
- 0x204502,
- 0x215e43,
- 0x205142,
- 0x21c103,
- 0x201ac3,
- 0x203583,
- 0x38288f,
- 0x382c4e,
- 0xb2b48,
- 0x22cc43,
- 0x47487,
- 0x232ec3,
- 0x215e43,
- 0x213303,
- 0x21c103,
- 0x201ac3,
- 0x8104,
- 0x6f604,
- 0x817c4,
- 0x208b43,
- 0x208b47,
- 0x204e82,
- 0x2f3ec9,
- 0x200602,
- 0x25444b,
- 0x2b2f4a,
- 0x27c5c9,
- 0x200182,
- 0x377f86,
- 0x22d355,
- 0x254595,
- 0x2320d3,
- 0x254b13,
- 0x206fc2,
- 0x206fc5,
- 0x206fcc,
- 0x28298b,
- 0x2bd205,
- 0x203642,
- 0x306242,
- 0x3951c6,
- 0x200282,
- 0x262586,
- 0x20c7cd,
- 0x239f4c,
- 0x2210c4,
- 0x201782,
- 0x206e02,
- 0x244c88,
- 0x203c82,
- 0x225986,
- 0x22598f,
- 0x32b410,
- 0x33ac84,
- 0x22d515,
- 0x232253,
- 0x205683,
- 0x33368a,
- 0x21e747,
- 0x351709,
- 0x2edd47,
- 0x329902,
- 0x200882,
- 0x39cf06,
- 0x26f782,
- 0xb2b48,
- 0x206ac2,
- 0x200302,
- 0x20ad87,
- 0x27c3c7,
- 0x27c3d1,
- 0x216905,
- 0x21690e,
- 0x2176cf,
- 0x2004c2,
- 0x21e947,
- 0x219e48,
- 0x2064c2,
- 0x21c002,
- 0x2a1046,
- 0x32f5cf,
- 0x2a1050,
- 0x22a242,
- 0x205382,
- 0x32dec8,
- 0x208e43,
- 0x2c0488,
- 0x2f12cd,
- 0x205543,
- 0x287608,
- 0x2517cf,
- 0x251b8e,
- 0x20554a,
- 0x3c55d1,
- 0x3c5a50,
- 0x2c60cd,
- 0x2c640c,
- 0x26d147,
- 0x333807,
- 0x33f289,
- 0x201c42,
- 0x200782,
- 0x25bb0c,
- 0x25be0b,
- 0x200d82,
- 0x2cad86,
- 0x201542,
- 0x203f02,
- 0x392ac2,
- 0x204502,
- 0x22da44,
- 0x23a787,
- 0x233782,
- 0x241747,
- 0x244087,
- 0x22b6c2,
- 0x202b42,
- 0x247345,
- 0x201482,
- 0x2d9b0e,
- 0x39638d,
- 0x232ec3,
- 0x3ce90e,
- 0x2ca64d,
- 0x32f343,
- 0x203502,
- 0x291f44,
- 0x234842,
- 0x204742,
- 0x3a0985,
- 0x3a44c7,
- 0x24b502,
- 0x21cd02,
- 0x250f47,
- 0x255b08,
- 0x233bc2,
- 0x2dca46,
- 0x25b98c,
- 0x25bccb,
- 0x20c542,
- 0x26374f,
- 0x263b10,
- 0x263f0f,
- 0x2642d5,
- 0x264814,
- 0x264d0e,
- 0x26508e,
- 0x26540f,
- 0x2657ce,
- 0x265b54,
- 0x266053,
- 0x26650d,
- 0x283f09,
- 0x299003,
- 0x200b42,
- 0x218645,
- 0x3bee86,
- 0x201382,
- 0x303ac7,
- 0x215e43,
- 0x2040c2,
- 0x2316c8,
- 0x3c5811,
- 0x3c5c50,
- 0x2082c2,
- 0x277f87,
- 0x200bc2,
- 0x20f407,
- 0x253a82,
- 0x2cbe49,
- 0x395187,
- 0x29e808,
- 0x226686,
- 0x2f5c43,
- 0x338245,
- 0x233142,
- 0x203f42,
- 0x39d305,
- 0x27d445,
- 0x206742,
- 0x206743,
- 0x206747,
- 0x217a47,
- 0x208d42,
- 0x288fc4,
- 0x21c843,
- 0x325a89,
- 0x312e48,
- 0x208242,
- 0x20d642,
- 0x3612c7,
- 0x389985,
- 0x201648,
- 0x3243c7,
- 0x202603,
- 0x29ce86,
- 0x2c5f4d,
- 0x2c62cc,
- 0x2daf86,
- 0x200482,
- 0x275d42,
- 0x202bc2,
- 0x25164f,
- 0x251a4e,
- 0x309207,
- 0x205102,
- 0x365345,
- 0x365346,
- 0x21c0c2,
- 0x208302,
- 0x29b986,
- 0x20f343,
- 0x20f346,
- 0x2d5385,
- 0x2d538d,
- 0x2d5955,
- 0x2d640c,
- 0x2d728d,
- 0x2d7652,
- 0x202c42,
- 0x2728c2,
- 0x2032c2,
- 0x21f886,
- 0x34b686,
- 0x202fc2,
- 0x3bef06,
- 0x209342,
- 0x3ccfc5,
- 0x2009c2,
- 0x2d9c49,
- 0x22410c,
- 0x22444b,
- 0x200342,
- 0x256b48,
- 0x213642,
- 0x208702,
- 0x27a386,
- 0x23ddc5,
- 0x280d87,
- 0x21c205,
- 0x2854c5,
- 0x247502,
- 0x20ce42,
- 0x2036c2,
- 0x2f0a47,
- 0x2fac4d,
- 0x2fafcc,
- 0x3ac247,
- 0x22b802,
- 0x20c982,
- 0x235ec8,
- 0x288cc8,
- 0x2f0dc8,
- 0x2fa1c4,
- 0x2cd007,
- 0x2f7343,
- 0x224a42,
- 0x202e42,
- 0x2fb749,
- 0x228d07,
- 0x213282,
- 0x27a785,
- 0x2031c2,
- 0x200e82,
- 0x2c9683,
- 0x2c9686,
- 0x303c82,
- 0x305e42,
- 0x200902,
- 0x3c7806,
- 0x2f1647,
- 0x206642,
- 0x200382,
- 0x3a770f,
- 0x3ce74d,
- 0x2c030e,
- 0x2ca4cc,
- 0x201b02,
- 0x200502,
- 0x2264c5,
- 0x3251c6,
- 0x204b82,
- 0x202f82,
- 0x204102,
- 0x2ca7c4,
- 0x2f1144,
- 0x360746,
- 0x208a82,
- 0x289847,
- 0x245603,
- 0x245608,
- 0x245b08,
- 0x39efc7,
- 0x257646,
- 0x20fd02,
- 0x227b83,
- 0x227b87,
- 0x3747c6,
- 0x303345,
- 0x2fa548,
- 0x204f42,
- 0x377d47,
- 0x23c5c2,
- 0x27dd02,
- 0x205702,
- 0x217849,
- 0x22ce82,
- 0x2017c2,
- 0x254f43,
- 0x2808c7,
- 0x202582,
- 0x22428c,
- 0x22458b,
- 0x2db006,
- 0x306e45,
- 0x209702,
- 0x2048c2,
- 0x2c70c6,
- 0x2698c3,
- 0x32cb47,
- 0x27ed42,
- 0x204342,
- 0x22d1d5,
- 0x254755,
- 0x231f93,
- 0x254c93,
- 0x391a07,
- 0x258411,
- 0x261a50,
- 0x269212,
- 0x282dd1,
- 0x284ec8,
- 0x284ed0,
- 0x2a814f,
- 0x2b2d13,
- 0x2b7952,
- 0x2d0450,
- 0x39334f,
- 0x3b9ed2,
- 0x2be391,
- 0x3d54d3,
- 0x2d4f12,
- 0x2deb0f,
- 0x2e0d4e,
- 0x2e24d2,
- 0x2e3a51,
- 0x2e738f,
- 0x2e92ce,
- 0x301b91,
- 0x304150,
- 0x3122d2,
- 0x37f211,
- 0x307b10,
- 0x308a8f,
- 0x37ded1,
- 0x3d07d0,
- 0x349f86,
- 0x350b07,
- 0x219347,
- 0x200f82,
- 0x28fa85,
- 0x310c47,
- 0x25efc2,
- 0x207802,
- 0x227ec5,
- 0x200443,
- 0x200446,
- 0x2fae0d,
- 0x2fb14c,
- 0x206e42,
- 0x206e4b,
- 0x28284a,
- 0x21d78a,
- 0x2c5849,
- 0x2f90cb,
- 0x32450d,
- 0x31134c,
- 0x276f4a,
- 0x2838cc,
- 0x2a32cb,
- 0x2bd04c,
- 0x330a4e,
- 0x2e628b,
- 0x31094c,
- 0x381ac3,
- 0x3c4d06,
- 0x3bc842,
- 0x306c02,
- 0x2110c3,
- 0x202402,
- 0x234383,
- 0x31be46,
- 0x264487,
- 0x2eafc6,
- 0x2f0488,
- 0x2065c8,
- 0x33b286,
- 0x208f02,
- 0x313ecd,
- 0x31420c,
- 0x2e4f47,
- 0x317f87,
- 0x235602,
- 0x214b02,
- 0x227b02,
- 0x287b02,
- 0x341216,
- 0x346615,
- 0x34a716,
- 0x34d853,
- 0x34df12,
- 0x35e3d3,
- 0x35e992,
- 0x3adfcf,
- 0x3bb818,
- 0x3bc317,
- 0x3bc959,
- 0x3be558,
- 0x3bff98,
- 0x3c07d7,
- 0x3c1f57,
- 0x3c2f56,
- 0x3c8a13,
- 0x3c9155,
- 0x3ca0d2,
- 0x3ca553,
- 0x204502,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x203583,
- 0x200742,
- 0x200a42,
- 0x33ea04c5,
- 0x34291505,
- 0x347c74c6,
- 0xb2b48,
- 0x34abe985,
- 0x204502,
- 0x202a02,
- 0x34e6e845,
- 0x3528e405,
- 0x3568f207,
- 0x35a8ff09,
- 0x35f62d04,
- 0x201382,
- 0x2040c2,
- 0x3624e745,
- 0x366a4489,
- 0x36b40808,
- 0x36ebacc5,
- 0x37358587,
- 0x376139c8,
- 0x37af2485,
- 0x37e373c6,
- 0x38389489,
- 0x386c3cc8,
- 0x38acd3c8,
- 0x38ea1eca,
- 0x39284744,
- 0x397bf8c5,
- 0x39ac8f48,
- 0x39e888c5,
- 0x212f82,
- 0x3a233d03,
- 0x3a6af8c6,
- 0x3ab49688,
- 0x3af3bc46,
- 0x3b373b48,
- 0x3b74d2c6,
- 0x3bb8e644,
- 0x2015c2,
- 0x3bf282c7,
- 0x3c2b67c4,
- 0x3c688007,
- 0x3cb2e207,
- 0x200342,
- 0x3cea9ac5,
- 0x3d24a884,
- 0x3d6e84c7,
- 0x3da412c7,
- 0x3de91d86,
- 0x3e28ea45,
- 0x3e6a4587,
- 0x3eaea488,
- 0x3ef2e587,
- 0x3f2fcdc9,
- 0x3f6d6745,
- 0x3facf347,
- 0x3fe9f6c6,
- 0x403bdf08,
- 0x222c0d,
- 0x28b889,
- 0x2b3c8b,
- 0x2b56cb,
- 0x30af0b,
- 0x31860b,
- 0x3253cb,
- 0x32568b,
- 0x326209,
- 0x32768b,
- 0x32794b,
- 0x328d4b,
- 0x329c8a,
- 0x32a1ca,
- 0x32a7cc,
- 0x33048b,
- 0x330eca,
- 0x34bf8a,
- 0x353f4e,
- 0x354fce,
- 0x35534a,
- 0x3573ca,
- 0x358d0b,
- 0x358fcb,
- 0x359d8b,
- 0x3713cb,
- 0x3719ca,
- 0x37268b,
- 0x37294a,
- 0x372bca,
- 0x372e4a,
- 0x392e4b,
- 0x39888b,
- 0x39ac0e,
- 0x39af8b,
- 0x3a0f0b,
- 0x3a1ecb,
- 0x3a504a,
- 0x3a52c9,
- 0x3a550a,
- 0x3a6e0a,
- 0x3bb20b,
- 0x3c630b,
- 0x3c6e4a,
- 0x3c844b,
- 0x3cfecb,
- 0x3d7ecb,
- 0x406905c8,
- 0x40a95949,
- 0x40eac149,
- 0x412ec8c8,
- 0x3604c5,
- 0x200583,
- 0x3a1784,
- 0x3c2985,
- 0x362a46,
- 0x237145,
- 0x294cc4,
- 0x3039c8,
- 0x31e405,
- 0x2a1444,
- 0x3366c7,
- 0x2ab68a,
- 0x24aeca,
- 0x309307,
- 0x221c07,
- 0x2e7887,
- 0x28b307,
- 0x309745,
- 0x3b6b86,
- 0x2c79c7,
- 0x3b91c4,
- 0x234bc6,
- 0x2f7b86,
- 0x335985,
- 0x26d6c4,
- 0x2a4bc6,
- 0x2aa947,
- 0x26a406,
- 0x327ec7,
- 0x2a1003,
- 0x3d0186,
- 0x22cfc5,
- 0x28f307,
- 0x27094a,
- 0x2317c4,
- 0x20f708,
- 0x2ed349,
- 0x2e45c7,
- 0x355bc6,
- 0x38abc8,
- 0x2189c9,
- 0x31bf44,
- 0x2553c4,
- 0x29af45,
- 0x2c76c8,
- 0x2d3507,
- 0x2cf089,
- 0x305c48,
- 0x34a086,
- 0x307446,
- 0x2a6688,
- 0x375f46,
- 0x291505,
- 0x291e46,
- 0x2891c8,
- 0x251546,
- 0x25ad0b,
- 0x366906,
- 0x2a850d,
- 0x3b7745,
- 0x2b6686,
- 0x20d845,
- 0x27cb89,
- 0x367d47,
- 0x3a8c48,
- 0x29eb46,
- 0x2a6f09,
- 0x38ae86,
- 0x2708c5,
- 0x297a86,
- 0x2a8f06,
- 0x2d8889,
- 0x2c3fc6,
- 0x2ab387,
- 0x2423c5,
- 0x2009c3,
- 0x23a205,
- 0x2a87c7,
- 0x26e046,
- 0x3b7649,
- 0x3c74c6,
- 0x292086,
- 0x212949,
- 0x291849,
- 0x2adc87,
- 0x386708,
- 0x2a7b89,
- 0x28f708,
- 0x34c1c6,
- 0x2e4805,
- 0x22b98a,
- 0x292106,
- 0x3bd846,
- 0x2dcd85,
- 0x2571c8,
- 0x22f147,
- 0x22f8ca,
- 0x251f86,
- 0x28bcc5,
- 0x306106,
- 0x2010c7,
- 0x355a87,
- 0x242f45,
- 0x270a85,
- 0x28df86,
- 0x2b4b06,
- 0x3ceec6,
- 0x2c9404,
- 0x290a49,
- 0x2967c6,
- 0x303e4a,
- 0x22a048,
- 0x341c88,
- 0x24aeca,
- 0x238e85,
- 0x2aa885,
- 0x2f1808,
- 0x2bf648,
- 0x22f547,
- 0x357a46,
- 0x344148,
- 0x2cfa07,
- 0x28eb88,
- 0x2c2c86,
- 0x292b48,
- 0x2c67c6,
- 0x288487,
- 0x2b9206,
- 0x2a4bc6,
- 0x27938a,
- 0x22dac6,
- 0x2e4809,
- 0x33b386,
- 0x2ef0ca,
- 0x38e649,
- 0x244546,
- 0x2c44c4,
- 0x21870d,
- 0x295bc7,
- 0x33d5c6,
- 0x2cd285,
- 0x38af05,
- 0x394846,
- 0x2e8309,
- 0x2c3607,
- 0x28a1c6,
- 0x2dbc06,
- 0x294d49,
- 0x291444,
- 0x36f144,
- 0x27f848,
- 0x269c86,
- 0x27a848,
- 0x2fa8c8,
- 0x2abac7,
- 0x3a8049,
- 0x3cf0c7,
- 0x2be84a,
- 0x2fc20f,
- 0x389fca,
- 0x2262c5,
- 0x289405,
- 0x3a8c05,
- 0x33abc7,
- 0x200c83,
- 0x386908,
- 0x31edc6,
- 0x31eec9,
- 0x2eb6c6,
- 0x2da0c7,
- 0x2a6cc9,
- 0x3a8b48,
- 0x2dce47,
- 0x322203,
- 0x360545,
- 0x200c05,
- 0x2c924b,
- 0x288984,
- 0x23fdc4,
- 0x285c86,
- 0x3223c7,
- 0x39e04a,
- 0x233d87,
- 0x31bfc7,
- 0x28e405,
- 0x3b6885,
- 0x267ec9,
- 0x2a4bc6,
- 0x233c0d,
- 0x33c3c5,
- 0x2bffc3,
- 0x21bc83,
- 0x3af305,
- 0x364e85,
- 0x38abc8,
- 0x28afc7,
- 0x36eec6,
- 0x2abdc6,
- 0x228345,
- 0x233187,
- 0x336047,
- 0x235a87,
- 0x3bf94a,
- 0x3d0248,
- 0x2c9404,
- 0x28d487,
- 0x28d1c7,
- 0x364386,
- 0x2a3687,
- 0x2d2288,
- 0x2ddac8,
- 0x36e286,
- 0x221e48,
- 0x2c4044,
- 0x2c79c6,
- 0x23e046,
- 0x207646,
- 0x206b86,
- 0x2a9e84,
- 0x28b3c6,
- 0x2cc086,
- 0x2a6086,
- 0x22fec6,
- 0x337046,
- 0x2d20c6,
- 0x36edc8,
- 0x3c9c48,
- 0x2e0488,
- 0x237348,
- 0x2f1786,
- 0x20f685,
- 0x23a1c6,
- 0x2bad45,
- 0x396ec7,
- 0x207605,
- 0x210243,
- 0x335b85,
- 0x22c404,
- 0x337185,
- 0x240803,
- 0x35a347,
- 0x3395c8,
- 0x327f86,
- 0x2bf2cd,
- 0x2893c6,
- 0x2a5445,
- 0x213d83,
- 0x2c8909,
- 0x2915c6,
- 0x29f946,
- 0x2ad544,
- 0x389f47,
- 0x33df46,
- 0x30d205,
- 0x2050c3,
- 0x3c0f04,
- 0x28d386,
- 0x23e144,
- 0x317348,
- 0x3b4a89,
- 0x23eb09,
- 0x2ad34a,
- 0x2ae84d,
- 0x231b47,
- 0x337d06,
- 0x20ce84,
- 0x28ff09,
- 0x2942c8,
- 0x2957c6,
- 0x23b0c6,
- 0x2a3687,
- 0x2d5f86,
- 0x21bbc6,
- 0x32d486,
- 0x32e28a,
- 0x2139c8,
- 0x279c85,
- 0x25fb89,
- 0x2d3c8a,
- 0x3c7f08,
- 0x2aa308,
- 0x29f8c8,
- 0x2aae0c,
- 0x328fc5,
- 0x2ac048,
- 0x2f7e06,
- 0x2227c6,
- 0x397ac7,
- 0x233c85,
- 0x291fc5,
- 0x23e9c9,
- 0x3b7b47,
- 0x31ee85,
- 0x21fd47,
- 0x21bc83,
- 0x2d4145,
- 0x31c3c8,
- 0x295547,
- 0x2aa1c9,
- 0x2ed6c5,
- 0x30f984,
- 0x2ae508,
- 0x328407,
- 0x2dd008,
- 0x28db08,
- 0x2b7485,
- 0x33af86,
- 0x29b346,
- 0x368089,
- 0x325ec7,
- 0x2bb206,
- 0x363287,
- 0x203703,
- 0x362d04,
- 0x2e2f45,
- 0x28d704,
- 0x24c884,
- 0x291187,
- 0x26bd07,
- 0x268344,
- 0x2aa010,
- 0x26e9c7,
- 0x3b6885,
- 0x253ccc,
- 0x211244,
- 0x2bef48,
- 0x288389,
- 0x385d86,
- 0x302848,
- 0x217f04,
- 0x285f88,
- 0x328ac6,
- 0x279208,
- 0x2a5ac6,
- 0x29650b,
- 0x332945,
- 0x2e2dc8,
- 0x212384,
- 0x3b4eca,
- 0x2aa1c9,
- 0x2b9106,
- 0x3c5188,
- 0x2b0285,
- 0x2c41c4,
- 0x2bee46,
- 0x235948,
- 0x2905c8,
- 0x3449c6,
- 0x32ee44,
- 0x22b906,
- 0x3cf147,
- 0x287f07,
- 0x2a368f,
- 0x3bd307,
- 0x244607,
- 0x365205,
- 0x370945,
- 0x2ad949,
- 0x2dc5c6,
- 0x25fd45,
- 0x291b47,
- 0x3d50c8,
- 0x23e1c5,
- 0x2b9206,
- 0x229e88,
- 0x33bc4a,
- 0x38bb08,
- 0x29b707,
- 0x2fc646,
- 0x25fb46,
- 0x203e43,
- 0x213643,
- 0x2d3e49,
- 0x2a7a09,
- 0x2bed46,
- 0x2ed6c5,
- 0x2ec148,
- 0x3c5188,
- 0x3760c8,
- 0x32d50b,
- 0x2bf507,
- 0x31e6c9,
- 0x2a3908,
- 0x368a04,
- 0x353208,
- 0x29d409,
- 0x2bb505,
- 0x33aac7,
- 0x362d85,
- 0x2904c8,
- 0x2a034b,
- 0x2a42d0,
- 0x2b5f45,
- 0x2122cc,
- 0x36f085,
- 0x28e483,
- 0x2cdb06,
- 0x2ca444,
- 0x24a986,
- 0x2aa947,
- 0x229f04,
- 0x245e48,
- 0x3867cd,
- 0x357885,
- 0x231b84,
- 0x226004,
- 0x2b1489,
- 0x2b9748,
- 0x332e07,
- 0x328b48,
- 0x290b08,
- 0x28a4c5,
- 0x20df87,
- 0x28a447,
- 0x33c987,
- 0x270a89,
- 0x32d1c9,
- 0x25c3c6,
- 0x2c6606,
- 0x291c06,
- 0x356d45,
- 0x38ddc4,
- 0x3b24c6,
- 0x3b4846,
- 0x28a508,
- 0x200d8b,
- 0x269807,
- 0x20ce84,
- 0x33de86,
- 0x2d25c7,
- 0x333b45,
- 0x348805,
- 0x22f404,
- 0x32d146,
- 0x3b2548,
- 0x28ff09,
- 0x249c06,
- 0x2940c8,
- 0x30d2c6,
- 0x3672c8,
- 0x2c1a4c,
- 0x28a386,
- 0x2a510d,
- 0x2a558b,
- 0x2ab445,
- 0x336187,
- 0x2c40c6,
- 0x355948,
- 0x25c449,
- 0x36e548,
- 0x3b6885,
- 0x3b8f07,
- 0x28f808,
- 0x2ebac9,
- 0x22b0c6,
- 0x2612ca,
- 0x3556c8,
- 0x36e38b,
- 0x2df70c,
- 0x286088,
- 0x28cb46,
- 0x20d988,
- 0x33b8c7,
- 0x3bd449,
- 0x2d6a8d,
- 0x2a4ac6,
- 0x2ec2c8,
- 0x3c9b09,
- 0x2c9508,
- 0x292c48,
- 0x2ccacc,
- 0x2cdc87,
- 0x2ce5c7,
- 0x2708c5,
- 0x2c2007,
- 0x3d4f88,
- 0x2beec6,
- 0x249a8c,
- 0x300e48,
- 0x2db288,
- 0x237606,
- 0x2863c7,
- 0x25c5c4,
- 0x237348,
- 0x23854c,
- 0x26e2cc,
- 0x226345,
- 0x335a07,
- 0x32edc6,
- 0x286346,
- 0x27cd48,
- 0x21a0c4,
- 0x26a40b,
- 0x28998b,
- 0x2fc646,
- 0x386647,
- 0x200845,
- 0x278285,
- 0x26a546,
- 0x2b0245,
- 0x288945,
- 0x2d86c7,
- 0x277a09,
- 0x2b4cc4,
- 0x25ebc5,
- 0x3ac5c5,
- 0x3170c8,
- 0x299785,
- 0x296c89,
- 0x320787,
- 0x32078b,
- 0x2fb346,
- 0x36eb09,
- 0x26d608,
- 0x29aa45,
- 0x33ca88,
- 0x32d208,
- 0x262e07,
- 0x3288c7,
- 0x291209,
- 0x279147,
- 0x2a1b09,
- 0x2e8ccc,
+ 0x3a7b46,
+ 0x3201842,
+ 0x2d02c7,
+ 0x236c86,
+ 0x3604b02,
+ 0x227483,
+ 0x280a84,
+ 0x2165c6,
+ 0x39fc48,
+ 0x289886,
+ 0x26f844,
+ 0x3a00b02,
+ 0x34a789,
+ 0x217307,
+ 0x200f46,
+ 0x274909,
0x2fccc8,
- 0x2c3b09,
- 0x2c4c07,
- 0x290bc9,
- 0x204f47,
- 0x2df808,
- 0x3a8205,
- 0x2c7946,
- 0x2cd2c8,
- 0x3029c8,
- 0x2d3b49,
- 0x288987,
- 0x278345,
- 0x23c9c9,
- 0x2d8f06,
- 0x280a04,
- 0x280a06,
- 0x349508,
- 0x3a1887,
- 0x200f88,
- 0x221f09,
- 0x38c847,
- 0x2ab846,
- 0x336244,
- 0x335c09,
- 0x20de08,
- 0x2374c7,
- 0x310046,
- 0x200cc6,
- 0x3bd7c4,
- 0x2f8046,
- 0x23a903,
- 0x3324c9,
- 0x332906,
- 0x3b6e05,
- 0x2abdc6,
- 0x2d8c45,
- 0x28fc88,
- 0x33b787,
- 0x30c846,
- 0x26e886,
- 0x341c88,
- 0x2adac7,
- 0x2a4b05,
- 0x2a9e08,
- 0x3d4448,
- 0x3556c8,
- 0x36ef45,
- 0x2c79c6,
- 0x23e8c9,
- 0x367f04,
- 0x2d8acb,
- 0x21b8cb,
- 0x279b89,
- 0x21bc83,
- 0x25cb05,
- 0x22e146,
- 0x381f88,
- 0x31b604,
- 0x327f86,
- 0x3bfa89,
- 0x2db945,
- 0x2d8606,
- 0x328406,
- 0x2220c4,
- 0x2220ca,
- 0x3b6d48,
- 0x3029c6,
- 0x2f4b05,
- 0x38cb07,
- 0x3650c7,
- 0x33af84,
- 0x21bb07,
- 0x2075c4,
- 0x2075c6,
- 0x209b43,
- 0x270a85,
- 0x2bc1c5,
- 0x373dc8,
- 0x28d645,
- 0x28a0c9,
- 0x237187,
- 0x23718b,
- 0x2af6cc,
- 0x2afcca,
- 0x358587,
- 0x204e03,
- 0x256148,
- 0x36f105,
- 0x23e245,
- 0x360604,
- 0x2df706,
- 0x288386,
- 0x2f8087,
- 0x23bf4b,
- 0x2a9e84,
- 0x31a144,
- 0x2d2e84,
- 0x2d83c6,
- 0x229f04,
- 0x2c77c8,
- 0x360405,
- 0x242dc5,
- 0x376007,
- 0x336289,
- 0x364e85,
- 0x39484a,
- 0x2422c9,
- 0x2b814a,
- 0x32e3c9,
- 0x35e884,
- 0x2dbcc5,
- 0x2d6088,
- 0x2e858b,
- 0x29af45,
- 0x257846,
- 0x20f084,
- 0x28a606,
- 0x38c6c9,
- 0x2d26c7,
- 0x3c7688,
- 0x2aebc6,
- 0x3cf0c7,
- 0x2905c8,
- 0x394dc6,
- 0x3a8f84,
- 0x382f87,
- 0x384585,
- 0x395f47,
- 0x217e04,
- 0x2c4046,
- 0x2ea608,
- 0x2a5748,
- 0x2f9787,
- 0x336c88,
- 0x2c6885,
- 0x21ba04,
- 0x24adc8,
- 0x275684,
- 0x20f705,
- 0x309944,
- 0x2cfb07,
- 0x296887,
- 0x290d08,
- 0x2dd186,
- 0x28d5c5,
- 0x289ec8,
- 0x38bd08,
- 0x2ad289,
- 0x21bbc6,
- 0x22f948,
- 0x3b4d4a,
- 0x333bc8,
- 0x2f2485,
- 0x2190c6,
- 0x242188,
- 0x3b8fca,
- 0x221407,
- 0x294705,
- 0x3586c8,
- 0x31a9c4,
- 0x257246,
- 0x2ce948,
- 0x337046,
- 0x208988,
- 0x29f307,
- 0x3365c6,
- 0x2c44c4,
- 0x278887,
- 0x2bf944,
- 0x38c687,
- 0x2b8e4d,
- 0x22f5c5,
- 0x2e810b,
- 0x26e546,
- 0x256c48,
- 0x245e04,
- 0x2eed86,
- 0x28d386,
- 0x20dcc7,
- 0x2a4dcd,
- 0x248f07,
- 0x2bff08,
- 0x2900c5,
- 0x23e308,
- 0x2d3486,
- 0x2c6908,
- 0x23d546,
- 0x27e147,
- 0x25af49,
- 0x380447,
- 0x295a88,
- 0x281dc5,
- 0x2283c8,
- 0x354785,
- 0x228e85,
- 0x33a505,
- 0x2265c3,
- 0x206c04,
- 0x25fb85,
- 0x389489,
- 0x30ff46,
- 0x2d2388,
- 0x328685,
- 0x2c1ec7,
- 0x22234a,
- 0x2d8549,
- 0x2a8e0a,
- 0x2e0508,
- 0x21fb8c,
- 0x291bcd,
- 0x311883,
- 0x208888,
- 0x3c0ec5,
- 0x33ba06,
- 0x3a89c6,
- 0x36dd85,
- 0x363389,
- 0x204d85,
- 0x289ec8,
- 0x25d9c6,
- 0x36f646,
- 0x2ae3c9,
- 0x3ab147,
- 0x2a0606,
- 0x2222c8,
- 0x207548,
- 0x2ecac7,
- 0x2cc20e,
- 0x2d36c5,
- 0x2eb9c5,
- 0x336f48,
- 0x34e7c7,
- 0x200d02,
- 0x2cc644,
- 0x24a88a,
- 0x237588,
- 0x32d346,
- 0x2a6e08,
- 0x29b346,
- 0x207288,
- 0x2bb208,
- 0x228e44,
- 0x2c2285,
- 0x680384,
- 0x680384,
- 0x680384,
- 0x207503,
- 0x200b46,
- 0x28a386,
- 0x2ab10c,
- 0x205ec3,
- 0x217e06,
- 0x213c44,
- 0x291548,
- 0x3bf8c5,
- 0x24a986,
- 0x2c9048,
- 0x2e2206,
- 0x30c7c6,
- 0x23b908,
- 0x2e2fc7,
- 0x278f09,
- 0x32ad4a,
- 0x26be84,
- 0x207605,
- 0x2cf045,
- 0x2d6986,
- 0x231b86,
- 0x2a8c06,
- 0x308e46,
- 0x279044,
- 0x27904b,
- 0x2cf084,
- 0x2ab2c5,
- 0x2ba645,
- 0x2abb86,
- 0x3bfd88,
- 0x291a87,
- 0x332884,
- 0x260143,
- 0x31a4c5,
- 0x305b07,
- 0x29198b,
- 0x373cc7,
- 0x2c8f48,
- 0x2c23c7,
- 0x271dc6,
- 0x28bb48,
- 0x275a0b,
- 0x3c28c6,
- 0x3bc0c9,
- 0x275b85,
- 0x322203,
- 0x2d8606,
- 0x29f208,
- 0x221f83,
- 0x257803,
- 0x2905c6,
- 0x29b346,
- 0x37af0a,
- 0x28cb85,
- 0x28d1cb,
- 0x2abd0b,
- 0x263583,
- 0x201583,
- 0x2be7c4,
- 0x29b107,
- 0x286084,
- 0x291544,
- 0x2f7c84,
- 0x333ec8,
- 0x2f4a48,
- 0x21e589,
- 0x2d67c8,
- 0x2ef2c7,
- 0x22fec6,
- 0x2d1fcf,
- 0x2d3806,
- 0x2dfa04,
- 0x2f488a,
- 0x305a07,
- 0x2bfa46,
- 0x29f709,
- 0x21e505,
- 0x373f05,
- 0x21e646,
- 0x228503,
- 0x31aa09,
- 0x213b46,
- 0x221cc9,
- 0x39e046,
- 0x270a85,
- 0x226745,
- 0x200bc3,
- 0x29b248,
- 0x332fc7,
- 0x31edc4,
- 0x2913c8,
- 0x222544,
- 0x310746,
- 0x2cdb06,
- 0x2404c6,
- 0x2e2c89,
- 0x23e1c5,
- 0x2a4bc6,
- 0x2972c9,
- 0x3d4c86,
- 0x2d20c6,
- 0x3a3786,
- 0x218ac5,
- 0x309946,
- 0x27e144,
- 0x3a8205,
- 0x2cd2c4,
- 0x2c0a06,
- 0x33c384,
- 0x200f83,
- 0x294385,
- 0x234488,
- 0x3cf687,
- 0x31b689,
- 0x294608,
- 0x2a6451,
- 0x32848a,
- 0x2fc587,
- 0x2dde06,
- 0x213c44,
- 0x2cd3c8,
- 0x268088,
- 0x2a660a,
- 0x296a4d,
- 0x297a86,
- 0x23ba06,
- 0x278946,
- 0x242dc7,
- 0x2bffc5,
- 0x378047,
- 0x291485,
- 0x3208c4,
- 0x2b5386,
- 0x2ec007,
- 0x31a70d,
- 0x2420c7,
- 0x3038c8,
- 0x28a1c9,
- 0x218fc6,
- 0x22b045,
- 0x240844,
- 0x349606,
- 0x33ae86,
- 0x237706,
- 0x2a7688,
- 0x224083,
- 0x20dcc3,
- 0x205e45,
- 0x252086,
- 0x2bb1c5,
- 0x2aedc8,
- 0x2aab0a,
- 0x33b084,
- 0x291548,
- 0x29f8c8,
- 0x2ab9c7,
- 0x328749,
- 0x2c8c48,
- 0x28ff87,
- 0x2f7f06,
- 0x33704a,
- 0x349688,
- 0x367b89,
- 0x2b9808,
- 0x214149,
- 0x2ddcc7,
- 0x35fa05,
- 0x32d706,
- 0x2bed48,
- 0x290748,
- 0x29fa48,
- 0x2fc748,
- 0x2ab2c5,
- 0x20d784,
- 0x232808,
- 0x243ec4,
- 0x32e1c4,
- 0x270a85,
- 0x2a1487,
- 0x336049,
- 0x20dac7,
- 0x2129c5,
- 0x285e86,
- 0x3737c6,
- 0x22a144,
- 0x2ae706,
- 0x28c7c4,
- 0x29dc06,
- 0x335e06,
- 0x3bf346,
- 0x3b6885,
- 0x2aec87,
- 0x204e03,
- 0x220689,
- 0x341a88,
- 0x28fe04,
- 0x28fe0d,
- 0x2a5848,
- 0x2f6808,
- 0x367b06,
- 0x25b049,
- 0x2d8549,
- 0x38c3c5,
- 0x2aac0a,
- 0x24f28a,
- 0x27508c,
- 0x275206,
- 0x287986,
- 0x2d4086,
- 0x3a0a49,
- 0x33bc46,
- 0x2adb06,
- 0x204e46,
- 0x237348,
- 0x336c86,
- 0x2df38b,
- 0x2a1605,
- 0x242dc5,
- 0x288005,
- 0x27f5c6,
- 0x21ba43,
- 0x240446,
- 0x242047,
- 0x2cd285,
- 0x25e685,
- 0x38af05,
- 0x3825c6,
- 0x340704,
- 0x340706,
- 0x2b0ec9,
- 0x27f44c,
- 0x320608,
- 0x2358c4,
- 0x309646,
- 0x26e646,
- 0x29f208,
- 0x3c5188,
- 0x27f349,
- 0x38cb07,
- 0x2699c9,
- 0x256f86,
- 0x22a344,
- 0x3d3584,
- 0x28f584,
- 0x2905c8,
- 0x335e8a,
- 0x364e06,
- 0x370807,
- 0x3961c7,
- 0x36ec05,
- 0x2cf004,
- 0x29d3c6,
- 0x2c0006,
- 0x21a103,
- 0x3418c7,
+ 0x346d44,
+ 0x368ac6,
+ 0x255fc6,
+ 0x3e017c2,
+ 0x23938f,
+ 0x205b8e,
+ 0x2199c4,
+ 0x215ac5,
+ 0x32bc45,
+ 0x2e1d89,
+ 0x23cc09,
+ 0x216dc7,
+ 0x21e046,
+ 0x248903,
+ 0x4220f02,
+ 0x222e83,
+ 0x317cca,
+ 0x46020c3,
+ 0x248d45,
+ 0x2ffe82,
+ 0x38a8c9,
+ 0x4e02442,
+ 0x20c3c4,
+ 0x3b89c6,
+ 0x336d45,
+ 0x36c084,
+ 0x5637884,
+ 0x20a683,
+ 0x233684,
+ 0x5a026c2,
+ 0x250bc4,
+ 0x5e6c7c4,
+ 0x398e8a,
+ 0x6200882,
+ 0x3b7607,
+ 0x206288,
+ 0x7202202,
+ 0x37e987,
+ 0x22d3c4,
+ 0x2c1807,
+ 0x22d3c5,
+ 0x351647,
+ 0x3cbf86,
+ 0x2ad604,
+ 0x32ec45,
+ 0x25bc47,
+ 0x82052c2,
+ 0x244683,
+ 0x20b582,
+ 0x3607c3,
+ 0x860d242,
+ 0x283a05,
+ 0x8a00202,
+ 0x243f44,
+ 0x2e1a05,
+ 0x219907,
+ 0x21f2ce,
+ 0x2b0444,
+ 0x265604,
+ 0x218a43,
+ 0x371bc9,
+ 0x257f0b,
+ 0x269488,
+ 0x2746c8,
+ 0x38c288,
0x28da08,
- 0x38c50a,
- 0x386a88,
- 0x373b48,
- 0x33c3c5,
- 0x2ab545,
- 0x269905,
- 0x36efc6,
- 0x383fc6,
- 0x205405,
- 0x332709,
- 0x2cee0c,
- 0x23bbc7,
- 0x2a6688,
- 0x290905,
- 0x680384,
- 0x2bc204,
- 0x295684,
- 0x21cb46,
- 0x2acb4e,
- 0x373f87,
- 0x242fc5,
- 0x367e8c,
- 0x309a47,
- 0x2ebf87,
- 0x361cc9,
- 0x20f7c9,
- 0x294705,
- 0x341a88,
- 0x23e8c9,
- 0x355585,
- 0x2cd1c8,
- 0x213cc6,
- 0x24b046,
- 0x38e644,
- 0x29be88,
- 0x219183,
- 0x20ebc4,
- 0x31a545,
- 0x399fc7,
- 0x380645,
- 0x3b4c09,
- 0x2a270d,
- 0x2b9c46,
- 0x35bec4,
- 0x3579c8,
- 0x27784a,
- 0x2237c7,
- 0x27e985,
- 0x20ec03,
- 0x2abece,
- 0x29b34c,
- 0x3c8007,
- 0x2acd07,
- 0x20af03,
- 0x33bc85,
- 0x295685,
- 0x2a71c8,
- 0x2a4909,
- 0x2357c6,
- 0x286084,
- 0x2fc4c6,
- 0x23498b,
- 0x2c5ccc,
- 0x255807,
- 0x2df645,
- 0x3d4348,
- 0x2ec885,
- 0x2f4887,
- 0x3282c7,
- 0x241e85,
- 0x21ba43,
- 0x334204,
- 0x3a1745,
- 0x2b4bc5,
- 0x2b4bc6,
- 0x2af4c8,
- 0x2ec007,
- 0x3a8cc6,
- 0x3bd6c6,
- 0x33a446,
- 0x297b89,
- 0x20e087,
- 0x3cf306,
- 0x2c5e46,
- 0x284646,
- 0x2b6785,
- 0x3cd2c6,
- 0x35b645,
- 0x299808,
- 0x2a3f4b,
- 0x29cd86,
- 0x396204,
- 0x2dad49,
- 0x237184,
- 0x213c48,
- 0x280b07,
- 0x292b44,
- 0x2c7ec8,
- 0x2ce3c4,
- 0x2b67c4,
- 0x295045,
- 0x3578c6,
- 0x333e07,
+ 0x346b8a,
+ 0x351547,
+ 0x2c7086,
+ 0x8e4a0c2,
+ 0x309243,
+ 0x3ce603,
+ 0x3d0044,
+ 0x309283,
+ 0x3639c3,
+ 0x1739742,
+ 0x9202c42,
+ 0x27fe45,
+ 0x39eb86,
+ 0x281084,
+ 0x369247,
+ 0x250a06,
+ 0x2ba9c4,
+ 0x389207,
+ 0x203a83,
+ 0x96cb182,
+ 0x9a25a42,
+ 0x9e25802,
+ 0x225806,
+ 0xa200282,
+ 0x2850c5,
+ 0x33ac83,
+ 0x3c0604,
+ 0x2ef704,
+ 0x2ef705,
+ 0x3c4703,
+ 0xa64ce83,
+ 0xab3b5c2,
+ 0x28cf05,
+ 0x3da30b,
+ 0x2c004b,
+ 0x22afc4,
+ 0x3dc049,
+ 0x207fc4,
+ 0xae08202,
0x208a43,
- 0x2ab905,
- 0x345044,
- 0x2eba06,
- 0x38c448,
- 0x26e1c5,
- 0x2a0d09,
- 0x23cbc5,
- 0x217e08,
- 0x272e87,
- 0x332a08,
- 0x2c7507,
- 0x2446c9,
- 0x28b246,
- 0x320bc6,
- 0x204e44,
- 0x31a085,
- 0x31374c,
- 0x288007,
- 0x2892c7,
- 0x2317c8,
- 0x2b9c46,
- 0x27a984,
- 0x3925c4,
- 0x291089,
- 0x2d4186,
- 0x267f47,
- 0x20d904,
- 0x235086,
- 0x351a85,
- 0x2dccc7,
- 0x2df306,
- 0x261189,
- 0x2d95c7,
- 0x2a3687,
- 0x2ae246,
- 0x234fc5,
- 0x28ea08,
- 0x2139c8,
- 0x2300c6,
- 0x26e205,
- 0x321d46,
- 0x210283,
- 0x2a7049,
- 0x2a898e,
- 0x2c7248,
- 0x222648,
- 0x22fecb,
- 0x2a0f46,
- 0x34d2c4,
- 0x2917c4,
- 0x2a8a8a,
- 0x2121c7,
- 0x3cf3c5,
- 0x3bc0c9,
- 0x2cc145,
- 0x32e207,
- 0x28d7c4,
- 0x29fe07,
- 0x2fa7c8,
- 0x2e4686,
- 0x2ec449,
- 0x2c8d4a,
- 0x212146,
- 0x2a5386,
- 0x2ba5c5,
- 0x39b545,
- 0x3374c7,
- 0x249888,
- 0x3519c8,
- 0x228e46,
- 0x2267c5,
- 0x23190e,
- 0x2c9404,
- 0x230045,
- 0x285809,
- 0x2dc3c8,
- 0x29b646,
- 0x2a990c,
- 0x2aa710,
- 0x2ac78f,
- 0x2ad848,
- 0x358587,
- 0x3b6885,
- 0x25fb85,
- 0x333c89,
- 0x3588c9,
- 0x22ba06,
- 0x29afc7,
- 0x319f85,
- 0x22f549,
- 0x364406,
- 0x33ba8d,
- 0x28f449,
- 0x291544,
- 0x2c6fc8,
- 0x2328c9,
- 0x364fc6,
- 0x256345,
- 0x320bc6,
- 0x3c7549,
- 0x38f608,
- 0x20f685,
- 0x29be84,
- 0x2a9acb,
- 0x364e85,
- 0x2a9c06,
- 0x291f06,
- 0x202c86,
- 0x2b188b,
- 0x2a0e09,
- 0x3bd605,
- 0x396dc7,
- 0x328406,
- 0x256dc6,
- 0x295408,
- 0x3c1b09,
- 0x30368c,
- 0x305908,
- 0x31dc46,
- 0x3449c3,
- 0x23b4c6,
- 0x244585,
- 0x28dd08,
- 0x2261c6,
- 0x2dcf08,
- 0x233e05,
- 0x2a67c5,
- 0x272fc8,
- 0x207407,
- 0x3a8907,
- 0x2f8087,
- 0x302848,
- 0x295108,
- 0x2d2b06,
- 0x2c0847,
- 0x362bc7,
- 0x2b158a,
- 0x208d83,
- 0x27f5c6,
- 0x231885,
- 0x24a884,
- 0x28a1c9,
- 0x244644,
- 0x2808c4,
- 0x2a5b44,
- 0x2acd0b,
- 0x332f07,
- 0x231b45,
- 0x2a3dc8,
- 0x285e86,
- 0x285e88,
- 0x28cac6,
- 0x29bdc5,
- 0x29c085,
- 0x29e146,
- 0x29efc8,
- 0x29f648,
- 0x28a386,
- 0x2a3c0f,
- 0x2a6b10,
- 0x3b7745,
- 0x204e03,
- 0x22a405,
- 0x31e608,
- 0x3587c9,
- 0x3556c8,
- 0x297a08,
- 0x239a48,
- 0x332fc7,
- 0x285b49,
- 0x2dd108,
- 0x29d2c4,
- 0x2a59c8,
- 0x317189,
- 0x2c1607,
- 0x2a8904,
- 0x20db88,
- 0x2aea4a,
- 0x2dbf86,
- 0x297a86,
- 0x21ba89,
- 0x2aa947,
- 0x2d9f48,
- 0x20aec8,
- 0x3bdd88,
- 0x391b45,
- 0x3c1405,
- 0x242dc5,
- 0x295645,
- 0x3a3387,
- 0x21ba45,
- 0x2cd285,
- 0x363086,
- 0x355607,
- 0x2e84c7,
- 0x2aed46,
- 0x2e0a45,
- 0x2a9c06,
- 0x2447c5,
- 0x319e08,
- 0x3c7e84,
- 0x3d4d06,
- 0x3518c4,
- 0x2c41c8,
- 0x22a7ca,
- 0x28afcc,
- 0x23c145,
- 0x242e86,
- 0x303846,
- 0x334886,
- 0x31dcc4,
- 0x351d45,
- 0x28c507,
- 0x2aa9c9,
- 0x2d8987,
- 0x680384,
- 0x680384,
- 0x332d85,
- 0x2de504,
- 0x2a92ca,
- 0x285d06,
- 0x28bd84,
- 0x335985,
- 0x398b05,
- 0x2bff04,
- 0x291b47,
- 0x23cb47,
- 0x2d83c8,
- 0x321e48,
- 0x34b349,
- 0x275688,
- 0x2a948b,
- 0x27e204,
- 0x256ec5,
- 0x25fdc5,
- 0x2f8009,
- 0x3c1b09,
- 0x2dac48,
- 0x305788,
- 0x2abb84,
- 0x26e685,
- 0x200583,
- 0x2d6945,
- 0x2a4c46,
- 0x2a474c,
- 0x20d806,
- 0x256246,
- 0x29b8c5,
- 0x382648,
- 0x397c06,
- 0x2ddf86,
- 0x297a86,
- 0x222f0c,
- 0x2378c4,
- 0x33a58a,
- 0x29b808,
- 0x2a4587,
- 0x344f46,
- 0x235887,
- 0x2fc0c5,
- 0x310046,
- 0x36d046,
- 0x379187,
- 0x2c8a44,
- 0x2cfc05,
- 0x285804,
- 0x320947,
- 0x285a48,
- 0x28780a,
- 0x28f687,
- 0x360847,
- 0x358507,
- 0x2ec9c9,
- 0x2a474a,
- 0x22a303,
- 0x3cf645,
- 0x2089c3,
- 0x2f7cc9,
- 0x27e3c8,
- 0x365207,
- 0x3557c9,
- 0x213ac6,
- 0x3a82c8,
- 0x35a2c5,
- 0x38be0a,
- 0x34afc9,
- 0x36e149,
- 0x397ac7,
- 0x268189,
- 0x3bf248,
- 0x379346,
- 0x243048,
- 0x3b8487,
- 0x279147,
- 0x2422c7,
- 0x2ea488,
- 0x3094c6,
- 0x2ae805,
- 0x28c507,
- 0x2a4e88,
- 0x33a3c4,
- 0x303d04,
- 0x2a0507,
- 0x2bb587,
- 0x23e74a,
- 0x3792c6,
- 0x35204a,
- 0x2cc587,
- 0x2c91c7,
- 0x2cfcc4,
- 0x2a1bc4,
- 0x2dcbc6,
- 0x33e1c4,
- 0x33e1cc,
- 0x30cfc5,
- 0x3c1949,
- 0x2bebc4,
- 0x2bffc5,
- 0x2777c8,
- 0x28bf45,
- 0x394846,
- 0x22f444,
- 0x2b380a,
- 0x325dc6,
- 0x2aa48a,
- 0x32e587,
- 0x2010c5,
- 0x228505,
- 0x36ec4a,
- 0x29f145,
- 0x2ad346,
- 0x243ec4,
- 0x2be946,
- 0x337585,
- 0x226286,
- 0x2f978c,
- 0x22318a,
- 0x24f384,
- 0x22fec6,
- 0x2aa947,
- 0x2df284,
- 0x237348,
- 0x257746,
- 0x396049,
- 0x2da689,
- 0x2fcdc9,
- 0x2d8c86,
- 0x3b8586,
- 0x243187,
- 0x332648,
- 0x3b8389,
- 0x332f07,
- 0x2c6706,
- 0x3cf147,
- 0x278805,
- 0x2c9404,
- 0x242d47,
- 0x362d85,
- 0x294f85,
- 0x280fc7,
- 0x241d48,
- 0x3d42c6,
- 0x2a5ecd,
- 0x2a73cf,
- 0x2abd0d,
- 0x212a04,
- 0x234586,
- 0x2e3708,
- 0x204e05,
- 0x2b1748,
- 0x262cca,
- 0x291544,
- 0x2ec606,
- 0x2dfa87,
- 0x2caa47,
- 0x2e3089,
- 0x243005,
- 0x2bff04,
- 0x2c21ca,
- 0x2c8809,
- 0x268287,
- 0x2e8ac6,
- 0x364fc6,
- 0x26e5c6,
- 0x383046,
- 0x2e294f,
- 0x2e35c9,
- 0x336c86,
- 0x38a806,
- 0x331d09,
- 0x2c0947,
- 0x206343,
- 0x223086,
- 0x213643,
- 0x36dc48,
- 0x3cef87,
- 0x2ada49,
- 0x2cd988,
- 0x3a8a48,
- 0x205086,
- 0x20d749,
- 0x23bb05,
- 0x23b404,
- 0x35fac7,
- 0x3a0ac5,
- 0x212a04,
- 0x231c08,
- 0x212484,
- 0x2c0687,
- 0x339546,
- 0x28e045,
- 0x2b9808,
- 0x364e8b,
- 0x2cf347,
- 0x36eec6,
- 0x2d3884,
- 0x34d246,
- 0x270a85,
- 0x362d85,
- 0x28e789,
- 0x291749,
- 0x279184,
- 0x2791c5,
- 0x22ff05,
- 0x38bc86,
- 0x341b88,
- 0x2cb646,
- 0x28d84b,
- 0x385c0a,
- 0x2c7605,
- 0x29c106,
- 0x31eac5,
- 0x2f1585,
- 0x2b6847,
- 0x27f848,
- 0x2699c4,
- 0x267ac6,
- 0x29f6c6,
- 0x3bf407,
- 0x3221c4,
- 0x28d386,
- 0x33acc5,
- 0x33acc9,
- 0x2e4444,
- 0x2cf189,
- 0x28a386,
- 0x2cdd48,
- 0x22ff05,
- 0x3962c5,
- 0x226286,
- 0x303589,
- 0x20f7c9,
- 0x2562c6,
- 0x2dc4c8,
- 0x2a2848,
- 0x31ea84,
- 0x2c2a84,
- 0x2c2a88,
- 0x33d6c8,
- 0x269ac9,
- 0x2a4bc6,
- 0x297a86,
- 0x34400d,
- 0x327f86,
- 0x2c1909,
- 0x23a2c5,
- 0x21e646,
- 0x3bdf08,
- 0x340645,
- 0x362c04,
- 0x270a85,
- 0x290f08,
- 0x2a9089,
- 0x2858c4,
- 0x2c4046,
- 0x28be0a,
- 0x3c7f08,
- 0x23e8c9,
- 0x2713ca,
- 0x355746,
- 0x2a7588,
- 0x2f4645,
- 0x29ba88,
- 0x2fc145,
- 0x213989,
- 0x346ac9,
- 0x235802,
- 0x275b85,
- 0x25fe86,
- 0x28a2c7,
- 0x37c4c5,
- 0x2fa6c6,
- 0x317d88,
- 0x2b9c46,
- 0x2d5f49,
- 0x2893c6,
- 0x295288,
- 0x2ee585,
- 0x3acec6,
- 0x27e248,
- 0x2905c8,
- 0x2ddbc8,
- 0x34a108,
- 0x3cd2c4,
- 0x201803,
- 0x2d6184,
- 0x28f886,
- 0x278844,
- 0x222587,
- 0x2dde89,
- 0x2d2e85,
- 0x20aec6,
- 0x223086,
- 0x2af30b,
- 0x2bf986,
- 0x2017c6,
- 0x3d4e08,
- 0x307446,
- 0x200ec3,
- 0x3cbac3,
- 0x2c9404,
- 0x22f845,
- 0x30d107,
- 0x285a48,
- 0x285a4f,
- 0x28c40b,
- 0x341988,
- 0x2c40c6,
- 0x341c8e,
- 0x226283,
- 0x30d084,
- 0x2bf905,
- 0x2bfd86,
- 0x29d4cb,
- 0x2a1546,
- 0x229f09,
- 0x28e045,
- 0x245788,
- 0x337988,
- 0x20f68c,
- 0x2acd46,
- 0x2d6986,
- 0x2ed6c5,
- 0x295848,
- 0x27e245,
- 0x368a08,
- 0x2a9c8a,
- 0x2ac149,
- 0x680384,
- 0x200742,
- 0x41a04502,
- 0x201382,
- 0x21f504,
- 0x202bc2,
- 0x21af04,
- 0x2015c2,
- 0x1ba03,
- 0x200342,
- 0x203582,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x24dd03,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x21c103,
- 0x201ac3,
- 0x2056c3,
- 0x2056c4,
- 0x22cc43,
- 0x236384,
- 0x232ec3,
- 0x2e4e84,
- 0x215e43,
- 0x37c787,
- 0x20e403,
- 0x21ba03,
- 0x244e08,
- 0x201ac3,
- 0x29d84b,
- 0x2fd603,
- 0x25d5c6,
- 0x202b82,
- 0x2f6fcb,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x201ac3,
- 0x209943,
- 0x22d1c3,
- 0x200742,
- 0xb2b48,
- 0x20ba85,
- 0x362e08,
- 0x3045c8,
- 0x204502,
- 0x32cd05,
- 0x3b6947,
- 0x201d42,
- 0x246047,
- 0x201382,
- 0x260cc7,
- 0x321749,
- 0x2f4208,
- 0x3bdc09,
- 0x20b3c2,
- 0x34b1c7,
- 0x233a84,
- 0x3b6a07,
- 0x385b07,
- 0x25f482,
- 0x20e403,
- 0x202c42,
- 0x2015c2,
- 0x200342,
- 0x2036c2,
- 0x200382,
- 0x203582,
- 0x2b6f85,
- 0x2a1085,
- 0x4502,
- 0x32ec3,
- 0x22cc43,
- 0x232ec3,
- 0x20d9c3,
- 0x215e43,
- 0x219203,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0xaac3,
- 0x781,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x213303,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0x2153c3,
- 0x44c77106,
- 0x75fc3,
- 0xd3ac5,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0xa502,
- 0xb2b48,
- 0x1ba03,
- 0x75003,
- 0x49844,
- 0xecc85,
- 0x200742,
- 0x3af1c4,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x247dc3,
- 0x22e005,
- 0x213303,
- 0x223643,
- 0x21c103,
- 0x252043,
- 0x201ac3,
- 0x203583,
- 0x205743,
- 0x202903,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x200742,
- 0x24dd03,
- 0x204502,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x21c103,
- 0x201ac3,
- 0x203582,
- 0xb2b48,
- 0x215e43,
- 0x75003,
- 0xb2b48,
- 0x75003,
- 0x2c3f43,
- 0x22cc43,
- 0x230484,
- 0x232ec3,
- 0x215e43,
- 0x205142,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x205142,
- 0x228c03,
- 0x21c103,
- 0x201ac3,
- 0x2f5d43,
- 0x203583,
- 0x200742,
- 0x204502,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x25d5c5,
- 0x15b286,
- 0x2056c4,
- 0x202b82,
- 0xb2b48,
- 0x200742,
- 0xfe4c5,
- 0x19c48,
- 0x81bc3,
- 0x204502,
- 0x49115c06,
- 0x7a44,
- 0xbdf8b,
- 0x3ad06,
- 0xe507,
- 0x232ec3,
- 0x4cf88,
- 0x4cf8b,
- 0x4d40b,
- 0x4da8b,
- 0x4ddcb,
- 0x4e08b,
- 0x4e4cb,
- 0x215e43,
- 0x13c2c5,
- 0x80144,
- 0x213d03,
- 0x55287,
- 0xe8044,
- 0x21c103,
- 0x563c6,
- 0x12ba04,
- 0x75003,
- 0x201ac3,
- 0x2ff404,
- 0x133507,
- 0x15ae89,
- 0xbdd48,
- 0x1b7d44,
- 0x107146,
- 0xa388,
- 0x7c305,
- 0x1cbc09,
- 0xfe4c5,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21ba03,
- 0x201ac3,
- 0x2fd603,
- 0x202b82,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21cc83,
- 0x221904,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x2e4e84,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x25d5c6,
- 0x232ec3,
- 0x215e43,
- 0x3f543,
- 0x75003,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0xfe4c5,
- 0xe507,
- 0xb2b48,
- 0x215e43,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x4be2cc43,
- 0x232ec3,
- 0x21c103,
- 0x201ac3,
- 0xb2b48,
- 0x200742,
- 0x204502,
- 0x22cc43,
- 0x215e43,
- 0x21c103,
- 0x200342,
- 0x201ac3,
- 0x347007,
- 0x33cd0b,
- 0x20b9c3,
- 0x2387c8,
- 0x3323c7,
+ 0x208fc3,
+ 0xb201a42,
+ 0x2ee503,
+ 0x20a94a,
+ 0xb6010c2,
+ 0x2dca05,
+ 0x2e0f4a,
+ 0x38b104,
+ 0x20b083,
+ 0x20b944,
+ 0x20c483,
+ 0x20c484,
+ 0x20c487,
+ 0x20db85,
+ 0x210d86,
0x211146,
- 0x2195c5,
- 0x32ce49,
- 0x20e188,
- 0x346049,
- 0x346050,
- 0x37e94b,
- 0x2f0149,
- 0x206103,
- 0x238a09,
- 0x231186,
- 0x23118c,
- 0x20bb48,
- 0x3d4ac8,
- 0x200289,
- 0x2c10ce,
- 0x32150b,
- 0x32d94c,
- 0x229a43,
- 0x29330c,
- 0x3bd049,
- 0x23fec7,
- 0x232e0c,
- 0x2bcbca,
- 0x24fc04,
- 0x36e80d,
- 0x2931c8,
- 0x3cc0cd,
- 0x3746c6,
- 0x2480cb,
- 0x35b009,
- 0x38aa87,
- 0x38e346,
- 0x377ac9,
- 0x38c04a,
- 0x327d08,
- 0x2fd204,
- 0x39a347,
- 0x2477c7,
- 0x206d04,
- 0x2eda84,
- 0x2081c9,
- 0x3c2709,
- 0x2183c8,
- 0x20a745,
- 0x20b305,
- 0x3cce86,
- 0x36e6c9,
- 0x262f4d,
- 0x257948,
- 0x3ccd87,
- 0x219648,
- 0x239d86,
- 0x23f804,
- 0x2b6385,
- 0x3b8286,
- 0x3bbdc4,
- 0x3bcf47,
- 0x3c054a,
- 0x20f5c4,
- 0x212086,
- 0x213609,
- 0x21360f,
- 0x213e4d,
- 0x214386,
- 0x219850,
- 0x219c46,
- 0x21a347,
- 0x21b087,
- 0x21b08f,
- 0x21bd49,
- 0x220f46,
- 0x223407,
- 0x223408,
- 0x223989,
- 0x28e108,
- 0x2f2107,
- 0x201843,
- 0x22cac6,
- 0x3ad7c8,
- 0x2c138a,
- 0x20ee09,
- 0x20e2c3,
- 0x32cc06,
- 0x26790a,
- 0x285647,
- 0x23fd0a,
- 0x31590e,
- 0x21be86,
- 0x275d87,
- 0x349986,
- 0x246bc6,
- 0x3c120b,
- 0x20b48a,
- 0x2d000d,
- 0x3b8647,
- 0x26bec8,
- 0x26bec9,
- 0x26becf,
- 0x31b80c,
- 0x272b09,
- 0x2dd5ce,
- 0x37c88a,
- 0x201546,
- 0x3d6dc6,
- 0x32aa8c,
- 0x34254c,
- 0x3490c8,
- 0x380347,
- 0x2ebe85,
- 0x228144,
- 0x20450e,
- 0x268584,
- 0x353487,
- 0x3d2d8a,
- 0x22bed4,
- 0x22c50f,
- 0x21b248,
- 0x22c988,
- 0x34cb0d,
- 0x34cb0e,
- 0x22cc49,
- 0x22e508,
- 0x22e50f,
- 0x232b0c,
- 0x232b0f,
- 0x2342c7,
- 0x236c8a,
- 0x24880b,
- 0x239748,
- 0x23b647,
- 0x26208d,
- 0x334746,
- 0x36e9c6,
- 0x2402c9,
- 0x271088,
- 0x2469c8,
- 0x2469ce,
- 0x33ce07,
- 0x248ac5,
- 0x249605,
- 0x208604,
- 0x211406,
- 0x2182c8,
- 0x209183,
- 0x2fdf4e,
- 0x262448,
- 0x2b0acb,
- 0x314907,
- 0x228c85,
- 0x293486,
- 0x2b8907,
- 0x37dc48,
- 0x259589,
- 0x230bc5,
- 0x2943c8,
- 0x223c86,
- 0x3c674a,
- 0x204409,
- 0x232ec9,
- 0x232ecb,
- 0x203108,
- 0x206bc9,
- 0x20a806,
- 0x38974a,
- 0x2e67ca,
- 0x236e8c,
- 0x31f087,
- 0x2f400a,
- 0x33530b,
- 0x335319,
- 0x322ac8,
- 0x25d645,
- 0x262246,
- 0x2a6209,
- 0x209806,
- 0x26a1ca,
- 0x20e386,
- 0x204b04,
- 0x2d4c0d,
- 0x204b07,
- 0x2215c9,
- 0x24c045,
- 0x24c488,
- 0x24cd49,
- 0x24f1c4,
- 0x24fb07,
- 0x24fb08,
- 0x24ff47,
- 0x26b388,
- 0x255d07,
- 0x22b285,
- 0x25cf4c,
- 0x25d7c9,
- 0x2e334a,
- 0x3aafc9,
- 0x238b09,
- 0x38a5cc,
- 0x26000b,
- 0x260fc8,
- 0x262848,
- 0x266904,
- 0x292808,
- 0x293a89,
- 0x2bcc87,
- 0x213846,
- 0x2a5d07,
- 0x29d0c9,
- 0x28658b,
- 0x27c187,
- 0x3d3907,
- 0x32e6c7,
- 0x3cc044,
- 0x3cc045,
- 0x2e4b85,
- 0x35f38b,
- 0x3b5ac4,
- 0x2f5748,
- 0x3011ca,
- 0x223d47,
- 0x299ec7,
- 0x29c912,
- 0x29db06,
- 0x22fac6,
- 0x26dbce,
- 0x29e746,
- 0x2a1d48,
- 0x2a220f,
- 0x3cc488,
- 0x3a7588,
- 0x357e4a,
- 0x357e51,
- 0x2aefce,
- 0x25a2ca,
- 0x25a2cc,
- 0x22e707,
- 0x22e710,
- 0x3b48c8,
- 0x2af1c5,
- 0x2b9a0a,
- 0x3bbe0c,
- 0x2c6a4d,
- 0x34b546,
- 0x34b547,
- 0x34b54c,
- 0x3a904c,
- 0x21330c,
- 0x2cf68b,
- 0x39eb44,
- 0x21bc04,
- 0x2bc489,
- 0x392647,
- 0x3a0049,
- 0x2e6609,
- 0x2bc887,
- 0x2bca46,
- 0x2bca49,
- 0x2bce43,
- 0x2b9d4a,
- 0x33ec47,
- 0x2077cb,
- 0x2cfe8a,
- 0x233b04,
- 0x352646,
- 0x28f909,
- 0x33e044,
- 0x36f1ca,
- 0x2c3745,
- 0x2c9805,
- 0x2c980d,
- 0x2c9b4e,
- 0x2d62c5,
- 0x3456c6,
- 0x25d1c7,
- 0x270e0a,
- 0x268886,
- 0x30f0c4,
- 0x30b647,
- 0x2e01cb,
- 0x26b087,
- 0x250744,
- 0x2924c6,
- 0x2924cd,
- 0x2e6c0c,
- 0x220446,
- 0x257b4a,
- 0x2740c6,
- 0x240948,
- 0x2302c7,
- 0x23eeca,
- 0x24c306,
- 0x28d403,
- 0x33c486,
- 0x3ad648,
- 0x2bc60a,
- 0x292dc7,
- 0x292dc8,
- 0x2dd284,
- 0x29bc07,
- 0x2d8f88,
- 0x2a6808,
- 0x2d2c08,
- 0x2f81ca,
- 0x2eb3c5,
- 0x2f11c7,
- 0x25a113,
- 0x271946,
- 0x21c688,
- 0x21ecc9,
- 0x245f08,
- 0x20510b,
- 0x3a8dc8,
- 0x293984,
- 0x2730c6,
- 0x325246,
- 0x357709,
- 0x3a2147,
- 0x25d048,
- 0x2a6986,
- 0x280ec4,
- 0x3a4c45,
- 0x2d9408,
- 0x288dca,
- 0x2d4888,
- 0x2da486,
- 0x2a778a,
- 0x2b4d48,
- 0x2df088,
- 0x2dfc48,
- 0x2e0706,
- 0x2e3906,
- 0x3a5d8c,
- 0x2e3e90,
- 0x2ba885,
- 0x319a48,
- 0x319a50,
- 0x3cc290,
- 0x345ece,
- 0x3a5a0e,
- 0x3a5a14,
- 0x3aa54f,
- 0x3aa906,
- 0x3d5bd1,
- 0x2032d3,
- 0x203748,
- 0x206dc5,
- 0x33d9c8,
- 0x354845,
- 0x38f00c,
- 0x2272c9,
- 0x227f89,
- 0x389c47,
- 0x315dc9,
- 0x269d87,
- 0x3097c6,
- 0x2b6187,
- 0x209f85,
- 0x20ab03,
- 0x209349,
- 0x24d749,
- 0x23f543,
- 0x37c3c4,
- 0x38cc8d,
- 0x32efcf,
- 0x280f05,
- 0x38b546,
- 0x21e047,
- 0x20b8c7,
- 0x383386,
- 0x38338b,
- 0x2afe85,
- 0x25e8c6,
- 0x30a487,
- 0x256889,
- 0x26ab86,
- 0x386205,
- 0x33fc8b,
- 0x34aec6,
- 0x3c1685,
- 0x2443c8,
- 0x29e508,
- 0x2b268c,
- 0x2b2690,
- 0x399189,
- 0x2bd687,
- 0x2ca0cb,
- 0x303206,
- 0x2f1fca,
- 0x2f2d0b,
- 0x2f344a,
- 0x2f36c6,
- 0x2f5c05,
- 0x3322c6,
- 0x289588,
- 0x389d0a,
- 0x34c79c,
- 0x2fd6cc,
- 0x2fd9c8,
- 0x25d5c5,
- 0x391887,
- 0x281a86,
- 0x277bc5,
- 0x215b86,
- 0x383548,
- 0x2c8a87,
- 0x2c0fc8,
- 0x271a0a,
- 0x21e14c,
- 0x348649,
- 0x3cd087,
- 0x2ca7c4,
- 0x2496c6,
- 0x3a710a,
- 0x2e6705,
- 0x22560c,
- 0x2296c8,
- 0x2b4fc8,
- 0x3543cc,
- 0x230ccc,
- 0x233649,
- 0x233887,
- 0x39118c,
- 0x222b44,
- 0x24fcca,
- 0x35c3cc,
- 0x25a58b,
- 0x25b6cb,
- 0x25e4c6,
- 0x266a87,
- 0x22e947,
- 0x22e94f,
- 0x30de11,
- 0x2e9b92,
- 0x2689cd,
- 0x2689ce,
- 0x268d0e,
- 0x3aa708,
- 0x3aa712,
- 0x272588,
- 0x21f307,
- 0x25298a,
- 0x2b3648,
- 0x29e705,
- 0x3a31ca,
- 0x219fc7,
- 0x2fe284,
- 0x21b7c3,
- 0x2368c5,
- 0x3580c7,
- 0x30e947,
- 0x2c6c4e,
- 0x35cbcd,
- 0x35d209,
- 0x23c5c5,
- 0x37a943,
- 0x3c2d86,
- 0x25eec5,
- 0x2b0d08,
- 0x2c59c9,
- 0x262285,
- 0x26228f,
- 0x2be087,
- 0x219445,
- 0x3152ca,
- 0x3b7a06,
- 0x35fd89,
- 0x3bab4c,
- 0x308889,
- 0x3c0f46,
- 0x300fcc,
- 0x344ac6,
- 0x30b1c8,
- 0x30b806,
- 0x322c46,
- 0x2bfb04,
- 0x320b43,
- 0x2c858a,
- 0x32e9d1,
- 0x278cca,
- 0x28b4c5,
- 0x3b7207,
- 0x25a947,
- 0x2d9084,
- 0x2d908b,
- 0x3bda88,
- 0x2c70c6,
- 0x231845,
- 0x330184,
- 0x249389,
- 0x204344,
- 0x246807,
- 0x3caa05,
- 0x3caa07,
- 0x26de05,
- 0x36e0c3,
- 0x21f1c8,
- 0x351b0a,
- 0x208a43,
- 0x20baca,
- 0x3c78c6,
- 0x26200f,
- 0x3ce589,
- 0x2fded0,
- 0x302f88,
- 0x2db389,
- 0x2a2047,
- 0x29244f,
- 0x355b84,
- 0x2e4f04,
- 0x207146,
- 0x3ac406,
- 0x286a8a,
- 0x2633c6,
- 0x39f887,
- 0x316248,
- 0x316447,
- 0x317b47,
- 0x318b0a,
- 0x31d14b,
- 0x378185,
- 0x2e97c8,
- 0x2076c3,
- 0x3a85cc,
- 0x35048f,
- 0x2ebc8d,
- 0x25dc07,
- 0x35d349,
- 0x229cc7,
- 0x2425c8,
- 0x22c0cc,
- 0x293888,
- 0x2768c8,
- 0x334ace,
- 0x34f154,
- 0x34f664,
- 0x36708a,
- 0x37edcb,
- 0x269e44,
- 0x269e49,
- 0x2ec688,
- 0x249dc5,
- 0x208c8a,
- 0x262687,
- 0x3321c4,
- 0x24dd03,
- 0x22cc43,
- 0x236384,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x213303,
- 0x20e403,
- 0x2e3e86,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x214903,
- 0x200742,
- 0x24dd03,
- 0x204502,
- 0x22cc43,
- 0x236384,
- 0x232ec3,
- 0x215e43,
- 0x213303,
- 0x2e3e86,
- 0x21c103,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x200742,
- 0x250bc3,
- 0x204502,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x205382,
- 0x20ecc2,
- 0x204502,
- 0x22cc43,
- 0x205fc2,
- 0x201582,
- 0x21f504,
- 0x21af04,
- 0x237d02,
- 0x221904,
- 0x200342,
- 0x201ac3,
- 0x214903,
- 0x25e4c6,
- 0x25efc2,
- 0x201882,
- 0x21ffc2,
- 0x4e615d03,
- 0x4ea2e703,
- 0x5b286,
- 0x5b286,
- 0x2056c4,
- 0x21ba03,
- 0x1814a,
- 0x8740c,
- 0x1ad8c,
- 0xd38cd,
- 0xfe4c5,
- 0x992cc,
- 0x163b47,
- 0x10506,
- 0x14508,
- 0x17c07,
- 0x1d3c8,
- 0x16feca,
- 0x10bb07,
- 0x4f699505,
- 0xe59c9,
- 0x353cb,
- 0xeb4b,
- 0x1b2b88,
- 0x59209,
- 0x1af8ca,
- 0x16e8e,
- 0x14008d,
- 0x1445d0b,
- 0xe6aca,
- 0x7a44,
- 0x5ea06,
- 0x1b8dc8,
- 0x97fc8,
- 0x35687,
- 0xcd45,
- 0x134287,
- 0x4ba49,
- 0x13e0c7,
- 0x5c248,
- 0x1077c9,
- 0x500c4,
- 0x57fc5,
- 0x190e,
- 0xee5cd,
- 0xe388,
- 0x4fa96f06,
- 0x505773c8,
- 0x823c8,
- 0x147210,
- 0x5884c,
- 0x67607,
- 0x68447,
- 0x70cc7,
- 0x774c7,
- 0x1282,
- 0x2147,
- 0xb64c,
- 0x54c5,
- 0x7ec07,
- 0xb2546,
- 0xb3a89,
- 0xb5508,
- 0x58e82,
- 0x1582,
- 0x1922c6,
- 0x137b4b,
- 0x137e46,
- 0x148f07,
- 0x3a3c9,
- 0x7acc9,
- 0x43448,
- 0x4e2c2,
- 0x197009,
- 0x116e4a,
- 0x2bc6,
- 0xd7ac9,
- 0xe6a47,
- 0xe7189,
- 0xe9108,
- 0xea047,
- 0xeb349,
- 0xef505,
- 0xef890,
- 0xfeb06,
- 0x148e45,
- 0x174407,
- 0x1cfa0d,
- 0x442c5,
- 0x2b806,
- 0xf7407,
- 0xff418,
- 0x13e448,
- 0x29ca,
- 0x1202,
- 0x5b48a,
- 0x7614d,
- 0xc02,
- 0xdc886,
- 0x52188,
- 0x4ed08,
- 0x74949,
- 0x116bc8,
- 0x84b8e,
- 0x74b88,
- 0x1c2d87,
- 0x11158d,
- 0x106545,
- 0x1ec8,
- 0x1abfc8,
- 0x111b86,
- 0x73c2,
- 0x33506,
- 0x107146,
- 0x74c2,
- 0x2c1,
- 0x60987,
- 0x4e803,
- 0x4feffc84,
- 0x502a2fc3,
- 0x101,
- 0x12686,
- 0x101,
- 0x301,
- 0x12686,
- 0x4e803,
- 0x158fb45,
- 0x4502,
- 0x24fc04,
- 0x22cc43,
- 0x251344,
- 0x21f504,
- 0x21c103,
- 0x21eb85,
- 0x2153c3,
- 0x202ac3,
- 0x383305,
- 0x202903,
- 0x5162cc43,
- 0x232ec3,
- 0x215e43,
- 0x200541,
- 0x20e403,
- 0x21af04,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x203583,
- 0xb2b48,
- 0x200742,
- 0x24dd03,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x201582,
- 0x21f504,
- 0x213303,
- 0x20e403,
- 0x21c103,
- 0x21ba03,
- 0x201ac3,
- 0x202903,
- 0xb2b48,
- 0x123607,
- 0x4502,
- 0x1a4bc5,
- 0x5898f,
- 0x14975c8,
- 0x11754e,
- 0x52625f82,
- 0x331948,
- 0x226406,
- 0x2d08c6,
- 0x225d87,
- 0x52a06d42,
- 0x52fce408,
- 0x20d54a,
- 0x267088,
- 0x200602,
- 0x33ea89,
- 0x3781c7,
- 0x2137c6,
- 0x21ef09,
- 0x2f1304,
- 0x211046,
- 0x2d0cc4,
- 0x26fe04,
- 0x25cb49,
- 0x30bfc6,
- 0x2f1b05,
- 0x287dc5,
- 0x22dd47,
- 0x2cc807,
- 0x29dd44,
- 0x225fc6,
- 0x300845,
- 0x2cf985,
- 0x31ea05,
- 0x298147,
- 0x314745,
- 0x24d1c9,
- 0x38ebc5,
- 0x37dd84,
- 0x2687c7,
- 0x26eb4e,
- 0x27fa09,
- 0x26da89,
- 0x333986,
- 0x241a08,
- 0x2eee8b,
- 0x3738cc,
- 0x356dc6,
- 0x32d807,
- 0x2bea45,
- 0x2eda8a,
- 0x2184c9,
- 0x399889,
- 0x26f6c6,
- 0x30a245,
- 0x249985,
- 0x34ac49,
- 0x31eb8b,
- 0x2847c6,
- 0x35a686,
- 0x2049c4,
- 0x29c5c6,
- 0x248b48,
- 0x3ad4c6,
- 0x323d06,
- 0x3beb08,
- 0x3c0d47,
- 0x3c24c9,
- 0x3c3485,
- 0xb2b48,
- 0x3c9644,
- 0x3180c4,
- 0x20b185,
- 0x34dcc9,
- 0x21dd07,
- 0x21dd0b,
- 0x2208ca,
- 0x227205,
- 0x53201842,
- 0x2cfd47,
- 0x53627d48,
- 0x2cba87,
- 0x227745,
- 0x390e8a,
- 0x4502,
- 0x287a8b,
- 0x28c64a,
- 0x24d646,
- 0x20a403,
- 0x2b8b8d,
- 0x38b88c,
- 0x3369cd,
- 0x28d785,
- 0x340985,
- 0x2091c7,
- 0x34cf49,
- 0x20d446,
- 0x263245,
- 0x2f2b08,
- 0x29c4c3,
- 0x3048c8,
- 0x29c4c8,
- 0x2d19c7,
- 0x38de48,
- 0x26d389,
- 0x2dbe07,
- 0x33c887,
- 0x33e908,
- 0x309f84,
- 0x309f87,
- 0x3745c8,
- 0x367786,
- 0x35278f,
- 0x228787,
- 0x36d906,
- 0x2339c5,
- 0x220143,
- 0x24b1c7,
- 0x388a43,
- 0x250306,
- 0x252686,
- 0x253046,
- 0x2a0b05,
- 0x26b383,
- 0x396c88,
- 0x38d909,
- 0x39d6cb,
- 0x2531c8,
- 0x2559c5,
- 0x257105,
- 0x53a33bc2,
- 0x2b6249,
- 0x21f587,
- 0x25e945,
- 0x25ca47,
- 0x25e0c6,
- 0x382f05,
- 0x25ed0b,
- 0x260fc4,
- 0x266c45,
- 0x266d87,
- 0x284146,
- 0x284585,
- 0x292a07,
- 0x293607,
- 0x2e8444,
- 0x2990ca,
- 0x299cc8,
- 0x2f46c9,
- 0x33dd05,
- 0x3740c6,
- 0x248d0a,
- 0x287cc6,
- 0x26ba07,
- 0x2f438d,
- 0x2af9c9,
- 0x32fa45,
- 0x26ef47,
- 0x33f648,
- 0x27e008,
- 0x3a93c7,
- 0x3b2e46,
- 0x223ec7,
- 0x255443,
- 0x30bf44,
- 0x3809c5,
- 0x3a9c47,
- 0x3aebc9,
- 0x273c88,
- 0x22c385,
- 0x24f0c4,
- 0x24d945,
- 0x25338d,
- 0x203602,
- 0x274246,
- 0x2dc7c6,
- 0x31888a,
- 0x39c5c6,
- 0x3a7045,
- 0x321f45,
- 0x321f47,
- 0x3c658c,
- 0x28224a,
- 0x29c286,
- 0x2e3805,
- 0x29c406,
- 0x29c747,
- 0x29ea06,
- 0x2a0a0c,
- 0x21f049,
- 0x53e12b07,
- 0x2a25c5,
- 0x2a25c6,
- 0x2a2a48,
- 0x24eb45,
- 0x2b0785,
- 0x2b1b48,
- 0x2b1d4a,
- 0x542882c2,
- 0x546783c2,
- 0x31a1c5,
- 0x278843,
- 0x273648,
- 0x25e283,
- 0x2b1fc4,
- 0x35fecb,
- 0x3bf088,
- 0x320448,
- 0x54a7e649,
- 0x2b6c89,
- 0x2b73c6,
- 0x2b8588,
- 0x2b8789,
- 0x2ba406,
- 0x2ba585,
- 0x24b846,
- 0x2baa89,
- 0x2c31c7,
- 0x3acd86,
- 0x21a187,
- 0x207b87,
- 0x226b44,
- 0x54f3e749,
- 0x277e08,
- 0x3ce308,
- 0x281107,
- 0x2d4346,
- 0x337249,
- 0x2d0f87,
- 0x27c98a,
- 0x351e88,
- 0x3b74c7,
- 0x211f06,
- 0x37420a,
- 0x241108,
- 0x2dc245,
- 0x225105,
- 0x351047,
- 0x30fb49,
- 0x31550b,
- 0x330708,
- 0x38ec49,
- 0x253a87,
- 0x2c484c,
- 0x2c504c,
- 0x2c534a,
- 0x2c55cc,
- 0x2d0848,
- 0x2d0a48,
- 0x2d0c44,
- 0x2d1149,
- 0x2d1389,
- 0x2d15ca,
- 0x2d1849,
- 0x2d1b87,
- 0x39d00c,
- 0x235dc6,
- 0x2f3d48,
- 0x287d86,
- 0x3a3006,
- 0x32f947,
- 0x3377c8,
- 0x321b0b,
- 0x2cb947,
- 0x25c809,
- 0x2b6449,
- 0x3b7347,
- 0x23e6c4,
- 0x262b47,
- 0x30c646,
- 0x210f46,
- 0x257d05,
- 0x2d7c88,
- 0x315cc4,
- 0x315cc6,
- 0x28210b,
- 0x2ba049,
- 0x239e46,
- 0x323f09,
- 0x20b246,
- 0x288fc8,
- 0x21c843,
- 0x30a3c5,
- 0x220b09,
- 0x223745,
- 0x350e84,
- 0x2835c6,
- 0x236245,
- 0x258bc6,
- 0x31d4c7,
- 0x335206,
- 0x30c94b,
- 0x389647,
- 0x38ad46,
- 0x230186,
- 0x22de06,
- 0x29dd09,
- 0x2f9a0a,
- 0x2c73c5,
- 0x21c2cd,
- 0x2b1e46,
- 0x3013c6,
- 0x2fddc6,
- 0x2408c5,
- 0x2efb87,
- 0x228f47,
- 0x27b24e,
- 0x20e403,
- 0x2d4309,
- 0x3488c9,
- 0x2ede87,
- 0x272247,
- 0x2a8d05,
- 0x310145,
- 0x5520830f,
- 0x2db5c7,
- 0x2db788,
- 0x2dbb44,
- 0x2dc106,
- 0x55649682,
- 0x2e0986,
- 0x2e3e86,
- 0x348a8e,
- 0x30470a,
- 0x3cec06,
- 0x2ca90a,
- 0x3367c9,
- 0x2fb605,
- 0x303408,
- 0x310606,
- 0x2a9708,
- 0x38e4c8,
- 0x22bc0b,
- 0x225e85,
- 0x3147c8,
- 0x3bec4c,
- 0x227607,
- 0x2528c6,
- 0x323ac8,
- 0x2112c8,
- 0x55a4ffc2,
- 0x3c368b,
- 0x299989,
- 0x217f89,
- 0x3380c7,
- 0x3c14c8,
- 0x55e0ca88,
- 0x205f0b,
- 0x2432c9,
- 0x29018d,
- 0x336d88,
- 0x365448,
- 0x562052c2,
- 0x26d9c4,
- 0x5662e8c2,
- 0x308586,
- 0x56a08802,
- 0x2fb40a,
- 0x337686,
- 0x26a5c8,
- 0x26f888,
- 0x22a5c6,
- 0x32dd06,
- 0x302d06,
- 0x2b0c85,
- 0x23a7c4,
- 0x56e38344,
- 0x360646,
- 0x2bd247,
- 0x57256487,
- 0x2ee38b,
- 0x2cbc89,
- 0x3409ca,
- 0x322084,
- 0x33c708,
- 0x3acb4d,
- 0x2fba89,
- 0x2fbcc8,
- 0x2fbf49,
- 0x2ff404,
- 0x2486c4,
- 0x3a0dc5,
- 0x33b48b,
- 0x3bf006,
- 0x360485,
- 0x27da89,
- 0x226088,
- 0x2384c4,
- 0x2edc09,
- 0x31abc5,
- 0x2cc848,
- 0x33cf47,
- 0x26de88,
- 0x28fb06,
- 0x35c0c7,
- 0x2e7e09,
- 0x33fe09,
- 0x3c1705,
- 0x24a7c5,
- 0x57607942,
- 0x37db44,
- 0x20b045,
- 0x225c86,
- 0x382505,
- 0x30d3c7,
- 0x2e8bc5,
- 0x284184,
- 0x333a46,
- 0x2632c7,
- 0x22d086,
- 0x324e85,
- 0x21f9c8,
- 0x226605,
- 0x2235c7,
- 0x363cc9,
- 0x2ba18a,
- 0x31b287,
- 0x31b28c,
- 0x2f1ac6,
- 0x24eec9,
- 0x24b6c5,
- 0x24ea88,
- 0x20a7c3,
- 0x20a7c5,
- 0x30c305,
- 0x39c1c7,
- 0x57a0c502,
- 0x2f6b47,
- 0x2f3806,
- 0x30eec6,
- 0x300c06,
- 0x211206,
- 0x31ae48,
- 0x33db05,
- 0x36d9c7,
- 0x36d9cd,
- 0x21b7c3,
- 0x21b7c5,
- 0x315087,
- 0x2f6e88,
- 0x314c45,
- 0x214b48,
- 0x39ff46,
- 0x2e5b87,
- 0x2d3045,
- 0x225f06,
- 0x3af245,
- 0x20d20a,
- 0x35f906,
- 0x279587,
- 0x2dba05,
- 0x3086c7,
- 0x30b5c4,
- 0x350e06,
- 0x310545,
- 0x20bfcb,
- 0x30c4c9,
- 0x250cca,
- 0x3c1788,
- 0x313248,
- 0x31c88c,
- 0x31df47,
- 0x341788,
- 0x346408,
- 0x357605,
- 0x3678ca,
- 0x37a949,
- 0x57e02482,
- 0x3d3706,
- 0x262284,
- 0x324789,
- 0x283b09,
- 0x2a34c7,
- 0x330d07,
- 0x2e6489,
- 0x2f83c8,
- 0x2f83cf,
- 0x2248c6,
- 0x2e568b,
- 0x26b705,
- 0x26b707,
- 0x3aab49,
- 0x2edb86,
- 0x2edb87,
- 0x2e9f05,
- 0x230ac4,
- 0x23bd06,
- 0x2161c4,
- 0x234cc7,
- 0x2c1cc8,
- 0x5830a148,
- 0x30ab05,
- 0x30ac47,
- 0x31bcc9,
- 0x21e644,
- 0x243e88,
- 0x58672cc8,
- 0x2d9084,
- 0x312c88,
- 0x38e404,
- 0x216089,
- 0x21c5c5,
- 0x58a02b82,
- 0x224905,
- 0x2de445,
- 0x2048c8,
- 0x234107,
- 0x58e04342,
- 0x238485,
- 0x2def06,
- 0x245186,
- 0x37db08,
- 0x37ebc8,
- 0x3824c6,
- 0x3924c6,
- 0x3236c9,
- 0x30ee06,
- 0x33440b,
- 0x38fa85,
- 0x2b3586,
- 0x2593c8,
- 0x29fcc6,
- 0x22ce06,
- 0x21500a,
- 0x2b704a,
- 0x253685,
- 0x33dbc7,
- 0x2fa4c6,
- 0x59206e42,
- 0x3151c7,
- 0x2604c5,
- 0x248c84,
- 0x248c85,
- 0x33c606,
- 0x27a487,
- 0x207145,
- 0x283bc4,
- 0x2eae88,
- 0x22cec5,
- 0x3d0647,
- 0x311d05,
- 0x20d145,
- 0x23da44,
- 0x23da49,
- 0x300688,
- 0x305086,
- 0x317006,
- 0x202406,
- 0x59711e48,
- 0x312047,
- 0x31274d,
- 0x31344c,
- 0x313a49,
- 0x313c89,
- 0x59b78c02,
- 0x3ce0c3,
- 0x253703,
- 0x30c705,
- 0x3a9d4a,
- 0x349e46,
- 0x318445,
- 0x31d684,
- 0x31d68b,
- 0x338b4c,
- 0x339bcc,
- 0x339ed5,
- 0x3403cd,
- 0x34284f,
- 0x342c12,
- 0x34308f,
- 0x343452,
- 0x3438d3,
- 0x343d8d,
- 0x34434d,
- 0x3446ce,
- 0x344c4e,
- 0x34548c,
- 0x34584c,
- 0x345c8b,
- 0x346d0e,
- 0x347612,
- 0x349c0c,
- 0x34a310,
- 0x354b52,
- 0x355d4c,
- 0x35640d,
- 0x35674c,
- 0x359951,
- 0x35a80d,
- 0x35d58d,
- 0x35db8a,
- 0x35de0c,
- 0x35f14c,
- 0x36018c,
- 0x360b4c,
- 0x363f13,
- 0x364690,
- 0x364a90,
- 0x36564d,
- 0x365c4c,
- 0x366dc9,
- 0x36908d,
- 0x3693d3,
- 0x369e91,
- 0x36a2d3,
- 0x36ae8f,
- 0x36b24c,
- 0x36b54f,
- 0x36b90d,
- 0x36bf0f,
- 0x36c2d0,
- 0x36cd4e,
- 0x37050e,
- 0x370a90,
- 0x37168d,
- 0x37200e,
- 0x37238c,
- 0x373353,
- 0x375c4e,
- 0x3762d0,
- 0x3766d1,
- 0x376b0f,
- 0x376ed3,
- 0x37878d,
- 0x378acf,
- 0x378e8e,
- 0x379550,
- 0x379949,
- 0x37ab90,
- 0x37b18f,
- 0x37b80f,
- 0x37bbd2,
- 0x37cd8e,
- 0x37d78d,
- 0x37e30d,
- 0x37e64d,
- 0x37f64d,
- 0x37f98d,
- 0x37fcd0,
- 0x3800cb,
- 0x38078c,
- 0x380b0c,
- 0x38110c,
- 0x38140e,
- 0x391c90,
- 0x393712,
- 0x393b8b,
- 0x393ece,
- 0x39424e,
- 0x394ace,
- 0x394f4b,
- 0x59f95456,
- 0x395c4d,
- 0x3967d4,
- 0x39754d,
- 0x3993d5,
- 0x39a8cd,
- 0x39b24f,
- 0x39b8cf,
- 0x39d98f,
- 0x39dd4e,
- 0x39e2cd,
- 0x3a0591,
- 0x3a27cc,
- 0x3a2acc,
- 0x3a2dcb,
- 0x3a354c,
- 0x3a3ccf,
- 0x3a4092,
- 0x3a468d,
- 0x3a578c,
- 0x3a608c,
- 0x3a638d,
- 0x3a66cf,
- 0x3a6a8e,
- 0x3a9a0c,
- 0x3a9fcd,
- 0x3aa30b,
- 0x3aad8c,
- 0x3ab68d,
- 0x3ab9ce,
- 0x3abd49,
- 0x3ad053,
- 0x3adc8d,
- 0x3ae38d,
- 0x3ae98c,
- 0x3aee0e,
- 0x3afc4f,
- 0x3b000c,
- 0x3b030d,
- 0x3b064f,
- 0x3b0a0c,
- 0x3b100c,
- 0x3b138c,
- 0x3b168c,
- 0x3b1d4d,
- 0x3b2092,
- 0x3b320c,
- 0x3b350c,
- 0x3b3811,
- 0x3b3c4f,
- 0x3b400f,
- 0x3b43d3,
- 0x3b514e,
- 0x3b54cf,
- 0x3b588c,
- 0x5a3b5bce,
- 0x3b5f4f,
- 0x3b6316,
- 0x3b7e52,
- 0x3ba34c,
- 0x3bae4f,
- 0x3bb4cd,
- 0x3c3d8f,
- 0x3c414c,
- 0x3c444d,
- 0x3c478d,
- 0x3c70ce,
- 0x3c870c,
- 0x3cabcc,
- 0x3caed0,
- 0x3cd451,
- 0x3cd88b,
- 0x3cdccc,
- 0x3cdfce,
- 0x3d0ed1,
- 0x3d130e,
- 0x3d168d,
- 0x3d598b,
- 0x3d648f,
- 0x3d7094,
- 0x24cc42,
- 0x24cc42,
- 0x225e83,
- 0x24cc42,
- 0x225e83,
- 0x24cc42,
- 0x2013c2,
- 0x24b885,
- 0x3d0bcc,
- 0x24cc42,
- 0x24cc42,
- 0x2013c2,
- 0x24cc42,
- 0x2a30c5,
- 0x2ba185,
- 0x24cc42,
- 0x24cc42,
- 0x200302,
- 0x2a30c5,
- 0x340c49,
- 0x369b8c,
- 0x24cc42,
- 0x24cc42,
- 0x24cc42,
- 0x24cc42,
- 0x24b885,
- 0x24cc42,
- 0x24cc42,
- 0x24cc42,
- 0x24cc42,
- 0x200302,
- 0x340c49,
- 0x24cc42,
- 0x24cc42,
- 0x24cc42,
- 0x2ba185,
- 0x24cc42,
- 0x2ba185,
- 0x369b8c,
- 0x3d0bcc,
- 0x24dd03,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x21c103,
- 0x201ac3,
- 0x4bc8,
- 0x730c4,
- 0x1ba03,
- 0x1d5308,
- 0x200742,
- 0x5b204502,
- 0x2437c3,
- 0x243544,
- 0x212503,
- 0x3b7c84,
- 0x22fac6,
- 0x2103c3,
- 0x309b84,
- 0x2d6d45,
- 0x20e403,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0x21a70a,
- 0x25e4c6,
- 0x3945cc,
- 0xb2b48,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x228c03,
- 0x2e3e86,
- 0x21c103,
- 0x201ac3,
- 0x214903,
- 0xb31c8,
- 0xfe4c5,
- 0xec89,
- 0x9682,
- 0x5c7c7b05,
- 0xfe4c5,
- 0x163b47,
- 0x74a88,
- 0x1d754e,
- 0x95e52,
- 0x13ed8b,
- 0x10bc06,
- 0x5ca99505,
- 0x5ce9950c,
- 0x18dc7,
- 0x9a6c7,
- 0xf530a,
- 0x3cd10,
- 0x7d05,
- 0xbdf8b,
- 0x97fc8,
- 0x35687,
- 0x1c96cb,
- 0x4ba49,
- 0x885c7,
- 0x13e0c7,
- 0x84a07,
- 0x355c6,
- 0x5c248,
- 0x5d428906,
- 0x4ec47,
- 0xee5cd,
- 0xf4cd0,
- 0x5d810ac2,
- 0xe388,
- 0x42750,
- 0x190acc,
- 0x5df9170d,
- 0x5f1c8,
- 0x5f64b,
- 0x71807,
- 0x3e409,
- 0x5b346,
- 0xa2c48,
- 0x5fec2,
- 0xad5ca,
- 0x6a947,
- 0x7ec07,
- 0xb3a89,
- 0xb5508,
- 0x13c2c5,
- 0x1922c6,
- 0x137e46,
- 0xfd28e,
- 0x38f8e,
- 0x14984f,
- 0x3a3c9,
- 0x7acc9,
- 0x9ab4b,
- 0xb118f,
- 0x16828c,
- 0xc4d8b,
- 0xe3288,
- 0x14e5c7,
- 0x16d508,
- 0x19a14b,
- 0x19f64c,
- 0x1a38cc,
- 0xbb74c,
- 0xbba4d,
- 0x43448,
- 0xf6782,
- 0x197009,
- 0x15fc08,
- 0x17110b,
- 0xd4546,
- 0xde88b,
- 0x14714b,
- 0xe964a,
- 0xea205,
- 0xef890,
- 0xf1c46,
- 0x6cd06,
- 0x148e45,
- 0x174407,
- 0x1c5008,
- 0xf7407,
- 0xf76c7,
- 0x10a947,
- 0x1083ca,
- 0xb29ca,
- 0xdc886,
- 0xa16cd,
- 0x4ed08,
- 0x116bc8,
- 0xcb0c9,
- 0xc3a05,
- 0x107f0c,
- 0xbbc4b,
- 0x10fa84,
- 0x111949,
- 0x111b86,
- 0x50186,
- 0x121906,
- 0x1882,
- 0x107146,
- 0x290b,
- 0x11ddc7,
- 0x74c2,
- 0xd6685,
- 0x72cc4,
- 0x781,
- 0x68cc3,
- 0x5d278a06,
- 0xa2fc3,
- 0x1382,
- 0x6304,
- 0x602,
- 0x56c4,
- 0x1782,
- 0x3782,
- 0xf02,
- 0x129902,
- 0x5382,
- 0x99502,
- 0xd82,
- 0x192ac2,
- 0x36f02,
- 0x1482,
- 0x46c2,
- 0x979c2,
- 0x32ec3,
- 0x43c2,
- 0x1d42,
- 0x1cd02,
- 0xc542,
- 0x40c2,
- 0x31242,
- 0x58e82,
- 0x1d02,
- 0xd282,
- 0x1582,
- 0x13303,
- 0xbc2,
- 0x2282,
- 0x4e2c2,
- 0x53a82,
- 0x8242,
- 0xd642,
- 0x8ec2,
- 0x75d42,
- 0x2bc2,
- 0x7f742,
- 0x728c2,
- 0x9f502,
- 0x1c103,
- 0x1a02,
- 0x4ffc2,
- 0x2fc2,
- 0x7482,
- 0x1c1685,
- 0xa482,
- 0x31c2,
- 0x40203,
- 0x4102,
- 0x1202,
- 0xc02,
- 0xfd02,
- 0x11202,
- 0x4342,
- 0x73c2,
- 0x1882,
- 0xe585,
- 0x5e2013c2,
- 0x5e720f83,
- 0x3643,
- 0x5ea013c2,
- 0x3643,
- 0x8ef87,
- 0x200943,
- 0x200742,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x2019c3,
- 0x228c03,
- 0x21c103,
- 0x21ba03,
- 0x201ac3,
- 0x2a3003,
- 0x8783,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x20e403,
- 0x21c103,
- 0x21ba03,
- 0x75003,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x200541,
- 0x20e403,
- 0x21c103,
- 0x252043,
- 0x201ac3,
- 0xa204,
- 0x24dd03,
- 0x22cc43,
- 0x232ec3,
+ 0x212103,
+ 0x215e08,
0x20e383,
- 0x21fe83,
- 0x252083,
- 0x23fc43,
- 0x2b6003,
- 0x201383,
- 0x215e43,
- 0x21f504,
- 0x21c103,
- 0x201ac3,
- 0x202903,
- 0x2068c4,
- 0x253583,
- 0x29a43,
- 0x3ad5c3,
- 0x330048,
- 0x32cac4,
- 0x203c8a,
- 0x239bc6,
- 0x122a44,
- 0x369847,
- 0x21b38a,
- 0x224789,
- 0x395987,
- 0x3a7d4a,
- 0x24dd03,
- 0x31a24b,
- 0x2012c9,
- 0x2d8e85,
- 0x201cc7,
- 0x4502,
- 0x22cc43,
- 0x212dc7,
- 0x279805,
- 0x2d0dc9,
- 0x232ec3,
- 0x321346,
- 0x2ce783,
- 0xf3883,
- 0x11cc86,
- 0x9546,
- 0x10347,
- 0x220d06,
- 0x229e45,
- 0x3c3547,
- 0x317987,
- 0x61215e43,
- 0x355f87,
- 0x321a03,
- 0x246e05,
- 0x21f504,
- 0x275508,
- 0x37d48c,
- 0x2bd405,
- 0x2afb46,
- 0x212c87,
- 0x3cd147,
- 0x243607,
- 0x253788,
- 0x318f8f,
- 0x2249c5,
- 0x2438c7,
- 0x3bf787,
- 0x2b210a,
- 0x2f2949,
- 0x31cdc5,
- 0x31ffca,
- 0x81446,
- 0xc3ec7,
- 0x2ce805,
- 0x393dc4,
- 0x26f7c6,
- 0xeb8c6,
- 0x390d47,
- 0x2f6687,
- 0x38e008,
- 0x21c845,
- 0x279706,
- 0x73348,
- 0x323c85,
- 0x123e46,
- 0x234e45,
- 0x274004,
- 0x22a4c7,
- 0x31ac8a,
- 0x23c2c8,
- 0x3793c6,
- 0x28c03,
- 0x2eb3c5,
- 0x353646,
- 0x39d246,
- 0x348d46,
- 0x20e403,
- 0x3a4907,
- 0x3bf705,
- 0x21c103,
- 0x2e990d,
- 0x21ba03,
- 0x38e108,
- 0x37c444,
- 0x284445,
- 0x2b2006,
- 0x32b786,
- 0x2b3487,
- 0x2b6047,
- 0x298845,
- 0x201ac3,
- 0x34e6c7,
- 0x23e589,
- 0x26cf49,
- 0x3cbd8a,
- 0x247502,
- 0x246dc4,
- 0x2f1ec4,
- 0x2f6547,
- 0x2f6a08,
- 0x2f8d49,
- 0x21b689,
- 0x2f9c87,
- 0x105fc9,
- 0x33a8c6,
- 0xfd006,
- 0x2ff404,
- 0x2ffa0a,
- 0x302248,
- 0x302bc9,
- 0x3ac686,
- 0x2c0085,
- 0x23c188,
- 0x2d498a,
- 0x27be03,
- 0x206a46,
- 0x2f9d87,
- 0x22f445,
- 0x37c305,
- 0x25d6c3,
- 0x2769c4,
- 0x2250c5,
- 0x293707,
- 0x3007c5,
- 0x30f386,
- 0x1121c5,
- 0x291443,
- 0x3cecc9,
- 0x28420c,
- 0x2c278c,
- 0x2de688,
- 0x2b1007,
- 0x30b988,
- 0x10cec7,
- 0x30d58a,
- 0x30dc4b,
- 0x201408,
- 0x32b888,
- 0x235cc6,
- 0x2022c5,
- 0x202f0a,
- 0x320fc5,
- 0x202b82,
- 0x2d2f07,
- 0x252346,
- 0x37a305,
- 0x30fd89,
- 0x38f385,
- 0x3893c5,
- 0x38f789,
- 0x353586,
- 0x3a8448,
- 0x246ec3,
- 0x20ab86,
- 0x283506,
- 0x31fdc5,
- 0x31fdc9,
- 0x2f9489,
- 0x28ba47,
- 0x11fc44,
- 0x31fc47,
- 0x21b589,
- 0x236045,
- 0x3a8c8,
- 0x33f3c5,
- 0x3779c5,
- 0x27d2c9,
- 0x203642,
- 0x3cf5c4,
- 0x200d42,
- 0x200bc2,
- 0x2e1285,
- 0x3227c8,
- 0x2c3945,
- 0x2d1d43,
- 0x2d1d45,
- 0x2e0b83,
- 0x20a342,
- 0x328a04,
- 0x2b4cc3,
- 0x208702,
- 0x38b344,
- 0x2f2443,
- 0x202e42,
- 0x2c39c3,
- 0x30c284,
- 0x303183,
- 0x260c44,
- 0x208a82,
- 0x214803,
- 0x220c43,
- 0x204f42,
- 0x27dd02,
- 0x2f92c9,
- 0x201142,
- 0x296984,
- 0x200442,
- 0x23c004,
- 0x33a884,
- 0x202dc4,
- 0x201882,
- 0x235902,
- 0x233803,
- 0x287303,
- 0x234f44,
- 0x24a104,
- 0x2da5c4,
- 0x2f9684,
- 0x31e5c3,
- 0x3341c3,
- 0x2813c4,
- 0x322184,
- 0x3222c6,
- 0x21c1c2,
- 0x4502,
- 0x442c3,
- 0x204502,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x200742,
- 0x24dd03,
- 0x22cc43,
- 0x232ec3,
- 0x202443,
- 0x215e43,
- 0x21f504,
- 0x2f9584,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x214903,
- 0x300184,
- 0x331903,
- 0x2b4503,
- 0x37da44,
- 0x33f1c6,
- 0x226c43,
- 0xfe4c5,
- 0x9a6c7,
- 0x23dd83,
- 0x62ba9808,
- 0x247f43,
- 0x2bf843,
- 0x246e43,
- 0x228c03,
- 0x27dd45,
- 0x1c83,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x20a483,
- 0x22edc3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x213303,
- 0x21c103,
- 0x251d44,
- 0x75003,
- 0x201ac3,
- 0x281a84,
- 0xfe4c5,
- 0x2cb745,
- 0x9a6c7,
- 0x204502,
- 0x202a02,
- 0x201382,
- 0x2015c2,
- 0x1ba03,
- 0x200342,
- 0x6f544,
- 0x22cc43,
- 0x236384,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x221904,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x203583,
- 0x2056c4,
- 0xb2b48,
- 0x22cc43,
- 0x21ba03,
- 0x8783,
- 0x156c44,
- 0x24fc04,
- 0xb2b48,
- 0x22cc43,
- 0x251344,
- 0x21f504,
- 0x21ba03,
- 0x2052c2,
- 0x75003,
- 0x201ac3,
- 0x202ac3,
- 0x769c4,
- 0x383305,
- 0x202b82,
- 0x202883,
- 0x80249,
- 0xe6f06,
- 0x81588,
- 0x200742,
- 0xb2b48,
- 0x204502,
- 0x232ec3,
- 0x215e43,
- 0x201582,
- 0x1ba03,
- 0x201ac3,
- 0xc682,
- 0x200742,
- 0x1a7f07,
- 0x12c8c9,
- 0x883,
- 0xb2b48,
- 0x1b2dc3,
- 0x66361147,
- 0x2cc43,
- 0x1d3608,
- 0x232ec3,
- 0x215e43,
- 0x3f446,
- 0x213303,
- 0x9f448,
- 0xcdf48,
- 0x2bb06,
- 0x20e403,
- 0xd81c8,
- 0x10d443,
- 0x664eab46,
- 0xf0685,
- 0x330c7,
- 0x1c103,
- 0x978c3,
- 0x1ac3,
- 0xe42,
- 0x19fd4a,
- 0x188c3,
- 0xe1343,
- 0x205884,
- 0x118d8b,
- 0x119348,
- 0x9e002,
- 0x1458987,
- 0x146edc7,
- 0x14d1e08,
- 0x15622c3,
- 0x7f0cb,
- 0x133507,
- 0x200742,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x2e4e84,
- 0x215e43,
- 0x213303,
- 0x20e403,
- 0x21c103,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x228c03,
- 0x21c103,
- 0x201ac3,
- 0x200e83,
- 0x203583,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x8783,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x228c03,
- 0x21c103,
- 0x201ac3,
- 0x25efc2,
- 0x200101,
- 0x200742,
- 0x200301,
- 0x342942,
- 0xb2b48,
- 0x219845,
- 0x200781,
- 0x2cc43,
- 0x200a81,
- 0x200041,
- 0x200141,
- 0x24b802,
- 0x388a44,
- 0x24b803,
- 0x200a01,
- 0x200dc1,
- 0x200541,
- 0x2026c1,
- 0x2fe347,
- 0x30f4cf,
- 0x30adc6,
- 0x200641,
- 0x356c86,
- 0x200081,
- 0x2001c1,
- 0x3b0c8e,
- 0x200341,
- 0x201ac3,
- 0x200e41,
- 0x238d85,
- 0x200e42,
- 0x25d5c5,
- 0x2002c1,
- 0x200c01,
- 0x200401,
- 0x202b82,
- 0x200441,
- 0x202881,
- 0x209841,
- 0x200cc1,
- 0x201441,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x2153c3,
- 0x22cc43,
- 0x215e43,
- 0x9df48,
- 0x20e403,
- 0x21c103,
- 0x75283,
- 0x201ac3,
- 0x14f3988,
- 0xa388,
- 0xfe4c5,
- 0xb2b48,
- 0x1ba03,
- 0xfe4c5,
- 0xf4c44,
- 0x49844,
- 0x14f398a,
- 0xb2b48,
- 0x75003,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21c103,
- 0x201ac3,
- 0x229a43,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x2e4e84,
- 0x201ac3,
- 0x28c285,
- 0x351b04,
- 0x22cc43,
- 0x21c103,
- 0x201ac3,
- 0xb32ca,
- 0x102604,
- 0x1263c6,
- 0x204502,
- 0x22cc43,
- 0x230a09,
- 0x232ec3,
- 0x360909,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x563c4,
- 0x1ba03,
- 0x201ac3,
- 0x2ff208,
- 0x240787,
- 0x383305,
- 0x1cdac8,
- 0x1a7f07,
- 0xf6c8a,
- 0x114a0b,
- 0x156ec7,
- 0x418c8,
- 0x13e58a,
- 0x12748,
- 0x12c8c9,
- 0x24f87,
- 0x162f47,
- 0x7f688,
- 0x1d3608,
- 0x43b8f,
- 0x219c5,
- 0x1d3907,
- 0x3f446,
- 0x97807,
- 0x11cf06,
- 0x9f448,
- 0xb6986,
- 0x153387,
- 0x18e9c9,
- 0x1b2f87,
- 0x175a09,
- 0xc43c9,
- 0xcb4c6,
- 0xcdf48,
- 0xcc985,
- 0x8814a,
- 0xd81c8,
- 0x10d443,
- 0xe10c8,
- 0x330c7,
- 0x80045,
- 0x614d0,
- 0x978c3,
- 0x75003,
- 0x18e847,
- 0x23fc5,
- 0xf79c8,
- 0x6be45,
- 0xe1343,
- 0x6fb88,
- 0x7d186,
- 0xb9489,
- 0xb8987,
- 0x8050b,
- 0x10f044,
- 0x1112c4,
- 0x118d8b,
- 0x119348,
- 0x11cb87,
- 0xfe4c5,
- 0x22cc43,
- 0x232ec3,
- 0x21fe83,
- 0x201ac3,
- 0x2029c3,
- 0x215e43,
- 0x75003,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x9ac8b,
- 0x200742,
- 0x204502,
- 0x201ac3,
- 0xb2b48,
- 0x4502,
- 0x200742,
- 0x204502,
- 0x201382,
- 0x201582,
- 0x205102,
- 0x21c103,
- 0x18b546,
- 0x200342,
- 0x769c4,
- 0x200742,
- 0x24dd03,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x201382,
- 0x215e43,
- 0x213303,
- 0x20e403,
- 0x221904,
- 0x21c103,
- 0x201bc3,
- 0x1ba03,
- 0x201ac3,
- 0x205884,
- 0x202903,
- 0x215e43,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x21ba03,
- 0x201ac3,
- 0x3ba807,
- 0x22cc43,
- 0x28a707,
- 0x366646,
- 0x203503,
- 0x21cd03,
- 0x215e43,
- 0x219203,
- 0x21f504,
- 0x3a7184,
- 0x2e5d06,
- 0x2032c3,
- 0x21c103,
- 0x201ac3,
- 0x28c285,
- 0x2d0384,
- 0x2f5803,
- 0x3ccf83,
- 0x2d2f07,
- 0x33cec5,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x59b87,
- 0x174407,
- 0x1a2685,
- 0x206e02,
- 0x24ee43,
- 0x21e743,
- 0x24dd03,
- 0x6fa2cc43,
- 0x205fc2,
- 0x232ec3,
- 0x212503,
- 0x215e43,
- 0x21f504,
- 0x2026c3,
- 0x2249c3,
- 0x20e403,
- 0x221904,
- 0x6fe047c2,
- 0x21c103,
- 0x201ac3,
- 0x231303,
- 0x213383,
- 0x25efc2,
- 0x202903,
- 0xb2b48,
- 0x215e43,
- 0x8783,
- 0x3321c4,
- 0x24dd03,
- 0x204502,
- 0x22cc43,
- 0x236384,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x213303,
- 0x33b104,
- 0x21af04,
- 0x2e3e86,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x214903,
- 0x252346,
- 0x3aecb,
- 0x28906,
- 0x1cfbca,
- 0x11e24a,
- 0xb2b48,
- 0x273304,
- 0x7122cc43,
- 0x26e184,
- 0x232ec3,
- 0x23e404,
- 0x215e43,
- 0x33c583,
- 0x20e403,
- 0x21c103,
- 0x75003,
- 0x201ac3,
- 0xf243,
- 0x35148b,
- 0x3c4aca,
- 0x3d818c,
- 0xeb148,
- 0x200742,
- 0x204502,
- 0x201382,
- 0x22e005,
- 0x21f504,
- 0x202bc2,
- 0x20e403,
- 0x21af04,
- 0x2015c2,
- 0x200342,
- 0x203582,
- 0x25efc2,
- 0x4dd03,
- 0xecc2,
- 0x2c8289,
- 0x225308,
- 0x215cc9,
- 0x226989,
- 0x22798a,
- 0x31baca,
- 0x214742,
- 0x392ac2,
- 0x4502,
- 0x22cc43,
- 0x233782,
- 0x243a86,
- 0x37b682,
- 0x206242,
- 0x314d8e,
- 0x21484e,
- 0x28de07,
- 0x220507,
- 0x255502,
- 0x232ec3,
- 0x215e43,
- 0x221582,
- 0x201582,
- 0x1cc83,
- 0x23658f,
- 0x243dc2,
- 0x2bcec7,
- 0x3308c7,
- 0x2bfbc7,
- 0x2d28cc,
- 0x2e5f8c,
- 0x363544,
- 0x3a0c0a,
- 0x214782,
- 0x253a82,
- 0x2c5c04,
- 0x204182,
- 0x2981c2,
- 0x2e61c4,
+ 0xba1c742,
+ 0x247308,
+ 0x37868b,
+ 0x220808,
+ 0x221346,
+ 0x221e87,
+ 0x225088,
+ 0xca07c02,
+ 0xcf25802,
+ 0x30b488,
+ 0x219047,
+ 0x314885,
+ 0x314888,
+ 0xd2bdcc8,
+ 0x2d4803,
+ 0x228bc4,
+ 0x389bc2,
+ 0xd629c02,
+ 0xda43fc2,
+ 0xe22b882,
+ 0x22b883,
+ 0xe605cc2,
+ 0x30f943,
+ 0x239944,
+ 0x212283,
+ 0x3cbd04,
+ 0x30ab0b,
+ 0x23af03,
+ 0x2ea246,
+ 0x23af04,
+ 0x2b920e,
+ 0x381c85,
+ 0x3a7c48,
+ 0x235dc7,
+ 0x235dca,
+ 0x226e43,
+ 0x3ac007,
+ 0x2580c5,
+ 0x22fc84,
+ 0x256786,
+ 0x256787,
+ 0x312944,
+ 0x22f5c7,
+ 0xea1f604,
+ 0x398b44,
+ 0x398b46,
+ 0x25b444,
+ 0x3c4e86,
+ 0x20b383,
+ 0x3d1dc8,
+ 0x20b388,
+ 0x2655c3,
+ 0x2ee4c3,
+ 0x343dc4,
+ 0x353ec3,
+ 0xf235d82,
+ 0xf68d142,
+ 0x208183,
+ 0x242d46,
+ 0x28ed83,
+ 0x23ab04,
+ 0xfa17b02,
+ 0x308183,
+ 0x217b03,
0x212f82,
- 0x208242,
- 0x23643,
- 0x2b6a07,
- 0x23be45,
- 0x208ec2,
- 0x297784,
- 0x27f742,
- 0x2eacc8,
- 0x21c103,
- 0x37a688,
- 0x200ac2,
- 0x363705,
- 0x399ec6,
- 0x201ac3,
- 0x20a482,
- 0x2f8f87,
- 0xe42,
- 0x25e745,
- 0x32eec5,
- 0x205a82,
- 0x204982,
- 0x3bd94a,
- 0x2986ca,
- 0x293202,
- 0x2a5bc4,
- 0x202582,
- 0x246c88,
- 0x208c02,
- 0x29ed48,
- 0x3157c7,
- 0x316009,
- 0x25e7c2,
- 0x31d445,
- 0x3b6c85,
- 0x21c90b,
- 0x2d564c,
- 0x22a288,
- 0x333348,
- 0x21c1c2,
- 0x2b3542,
- 0x200742,
- 0xb2b48,
- 0x204502,
- 0x22cc43,
- 0x201382,
- 0x2015c2,
- 0x1ba03,
- 0x200342,
- 0x201ac3,
- 0x203582,
- 0x200742,
- 0xfe4c5,
- 0x72604502,
- 0x72e15e43,
- 0x223643,
- 0x202bc2,
- 0x21c103,
- 0x2fec43,
- 0x73201ac3,
- 0x2f5d43,
- 0x28f086,
- 0x1603583,
- 0xfe4c5,
- 0x18b40b,
- 0xb2b48,
- 0x72a02508,
- 0x62a07,
- 0x74887,
- 0x148e45,
- 0xb5c0d,
- 0x3f242,
- 0x119882,
- 0xb3f4a,
- 0x98507,
- 0x29884,
- 0x298c3,
- 0x121984,
- 0x73a07502,
- 0x73e00602,
- 0x74200282,
- 0x74604442,
- 0x74a13b82,
- 0x74e05382,
- 0x9a6c7,
- 0x75204502,
- 0x75602b42,
- 0x75a0e682,
- 0x75e046c2,
- 0x214843,
- 0x16284,
- 0x2339c3,
- 0x76210f02,
- 0x5f1c8,
- 0x76600a02,
- 0x784c7,
- 0x76a03ac2,
- 0x76e00dc2,
- 0x77200542,
- 0x77605142,
- 0x77a0d282,
- 0x77e01582,
- 0xd8dc5,
- 0x2265c3,
- 0x33e044,
- 0x78204182,
- 0x78616d02,
- 0x78a00682,
- 0x8968b,
- 0x78e000c2,
- 0x79651402,
- 0x79a02bc2,
- 0x79e05102,
- 0x7a21c0c2,
- 0x7a608302,
- 0x7aa02c42,
- 0x7ae728c2,
- 0x7b2047c2,
- 0x7b606142,
- 0x7ba015c2,
- 0x7be0b602,
- 0x7c249002,
- 0x7c615f82,
- 0x12ba04,
- 0x34ce03,
- 0x7ca34342,
- 0x7ce14482,
- 0x7d212ac2,
- 0x7d604142,
- 0x7da00342,
- 0x7de08702,
- 0x9ae07,
- 0x7e213282,
- 0x7e600502,
- 0x7ea03582,
- 0x7ee085c2,
- 0x107f0c,
- 0x7f209702,
- 0x7f622bc2,
- 0x7fa08002,
- 0x7fe06e42,
- 0x80208f02,
- 0x80627b02,
- 0x80a076c2,
- 0x80e10402,
- 0x81283882,
- 0x81669e02,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x25883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x792026c3,
- 0x225883,
- 0x27ddc4,
- 0x225206,
- 0x3040c3,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x200189,
- 0x20ecc2,
- 0x3d0143,
- 0x2c46c3,
- 0x204845,
- 0x212503,
- 0x2026c3,
- 0x225883,
- 0x2ba883,
- 0x239283,
- 0x3b26c9,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x20ecc2,
- 0x20ecc2,
- 0x2026c3,
- 0x225883,
- 0x81e2cc43,
- 0x232ec3,
- 0x226bc3,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0xb2b48,
- 0x204502,
- 0x22cc43,
- 0x21c103,
- 0x201ac3,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x20e403,
- 0x21c103,
- 0x1ba03,
- 0x201ac3,
- 0x24fc04,
- 0x204502,
- 0x22cc43,
- 0x280c83,
- 0x232ec3,
- 0x251344,
- 0x21fe83,
- 0x215e43,
- 0x21f504,
- 0x213303,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x202ac3,
- 0x383305,
- 0x239283,
- 0x202903,
- 0x1ba03,
- 0x204502,
- 0x22cc43,
- 0x2026c3,
- 0x21c103,
- 0x201ac3,
- 0x200742,
- 0x24dd03,
- 0xb2b48,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x22fac6,
- 0x21f504,
- 0x213303,
- 0x221904,
- 0x21c103,
- 0x201ac3,
- 0x214903,
- 0x22cc43,
- 0x232ec3,
- 0x21c103,
- 0x201ac3,
- 0x1450bc7,
- 0x1c3bc7,
- 0x22cc43,
- 0x28906,
- 0x232ec3,
- 0x215e43,
- 0xed586,
- 0x21c103,
- 0x201ac3,
- 0x32fec8,
- 0x333189,
- 0x34bac9,
- 0x353c08,
+ 0xfe014c2,
+ 0x2c5006,
+ 0x234f87,
+ 0x275487,
+ 0x209e85,
+ 0x396d84,
+ 0x29b045,
+ 0x23f907,
+ 0x2eb4c9,
+ 0x2fed86,
+ 0x300c48,
+ 0x3109c6,
+ 0x1022ec82,
+ 0x3019c8,
+ 0x3037c6,
+ 0x2d4b85,
+ 0x321b07,
+ 0x323144,
+ 0x323145,
+ 0x10731a84,
+ 0x331a88,
+ 0x10a0a602,
+ 0x10e00482,
+ 0x30c486,
+ 0x200488,
+ 0x358345,
+ 0x359946,
+ 0x35e748,
+ 0x37c508,
+ 0x11205f85,
+ 0x11625344,
+ 0x2448c7,
+ 0x11a07a42,
+ 0x11ed5e42,
+ 0x13202782,
+ 0x3b8ac5,
+ 0x2a5f45,
+ 0x377c46,
+ 0x3a0ec7,
+ 0x22c487,
+ 0x13a2d7c3,
+ 0x2df287,
+ 0x348dc8,
+ 0x1da2d989,
+ 0x26de47,
+ 0x22de07,
+ 0x22e808,
+ 0x22f006,
+ 0x22f786,
+ 0x230bcc,
+ 0x23230a,
+ 0x232c87,
+ 0x23418b,
+ 0x234dc7,
+ 0x234dce,
+ 0x1de35c44,
+ 0x236204,
+ 0x239807,
+ 0x260147,
+ 0x23c4c6,
+ 0x23c4c7,
+ 0x337307,
+ 0x1e22bdc2,
+ 0x23de06,
+ 0x23de0a,
+ 0x23e20b,
+ 0x23fec7,
+ 0x240945,
+ 0x2414c3,
+ 0x241b06,
+ 0x241b07,
+ 0x272803,
+ 0x1e600102,
+ 0x24238a,
+ 0x1eb76cc2,
+ 0x1ee487c2,
+ 0x1f247002,
+ 0x1f636d82,
+ 0x247745,
+ 0x248484,
+ 0x1fe37982,
+ 0x250c45,
+ 0x231543,
+ 0x2080c5,
+ 0x204a44,
+ 0x20bc84,
+ 0x21f906,
+ 0x27f946,
+ 0x2a7843,
+ 0x3ba9c4,
+ 0x275783,
+ 0x20e02942,
+ 0x222204,
+ 0x244e46,
+ 0x222205,
+ 0x2576c6,
+ 0x321c08,
+ 0x28fd84,
+ 0x2102c8,
+ 0x39fa05,
+ 0x39f748,
+ 0x2bef86,
+ 0x359d87,
+ 0x26ec04,
+ 0x2226ec06,
+ 0x22645dc3,
+ 0x39cbc3,
+ 0x348188,
+ 0x332c04,
+ 0x22b5ed87,
+ 0x232de7c6,
+ 0x2de7c9,
+ 0x336088,
+ 0x38ca48,
+ 0x34a204,
+ 0x3c2b83,
+ 0x23e8c2,
+ 0x23652282,
+ 0x23a03e02,
+ 0x3c7983,
+ 0x23e12ac2,
+ 0x2f0a04,
+ 0x36f146,
+ 0x309cc5,
+ 0x21b1c3,
+ 0x2b5f07,
+ 0x3306c3,
+ 0x338108,
+ 0x214ec5,
+ 0x25cdc3,
+ 0x2e1985,
+ 0x2e1ac4,
+ 0x3034c6,
+ 0x217004,
+ 0x217b86,
+ 0x219846,
+ 0x206804,
+ 0x235183,
+ 0x2420d602,
+ 0x2479e645,
+ 0x200843,
+ 0x24e16042,
+ 0x22d943,
+ 0x246385,
+ 0x25233743,
+ 0x25a33749,
+ 0x25e00942,
+ 0x26605242,
+ 0x28ca45,
+ 0x213986,
+ 0x20da06,
+ 0x2d0f48,
+ 0x2d0f4b,
+ 0x32dc4b,
+ 0x20a085,
+ 0x2cc809,
+ 0x1601982,
+ 0x2e8e88,
+ 0x21f084,
+ 0x26e01242,
+ 0x337943,
+ 0x27660306,
+ 0x27db08,
+ 0x27a01f02,
+ 0x310588,
+ 0x27e758c2,
+ 0x33f30a,
+ 0x282d2003,
+ 0x28b75646,
+ 0x399608,
+ 0x315848,
+ 0x3c0b46,
+ 0x386d47,
+ 0x239587,
+ 0x255b4a,
+ 0x38b184,
+ 0x35d884,
+ 0x374a49,
+ 0x28fabc05,
+ 0x205d86,
+ 0x219243,
+ 0x271e84,
+ 0x29202404,
+ 0x202407,
+ 0x29757a47,
+ 0x26e4c4,
+ 0x378c45,
+ 0x377d08,
+ 0x3a4587,
+ 0x249487,
+ 0x29a19d02,
+ 0x3c3844,
+ 0x293548,
+ 0x24aa44,
+ 0x24e444,
+ 0x24e805,
+ 0x24e947,
+ 0x29e4dbc9,
+ 0x250104,
+ 0x250f49,
+ 0x251188,
+ 0x251984,
+ 0x251987,
+ 0x2a252083,
+ 0x252747,
+ 0x1603582,
+ 0x16b0f82,
+ 0x253946,
+ 0x253fc7,
+ 0x254244,
+ 0x255047,
+ 0x256bc7,
+ 0x257843,
+ 0x2b06c2,
+ 0x20c742,
+ 0x2747c3,
+ 0x3be744,
+ 0x3be74b,
+ 0x2a6747c8,
+ 0x25c784,
+ 0x258ec5,
+ 0x25a687,
+ 0x25bec5,
+ 0x2e0b8a,
+ 0x25c6c3,
+ 0x2aa0e282,
+ 0x20e284,
+ 0x25ff09,
+ 0x263f83,
+ 0x264047,
+ 0x38c6c9,
+ 0x3d77c8,
+ 0x238983,
+ 0x27cb87,
+ 0x27dfc9,
+ 0x23fac3,
+ 0x2872c4,
+ 0x288c09,
+ 0x28ab06,
+ 0x219c03,
+ 0x205282,
+ 0x236883,
+ 0x2b0d87,
+ 0x236885,
+ 0x3cb4c6,
+ 0x2aea44,
+ 0x302fc5,
+ 0x279d03,
+ 0x212346,
+ 0x237482,
+ 0x24ce44,
+ 0x2ae0a1c2,
+ 0x2b22b083,
+ 0x2b604182,
+ 0x24c203,
+ 0x2115c4,
+ 0x2115c7,
+ 0x38b206,
+ 0x2023c2,
+ 0x2ba02382,
+ 0x321e04,
+ 0x2be0c602,
+ 0x2c212782,
+ 0x246644,
+ 0x246645,
+ 0x3cae05,
+ 0x365f46,
+ 0x2c609d82,
+ 0x360245,
+ 0x3c53c5,
+ 0x2270c3,
+ 0x211746,
+ 0x21c105,
+ 0x225782,
+ 0x357f85,
+ 0x225784,
+ 0x226203,
+ 0x228d03,
+ 0x2ca05142,
+ 0x233b47,
+ 0x251b04,
+ 0x251b09,
+ 0x271d84,
+ 0x28d503,
0x39bf48,
- 0x39bf49,
- 0x32740a,
- 0x366b4a,
- 0x39788a,
- 0x39ca0a,
- 0x3c4aca,
- 0x3d288b,
- 0x2483cd,
- 0x37524f,
- 0x276bd0,
- 0x368c0d,
- 0x380e0c,
- 0x39c74b,
- 0x74a88,
- 0x112b88,
- 0x1668c5,
- 0x1494887,
- 0xd6685,
- 0x200742,
- 0x33cd05,
- 0x208203,
- 0x85604502,
- 0x232ec3,
- 0x215e43,
- 0x397387,
- 0x246e43,
- 0x20e403,
- 0x21c103,
- 0x252043,
- 0x20f683,
- 0x21ba03,
- 0x201ac3,
- 0x25e4c6,
+ 0x2cea5dc4,
+ 0x2a5dc6,
+ 0x2ab3c3,
+ 0x259703,
+ 0x220583,
+ 0x2d2ee042,
+ 0x300002,
+ 0x2d600642,
+ 0x33cd88,
+ 0x220108,
+ 0x3b1646,
+ 0x25c585,
+ 0x22c045,
+ 0x201887,
+ 0x2da78745,
+ 0x2068c2,
+ 0x2de96bc2,
+ 0x2e200042,
+ 0x31ed08,
+ 0x301905,
+ 0x2f5f44,
+ 0x257605,
+ 0x24a487,
+ 0x273244,
+ 0x242282,
+ 0x2e605002,
+ 0x34e6c4,
+ 0x221807,
+ 0x28f307,
+ 0x351604,
+ 0x3ced83,
+ 0x265504,
+ 0x265508,
+ 0x22fac6,
+ 0x25660a,
+ 0x3575c4,
+ 0x295548,
+ 0x28af44,
+ 0x221f86,
+ 0x296b84,
+ 0x3b8dc6,
+ 0x251dc9,
+ 0x245847,
+ 0x21f183,
+ 0x2ea07102,
+ 0x34a483,
+ 0x208402,
+ 0x2ee01d02,
+ 0x2f3206,
+ 0x380e08,
+ 0x2a7747,
+ 0x22a1c9,
+ 0x295109,
+ 0x2a8c85,
+ 0x2aa589,
+ 0x2aad45,
+ 0x2aae89,
+ 0x2abe05,
+ 0x2ac848,
+ 0x2f20c644,
+ 0x2f657987,
+ 0x22e1c3,
+ 0x2aca47,
+ 0x22e1c6,
+ 0x2ace87,
+ 0x2a48c5,
+ 0x2ba0c3,
+ 0x2fa320c2,
+ 0x20b2c4,
+ 0x2fe2bf42,
+ 0x302373c2,
+ 0x33c146,
+ 0x206205,
+ 0x2af987,
+ 0x32f343,
+ 0x363944,
+ 0x203f43,
+ 0x2c6883,
+ 0x306067c2,
+ 0x30e03d82,
+ 0x389c44,
+ 0x36b103,
+ 0x2fc5c5,
+ 0x31205e42,
+ 0x31a00bc2,
+ 0x2da6c6,
+ 0x332d44,
+ 0x321644,
+ 0x32164a,
+ 0x322005c2,
+ 0x244b03,
+ 0x2157ca,
+ 0x219c88,
+ 0x32622884,
+ 0x2005c3,
+ 0x32a038c3,
+ 0x281709,
+ 0x252d49,
+ 0x2b6006,
+ 0x32e19e43,
+ 0x21c445,
+ 0x31de8d,
+ 0x219e46,
+ 0x21bccb,
+ 0x33204c02,
+ 0x2b2c48,
+ 0x36215f02,
+ 0x36604c82,
+ 0x375e05,
+ 0x36a01b82,
+ 0x230047,
+ 0x2adec7,
+ 0x204383,
+ 0x341788,
+ 0x36e06102,
+ 0x3b9c84,
+ 0x219583,
+ 0x328085,
+ 0x23e906,
+ 0x220d44,
+ 0x2ee483,
+ 0x2b1e03,
+ 0x37202d42,
+ 0x20a004,
+ 0x3bc2c5,
+ 0x2b0987,
+ 0x27a143,
+ 0x2b1403,
+ 0x16b14c2,
+ 0x2b14c3,
+ 0x2b1d83,
+ 0x376035c2,
+ 0x3b7d44,
+ 0x27fb46,
+ 0x2e6343,
+ 0x2b22c3,
+ 0x37a4d442,
+ 0x24d448,
+ 0x2b3204,
+ 0x368486,
+ 0x25d187,
+ 0x29b3c6,
+ 0x36f744,
+ 0x45a015c2,
+ 0x22e08b,
+ 0x2f90ce,
+ 0x21450f,
+ 0x2b0fc3,
+ 0x4625d602,
+ 0x1637542,
+ 0x46603882,
+ 0x295ac3,
+ 0x209503,
+ 0x21d046,
+ 0x2eb746,
+ 0x21ac87,
+ 0x30e184,
+ 0x46a13ac2,
+ 0x46e0a3c2,
+ 0x241385,
+ 0x2fa2c7,
+ 0x2b4ac6,
+ 0x47248702,
+ 0x32e844,
+ 0x2bab43,
+ 0x47653a42,
+ 0x47b70e03,
+ 0x2bbb44,
+ 0x2c0a89,
+ 0x47ec80c2,
+ 0x48203942,
+ 0x203945,
+ 0x486c8e02,
+ 0x48a06ac2,
+ 0x35be87,
+ 0x3b2349,
+ 0x37528b,
+ 0x239345,
+ 0x26a549,
+ 0x26d1c6,
+ 0x38f987,
+ 0x48e0e984,
+ 0x3d5849,
+ 0x37b387,
+ 0x20f607,
+ 0x22bb83,
+ 0x2b2ac6,
+ 0x32a947,
+ 0x20bec3,
+ 0x3ca646,
+ 0x4960ac02,
+ 0x49a339c2,
+ 0x3b5543,
+ 0x38aa85,
+ 0x21ee87,
+ 0x2eb846,
+ 0x236805,
+ 0x251304,
+ 0x2a3dc5,
+ 0x38bc44,
+ 0x49e00f82,
+ 0x274d87,
+ 0x2c5c44,
+ 0x23bf84,
+ 0x34998d,
+ 0x2d9189,
+ 0x22be88,
+ 0x203bc4,
+ 0x3b9445,
+ 0x20df07,
+ 0x210184,
+ 0x267b87,
+ 0x357285,
+ 0x4a214a04,
+ 0x2b4085,
+ 0x262c44,
+ 0x2b1a46,
+ 0x3a0cc5,
+ 0x4a624ec2,
+ 0x30c403,
+ 0x35cf44,
+ 0x35cf45,
+ 0x3520c6,
+ 0x236945,
+ 0x238904,
+ 0x34c603,
+ 0x4aa12a06,
+ 0x2676c5,
+ 0x282305,
+ 0x3a0dc4,
+ 0x2e5a43,
+ 0x2e5a4c,
+ 0x4aeb0a82,
+ 0x4b203502,
+ 0x4b600b42,
+ 0x214903,
+ 0x214904,
+ 0x4ba08002,
+ 0x37e508,
+ 0x3cb585,
+ 0x24b304,
+ 0x367a46,
+ 0x4be0f1c2,
+ 0x4c205e82,
+ 0x4c601442,
+ 0x28c045,
+ 0x2066c6,
+ 0x357984,
+ 0x216b06,
+ 0x371f86,
+ 0x210043,
+ 0x4cb4b2ca,
+ 0x271cc5,
+ 0x317c83,
+ 0x209b86,
+ 0x209b89,
+ 0x224207,
+ 0x2a4ec8,
+ 0x2fcb89,
+ 0x331688,
+ 0x226b86,
+ 0x218a03,
+ 0x4cedf302,
+ 0x3a1788,
+ 0x4d24ab82,
+ 0x4d6024c2,
+ 0x22a243,
+ 0x2e43c5,
+ 0x26ae44,
+ 0x211ec9,
+ 0x2e14c4,
+ 0x21a048,
+ 0x4de08443,
+ 0x4e30af84,
+ 0x2139c8,
+ 0x3498c7,
+ 0x4e65e5c2,
+ 0x23f1c2,
+ 0x32bbc5,
+ 0x265dc9,
+ 0x205e03,
+ 0x281304,
+ 0x31de44,
+ 0x20df83,
+ 0x2835ca,
+ 0x4ea01582,
+ 0x4ee0b102,
+ 0x2cb103,
+ 0x38e683,
+ 0x162d842,
+ 0x308a43,
+ 0x4f202dc2,
+ 0x4f600c02,
+ 0x4fb216c4,
+ 0x3dcb86,
+ 0x39ba06,
+ 0x226244,
+ 0x279343,
+ 0x3bb343,
+ 0x4fecb283,
+ 0x23e586,
+ 0x3a4dc5,
+ 0x2cc1c7,
+ 0x2cee45,
+ 0x2d0006,
+ 0x2d1208,
+ 0x2d1406,
+ 0x207304,
+ 0x29c1cb,
+ 0x2d6043,
+ 0x2d6045,
+ 0x2d6c88,
+ 0x2104c2,
+ 0x35c182,
+ 0x502477c2,
+ 0x50600e82,
+ 0x200e83,
+ 0x50a6cec2,
+ 0x26cec3,
+ 0x2d7683,
+ 0x51224682,
+ 0x516dc3c6,
+ 0x2594c6,
+ 0x51ab2e42,
+ 0x51e09002,
+ 0x52228d42,
+ 0x52645ec2,
+ 0x52a1a282,
+ 0x52e01342,
+ 0x20ed83,
+ 0x2c9e05,
+ 0x327d86,
+ 0x53205184,
+ 0x244c4a,
+ 0x3aa406,
+ 0x20c844,
+ 0x201c43,
+ 0x53e02a42,
+ 0x202642,
+ 0x22d903,
+ 0x54206b43,
+ 0x366547,
+ 0x3a0bc7,
+ 0x55ee7247,
+ 0x3cd307,
+ 0x227983,
+ 0x35fc8a,
+ 0x235fc4,
+ 0x31b684,
+ 0x31b68a,
+ 0x22c5c5,
+ 0x56205d42,
+ 0x255003,
+ 0x56600602,
+ 0x251ac3,
+ 0x34a443,
+ 0x56e00582,
+ 0x348d44,
+ 0x201a84,
+ 0x3bf805,
+ 0x322885,
+ 0x2aa2c6,
+ 0x2b6c06,
+ 0x5724fd42,
+ 0x576013c2,
+ 0x37a405,
+ 0x2591d2,
+ 0x34f1c6,
+ 0x24e703,
+ 0x304c46,
+ 0x2b4545,
+ 0x160a982,
+ 0x5fa0af02,
+ 0x3743c3,
+ 0x20af03,
+ 0x288883,
+ 0x5fe1a682,
+ 0x23d443,
+ 0x6060cc82,
+ 0x2a7503,
+ 0x3b7d88,
+ 0x2a8b03,
+ 0x2a8b06,
+ 0x32f7c7,
+ 0x324a06,
+ 0x324a0b,
+ 0x20c787,
+ 0x347f84,
+ 0x60e00e42,
+ 0x3cb405,
+ 0x61212b03,
+ 0x2050c3,
+ 0x28e805,
+ 0x332f43,
+ 0x61b32f46,
+ 0x2e900a,
+ 0x2a3083,
+ 0x2164c4,
+ 0x2003c6,
+ 0x2d4f86,
+ 0x61e3cf83,
+ 0x363807,
+ 0x281607,
+ 0x29dbc5,
+ 0x2ec406,
+ 0x267703,
+ 0x64a11983,
+ 0x64e01002,
+ 0x6533ef04,
+ 0x3c2249,
+ 0x3c7a05,
+ 0x22c244,
+ 0x34e0c8,
+ 0x2e6185,
+ 0x656e75c5,
+ 0x240ac9,
+ 0x201003,
+ 0x248744,
+ 0x65a02142,
+ 0x213d03,
+ 0x65e76402,
+ 0x276406,
+ 0x1678842,
+ 0x662201c2,
+ 0x28bf48,
+ 0x291f83,
+ 0x2b3fc7,
+ 0x2b1545,
+ 0x2b3b85,
+ 0x324c8b,
+ 0x2e8146,
+ 0x324e86,
+ 0x2e96c6,
+ 0x27f1c4,
+ 0x2c0c86,
+ 0x666d9d88,
+ 0x23afc3,
+ 0x23d903,
+ 0x23d904,
+ 0x38c084,
+ 0x316147,
+ 0x2ed4c5,
+ 0x66aed602,
+ 0x66e06a82,
+ 0x6761b085,
+ 0x2b8044,
+ 0x2daccb,
+ 0x2ef608,
+ 0x2525c4,
+ 0x67a2bd02,
+ 0x67e23802,
+ 0x3c4e03,
+ 0x2f15c4,
+ 0x2f1885,
+ 0x2f2247,
+ 0x2f5a84,
+ 0x351704,
+ 0x68213c42,
+ 0x37ab09,
+ 0x2f6bc5,
+ 0x239605,
+ 0x2f7745,
+ 0x68613c43,
+ 0x2f8644,
+ 0x2f864b,
+ 0x2f8984,
+ 0x2f8c4b,
+ 0x2f9c85,
+ 0x21464a,
+ 0x2fa7c8,
+ 0x2fa9ca,
+ 0x2fb203,
+ 0x2fb20a,
+ 0x68e0a0c2,
+ 0x69241f42,
+ 0x6961f4c3,
+ 0x69afed02,
+ 0x2fed03,
+ 0x69f52a42,
+ 0x6a33b402,
+ 0x2ffbc4,
+ 0x215f46,
+ 0x216845,
+ 0x300e43,
+ 0x32c306,
+ 0x216345,
+ 0x2e4a44,
+ 0x6a600902,
+ 0x2a1344,
+ 0x2cc48a,
+ 0x336fc7,
+ 0x3332c6,
+ 0x3abe47,
+ 0x23de43,
+ 0x2bbb88,
+ 0x37eb4b,
+ 0x2c12c5,
+ 0x2a9c05,
+ 0x2a9c06,
+ 0x2ec744,
+ 0x210f48,
+ 0x222b03,
+ 0x255ec4,
+ 0x255ec7,
+ 0x347bc6,
+ 0x3ccb06,
+ 0x2b904a,
+ 0x250fc4,
+ 0x2fba4a,
+ 0x6ab30086,
+ 0x330087,
+ 0x258f47,
+ 0x275dc4,
+ 0x275dc9,
+ 0x2ff605,
+ 0x3cc44b,
+ 0x2ee903,
+ 0x217d43,
+ 0x6ae1d583,
+ 0x2ca004,
+ 0x6b200682,
+ 0x229446,
+ 0x6b6b9e45,
+ 0x304e85,
+ 0x253b86,
+ 0x29fe44,
+ 0x6ba02542,
+ 0x241504,
+ 0x6be16f82,
+ 0x2d5745,
+ 0x32ffc4,
+ 0x6ca1b683,
+ 0x6ce01e82,
+ 0x201e83,
+ 0x237086,
+ 0x6d209482,
+ 0x391a48,
+ 0x224084,
+ 0x224086,
+ 0x38ef06,
+ 0x6d65a744,
+ 0x212985,
+ 0x225248,
+ 0x226087,
+ 0x246747,
+ 0x24674f,
+ 0x293446,
+ 0x231c83,
+ 0x23c644,
+ 0x20e4c3,
+ 0x2220c4,
+ 0x254144,
+ 0x6da02c02,
+ 0x28ce43,
+ 0x338dc3,
+ 0x6de02002,
+ 0x227683,
+ 0x2259c3,
+ 0x20dc0a,
+ 0x273b07,
+ 0x25984c,
+ 0x259b06,
+ 0x25c186,
+ 0x25ce87,
+ 0x6e22ec47,
+ 0x268049,
+ 0x247444,
+ 0x269ac4,
+ 0x6e600ec2,
+ 0x6ea01bc2,
+ 0x2b9406,
+ 0x363604,
+ 0x28d2c6,
+ 0x22f0c8,
+ 0x38ab44,
+ 0x230086,
+ 0x20d9c5,
+ 0x6ee83048,
+ 0x241c03,
+ 0x287a45,
+ 0x288203,
+ 0x239703,
+ 0x239704,
+ 0x20e243,
+ 0x6f24d882,
+ 0x6f601282,
+ 0x2ee7c9,
+ 0x28be45,
+ 0x28c144,
+ 0x317f05,
+ 0x297104,
+ 0x3a1fc7,
+ 0x36aac5,
+ 0x6fa3d804,
+ 0x23d808,
+ 0x2d9f46,
+ 0x2dcb04,
+ 0x2e1348,
+ 0x2e1c47,
+ 0x6fe037c2,
+ 0x2e8684,
+ 0x303104,
+ 0x2c1a07,
+ 0x70207c44,
+ 0x22b302,
+ 0x70603842,
+ 0x203843,
+ 0x203844,
+ 0x29e943,
+ 0x29e945,
+ 0x70a388c2,
+ 0x2fff05,
+ 0x2801c2,
+ 0x307d85,
+ 0x3b49c5,
+ 0x70e15042,
+ 0x217a84,
+ 0x71203002,
+ 0x25e406,
+ 0x2ba6c6,
+ 0x265f08,
+ 0x2c2988,
+ 0x33c0c4,
+ 0x305d85,
+ 0x3a6509,
+ 0x20a104,
+ 0x2e8fc4,
+ 0x206903,
+ 0x71655c85,
+ 0x243185,
+ 0x2a15c4,
+ 0x35248d,
+ 0x308102,
+ 0x353f43,
+ 0x354c83,
+ 0x71a02702,
+ 0x391505,
+ 0x220f87,
+ 0x2b9f44,
+ 0x3cd3c7,
+ 0x2fcd89,
+ 0x2cc5c9,
+ 0x202703,
+ 0x278688,
+ 0x2f9889,
+ 0x2f7a07,
+ 0x3da885,
+ 0x37e1c6,
+ 0x380fc6,
+ 0x3a60c5,
+ 0x2d9285,
+ 0x71e03b42,
+ 0x27b445,
+ 0x2b8308,
+ 0x2c4dc6,
+ 0x72206ec7,
+ 0x26e404,
+ 0x335187,
+ 0x302c86,
+ 0x72641542,
+ 0x351dc6,
+ 0x30740a,
+ 0x307c85,
+ 0x72ae9d02,
+ 0x72e8f4c2,
+ 0x33f806,
+ 0x323448,
+ 0x7328f4c7,
+ 0x73639102,
+ 0x28a5c3,
+ 0x209786,
+ 0x224e44,
+ 0x27e606,
+ 0x33bd46,
+ 0x20720a,
+ 0x331f45,
+ 0x328c46,
+ 0x32e243,
+ 0x32e244,
+ 0x202742,
+ 0x332cc3,
+ 0x73a14942,
+ 0x2d15c3,
+ 0x215a44,
+ 0x2c3184,
+ 0x73f2358a,
+ 0x21c4c3,
+ 0x226c4a,
+ 0x239dc7,
+ 0x312e86,
+ 0x25e2c4,
+ 0x20c702,
+ 0x2a6742,
+ 0x742007c2,
+ 0x2654c3,
+ 0x258d07,
+ 0x2007c7,
+ 0x2895c4,
+ 0x21e8c7,
+ 0x2f2346,
+ 0x219187,
+ 0x225904,
+ 0x37cb05,
+ 0x218345,
+ 0x74619f82,
+ 0x3dc5c6,
+ 0x21d843,
+ 0x220bc2,
+ 0x220bc6,
+ 0x74a19b42,
+ 0x74e1be02,
+ 0x3c3905,
+ 0x75243982,
+ 0x75602b42,
+ 0x348ac5,
+ 0x2d6385,
+ 0x2a7ec5,
+ 0x75a04e83,
+ 0x36f205,
+ 0x2e8207,
+ 0x2c4c05,
+ 0x332105,
+ 0x32a284,
+ 0x2e6006,
+ 0x34b504,
+ 0x75e008c2,
+ 0x76ae94c5,
+ 0x382b07,
+ 0x360088,
+ 0x251646,
+ 0x25164d,
+ 0x252b09,
+ 0x252b12,
+ 0x380385,
+ 0x38bd03,
+ 0x76e062c2,
+ 0x2f3e44,
+ 0x219ec3,
+ 0x30d305,
+ 0x30e4c5,
+ 0x772195c2,
+ 0x25ce03,
+ 0x7765b8c2,
+ 0x77ee3402,
+ 0x78200082,
+ 0x2c8b45,
+ 0x3cd503,
+ 0x24af88,
+ 0x78619082,
+ 0x78a0d2c2,
+ 0x348d06,
+ 0x31f38a,
+ 0x20ef03,
+ 0x25ac43,
+ 0x2eeac3,
+ 0x79e07d82,
+ 0x8821a6c2,
+ 0x88a0a742,
+ 0x206842,
+ 0x3d00c9,
+ 0x2c7504,
+ 0x2ac108,
+ 0x88efc182,
+ 0x89214f82,
+ 0x2af4c5,
+ 0x2345c8,
+ 0x311308,
+ 0x2ef30c,
+ 0x239d03,
+ 0x8961f202,
+ 0x89a0a342,
+ 0x349646,
+ 0x313d05,
+ 0x2dcf43,
+ 0x2574c6,
+ 0x313e46,
+ 0x29b2c3,
+ 0x3c2003,
+ 0x3152c6,
+ 0x316ac4,
+ 0x2819c6,
+ 0x21c28a,
+ 0x24e184,
+ 0x317184,
+ 0x31820a,
+ 0x89e1ff02,
+ 0x252205,
+ 0x319d4a,
+ 0x319c85,
+ 0x31b1c4,
+ 0x31b2c6,
+ 0x31b444,
+ 0x213fc6,
+ 0x8a22bc42,
+ 0x2fdd06,
+ 0x328805,
+ 0x32e0c7,
+ 0x3ad646,
+ 0x25d084,
+ 0x2dd1c7,
+ 0x34b206,
+ 0x20bf45,
+ 0x20bf47,
+ 0x3bbc47,
+ 0x3bbc4e,
+ 0x26bb86,
+ 0x221d45,
+ 0x207b87,
+ 0x306003,
+ 0x330387,
+ 0x209185,
+ 0x20af84,
+ 0x221ac2,
+ 0x229c47,
+ 0x30e204,
+ 0x231784,
+ 0x23f04b,
+ 0x21c8c3,
+ 0x288087,
+ 0x21c8c4,
+ 0x288287,
+ 0x294a03,
+ 0x34ca4d,
+ 0x3a4bc8,
+ 0x8a62a984,
+ 0x23d705,
+ 0x31bfc5,
+ 0x31c403,
+ 0x8aa23f82,
+ 0x31dd83,
+ 0x31e583,
+ 0x3dc744,
+ 0x27e0c5,
+ 0x21d8c7,
+ 0x32e2c6,
+ 0x38bac3,
+ 0x228d8b,
+ 0x27444b,
+ 0x2b200b,
+ 0x2d440b,
+ 0x2e9d4a,
+ 0x33484b,
+ 0x36d94b,
+ 0x392c8c,
+ 0x3d990b,
+ 0x3db991,
+ 0x32068a,
+ 0x320b8b,
+ 0x320e4c,
+ 0x32114b,
+ 0x3218ca,
+ 0x321f0a,
+ 0x322e0e,
+ 0x32380b,
+ 0x323aca,
+ 0x325011,
+ 0x32544a,
+ 0x32594b,
+ 0x325e8e,
+ 0x3267cc,
+ 0x326e0b,
+ 0x3270ce,
+ 0x32744c,
+ 0x329d4a,
+ 0x32b58c,
+ 0x8af2b88a,
+ 0x32c488,
+ 0x32d049,
+ 0x33390a,
+ 0x333b8a,
+ 0x333e0b,
+ 0x33854e,
+ 0x338f51,
+ 0x341f49,
+ 0x34218a,
+ 0x342f8b,
+ 0x3444ca,
+ 0x345596,
+ 0x34690b,
+ 0x34768a,
+ 0x34854a,
+ 0x349d8b,
+ 0x34a609,
+ 0x34d3c9,
+ 0x34da0d,
+ 0x34e44b,
+ 0x34f34b,
+ 0x34fd0b,
+ 0x350589,
+ 0x350bce,
+ 0x35130a,
+ 0x35224a,
+ 0x3527ca,
+ 0x352f8b,
+ 0x3537cb,
+ 0x35448d,
+ 0x356b8d,
+ 0x357c10,
+ 0x3580cb,
+ 0x358acc,
+ 0x3596cb,
+ 0x35b98b,
+ 0x35dd4e,
+ 0x35e44b,
+ 0x35e44d,
+ 0x364a4b,
+ 0x3654cf,
+ 0x36588b,
+ 0x3660ca,
+ 0x3673c9,
+ 0x367bc9,
+ 0x8b368c4b,
+ 0x368f0e,
+ 0x36b88b,
+ 0x36c50f,
+ 0x36e54b,
+ 0x36e80b,
+ 0x36eacb,
+ 0x36f34a,
+ 0x374e89,
+ 0x37978f,
+ 0x37df0c,
+ 0x37fb4c,
+ 0x38004e,
+ 0x38054f,
+ 0x38090e,
+ 0x381150,
+ 0x38154f,
+ 0x38210e,
+ 0x382ccc,
+ 0x382fd2,
+ 0x383751,
+ 0x383f4e,
+ 0x38438e,
+ 0x3853cb,
+ 0x3853ce,
+ 0x38574f,
+ 0x385b0e,
+ 0x385e93,
+ 0x386351,
+ 0x38678c,
+ 0x386a8e,
+ 0x386f0c,
+ 0x387453,
+ 0x387c50,
+ 0x3887cc,
+ 0x388acc,
+ 0x388f8b,
+ 0x38984e,
+ 0x389d4b,
+ 0x38a54b,
+ 0x38d28c,
+ 0x391f8a,
+ 0x39248c,
+ 0x39278c,
+ 0x392a89,
+ 0x39470b,
+ 0x3949c8,
+ 0x395189,
+ 0x39518f,
+ 0x39690b,
+ 0x8b79724a,
+ 0x39a2cc,
+ 0x39b48b,
+ 0x39b749,
+ 0x39bb88,
+ 0x39c14b,
+ 0x39c98b,
+ 0x39d50a,
+ 0x39d78b,
+ 0x3a150c,
+ 0x3a26c8,
+ 0x3a4f0b,
+ 0x3a814b,
+ 0x3ab00e,
+ 0x3ac50b,
+ 0x3ae20b,
+ 0x3bb7cb,
+ 0x3bba89,
+ 0x3bbfcd,
+ 0x3cd98a,
+ 0x3d0b57,
+ 0x3d1358,
+ 0x3d3f49,
+ 0x3d508b,
+ 0x3d6054,
+ 0x3d654b,
+ 0x3d6aca,
+ 0x3d6f8a,
+ 0x3d720b,
+ 0x3d79d0,
+ 0x3d7dd1,
+ 0x3d838a,
+ 0x3d8f0d,
+ 0x3d960d,
+ 0x3dbdcb,
+ 0x3dc6c3,
+ 0x8bb77983,
+ 0x2d4886,
+ 0x278445,
+ 0x30db87,
+ 0x334706,
+ 0x1605042,
+ 0x2dd4c9,
+ 0x32c104,
+ 0x2e7748,
+ 0x21d4c3,
+ 0x2f3d87,
+ 0x22f282,
+ 0x2af9c3,
+ 0x8be0a842,
+ 0x2cd186,
+ 0x2ce1c4,
+ 0x35cbc4,
+ 0x332803,
+ 0x8c6c8e42,
+ 0x8caab204,
+ 0x275d07,
+ 0x8ce37b02,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0xecf48,
+ 0x2013c3,
+ 0x2000c2,
+ 0xa14c8,
+ 0x202782,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x202003,
+ 0x33e716,
+ 0x362c13,
+ 0x21e749,
+ 0x2447c8,
+ 0x3cb289,
+ 0x319ec6,
+ 0x34e710,
+ 0x2425d3,
+ 0x347c88,
+ 0x279447,
+ 0x27ad47,
+ 0x2a3b0a,
+ 0x32efc9,
+ 0x3a2849,
+ 0x24184b,
+ 0x3cbf86,
+ 0x289b0a,
+ 0x221346,
+ 0x32bd03,
+ 0x2dc8c5,
+ 0x3d1dc8,
+ 0x234a8d,
+ 0x3b8b8c,
+ 0x310ac7,
+ 0x32428d,
+ 0x225344,
+ 0x23094a,
+ 0x231e4a,
+ 0x23230a,
+ 0x2428c7,
+ 0x23bc07,
+ 0x23ef84,
+ 0x26ec06,
+ 0x32f404,
+ 0x2da308,
+ 0x2e1509,
+ 0x2d0f46,
+ 0x2d0f48,
+ 0x242d8d,
+ 0x2cc809,
+ 0x315848,
+ 0x239587,
+ 0x2399ca,
+ 0x253fc6,
+ 0x25f947,
+ 0x2cbe44,
+ 0x28f147,
+ 0x22964a,
+ 0x23d00e,
+ 0x278745,
+ 0x28f04b,
+ 0x229149,
+ 0x252d49,
+ 0x2add07,
+ 0x3bf4ca,
+ 0x2c1947,
+ 0x2f9209,
+ 0x3b9108,
+ 0x28eb4b,
+ 0x2e43c5,
+ 0x22bd4a,
+ 0x28fd09,
+ 0x37270a,
+ 0x2ceecb,
+ 0x3c514b,
+ 0x2415d5,
+ 0x2eb105,
+ 0x239605,
+ 0x2f864a,
+ 0x25b58a,
+ 0x311a07,
+ 0x234703,
+ 0x2b9388,
+ 0x2db00a,
+ 0x224086,
+ 0x266809,
+ 0x283048,
+ 0x2dcb04,
+ 0x387209,
+ 0x2c2988,
+ 0x2beec7,
+ 0x2e94c6,
+ 0x382b07,
+ 0x3503c7,
+ 0x23e385,
+ 0x2e730c,
+ 0x23d705,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x202782,
+ 0x22d7c3,
+ 0x206b43,
+ 0x2013c3,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x206b43,
+ 0x13c3,
+ 0x2a8b03,
+ 0x23cf83,
+ 0x1cdd43,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0xa14c8,
+ 0x202782,
+ 0x22d7c3,
+ 0x22d7c7,
+ 0x206b43,
+ 0x23cf83,
+ 0x202782,
+ 0x203dc2,
+ 0x31b402,
+ 0x206102,
+ 0x200d42,
+ 0x2ea5c2,
+ 0x91d46,
+ 0x54389,
+ 0x481b683,
+ 0x89947,
+ 0x7b83,
+ 0x11b645,
+ 0xc1,
+ 0x522d7c3,
+ 0x233743,
+ 0x228843,
+ 0x220583,
+ 0x219e43,
+ 0x205e03,
+ 0x2dc7c6,
+ 0x206b43,
+ 0x23cf83,
+ 0x204283,
+ 0xa14c8,
+ 0x200984,
+ 0x30ad47,
+ 0x332843,
+ 0x375e04,
+ 0x21a5c3,
+ 0x212003,
+ 0x220583,
+ 0x14c47,
+ 0x109744,
+ 0x3283,
+ 0x131905,
+ 0x2000c2,
+ 0x4ce83,
+ 0x6602782,
+ 0x688bc49,
+ 0x8c5cd,
+ 0x8c90d,
+ 0x31b402,
+ 0x22884,
+ 0x131949,
+ 0x2003c2,
+ 0x6e22788,
+ 0xf7dc4,
+ 0xa14c8,
+ 0x1419a42,
+ 0x14005c2,
+ 0x1419a42,
+ 0x1517386,
+ 0x22f303,
+ 0x26f283,
+ 0x762d7c3,
+ 0x230944,
+ 0x7a33743,
+ 0x7e20583,
+ 0x2067c2,
+ 0x222884,
+ 0x206b43,
+ 0x305f83,
+ 0x201642,
+ 0x23cf83,
+ 0x218142,
+ 0x2ffb03,
+ 0x209482,
+ 0x207043,
+ 0x283103,
+ 0x205302,
+ 0xa14c8,
+ 0x22f303,
+ 0x305f83,
+ 0x201642,
+ 0x2ffb03,
+ 0x209482,
+ 0x207043,
+ 0x283103,
+ 0x205302,
+ 0x2ffb03,
+ 0x209482,
+ 0x207043,
+ 0x283103,
+ 0x205302,
+ 0x22d7c3,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x219e43,
+ 0x205e03,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x202102,
+ 0x213c43,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x24ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x206b43,
+ 0x23cf83,
+ 0x3da885,
+ 0x2195c2,
+ 0x2000c2,
+ 0xa14c8,
+ 0x144b148,
+ 0x103e4a,
+ 0x220583,
+ 0x207881,
+ 0x2009c1,
+ 0x203281,
+ 0x202ec1,
+ 0x200a41,
+ 0x20c101,
+ 0x200a01,
+ 0x228441,
+ 0x207901,
+ 0x200001,
+ 0x2000c1,
+ 0x200201,
+ 0x12dac5,
+ 0xa14c8,
+ 0x200101,
+ 0x200f01,
+ 0x200501,
+ 0x202401,
+ 0x200041,
+ 0x200801,
+ 0x200181,
+ 0x202d41,
+ 0x200701,
+ 0x2004c1,
+ 0x200c01,
+ 0x200581,
+ 0x2003c1,
+ 0x201001,
+ 0x215f41,
+ 0x200401,
+ 0x200741,
+ 0x2007c1,
+ 0x200081,
+ 0x206841,
+ 0x201ec1,
+ 0x203301,
+ 0x201081,
+ 0x20a781,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x2003c2,
+ 0x23cf83,
+ 0x1b043,
+ 0x14c47,
+ 0x5f07,
+ 0x29f46,
+ 0x3530a,
+ 0x8b088,
+ 0x58748,
+ 0x58c07,
+ 0x108a46,
+ 0xe3485,
+ 0x45585,
+ 0x125d43,
+ 0x5bac6,
+ 0xec046,
+ 0x241844,
+ 0x37e847,
+ 0xa14c8,
+ 0x2dd2c4,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x2782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x32ba88,
+ 0x201844,
+ 0x233684,
+ 0x22afc4,
+ 0x349547,
+ 0x2d9947,
+ 0x22d7c3,
+ 0x23620b,
+ 0x31fb4a,
+ 0x3cc247,
+ 0x306588,
+ 0x328108,
+ 0x233743,
+ 0x336447,
+ 0x228843,
+ 0x20d348,
+ 0x210b49,
+ 0x222884,
+ 0x219e43,
+ 0x2fee88,
+ 0x205e03,
+ 0x2d618a,
+ 0x2dc7c6,
+ 0x3aa407,
+ 0x206b43,
+ 0x394486,
+ 0x26f108,
+ 0x23cf83,
+ 0x25ae06,
+ 0x2ef84d,
+ 0x2f1f08,
+ 0x2f898b,
+ 0x2bff86,
+ 0x3416c7,
+ 0x214dc5,
+ 0x2d5dca,
+ 0x228105,
+ 0x24308a,
+ 0x2195c2,
+ 0x207b83,
+ 0x231784,
+ 0x200006,
+ 0x3b0ec3,
+ 0x2a13c3,
+ 0x24de03,
+ 0x201843,
+ 0x372dc3,
+ 0x2017c2,
+ 0x300745,
+ 0x2a9049,
+ 0x23ea03,
+ 0x20a683,
+ 0x202b03,
+ 0x200201,
+ 0x2e8d87,
+ 0x2c8885,
+ 0x398a83,
+ 0x3c4703,
+ 0x22afc4,
+ 0x32f383,
+ 0x21c1c8,
+ 0x367603,
+ 0x31454d,
+ 0x26bc48,
+ 0x20b546,
+ 0x332d03,
+ 0x38d543,
+ 0x3ac783,
+ 0xbe2d7c3,
+ 0x232f88,
+ 0x236204,
+ 0x23fec3,
+ 0x200106,
+ 0x243608,
+ 0x202943,
+ 0x2d5e03,
+ 0x22d943,
+ 0x233743,
+ 0x210483,
+ 0x2416c3,
+ 0x2a6003,
+ 0x332c83,
+ 0x209c83,
+ 0x202403,
+ 0x38a7c5,
+ 0x254344,
+ 0x254cc7,
+ 0x2b06c2,
+ 0x2584c3,
+ 0x25af86,
+ 0x25c303,
+ 0x25c9c3,
+ 0x278643,
+ 0x309303,
+ 0x202383,
+ 0x2973c7,
+ 0xc220583,
+ 0x24b543,
+ 0x3d54c3,
+ 0x209a03,
+ 0x219c83,
+ 0x2fe043,
+ 0x3b4d05,
+ 0x371983,
+ 0x2f9f89,
+ 0x2035c3,
+ 0x30e7c3,
+ 0xc636803,
+ 0x3d8883,
+ 0x21b888,
+ 0x2a8f86,
+ 0x3090c6,
+ 0x29d786,
+ 0x388307,
+ 0x226b83,
+ 0x22a243,
+ 0x205e03,
+ 0x28b186,
+ 0x2104c2,
+ 0x2a6343,
+ 0x33d1c5,
+ 0x206b43,
+ 0x31aa87,
+ 0x16013c3,
+ 0x26f103,
+ 0x234203,
+ 0x218003,
+ 0x2050c3,
+ 0x23cf83,
+ 0x20e486,
+ 0x3315c6,
+ 0x37a043,
+ 0x2f0b83,
+ 0x213c43,
+ 0x225983,
+ 0x3c2083,
+ 0x2fe543,
+ 0x2ffec3,
+ 0x216345,
+ 0x25b583,
+ 0x378b46,
+ 0x32f608,
+ 0x217d43,
+ 0x274f89,
+ 0x363108,
+ 0x2170c8,
+ 0x224385,
+ 0x37cc0a,
+ 0x39da8a,
+ 0x22e30b,
+ 0x22f448,
+ 0x2ee443,
+ 0x38bc03,
+ 0x2f88c3,
+ 0x30f848,
+ 0x35e143,
+ 0x32e244,
+ 0x202742,
+ 0x260403,
+ 0x2007c3,
+ 0x229343,
+ 0x2572c3,
+ 0x204283,
+ 0x2195c2,
+ 0x227d43,
+ 0x239d03,
+ 0x317503,
+ 0x318c44,
+ 0x231784,
+ 0x228c83,
+ 0xa14c8,
+ 0x2000c2,
+ 0x200b02,
+ 0x2017c2,
+ 0x2020c2,
+ 0x200202,
+ 0x201942,
+ 0x258542,
+ 0x201242,
+ 0x200382,
+ 0x201442,
+ 0x25e5c2,
+ 0x200e82,
+ 0x26cec2,
+ 0x201002,
+ 0x2ea5c2,
+ 0x202142,
+ 0x203d42,
+ 0x213c42,
+ 0x2b0942,
+ 0x206382,
+ 0x200682,
+ 0x214582,
+ 0x202542,
+ 0x202002,
+ 0x201bc2,
+ 0x236082,
+ 0x202b42,
+ 0xc2,
+ 0xb02,
+ 0x17c2,
+ 0x20c2,
+ 0x202,
+ 0x1942,
+ 0x58542,
+ 0x1242,
+ 0x382,
+ 0x1442,
+ 0x5e5c2,
+ 0xe82,
+ 0x6cec2,
+ 0x1002,
+ 0xea5c2,
+ 0x2142,
+ 0x3d42,
+ 0x13c42,
+ 0xb0942,
+ 0x6382,
+ 0x682,
+ 0x14582,
+ 0x2542,
+ 0x2002,
+ 0x1bc2,
+ 0x36082,
+ 0x2b42,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x1ec2,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x2782,
+ 0x202782,
+ 0x23cf83,
+ 0xde2d7c3,
+ 0x220583,
+ 0x205e03,
+ 0x6df83,
+ 0x22ebc2,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0xa842,
+ 0x2001c2,
+ 0x1445d45,
+ 0x12dac5,
+ 0x20b342,
+ 0xa14c8,
+ 0x2782,
+ 0x234f42,
+ 0x202282,
+ 0x201c42,
+ 0x205d42,
+ 0x24fd42,
+ 0x45585,
+ 0x201fc2,
+ 0x201642,
+ 0x21a682,
0x202b82,
- 0x202903,
- 0xb2b48,
- 0x200742,
- 0x24dd03,
- 0x204502,
- 0x22cc43,
- 0x232ec3,
- 0x215e43,
- 0x21f504,
- 0x20e403,
- 0x21c103,
- 0x201ac3,
- 0x203583,
- 0x80244,
- 0x1553dc6,
- 0x200742,
- 0x204502,
- 0x215e43,
- 0x20e403,
- 0x201ac3,
+ 0x202142,
+ 0x3a1602,
+ 0x203842,
+ 0x295a82,
+ 0xef0b404,
+ 0x142,
+ 0x14c47,
+ 0x1a108d,
+ 0xe3509,
+ 0xaea4b,
+ 0xe80c8,
+ 0x71f49,
+ 0x10f346,
+ 0x220583,
+ 0xa14c8,
+ 0x109744,
+ 0x3283,
+ 0x131905,
+ 0xa14c8,
+ 0xdffc7,
+ 0x59706,
+ 0x131949,
+ 0x14a0e,
+ 0x137987,
+ 0x2000c2,
+ 0x241844,
+ 0x202782,
+ 0x22d7c3,
+ 0x203dc2,
+ 0x233743,
+ 0x19d03,
+ 0x200382,
+ 0x2dd2c4,
+ 0x219e43,
+ 0x24ab82,
+ 0x206b43,
+ 0x2003c2,
+ 0x23cf83,
+ 0x239606,
+ 0x3343cf,
+ 0x602,
+ 0x7094c3,
+ 0xa14c8,
+ 0x202782,
+ 0x228843,
+ 0x220583,
+ 0x205e03,
+ 0x13c3,
+ 0x14a08,
+ 0x14d5b8b,
+ 0x153f50a,
+ 0x148e24a,
+ 0x14726c7,
+ 0xa3bcb,
+ 0x15e1c5,
+ 0x11a7c9,
+ 0x12dac5,
+ 0x14c47,
+ 0xf5744,
+ 0x202782,
+ 0x22d7c3,
+ 0x220583,
+ 0x206b43,
+ 0x2000c2,
+ 0x201cc2,
+ 0x33b5c2,
+ 0x1222d7c3,
+ 0x23c842,
+ 0x233743,
+ 0x203582,
+ 0x20a1c2,
+ 0x220583,
+ 0x2068c2,
+ 0x272142,
+ 0x2ab1c2,
+ 0x202082,
+ 0x291a82,
+ 0x200802,
+ 0x2012c2,
+ 0x207102,
+ 0x27a482,
+ 0x201d02,
+ 0x18c3cc,
+ 0x2b1402,
+ 0x2efdc2,
+ 0x21d882,
+ 0x241442,
+ 0x205e03,
+ 0x200c02,
+ 0x206b43,
+ 0x209b42,
+ 0x2d43c2,
+ 0x23cf83,
+ 0x23ea82,
+ 0x202002,
+ 0x200ec2,
+ 0x201282,
+ 0x215042,
+ 0x2e9d02,
+ 0x219f82,
+ 0x25b8c2,
+ 0x220d02,
+ 0x323aca,
+ 0x3660ca,
+ 0x39858a,
+ 0x3dce42,
+ 0x218b42,
+ 0x3b4cc2,
+ 0x12644509,
+ 0x12b63a0a,
+ 0x142e5c7,
+ 0x12e04d82,
+ 0x140abc3,
+ 0x2e82,
+ 0x163a0a,
+ 0x1878ce,
+ 0x24ec04,
+ 0x5bd85,
+ 0x1362d7c3,
+ 0x3d4c3,
+ 0x233743,
+ 0x251184,
+ 0x1c1f46,
+ 0x220583,
+ 0x222884,
+ 0x219e43,
+ 0x13ee09,
+ 0x157646,
+ 0x205e03,
+ 0xe9644,
+ 0x10a4c3,
+ 0x206b43,
+ 0xfc85,
+ 0x2013c3,
+ 0x23cf83,
+ 0x14e60c4,
+ 0x25b583,
+ 0x6a04,
+ 0x207b83,
+ 0xa14c8,
+ 0x109406,
+ 0x15089c4,
+ 0x132605,
+ 0x13774a,
+ 0x12b382,
+ 0x1a7b46,
+ 0x48fd1,
+ 0x13e44509,
+ 0x132688,
+ 0x50308,
+ 0x1c6547,
+ 0x2442,
+ 0xe834e,
+ 0x12dacb,
+ 0x132e0b,
+ 0x19018a,
+ 0x89a4a,
+ 0x2afc7,
+ 0xa14c8,
+ 0x11d0c8,
+ 0x7947,
+ 0x1a81414b,
+ 0x1b047,
+ 0x1c742,
+ 0x7dc87,
+ 0xd4b8a,
+ 0x48a4f,
+ 0x4604f,
+ 0xd5e42,
+ 0x2782,
+ 0xa5f48,
+ 0xe1f0a,
+ 0xdfaca,
+ 0x54a4a,
+ 0x6ba48,
+ 0xe188,
+ 0x5d448,
+ 0xdff88,
+ 0x173088,
+ 0x2942,
+ 0x45dcf,
+ 0xa0d8b,
+ 0x6c648,
+ 0x3fbc7,
+ 0x374a,
+ 0x19ee0b,
+ 0x80b89,
+ 0x4aac7,
+ 0xe088,
+ 0x19dc4c,
+ 0x1a0047,
+ 0x6644a,
+ 0x18b08,
+ 0x29f4e,
+ 0x2a70e,
+ 0x2ae0b,
+ 0x3850b,
+ 0xde14b,
+ 0xe4b09,
+ 0xe518b,
+ 0xebb0d,
+ 0x10138b,
+ 0x110d0d,
+ 0x11108d,
+ 0x103c8a,
+ 0x315cb,
+ 0x3d54b,
+ 0x18af05,
+ 0x1ac24b50,
+ 0x168cf,
+ 0x10b5cf,
+ 0xe558d,
+ 0x13efd0,
+ 0x758c2,
+ 0x1b21e488,
+ 0x5d88,
+ 0x6e4d0,
+ 0x11e60e,
+ 0x1b7675c5,
+ 0x5010b,
+ 0x13df10,
+ 0x57d48,
+ 0xe28a,
+ 0x386c9,
+ 0x64b87,
+ 0x64ec7,
+ 0x65087,
+ 0x659c7,
+ 0x66b87,
+ 0x67107,
+ 0x67807,
+ 0x67d47,
+ 0x68287,
+ 0x68607,
+ 0x68cc7,
+ 0x68e87,
+ 0x69047,
+ 0x69207,
+ 0x69947,
+ 0x69cc7,
+ 0x6a787,
+ 0x6ab47,
+ 0x6b107,
+ 0x6b3c7,
+ 0x6b587,
+ 0x6c8c7,
+ 0x6cd87,
+ 0x6cf87,
+ 0x6d347,
+ 0x6d507,
+ 0x6d6c7,
+ 0x6ee07,
+ 0x70247,
+ 0x70647,
+ 0x70e07,
+ 0x710c7,
+ 0x71447,
+ 0x71607,
+ 0x71a07,
+ 0x72f87,
+ 0x739c7,
+ 0x73f47,
+ 0x74107,
+ 0x742c7,
+ 0x75b07,
+ 0x76587,
+ 0x76ac7,
+ 0x770c7,
+ 0x77287,
+ 0x77607,
+ 0x77b47,
+ 0x37482,
+ 0x5d54a,
+ 0xe9787,
+ 0x8b705,
+ 0x9a3d1,
+ 0x1d21c6,
+ 0xf2f0a,
+ 0xa5dca,
+ 0x59706,
+ 0x15578b,
+ 0x642,
+ 0x2fad1,
+ 0xb3dc9,
+ 0x967c9,
+ 0x7102,
+ 0x8898a,
+ 0xa8549,
+ 0xa8c8f,
+ 0xa928e,
+ 0xaa8c8,
+ 0x373c2,
+ 0x108f09,
+ 0x19774e,
+ 0x1c848c,
+ 0xeaa8f,
+ 0x1b174e,
+ 0x8284c,
+ 0xe4e09,
+ 0xe6711,
+ 0xe6cc8,
+ 0x19e052,
+ 0x19f60d,
+ 0x6eacd,
+ 0x16f00b,
+ 0x4da95,
+ 0x504c9,
+ 0x5c44a,
+ 0x73109,
+ 0x82c50,
+ 0x8700b,
+ 0x16e18f,
+ 0x1ca50b,
+ 0x916cc,
+ 0x93b50,
+ 0xa4cca,
+ 0xa620d,
+ 0xac4ce,
+ 0xae70a,
+ 0xaf0cc,
+ 0x150094,
+ 0xb3a51,
+ 0xb7f0b,
+ 0xb8f0f,
+ 0xb9d0d,
+ 0xba58e,
+ 0xbed8c,
+ 0xc1d8c,
+ 0xc304b,
+ 0xc3a0e,
+ 0xc42d0,
+ 0xc548b,
+ 0x134c0d,
+ 0x14288f,
+ 0xcfc0c,
+ 0xd0dce,
+ 0xd2d11,
+ 0xda08c,
+ 0xf5587,
+ 0xfc78d,
+ 0x11274c,
+ 0x1cf090,
+ 0x102dcd,
+ 0x11ac07,
+ 0x15c2d0,
+ 0x16f588,
+ 0x184ccb,
+ 0xb018f,
+ 0x17f8c8,
+ 0xf310d,
+ 0x107d10,
+ 0x175889,
+ 0x1bab22c6,
+ 0xb3143,
+ 0xba245,
+ 0x53a42,
+ 0x3bc9,
+ 0x5a34a,
+ 0x1bf9e506,
+ 0x1c27de84,
+ 0x5acc6,
+ 0x1d3ca,
+ 0xe5d0d,
+ 0x1c5313c9,
+ 0x19a03,
+ 0x114e0a,
+ 0xde5d1,
+ 0xdea09,
+ 0xdfa47,
+ 0xe0808,
+ 0xe0e07,
+ 0xe9848,
+ 0x45ecb,
+ 0x12d8c9,
+ 0xe9fd0,
+ 0xea48c,
+ 0xeaf48,
+ 0xeb3c5,
+ 0x1b9288,
+ 0x1bcd8a,
+ 0x19ac7,
+ 0x12e547,
+ 0x13c2,
+ 0x13ec0a,
+ 0x147488,
+ 0x1c3689,
+ 0x78505,
+ 0x11a90a,
+ 0x8f40f,
+ 0x12a2cb,
+ 0x1b4dcc,
+ 0x15c812,
+ 0x78845,
+ 0xed2c8,
+ 0x51c0a,
+ 0x1caf7605,
+ 0x17770c,
+ 0x13b403,
+ 0x1a1602,
+ 0x10004a,
+ 0x15003cc,
+ 0x1a03c8,
+ 0x110ec8,
+ 0x1cf47506,
+ 0x18c8c7,
+ 0x16f82,
+ 0x9482,
+ 0x4ecd0,
+ 0x72847,
+ 0x2f0cf,
+ 0x5bac6,
+ 0x7c64e,
+ 0x1592cb,
+ 0x49f88,
+ 0x80f49,
+ 0x1991d2,
+ 0x11570d,
+ 0x115f88,
+ 0xae909,
+ 0xd8f4d,
+ 0x18be89,
+ 0x19628b,
+ 0x1d1c08,
+ 0x7c988,
+ 0x7ec48,
+ 0x7f089,
+ 0x7f28a,
+ 0x7ff4c,
+ 0xea74a,
+ 0x1c20c7,
+ 0x55c8d,
+ 0xe6fd1,
+ 0x1d2ba886,
+ 0x1b068b,
+ 0x12bf0c,
+ 0x10448,
+ 0x48589,
+ 0x17c5cd,
+ 0x1a7d50,
+ 0xd2c2,
+ 0x14500d,
+ 0x7d82,
+ 0x1a6c2,
+ 0x1c200a,
+ 0x10c20a,
+ 0xf2e0a,
+ 0xf3c8b,
+ 0x2a98c,
+ 0x11c8cc,
+ 0x11cbca,
+ 0x11ce4e,
+ 0x1dc80d,
+ 0x1d5dcd05,
+ 0x136288,
+ 0xa842,
+ 0x1430c68e,
+ 0x14a0750e,
+ 0x152046ca,
+ 0x15b322ce,
+ 0x16202f4e,
+ 0x16b7350c,
+ 0x142e5c7,
+ 0x142e5c9,
+ 0x140abc3,
+ 0x173cd68c,
+ 0x17a758c9,
+ 0x18329b09,
+ 0x18b37549,
+ 0x2e82,
+ 0x10c5d1,
+ 0x7451,
+ 0x460d,
+ 0x132211,
+ 0x2e91,
+ 0x17344f,
+ 0x1cd5cf,
+ 0x7580c,
+ 0x129a4c,
+ 0x13748c,
+ 0x14364d,
+ 0x202d5,
+ 0x581cc,
+ 0x6964c,
+ 0x133510,
+ 0x17910c,
+ 0x18954c,
+ 0x199c99,
+ 0x1a9299,
+ 0x1b2559,
+ 0x1c0f94,
+ 0x1c3c94,
+ 0x7ad4,
+ 0x8554,
+ 0x8ad4,
+ 0x19258289,
+ 0x19807d89,
+ 0x1a269709,
+ 0x146e6ec9,
+ 0x2e82,
+ 0x14ee6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x156e6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x15ee6ec9,
+ 0x2e82,
+ 0x166e6ec9,
+ 0x2e82,
+ 0x16ee6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x176e6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x17ee6ec9,
+ 0x2e82,
+ 0x186e6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x18ee6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x196e6ec9,
+ 0x2e82,
+ 0x19ee6ec9,
+ 0x2e82,
+ 0x1a6e6ec9,
+ 0x2e82,
+ 0x7aca,
+ 0x2e82,
+ 0x48fc5,
+ 0x190184,
+ 0x10c68e,
+ 0x750e,
+ 0x79d4e,
+ 0x46ca,
+ 0x1322ce,
+ 0x2f4e,
+ 0x17350c,
+ 0x1cd68c,
+ 0x758c9,
+ 0x129b09,
+ 0x137549,
+ 0x58289,
+ 0x7d89,
+ 0x69709,
+ 0x204cd,
+ 0x8809,
+ 0x8d89,
+ 0x141e44,
+ 0x1d5f44,
+ 0x18d184,
+ 0x149c84,
+ 0xa3e84,
+ 0x2c684,
+ 0x36a04,
+ 0x52644,
+ 0x103a04,
+ 0x159da03,
+ 0x31b07,
+ 0x3484c,
+ 0x20c3,
+ 0x758c2,
+ 0x1dc803,
+ 0x20c3,
+ 0x35e03,
+ 0x148702,
+ 0x1da608,
+ 0x12d947,
+ 0x2942,
+ 0x2000c2,
+ 0x202782,
+ 0x203dc2,
+ 0x219d02,
+ 0x200382,
+ 0x2003c2,
+ 0x209482,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x219c83,
+ 0x206b43,
+ 0x23cf83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x206b43,
+ 0x23cf83,
+ 0xb243,
+ 0x220583,
+ 0x22884,
+ 0x2000c2,
+ 0x24ce83,
+ 0x1fa2d7c3,
+ 0x38abc7,
+ 0x220583,
+ 0x214903,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x21d60a,
+ 0x239605,
+ 0x213c43,
+ 0x21be02,
+ 0xa14c8,
+ 0xa14c8,
+ 0x2782,
+ 0x1392c2,
+ 0x2033114b,
+ 0x2062da44,
+ 0x7ddc5,
+ 0x5f85,
+ 0x1d9c46,
+ 0x20a05f85,
+ 0x57243,
+ 0x1080c3,
+ 0x109744,
+ 0x3283,
+ 0x131905,
+ 0x12dac5,
+ 0xa14c8,
+ 0x1b047,
+ 0x2d7c3,
+ 0x2123a4c7,
+ 0x3686,
+ 0x21573345,
+ 0x3a5c7,
+ 0xbb4a,
+ 0xba08,
+ 0xea47,
+ 0x679ca,
+ 0x183548,
+ 0x33c87,
+ 0x1a618f,
+ 0x3e047,
+ 0x52446,
+ 0x13df10,
+ 0xf43cf,
+ 0x12789,
+ 0x5ad44,
+ 0x2183a68e,
+ 0x50949,
+ 0x69346,
+ 0x1071c9,
+ 0x18bb06,
+ 0x1c4d06,
+ 0x6c40c,
+ 0x19f00a,
+ 0x80d07,
+ 0x1cd10a,
+ 0x160a49,
+ 0xef0cc,
+ 0x1b4a8a,
+ 0x60c0a,
+ 0x131949,
+ 0x5acc6,
+ 0x80dca,
+ 0x11658a,
+ 0x9cf0a,
+ 0x11a349,
+ 0xdce88,
+ 0xdd106,
+ 0xe3a0d,
+ 0xbacc5,
+ 0x21f4df8c,
+ 0x137987,
+ 0x1051c9,
+ 0xb4147,
+ 0x10cad4,
+ 0x10cfcb,
+ 0x3fa0a,
+ 0x19904a,
+ 0xa65cd,
+ 0x14f3e89,
+ 0x1154cc,
+ 0x115d8b,
+ 0x18b03,
+ 0x18b03,
+ 0x29f46,
+ 0x18b03,
+ 0x1d9c48,
+ 0x1cd543,
+ 0x150c443,
+ 0x54389,
+ 0x14cfe83,
+ 0x82ec7,
+ 0x22dc6409,
+ 0x12a06,
+ 0x1081c9,
+ 0x4ce83,
+ 0xa14c8,
+ 0x2782,
+ 0x51184,
+ 0x88dc3,
+ 0x1da885,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x20a683,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x296983,
+ 0x207b83,
+ 0x20a683,
+ 0x241844,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x204f03,
+ 0x249c6505,
+ 0x142c183,
+ 0x22d7c3,
+ 0x233743,
+ 0x219d03,
+ 0x228843,
+ 0x220583,
+ 0x222884,
+ 0x37fa83,
+ 0x22a243,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x213c43,
+ 0x2561dac3,
+ 0x15c709,
+ 0x2782,
+ 0x2097c3,
+ 0x2622d7c3,
+ 0x233743,
+ 0x24adc3,
+ 0x220583,
+ 0x217343,
+ 0x22a243,
+ 0x23cf83,
+ 0x21c3c3,
+ 0x369444,
+ 0xa14c8,
+ 0x26a2d7c3,
+ 0x233743,
+ 0x2aa983,
+ 0x220583,
+ 0x205e03,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x22ec43,
+ 0xa14c8,
+ 0x2722d7c3,
+ 0x233743,
+ 0x228843,
+ 0x2013c3,
+ 0x23cf83,
+ 0xa14c8,
+ 0x142e5c7,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x12dac5,
+ 0x14c47,
+ 0x10cd0b,
+ 0xdee04,
+ 0xbacc5,
+ 0x144b148,
+ 0xaafcd,
+ 0x286e75c5,
+ 0x9a544,
+ 0x2782,
+ 0x1083,
+ 0x175785,
+ 0x2ebc2,
+ 0x2b82,
+ 0x3cc145,
+ 0xa14c8,
+ 0x18b02,
+ 0x1d003,
+ 0x16240f,
+ 0x2782,
+ 0xfd346,
+ 0x2ebc2,
+ 0x32c608,
+ 0x241844,
+ 0x340cc6,
+ 0x343506,
+ 0xa14c8,
+ 0x301983,
+ 0x2c6689,
+ 0x359a95,
+ 0x159a9f,
+ 0x22d7c3,
+ 0x3c0b52,
+ 0x16ed46,
+ 0x17fe05,
+ 0xe28a,
+ 0x386c9,
+ 0x3c090f,
+ 0x2dd2c4,
+ 0x25e605,
+ 0x30e590,
+ 0x2449c7,
+ 0x2013c3,
+ 0x2fb908,
+ 0x10b906,
+ 0x27ee0a,
+ 0x206f84,
+ 0x2f7043,
+ 0x21be02,
+ 0x2f060b,
+ 0x13c3,
+ 0x19c3c4,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x2fe843,
+ 0x202782,
+ 0xe16c3,
+ 0xf984,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x214903,
+ 0x226243,
+ 0x23cf83,
+ 0x4ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x2000c2,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x5f85,
+ 0x241844,
+ 0x22d7c3,
+ 0x233743,
+ 0x3216c4,
+ 0x206b43,
+ 0x23cf83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0x137249,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x209a03,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x32ef44,
+ 0x222884,
+ 0x206b43,
+ 0x23cf83,
+ 0x207b83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x2067c3,
+ 0x44b03,
+ 0x14903,
+ 0x206b43,
+ 0x23cf83,
+ 0x323aca,
+ 0x345349,
+ 0x35c04b,
+ 0x35d44a,
+ 0x3660ca,
+ 0x376b8b,
+ 0x38b8ca,
+ 0x391f8a,
+ 0x39858a,
+ 0x39880b,
+ 0x3bcac9,
+ 0x3c94ca,
+ 0x3c9c8b,
+ 0x3d680b,
+ 0x3db74a,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x17830b,
+ 0x5e148,
+ 0xd9084,
+ 0x46006,
+ 0xec149,
+ 0xa14c8,
+ 0x22d7c3,
+ 0xe284,
+ 0x264b84,
+ 0x20d142,
+ 0x205184,
+ 0x331e45,
+ 0x20a683,
+ 0x241844,
+ 0x22d7c3,
+ 0x236204,
+ 0x233743,
+ 0x251184,
+ 0x2dd2c4,
+ 0x222884,
+ 0x22a243,
+ 0x206b43,
+ 0x23cf83,
+ 0x3451c5,
+ 0x204f03,
+ 0x213c43,
+ 0x210f43,
+ 0x23d804,
+ 0x309384,
+ 0x308485,
+ 0xa14c8,
+ 0x2010c4,
+ 0x3c4e86,
+ 0x331a84,
+ 0x202782,
+ 0x35cc07,
+ 0x249587,
+ 0x24e444,
+ 0x25bec5,
+ 0x302fc5,
+ 0x22e1c5,
+ 0x222884,
+ 0x3883c8,
+ 0x239006,
+ 0x34c488,
+ 0x27a4c5,
+ 0x2e43c5,
+ 0x235fc4,
+ 0x23cf83,
+ 0x2f7dc4,
+ 0x3751c6,
+ 0x239703,
+ 0x23d804,
+ 0x243185,
+ 0x203b44,
+ 0x255ac4,
+ 0x21be02,
+ 0x39f906,
+ 0x3aec06,
+ 0x313d05,
+ 0x2000c2,
+ 0x24ce83,
+ 0x30a02782,
+ 0x21e604,
+ 0x200382,
+ 0x205e03,
+ 0x245ec2,
+ 0x206b43,
+ 0x2003c2,
+ 0x2f4786,
+ 0x202003,
+ 0x207b83,
+ 0xab204,
+ 0xa14c8,
+ 0xa14c8,
+ 0x220583,
+ 0x6df83,
+ 0x2000c2,
+ 0x31602782,
+ 0x220583,
+ 0x268fc3,
+ 0x37fa83,
+ 0x22da44,
+ 0x206b43,
+ 0x23cf83,
+ 0xa14c8,
+ 0x2000c2,
+ 0x31e02782,
+ 0x22d7c3,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x682,
+ 0x2062c2,
+ 0x2195c2,
+ 0x214903,
+ 0x2ef083,
+ 0x2000c2,
+ 0x12dac5,
+ 0xa14c8,
+ 0x14c47,
+ 0x202782,
+ 0x233743,
+ 0x251184,
+ 0x204183,
+ 0x220583,
+ 0x209a03,
+ 0x205e03,
+ 0x206b43,
+ 0x212203,
+ 0x23cf83,
+ 0x234703,
+ 0x1cb6d3,
+ 0x127714,
+ 0x12dac5,
+ 0x14c47,
+ 0x114486,
+ 0x111b4b,
+ 0x29f46,
+ 0x58587,
+ 0x5bec6,
+ 0x649,
+ 0x10408a,
+ 0x8af4d,
+ 0x1a0d8c,
+ 0x116f0a,
+ 0xf9708,
+ 0x45585,
+ 0xbb88,
+ 0x5bac6,
+ 0x1be646,
+ 0xec046,
+ 0x602,
+ 0x2758c2,
+ 0x7844,
+ 0x9b106,
+ 0x178050,
+ 0x83a0e,
+ 0x49c6,
+ 0x177e0c,
+ 0x336488cb,
+ 0x12dac5,
+ 0x1407cb,
+ 0x33bbe584,
+ 0x190347,
+ 0x23ed1,
+ 0x10388a,
+ 0x22d7c3,
+ 0x67945,
+ 0x160308,
+ 0x16f44,
+ 0x5a545,
+ 0x33d10886,
+ 0x9a3c6,
+ 0xbc406,
+ 0x91d4a,
+ 0x198ac3,
+ 0x34242584,
+ 0x54389,
+ 0x1784a,
+ 0x14cea89,
+ 0x605,
+ 0x110c83,
+ 0x3479e587,
+ 0xfc85,
+ 0x1563046,
+ 0x15584c,
+ 0xfac48,
+ 0xf084b,
+ 0xdf44b,
+ 0x34a4b78c,
+ 0x140c0c3,
+ 0xbbf88,
+ 0xf0ac5,
+ 0xa0c09,
+ 0xf3f88,
+ 0x141d306,
+ 0x89947,
+ 0x34f7c5c9,
+ 0x12b3c7,
+ 0x15e1ca,
+ 0x115a4d,
+ 0x140fc8,
+ 0x20c3,
+ 0x108943,
+ 0x1d9c48,
+ 0x103a04,
+ 0x129285,
+ 0xe8507,
+ 0x35245dc3,
+ 0x3575fec6,
+ 0x35af8644,
+ 0x35f00207,
+ 0x1d9c44,
+ 0x1d9c44,
+ 0x1d9c44,
+ 0x1d9c44,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x2000c2,
+ 0x202782,
+ 0x220583,
+ 0x2067c2,
+ 0x206b43,
+ 0x23cf83,
+ 0x202003,
+ 0x38054f,
+ 0x38090e,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x43447,
+ 0x233743,
+ 0x220583,
+ 0x219e43,
+ 0x206b43,
+ 0x23cf83,
+ 0x4904,
+ 0x33c4,
+ 0xa04,
+ 0x21cd03,
+ 0x30a807,
+ 0x201842,
+ 0x2c9689,
+ 0x200b02,
+ 0x24efcb,
+ 0x2a52ca,
+ 0x2e2689,
+ 0x200542,
+ 0x2750c6,
+ 0x3ac995,
+ 0x24f115,
+ 0x230313,
+ 0x24f693,
+ 0x220f02,
+ 0x220f05,
+ 0x360e4c,
+ 0x27680b,
+ 0x296e05,
+ 0x2020c2,
+ 0x2ffe82,
+ 0x38f886,
+ 0x202442,
+ 0x260646,
+ 0x20e50d,
+ 0x20fa0c,
+ 0x224bc4,
+ 0x200882,
+ 0x20c882,
+ 0x39e408,
+ 0x200202,
+ 0x30f9c6,
+ 0x30f9cf,
+ 0x393e90,
+ 0x3a39c4,
+ 0x3acb55,
+ 0x230493,
+ 0x204dc3,
+ 0x34320a,
+ 0x20ee07,
+ 0x35f709,
+ 0x217707,
+ 0x225a42,
+ 0x200282,
+ 0x3b2246,
+ 0x207942,
+ 0xa14c8,
+ 0x201a42,
+ 0x2010c2,
+ 0x209247,
+ 0x341247,
+ 0x341251,
+ 0x218105,
+ 0x21810e,
+ 0x21860f,
+ 0x21c742,
+ 0x394547,
+ 0x21cd48,
+ 0x207c02,
+ 0x325802,
+ 0x2a9746,
+ 0x3418cf,
+ 0x2a9750,
+ 0x22b882,
+ 0x205cc2,
+ 0x32f488,
+ 0x212283,
+ 0x288f88,
+ 0x30bd8d,
+ 0x23af03,
+ 0x3723c8,
+ 0x23af0f,
+ 0x23b2ce,
+ 0x398d0a,
+ 0x226e51,
+ 0x2272d0,
+ 0x2bd68d,
+ 0x2bd9cc,
+ 0x3c2447,
+ 0x343387,
+ 0x340d89,
+ 0x224cc2,
+ 0x201942,
+ 0x259e0c,
+ 0x25a10b,
+ 0x2014c2,
+ 0x2c3206,
+ 0x22ec82,
+ 0x200482,
+ 0x2d5e42,
+ 0x202782,
+ 0x22dbc4,
+ 0x23a187,
+ 0x22bdc2,
+ 0x23e4c7,
+ 0x240787,
+ 0x220282,
+ 0x22eec2,
+ 0x243305,
+ 0x237982,
+ 0x2e920e,
+ 0x38288d,
+ 0x233743,
+ 0x397d0e,
+ 0x2b628d,
+ 0x341643,
+ 0x201602,
+ 0x286d04,
+ 0x265582,
+ 0x2029c2,
+ 0x39b945,
+ 0x39d087,
+ 0x24a442,
+ 0x219d02,
+ 0x250d87,
+ 0x254708,
+ 0x2b06c2,
+ 0x2788c6,
+ 0x259c8c,
+ 0x259fcb,
+ 0x20e282,
+ 0x260e8f,
+ 0x261250,
+ 0x26164f,
+ 0x261a15,
+ 0x261f54,
+ 0x26244e,
+ 0x2627ce,
+ 0x262b4f,
+ 0x262f0e,
+ 0x263294,
+ 0x263793,
+ 0x263c4d,
+ 0x277d09,
+ 0x28cc43,
+ 0x204182,
+ 0x28dc85,
+ 0x3c70c6,
+ 0x200382,
+ 0x367207,
+ 0x220583,
+ 0x200642,
+ 0x232548,
+ 0x227091,
+ 0x2274d0,
+ 0x200bc2,
+ 0x28ba87,
+ 0x201b82,
+ 0x309a07,
+ 0x253a42,
+ 0x37ed89,
+ 0x38f847,
+ 0x318008,
+ 0x3106c6,
+ 0x2eef83,
+ 0x3cbdc5,
+ 0x2339c2,
+ 0x2004c2,
+ 0x3d5e45,
+ 0x377b85,
+ 0x200f82,
+ 0x21c583,
+ 0x340b47,
+ 0x218447,
+ 0x204042,
+ 0x204044,
+ 0x218983,
+ 0x348009,
+ 0x218988,
+ 0x200b42,
+ 0x208002,
+ 0x22cec7,
+ 0x235d05,
+ 0x363388,
+ 0x246a07,
+ 0x209b83,
+ 0x29af86,
+ 0x2bd50d,
+ 0x2bd88c,
+ 0x2da786,
+ 0x202282,
+ 0x2df302,
+ 0x2024c2,
+ 0x23ad8f,
+ 0x23b18e,
+ 0x303047,
+ 0x205e02,
+ 0x3200c5,
+ 0x3200c6,
+ 0x202dc2,
+ 0x200c02,
+ 0x29f506,
+ 0x210203,
+ 0x309946,
+ 0x2ccec5,
+ 0x2ccecd,
+ 0x2cd515,
+ 0x2cdf4c,
+ 0x2ce2cd,
+ 0x2ce612,
+ 0x200e82,
+ 0x26cec2,
+ 0x201342,
+ 0x329906,
+ 0x3c8346,
+ 0x2013c2,
+ 0x3c7146,
+ 0x21a682,
+ 0x2c71c5,
+ 0x200d42,
+ 0x2e9349,
+ 0x222ecc,
+ 0x22320b,
+ 0x2003c2,
+ 0x2550c8,
+ 0x2039c2,
+ 0x201002,
+ 0x271746,
+ 0x2e6e45,
+ 0x309807,
+ 0x226ac5,
+ 0x25bc05,
+ 0x2434c2,
+ 0x20bc42,
+ 0x202142,
+ 0x2ead87,
+ 0x2f484d,
+ 0x2f4bcc,
+ 0x3abf47,
+ 0x278842,
+ 0x203d42,
+ 0x20cb48,
+ 0x203d48,
+ 0x2e7c08,
+ 0x2f30c4,
+ 0x2c3c87,
+ 0x27df03,
+ 0x223802,
+ 0x204f02,
+ 0x2f5849,
+ 0x22a347,
+ 0x213c42,
+ 0x271b45,
+ 0x241f42,
+ 0x21f4c2,
+ 0x3bfe83,
+ 0x3bfe86,
+ 0x2fe542,
+ 0x2ffa82,
+ 0x200402,
+ 0x27ea46,
+ 0x2ddb07,
+ 0x213a42,
+ 0x200902,
+ 0x288dcf,
+ 0x397b4d,
+ 0x3d364e,
+ 0x2b610c,
+ 0x202342,
+ 0x204482,
+ 0x310505,
+ 0x3220c6,
+ 0x202482,
+ 0x206382,
+ 0x200682,
+ 0x246984,
+ 0x2fee04,
+ 0x355686,
+ 0x209482,
+ 0x27b0c7,
+ 0x233ec3,
+ 0x233ec8,
+ 0x23ba08,
+ 0x36ee87,
+ 0x253cc6,
+ 0x2037c2,
+ 0x2398c3,
+ 0x2b7387,
+ 0x287c86,
+ 0x2e3705,
+ 0x2f3448,
+ 0x203002,
+ 0x274e87,
+ 0x236082,
+ 0x308102,
+ 0x21bac2,
+ 0x218789,
+ 0x241542,
+ 0xc2148,
+ 0x201182,
+ 0x24fac3,
+ 0x331fc7,
+ 0x201202,
+ 0x22304c,
+ 0x22334b,
+ 0x2da806,
+ 0x310bc5,
+ 0x243982,
+ 0x202b42,
+ 0x2be3c6,
+ 0x267343,
+ 0x32ecc7,
+ 0x288782,
+ 0x2008c2,
+ 0x3ac815,
+ 0x24f2d5,
+ 0x2301d3,
+ 0x24f813,
+ 0x38a2c7,
+ 0x25fad1,
+ 0x266d10,
+ 0x276c52,
+ 0x27b891,
+ 0x29a7c8,
+ 0x29a7d0,
+ 0x2a168f,
+ 0x2a5093,
+ 0x384f52,
+ 0x3bc3d0,
+ 0x2b240f,
+ 0x2c0dd2,
+ 0x3a2291,
+ 0x2cca13,
+ 0x2d7212,
+ 0x2db24f,
+ 0x2dc04e,
+ 0x2e0392,
+ 0x2e2491,
+ 0x2ec80f,
+ 0x2fe1ce,
+ 0x2f0fd1,
+ 0x2fae10,
+ 0x2fbc92,
+ 0x2fe8d1,
+ 0x33c390,
+ 0x354d0f,
+ 0x3bd1d1,
+ 0x3c9890,
+ 0x31b8c6,
+ 0x33bf87,
+ 0x215907,
+ 0x203b02,
+ 0x2847c5,
+ 0x30e307,
+ 0x2195c2,
+ 0x206042,
+ 0x227d45,
+ 0x202243,
+ 0x308e06,
+ 0x2f4a0d,
+ 0x2f4d4c,
+ 0x206842,
+ 0x360ccb,
+ 0x2766ca,
+ 0x220dca,
+ 0x2bce09,
+ 0x2f284b,
+ 0x246b4d,
+ 0x30ea0c,
+ 0x27250a,
+ 0x2707cc,
+ 0x27778b,
+ 0x296c4c,
+ 0x2b464e,
+ 0x3560cb,
+ 0x2b588c,
+ 0x2e4083,
+ 0x38bd86,
+ 0x3bf082,
+ 0x2fc182,
+ 0x20f203,
+ 0x214f82,
+ 0x21e4c3,
+ 0x32ae06,
+ 0x261bc7,
+ 0x2d3b06,
+ 0x2e20c8,
+ 0x3409c8,
+ 0x31e8c6,
+ 0x20a342,
+ 0x3136cd,
+ 0x313a0c,
+ 0x2df607,
+ 0x316d47,
+ 0x2351c2,
+ 0x213e42,
+ 0x276c02,
+ 0x279b42,
+ 0x3388d6,
+ 0x33d315,
+ 0x340296,
+ 0x343993,
+ 0x344052,
+ 0x353a93,
+ 0x354012,
+ 0x3adb0f,
+ 0x3bdfd8,
+ 0x3beb57,
+ 0x3c0019,
+ 0x3c1498,
+ 0x3c2e18,
+ 0x3c4197,
+ 0x3c5a17,
+ 0x3c6816,
+ 0x3ce1d3,
+ 0x3ce8d5,
+ 0x3cf792,
+ 0x3cfc13,
+ 0x202782,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x202003,
+ 0x2000c2,
+ 0x206702,
+ 0x37e938c5,
+ 0x3828a305,
+ 0x3867e706,
+ 0xa14c8,
+ 0x38ab2985,
+ 0x202782,
+ 0x203dc2,
+ 0x38f2f1c5,
+ 0x39282b45,
+ 0x39683f47,
+ 0x39a84c49,
+ 0x39e37284,
+ 0x200382,
+ 0x200642,
+ 0x3a24d8c5,
+ 0x3a698349,
+ 0x3ab37f88,
+ 0x3aeaef45,
+ 0x3b317887,
+ 0x3b613148,
+ 0x3baed185,
+ 0x3be45a86,
+ 0x3c2496c9,
+ 0x3c6d3388,
+ 0x3cac3848,
+ 0x3ce9898a,
+ 0x3d2e1804,
+ 0x3d60d685,
+ 0x3dabf848,
+ 0x3de03945,
+ 0x212302,
+ 0x3e237f83,
+ 0x3e6a5746,
+ 0x3eae6548,
+ 0x3efb8806,
+ 0x3f209388,
+ 0x3f727d86,
+ 0x3fa3dbc4,
+ 0x3fe02642,
+ 0x40301b47,
+ 0x406ab6c4,
+ 0x40a7a1c7,
+ 0x40f2f7c7,
+ 0x2003c2,
+ 0x4129dbc5,
+ 0x41644704,
+ 0x41ad29c7,
+ 0x41e31c87,
+ 0x42286b46,
+ 0x42683785,
+ 0x42a98447,
+ 0x42ed3208,
+ 0x4328e007,
+ 0x437cf549,
+ 0x43ad6385,
+ 0x43f125c7,
+ 0x44292f06,
+ 0x9a54b,
+ 0x44606548,
+ 0x22824d,
+ 0x27e1c9,
+ 0x2a874b,
+ 0x2aaa8b,
+ 0x3199cb,
+ 0x31758b,
+ 0x3222cb,
+ 0x32258b,
+ 0x322ac9,
+ 0x323d4b,
+ 0x32400b,
+ 0x3245cb,
+ 0x3256ca,
+ 0x325c0a,
+ 0x32620c,
+ 0x32a58b,
+ 0x32b18a,
+ 0x34240a,
+ 0x34ad8e,
+ 0x34bece,
+ 0x34c24a,
+ 0x34dd4a,
+ 0x34eb0b,
+ 0x34edcb,
+ 0x34fa4b,
+ 0x36bc8b,
+ 0x36c28a,
+ 0x36cf4b,
+ 0x36d20a,
+ 0x36d48a,
+ 0x36d70a,
+ 0x38d78b,
+ 0x392f8b,
+ 0x39588e,
+ 0x395c0b,
+ 0x39d24b,
+ 0x3a198b,
+ 0x3a51ca,
+ 0x3a5449,
+ 0x3a568a,
+ 0x3a764a,
+ 0x3bd9cb,
+ 0x3c9f4b,
+ 0x3ca7ca,
+ 0x3cdc0b,
+ 0x3d39cb,
+ 0x3db18b,
+ 0x44a854c8,
+ 0x44e8a6c9,
+ 0x452a0a89,
+ 0x456e7748,
+ 0x355405,
+ 0x2017c3,
+ 0x27fac4,
+ 0x2be185,
+ 0x236fc6,
+ 0x245805,
+ 0x289d84,
+ 0x367108,
+ 0x31c2c5,
+ 0x294c44,
+ 0x3c2887,
+ 0x2a000a,
+ 0x381e0a,
+ 0x303147,
+ 0x21a647,
+ 0x2e0947,
+ 0x27cfc7,
+ 0x35b445,
+ 0x211d46,
+ 0x39f487,
+ 0x360704,
+ 0x2b5186,
+ 0x2f1b86,
+ 0x3bf885,
+ 0x34a344,
+ 0x2999c6,
+ 0x29ecc7,
+ 0x238186,
+ 0x301747,
+ 0x228883,
+ 0x3d3c86,
+ 0x2ff6c5,
+ 0x284047,
+ 0x269e8a,
+ 0x232644,
+ 0x212508,
+ 0x312a09,
+ 0x2cd2c7,
+ 0x393846,
+ 0x255348,
+ 0x3b8f49,
+ 0x32af04,
+ 0x3a8c84,
+ 0x2d8045,
+ 0x2823c8,
+ 0x2ca0c7,
+ 0x2c4949,
+ 0x229a08,
+ 0x318dc6,
+ 0x2e6006,
+ 0x29ae08,
+ 0x370586,
+ 0x28a305,
+ 0x286c06,
+ 0x27aa48,
+ 0x3a8d06,
+ 0x23eacb,
+ 0x2b1046,
+ 0x29c80d,
+ 0x3bf405,
+ 0x2ab586,
+ 0x213205,
+ 0x349189,
+ 0x247e07,
+ 0x3badc8,
+ 0x3666c6,
+ 0x29b949,
+ 0x3cb146,
+ 0x269e05,
+ 0x2a2dc6,
+ 0x2704c6,
+ 0x2cf6c9,
+ 0x2bb246,
+ 0x29fd07,
+ 0x2a3445,
+ 0x21b203,
+ 0x223885,
+ 0x29cac7,
+ 0x3614c6,
+ 0x3bf309,
+ 0x27e706,
+ 0x286e46,
+ 0x211a09,
+ 0x286609,
+ 0x2a39c7,
+ 0x384748,
+ 0x29a209,
+ 0x284448,
+ 0x36bb06,
+ 0x2dcc45,
+ 0x31ef0a,
+ 0x286ec6,
+ 0x204c46,
+ 0x2d3e45,
+ 0x256488,
+ 0x357487,
+ 0x22f8ca,
+ 0x251a06,
+ 0x2f36c5,
+ 0x2ffd46,
+ 0x2d5607,
+ 0x393707,
+ 0x21b385,
+ 0x269fc5,
+ 0x2a95c6,
+ 0x2b6806,
+ 0x2d4686,
+ 0x2bfd04,
+ 0x285b89,
+ 0x28b846,
+ 0x2d03ca,
+ 0x225c88,
+ 0x3122c8,
+ 0x381e0a,
+ 0x223a45,
+ 0x29ec05,
+ 0x2311c8,
+ 0x2baf48,
+ 0x239f47,
+ 0x2b7dc6,
+ 0x33af48,
+ 0x218d07,
+ 0x2838c8,
+ 0x2b9bc6,
+ 0x287608,
+ 0x297986,
+ 0x27a647,
+ 0x36fe46,
+ 0x2999c6,
+ 0x281f8a,
+ 0x2da906,
+ 0x2dcc49,
+ 0x368146,
+ 0x371d8a,
+ 0x23dbc9,
+ 0x2f5206,
+ 0x2bba04,
+ 0x28dd4d,
+ 0x28a947,
+ 0x28e8c6,
+ 0x2c3705,
+ 0x3cb1c5,
+ 0x38ef06,
+ 0x2d2809,
+ 0x2eda47,
+ 0x27bfc6,
+ 0x2cbcc6,
+ 0x289e09,
+ 0x28a244,
+ 0x241304,
+ 0x201688,
+ 0x35fb86,
+ 0x2a2ec8,
+ 0x2fd948,
+ 0x3b9d47,
+ 0x3b8209,
+ 0x3b44c7,
+ 0x2b284a,
+ 0x2f630f,
+ 0x2ec3ca,
+ 0x310305,
+ 0x27ac85,
+ 0x2108c5,
+ 0x3b7807,
+ 0x23f643,
+ 0x384948,
+ 0x27d606,
+ 0x27d709,
+ 0x2eb646,
+ 0x2cf507,
+ 0x29b709,
+ 0x3bacc8,
+ 0x2d3f07,
+ 0x31fe43,
+ 0x355485,
+ 0x2d5145,
+ 0x2bfb4b,
+ 0x203a04,
+ 0x306384,
+ 0x278ec6,
+ 0x3204c7,
+ 0x39aeca,
+ 0x238007,
+ 0x209887,
+ 0x282b45,
+ 0x3c0645,
+ 0x292189,
+ 0x2999c6,
+ 0x237e8d,
+ 0x3632c5,
+ 0x2b5dc3,
+ 0x226783,
+ 0x21e685,
+ 0x35b0c5,
+ 0x255348,
+ 0x27cc87,
+ 0x241086,
+ 0x2a0706,
+ 0x2288c5,
+ 0x233a07,
+ 0x3b9847,
+ 0x238ec7,
+ 0x20d70a,
+ 0x3d3d48,
+ 0x2bfd04,
+ 0x280887,
+ 0x2805c7,
+ 0x34f046,
+ 0x297007,
+ 0x2c8608,
+ 0x304248,
+ 0x247d06,
+ 0x21a888,
+ 0x2bb2c4,
+ 0x39f486,
+ 0x2656c6,
+ 0x390946,
+ 0x201b06,
+ 0x21bb44,
+ 0x27d086,
+ 0x2c2346,
+ 0x299d86,
+ 0x20fd86,
+ 0x3c7586,
+ 0x244446,
+ 0x240f88,
+ 0x2b5008,
+ 0x2d9608,
+ 0x245a08,
+ 0x231146,
+ 0x20c245,
+ 0x223846,
+ 0x2aefc5,
+ 0x391647,
+ 0x229ac5,
+ 0x20c503,
+ 0x3c4785,
+ 0x22ccc4,
+ 0x3c76c5,
+ 0x2039c3,
+ 0x3a3547,
+ 0x3426c8,
+ 0x301806,
+ 0x36694d,
+ 0x27ac46,
+ 0x299345,
+ 0x218783,
+ 0x2bf209,
+ 0x28a3c6,
+ 0x295746,
+ 0x288904,
+ 0x2ec347,
+ 0x39fec6,
+ 0x2edd05,
+ 0x20fd43,
+ 0x3d1ac4,
+ 0x280786,
+ 0x211e44,
+ 0x2657c8,
+ 0x3bb109,
+ 0x306d89,
+ 0x2a2cca,
+ 0x29270d,
+ 0x2329c7,
+ 0x3c4bc6,
+ 0x20bc84,
+ 0x284c49,
+ 0x289388,
+ 0x28a546,
+ 0x235606,
+ 0x297007,
+ 0x2bc186,
+ 0x2266c6,
+ 0x336886,
+ 0x32f84a,
+ 0x213148,
+ 0x2a9e45,
+ 0x372a49,
+ 0x2ca84a,
+ 0x3029c8,
+ 0x29e408,
+ 0x2956c8,
+ 0x2a034c,
+ 0x34ff85,
+ 0x2a0988,
+ 0x2b7b46,
+ 0x344ec6,
+ 0x3a1c07,
+ 0x237f05,
+ 0x286d85,
+ 0x306c49,
+ 0x3dc3c7,
+ 0x27d6c5,
+ 0x228707,
+ 0x226783,
+ 0x2cad05,
+ 0x21ea48,
+ 0x285907,
+ 0x29e2c9,
+ 0x2dcb05,
+ 0x3b0b44,
+ 0x2a4248,
+ 0x301c87,
+ 0x2d40c8,
+ 0x3b5c08,
+ 0x2ac3c5,
+ 0x3b7bc6,
+ 0x248186,
+ 0x2d8409,
+ 0x2b1847,
+ 0x2af786,
+ 0x21e147,
+ 0x202183,
+ 0x237284,
+ 0x2d0a85,
+ 0x280b04,
+ 0x24ba44,
+ 0x25e7c7,
+ 0x268747,
+ 0x27c184,
+ 0x29e110,
+ 0x372c47,
+ 0x3c0645,
+ 0x3308cc,
+ 0x20f384,
+ 0x35d248,
+ 0x27a549,
+ 0x383dc6,
+ 0x2f40c8,
+ 0x246544,
+ 0x2791c8,
+ 0x302346,
+ 0x281e08,
+ 0x29cd86,
+ 0x39800b,
+ 0x32cd85,
+ 0x2d0908,
+ 0x211444,
+ 0x3bb54a,
+ 0x29e2c9,
+ 0x36fd46,
+ 0x319348,
+ 0x2a6105,
+ 0x2be9c4,
+ 0x35d146,
+ 0x238d88,
+ 0x2854c8,
+ 0x33b7c6,
+ 0x21fe04,
+ 0x31ee86,
+ 0x3b4547,
+ 0x27a0c7,
+ 0x29700f,
+ 0x32de07,
+ 0x2f52c7,
+ 0x31ff85,
+ 0x374345,
+ 0x2a3689,
+ 0x2e8ac6,
+ 0x26b885,
+ 0x286907,
+ 0x3a1e88,
+ 0x2fca45,
+ 0x36fe46,
+ 0x225ac8,
+ 0x3b880a,
+ 0x238a88,
+ 0x28fa87,
+ 0x2f6746,
+ 0x372a06,
+ 0x2003c3,
+ 0x20ecc3,
+ 0x2caa09,
+ 0x29a089,
+ 0x35d046,
+ 0x2dcb05,
+ 0x21ab08,
+ 0x319348,
+ 0x370708,
+ 0x33690b,
+ 0x366b87,
+ 0x2fb749,
+ 0x297288,
+ 0x35e8c4,
+ 0x390588,
+ 0x291209,
+ 0x2afa85,
+ 0x3b7707,
+ 0x237305,
+ 0x2853c8,
+ 0x29374b,
+ 0x298190,
+ 0x2ab305,
+ 0x21138c,
+ 0x241245,
+ 0x282bc3,
+ 0x2b4446,
+ 0x2c1244,
+ 0x370106,
+ 0x29ecc7,
+ 0x225b44,
+ 0x241fc8,
+ 0x38480d,
+ 0x319205,
+ 0x232a04,
+ 0x2a2544,
+ 0x2a2549,
+ 0x2acbc8,
+ 0x32d247,
+ 0x3023c8,
+ 0x285c48,
+ 0x27c2c5,
+ 0x205987,
+ 0x27c247,
+ 0x2c6447,
+ 0x269fc9,
+ 0x3365c9,
+ 0x20b646,
+ 0x2bdbc6,
+ 0x2869c6,
+ 0x34d6c5,
+ 0x3a83c4,
+ 0x3ba3c6,
+ 0x3bf0c6,
+ 0x27c308,
+ 0x2d52cb,
+ 0x267287,
+ 0x20bc84,
+ 0x39fe06,
+ 0x2c8947,
+ 0x244045,
+ 0x244f45,
+ 0x2ae104,
+ 0x336546,
+ 0x3ba448,
+ 0x284c49,
+ 0x25f446,
+ 0x289188,
+ 0x2eddc6,
+ 0x35a6c8,
+ 0x2b340c,
+ 0x27c186,
+ 0x29900d,
+ 0x29948b,
+ 0x29fdc5,
+ 0x3b9987,
+ 0x2bb346,
+ 0x3935c8,
+ 0x20b6c9,
+ 0x3057c8,
+ 0x3c0645,
+ 0x360447,
+ 0x284548,
+ 0x2ff109,
+ 0x39fb46,
+ 0x25f34a,
+ 0x393348,
+ 0x30560b,
+ 0x2133cc,
+ 0x2792c8,
+ 0x27fd46,
+ 0x205388,
+ 0x3b8487,
+ 0x209509,
+ 0x3179cd,
+ 0x2998c6,
+ 0x23f608,
+ 0x2b4ec9,
+ 0x2bfe08,
+ 0x287708,
+ 0x2c2d8c,
+ 0x2c3e47,
+ 0x2c4f47,
+ 0x269e05,
+ 0x2b89c7,
+ 0x3a1d48,
+ 0x35d1c6,
+ 0x36b18c,
+ 0x2cb288,
+ 0x2d1f48,
+ 0x2ff406,
+ 0x2d4ec7,
+ 0x20b844,
+ 0x245a08,
+ 0x31e9cc,
+ 0x28b28c,
+ 0x310385,
+ 0x3bf907,
+ 0x21fd86,
+ 0x2d4e46,
+ 0x349348,
+ 0x21cfc4,
+ 0x23818b,
+ 0x27b20b,
+ 0x2f6746,
+ 0x384687,
+ 0x3ccdc5,
+ 0x271205,
+ 0x2382c6,
+ 0x2a60c5,
+ 0x2039c5,
+ 0x2cdd87,
+ 0x3bfcc9,
+ 0x2b69c4,
+ 0x25ca05,
+ 0x3ac2c5,
+ 0x3b7f88,
+ 0x28d3c5,
+ 0x26e249,
+ 0x375e47,
+ 0x375e4b,
+ 0x2f4f46,
+ 0x240cc9,
+ 0x34a288,
+ 0x288405,
+ 0x2c6548,
+ 0x336608,
+ 0x273547,
+ 0x302147,
+ 0x25e849,
+ 0x281d47,
+ 0x295309,
+ 0x334f0c,
+ 0x3cf448,
+ 0x2b84c9,
+ 0x2ba407,
+ 0x285d09,
+ 0x3617c7,
+ 0x2134c8,
+ 0x3b83c5,
+ 0x39f406,
+ 0x2c3748,
+ 0x2f6848,
+ 0x2ca709,
+ 0x203a07,
+ 0x271c05,
+ 0x256089,
+ 0x2d8746,
+ 0x292f04,
+ 0x31bd06,
+ 0x2e63c8,
+ 0x2ff8c7,
+ 0x2d54c8,
+ 0x21a949,
+ 0x3286c7,
+ 0x2a01c6,
+ 0x3b9a44,
+ 0x3c4809,
+ 0x205808,
+ 0x2ff2c7,
+ 0x237c86,
+ 0x2d5206,
+ 0x204bc4,
+ 0x36a2c6,
+ 0x23a303,
+ 0x32c909,
+ 0x32cd46,
+ 0x2ab805,
+ 0x2a0706,
+ 0x2cfa85,
+ 0x2849c8,
+ 0x368547,
+ 0x2ddcc6,
+ 0x32f206,
+ 0x3122c8,
+ 0x2a3807,
+ 0x299905,
+ 0x29df08,
+ 0x3ca348,
+ 0x393348,
+ 0x241105,
+ 0x39f486,
+ 0x306b49,
+ 0x2d8284,
+ 0x2cf90b,
+ 0x2263cb,
+ 0x2a9d49,
+ 0x226783,
+ 0x25aac5,
+ 0x301606,
+ 0x241c88,
+ 0x2b6cc4,
+ 0x301806,
+ 0x20d849,
+ 0x31e385,
+ 0x2cdcc6,
+ 0x301c86,
+ 0x210984,
+ 0x29e58a,
+ 0x2ab748,
+ 0x2f6846,
+ 0x243e85,
+ 0x3ccc47,
+ 0x35b307,
+ 0x3b7bc4,
+ 0x226607,
+ 0x229a84,
+ 0x229a86,
+ 0x205dc3,
+ 0x269fc5,
+ 0x2b0445,
+ 0x368788,
+ 0x280a45,
+ 0x27bec9,
+ 0x245847,
+ 0x24584b,
+ 0x2a554c,
+ 0x2a5b4a,
+ 0x317887,
+ 0x201303,
+ 0x26bd48,
+ 0x2412c5,
+ 0x2fcac5,
+ 0x355544,
+ 0x2133c6,
+ 0x27a546,
+ 0x36a307,
+ 0x25560b,
+ 0x21bb44,
+ 0x3008c4,
+ 0x2c9284,
+ 0x2cf386,
+ 0x225b44,
+ 0x2824c8,
+ 0x355345,
+ 0x21b205,
+ 0x370647,
+ 0x3b9a89,
+ 0x35b0c5,
+ 0x38ef0a,
+ 0x2a3349,
+ 0x2a82ca,
+ 0x32f989,
+ 0x338e44,
+ 0x2cbd85,
+ 0x2bc288,
+ 0x2d2a8b,
+ 0x2d8045,
+ 0x2fdac6,
+ 0x240844,
+ 0x27c406,
+ 0x328549,
+ 0x2c8a47,
+ 0x27e8c8,
+ 0x292a86,
+ 0x3b44c7,
+ 0x2854c8,
+ 0x38f486,
+ 0x3b9544,
+ 0x380c47,
+ 0x36e085,
+ 0x382447,
+ 0x245a84,
+ 0x2bb2c6,
+ 0x3026c8,
+ 0x299648,
+ 0x2fa2c7,
+ 0x3294c8,
+ 0x297a45,
+ 0x226504,
+ 0x381d08,
+ 0x3201c4,
+ 0x210845,
+ 0x3028c4,
+ 0x218e07,
+ 0x28b907,
+ 0x285e48,
+ 0x2d4246,
+ 0x2809c5,
+ 0x27bcc8,
+ 0x24bb48,
+ 0x2a2c09,
+ 0x2266c6,
+ 0x22f948,
+ 0x3bb3ca,
+ 0x2440c8,
+ 0x2ed185,
+ 0x215686,
+ 0x2a3208,
+ 0x36050a,
+ 0x357887,
+ 0x2897c5,
+ 0x293108,
+ 0x2dd904,
+ 0x256506,
+ 0x2c52c8,
+ 0x3c7586,
+ 0x30a648,
+ 0x2d6947,
+ 0x3c2786,
+ 0x2bba04,
+ 0x281487,
+ 0x2b5484,
+ 0x328507,
+ 0x36fa8d,
+ 0x239fc5,
+ 0x2d260b,
+ 0x28b506,
+ 0x2551c8,
+ 0x241f84,
+ 0x231346,
+ 0x280786,
+ 0x2056c7,
+ 0x298ccd,
+ 0x2fc607,
+ 0x2b5d08,
+ 0x284e05,
+ 0x36a448,
+ 0x2ca046,
+ 0x297ac8,
+ 0x39df06,
+ 0x330647,
+ 0x2861c9,
+ 0x36a9c7,
+ 0x28a808,
+ 0x275c45,
+ 0x228948,
+ 0x2d4d85,
+ 0x22a4c5,
+ 0x32fc05,
+ 0x251e03,
+ 0x201b84,
+ 0x244185,
+ 0x2496c9,
+ 0x36a0c6,
+ 0x2c8708,
+ 0x301f05,
+ 0x2b8887,
+ 0x344a4a,
+ 0x2cdc09,
+ 0x2703ca,
+ 0x2d9688,
+ 0x22854c,
+ 0x28698d,
+ 0x30d243,
+ 0x30a548,
+ 0x3d1a85,
+ 0x3b85c6,
+ 0x3bab46,
+ 0x359205,
+ 0x21e249,
+ 0x361605,
+ 0x27bcc8,
+ 0x2590c6,
+ 0x35dbc6,
+ 0x2a4109,
+ 0x3aae47,
+ 0x293a06,
+ 0x3449c8,
+ 0x390848,
+ 0x2e7947,
+ 0x2c24ce,
+ 0x2ca285,
+ 0x2ff005,
+ 0x3c7488,
+ 0x2e9a87,
+ 0x204c42,
+ 0x2c2904,
+ 0x37000a,
+ 0x2ff388,
+ 0x336746,
+ 0x29b848,
+ 0x248186,
+ 0x361108,
+ 0x2af788,
+ 0x22a484,
+ 0x2b8c45,
+ 0x731a84,
+ 0x731a84,
+ 0x731a84,
+ 0x2094c3,
+ 0x2d5086,
+ 0x27c186,
+ 0x29fa8c,
+ 0x20d8c3,
+ 0x246446,
+ 0x2133c4,
+ 0x28a348,
+ 0x20d685,
+ 0x370106,
+ 0x2bf948,
+ 0x2daf86,
+ 0x2ddc46,
+ 0x3a88c8,
+ 0x2d0b07,
+ 0x281b09,
+ 0x3114ca,
+ 0x20d6c4,
+ 0x229ac5,
+ 0x2c4905,
+ 0x2d65c6,
+ 0x232a06,
+ 0x29f406,
+ 0x3cef46,
+ 0x281c44,
+ 0x281c4b,
+ 0x229884,
+ 0x240e45,
+ 0x2ae605,
+ 0x3b9e06,
+ 0x3c2c08,
+ 0x286847,
+ 0x32ccc4,
+ 0x25dfc3,
+ 0x2dd405,
+ 0x31bbc7,
+ 0x28674b,
+ 0x368687,
+ 0x2bf848,
+ 0x2b8d87,
+ 0x26b246,
+ 0x27e488,
+ 0x25364b,
+ 0x2be0c6,
+ 0x20c249,
+ 0x2537c5,
+ 0x31fe43,
+ 0x2cdcc6,
+ 0x2d6848,
+ 0x20d2c3,
+ 0x2ad643,
+ 0x2854c6,
+ 0x248186,
+ 0x37654a,
+ 0x27fd85,
+ 0x2805cb,
+ 0x2a064b,
+ 0x244e03,
+ 0x202603,
+ 0x2b27c4,
+ 0x247f47,
+ 0x2792c4,
+ 0x28a344,
+ 0x2b79c4,
+ 0x2443c8,
+ 0x243dc8,
+ 0x20ec49,
+ 0x2d6408,
+ 0x32fe87,
+ 0x20fd86,
+ 0x2c834f,
+ 0x2ca3c6,
+ 0x2d8b84,
+ 0x243c0a,
+ 0x31bac7,
+ 0x2b5586,
+ 0x292f49,
+ 0x20ebc5,
+ 0x3688c5,
+ 0x20ed06,
+ 0x228a83,
+ 0x2dd949,
+ 0x2132c6,
+ 0x21a709,
+ 0x39aec6,
+ 0x269fc5,
+ 0x310785,
+ 0x201b83,
+ 0x248088,
+ 0x32d407,
+ 0x27d604,
+ 0x28a1c8,
+ 0x344c44,
+ 0x304b46,
+ 0x2b4446,
+ 0x23cb46,
+ 0x2d07c9,
+ 0x2fca45,
+ 0x2999c6,
+ 0x22fec9,
+ 0x2c8e86,
+ 0x244446,
+ 0x3a3946,
+ 0x22b5c5,
+ 0x3028c6,
+ 0x330644,
+ 0x3b83c5,
+ 0x2c3744,
+ 0x2b78c6,
+ 0x363284,
+ 0x203b03,
+ 0x289445,
+ 0x2346c8,
+ 0x2e4947,
+ 0x2b6d49,
+ 0x2896c8,
+ 0x29abd1,
+ 0x301d0a,
+ 0x2f6687,
+ 0x304586,
+ 0x2133c4,
+ 0x2c3848,
+ 0x3698c8,
+ 0x29ad8a,
+ 0x26e00d,
+ 0x2a2dc6,
+ 0x3a89c6,
+ 0x281546,
+ 0x21b207,
+ 0x2b5dc5,
+ 0x275187,
+ 0x28a285,
+ 0x375f84,
+ 0x2aa746,
+ 0x39f2c7,
+ 0x2dd64d,
+ 0x2a3147,
+ 0x367008,
+ 0x27bfc9,
+ 0x215586,
+ 0x39fac5,
+ 0x231a84,
+ 0x2e64c6,
+ 0x3b7ac6,
+ 0x2ff506,
+ 0x29c0c8,
+ 0x222e43,
+ 0x2056c3,
+ 0x37f685,
+ 0x251386,
+ 0x2af745,
+ 0x292c88,
+ 0x29ee8a,
+ 0x3b7cc4,
+ 0x28a348,
+ 0x2956c8,
+ 0x3b9c47,
+ 0x301fc9,
+ 0x2bf548,
+ 0x284cc7,
+ 0x2b7c46,
+ 0x3c758a,
+ 0x2e6548,
+ 0x30d849,
+ 0x2acc88,
+ 0x21ae09,
+ 0x304447,
+ 0x2f9505,
+ 0x336b06,
+ 0x35d048,
+ 0x3885c8,
+ 0x39ea08,
+ 0x210988,
+ 0x240e45,
+ 0x201484,
+ 0x233088,
+ 0x21f304,
+ 0x32f784,
+ 0x269fc5,
+ 0x294c87,
+ 0x3b9849,
+ 0x2054c7,
+ 0x211a85,
+ 0x2790c6,
+ 0x367dc6,
+ 0x20c384,
+ 0x2a4446,
+ 0x27f8c4,
+ 0x28c286,
+ 0x3b9606,
+ 0x20d106,
+ 0x3c0645,
+ 0x292b47,
+ 0x201303,
+ 0x272d49,
+ 0x3120c8,
+ 0x284b44,
+ 0x284b4d,
+ 0x299748,
+ 0x2efe48,
+ 0x30d7c6,
+ 0x2862c9,
+ 0x2cdc09,
+ 0x328245,
+ 0x29ef8a,
+ 0x26e88a,
+ 0x24e50c,
+ 0x24e686,
+ 0x2799c6,
+ 0x2cac46,
+ 0x26b6c9,
+ 0x3b8806,
+ 0x213546,
+ 0x3616c6,
+ 0x245a08,
+ 0x238a86,
+ 0x2d7b4b,
+ 0x294e05,
+ 0x21b205,
+ 0x27a1c5,
+ 0x201406,
+ 0x226543,
+ 0x23cac6,
+ 0x2a30c7,
+ 0x2c3705,
+ 0x25c345,
+ 0x3cb1c5,
+ 0x37a286,
+ 0x328304,
+ 0x337e86,
+ 0x2a4a09,
+ 0x20128c,
+ 0x375cc8,
+ 0x238d04,
+ 0x3025c6,
+ 0x28b606,
+ 0x2d6848,
+ 0x319348,
+ 0x201189,
+ 0x3ccc47,
+ 0x35f8c9,
+ 0x2712c6,
+ 0x22b984,
+ 0x208044,
+ 0x2842c4,
+ 0x2854c8,
+ 0x3b968a,
+ 0x35b046,
+ 0x369f87,
+ 0x3826c7,
+ 0x240dc5,
+ 0x2c48c4,
+ 0x2911c6,
+ 0x2b5e06,
+ 0x21d003,
+ 0x311f07,
+ 0x3b5b08,
+ 0x32838a,
+ 0x22b688,
+ 0x209388,
+ 0x3632c5,
+ 0x29fec5,
+ 0x267385,
+ 0x241186,
+ 0x38b006,
+ 0x398bc5,
+ 0x32cb49,
+ 0x2c46cc,
+ 0x267447,
+ 0x29ae08,
+ 0x2b1185,
+ 0x731a84,
+ 0x22c344,
+ 0x285a44,
+ 0x21a506,
+ 0x2a1e0e,
+ 0x368947,
+ 0x21b405,
+ 0x2d820c,
+ 0x30e047,
+ 0x39f247,
+ 0x235a09,
+ 0x2125c9,
+ 0x2897c5,
+ 0x3120c8,
+ 0x306b49,
+ 0x393205,
+ 0x2c3648,
+ 0x2b8706,
+ 0x381f86,
+ 0x23dbc4,
+ 0x290008,
+ 0x215743,
+ 0x378384,
+ 0x2dd485,
+ 0x394c07,
+ 0x2de485,
+ 0x3bb289,
+ 0x29608d,
+ 0x2adc06,
+ 0x3c2344,
+ 0x2b7d48,
+ 0x3bfb0a,
+ 0x224887,
+ 0x3cc385,
+ 0x280a03,
+ 0x2a080e,
+ 0x24818c,
+ 0x302ac7,
+ 0x2a1fc7,
+ 0x109d86,
+ 0x205643,
+ 0x3b8845,
+ 0x285a45,
+ 0x29bc08,
+ 0x2987c9,
+ 0x238c06,
+ 0x2792c4,
+ 0x2f65c6,
+ 0x23f3cb,
+ 0x2bd28c,
+ 0x251ec7,
+ 0x2d7e05,
+ 0x3ca248,
+ 0x2e7705,
+ 0x243c07,
+ 0x301b47,
+ 0x39e885,
+ 0x226543,
+ 0x2193c4,
+ 0x2e6285,
+ 0x2b68c5,
+ 0x2b68c6,
+ 0x29c608,
+ 0x39f2c7,
+ 0x3bae46,
+ 0x204ac6,
+ 0x32fb46,
+ 0x23f789,
+ 0x205a87,
+ 0x27f9c6,
+ 0x2bd406,
+ 0x2e1706,
+ 0x2ab685,
+ 0x20a7c6,
+ 0x377645,
+ 0x28d448,
+ 0x29458b,
+ 0x290f06,
+ 0x382704,
+ 0x2da549,
+ 0x245844,
+ 0x2b8688,
+ 0x31be07,
+ 0x287604,
+ 0x2bebc8,
+ 0x2c4d44,
+ 0x2ab6c4,
+ 0x28a105,
+ 0x319246,
+ 0x244307,
+ 0x2166c3,
+ 0x2a0285,
+ 0x2f4344,
+ 0x2ff046,
+ 0x3282c8,
+ 0x3293c5,
+ 0x294249,
+ 0x256285,
+ 0x246448,
+ 0x358447,
+ 0x32ce48,
+ 0x2be807,
+ 0x2f5389,
+ 0x27cf06,
+ 0x334ac6,
+ 0x29a344,
+ 0x300805,
+ 0x312f4c,
+ 0x27a1c7,
+ 0x27ab47,
+ 0x232648,
+ 0x2adc06,
+ 0x2a3004,
+ 0x37af04,
+ 0x25e6c9,
+ 0x2cad46,
+ 0x292207,
+ 0x205304,
+ 0x2a4546,
+ 0x348c85,
+ 0x2d3d87,
+ 0x2d7ac6,
+ 0x25f209,
+ 0x2e8cc7,
+ 0x297007,
+ 0x2a3f86,
+ 0x237bc5,
+ 0x283748,
+ 0x213148,
+ 0x20ff86,
+ 0x329405,
+ 0x2c5e86,
+ 0x203883,
+ 0x29ba89,
+ 0x29f18e,
+ 0x2be548,
+ 0x344d48,
+ 0x20fd8b,
+ 0x294486,
+ 0x327d84,
+ 0x286584,
+ 0x29f28a,
+ 0x211287,
+ 0x27fa85,
+ 0x20c249,
+ 0x2c2405,
+ 0x32f7c7,
+ 0x2310c4,
+ 0x291547,
+ 0x2fd848,
+ 0x2cd386,
+ 0x2bb449,
+ 0x2bf64a,
+ 0x211206,
+ 0x299286,
+ 0x2ae585,
+ 0x3961c5,
+ 0x38cc47,
+ 0x2479c8,
+ 0x348bc8,
+ 0x22a486,
+ 0x310805,
+ 0x23278e,
+ 0x2bfd04,
+ 0x20ff05,
+ 0x278a49,
+ 0x2e88c8,
+ 0x28f9c6,
+ 0x29da0c,
+ 0x29ea90,
+ 0x2a1a4f,
+ 0x2a3588,
+ 0x317887,
+ 0x3c0645,
+ 0x244185,
+ 0x244189,
+ 0x293309,
+ 0x31ef86,
+ 0x2d80c7,
+ 0x300705,
+ 0x239f49,
+ 0x34f0c6,
+ 0x3b864d,
+ 0x284189,
+ 0x28a344,
+ 0x2be2c8,
+ 0x233149,
+ 0x35b206,
+ 0x26bf45,
+ 0x334ac6,
+ 0x27e789,
+ 0x2063c8,
+ 0x20c245,
+ 0x290004,
+ 0x29dbcb,
+ 0x35b0c5,
+ 0x241d06,
+ 0x286cc6,
+ 0x206dc6,
+ 0x2a294b,
+ 0x294349,
+ 0x2096c5,
+ 0x391547,
+ 0x301c86,
+ 0x3a8ac6,
+ 0x2857c8,
+ 0x282649,
+ 0x366dcc,
+ 0x31b9c8,
+ 0x31b4c6,
+ 0x33b7c3,
+ 0x37cd86,
+ 0x2a2785,
+ 0x281188,
+ 0x310206,
+ 0x2d3fc8,
+ 0x238085,
+ 0x3882c5,
+ 0x358588,
+ 0x390707,
+ 0x3baa87,
+ 0x36a307,
+ 0x2f40c8,
+ 0x2d66c8,
+ 0x2d1886,
+ 0x2b7707,
+ 0x237147,
+ 0x2a264a,
+ 0x246603,
+ 0x201406,
+ 0x232705,
+ 0x244704,
+ 0x27bfc9,
+ 0x2f5304,
+ 0x2b9f84,
+ 0x29ce04,
+ 0x2a1fcb,
+ 0x32d347,
+ 0x2329c5,
+ 0x297748,
+ 0x2790c6,
+ 0x2790c8,
+ 0x27fcc6,
+ 0x28ff45,
+ 0x290205,
+ 0x291bc6,
+ 0x292548,
+ 0x292e88,
+ 0x27c186,
+ 0x29758f,
+ 0x29b550,
+ 0x3bf405,
+ 0x201303,
+ 0x22ba45,
+ 0x2fb688,
+ 0x293209,
+ 0x393348,
+ 0x2d7ec8,
+ 0x2506c8,
+ 0x32d407,
+ 0x278d89,
+ 0x2d41c8,
+ 0x2fcf84,
+ 0x29cc88,
+ 0x3b8049,
+ 0x2b81c7,
+ 0x29cc04,
+ 0x205588,
+ 0x29290a,
+ 0x2cc046,
+ 0x2a2dc6,
+ 0x226589,
+ 0x29ecc7,
+ 0x2d0648,
+ 0x20a408,
+ 0x205188,
+ 0x38a405,
+ 0x396f85,
+ 0x21b205,
+ 0x285a05,
+ 0x2b4d07,
+ 0x226545,
+ 0x2c3705,
+ 0x3c2646,
+ 0x393287,
+ 0x2d29c7,
+ 0x292c06,
+ 0x2d9bc5,
+ 0x241d06,
+ 0x26be05,
+ 0x2badc8,
+ 0x300684,
+ 0x2c8f06,
+ 0x348ac4,
+ 0x2be9c8,
+ 0x2c900a,
+ 0x27cc8c,
+ 0x255805,
+ 0x21b2c6,
+ 0x366f86,
+ 0x37f546,
+ 0x2fb884,
+ 0x3693c5,
+ 0x27f607,
+ 0x29ed49,
+ 0x2cf7c7,
+ 0x731a84,
+ 0x731a84,
+ 0x32d1c5,
+ 0x2177c4,
+ 0x29d3ca,
+ 0x278f46,
+ 0x306944,
+ 0x3bf885,
+ 0x2b3945,
+ 0x2b5d04,
+ 0x286907,
+ 0x256207,
+ 0x2cf388,
+ 0x2c5f88,
+ 0x3c8009,
+ 0x3201c8,
+ 0x29d58b,
+ 0x2442c4,
+ 0x3a8bc5,
+ 0x26b905,
+ 0x36a289,
+ 0x282649,
+ 0x2da448,
+ 0x229888,
+ 0x2dea44,
+ 0x28b645,
+ 0x2017c3,
+ 0x2d6585,
+ 0x299a46,
+ 0x29860c,
+ 0x2131c6,
+ 0x26be46,
+ 0x28fc45,
+ 0x37a308,
+ 0x3194c6,
+ 0x304706,
+ 0x2a2dc6,
+ 0x22b40c,
+ 0x26b9c4,
+ 0x32fc8a,
+ 0x28fb88,
+ 0x298447,
+ 0x2f4246,
+ 0x238cc7,
+ 0x2f61c5,
+ 0x237c86,
+ 0x365e46,
+ 0x374207,
+ 0x2bf344,
+ 0x218f05,
+ 0x278a44,
+ 0x376007,
+ 0x278c88,
+ 0x27984a,
+ 0x2843c7,
+ 0x2ab8c7,
+ 0x317807,
+ 0x2e7849,
+ 0x29860a,
+ 0x20ff83,
+ 0x2e4905,
+ 0x20d143,
+ 0x2b7a09,
+ 0x2d6a88,
+ 0x31ff87,
+ 0x393449,
+ 0x213246,
+ 0x32df48,
+ 0x3a34c5,
+ 0x24bc4a,
+ 0x384ac9,
+ 0x247bc9,
+ 0x3a1c07,
+ 0x3699c9,
+ 0x20d008,
+ 0x361306,
+ 0x21b488,
+ 0x3c1c47,
+ 0x281d47,
+ 0x2a3347,
+ 0x2d3208,
+ 0x3d02c6,
+ 0x2926c5,
+ 0x27f607,
+ 0x298d88,
+ 0x348a44,
+ 0x2d0284,
+ 0x293907,
+ 0x2afb07,
+ 0x3069ca,
+ 0x361286,
+ 0x3696ca,
+ 0x2c2847,
+ 0x2bfac7,
+ 0x218fc4,
+ 0x2953c4,
+ 0x2d3c86,
+ 0x3a0144,
+ 0x3a014c,
+ 0x306885,
+ 0x2107c9,
+ 0x2465c4,
+ 0x2b5dc5,
+ 0x3bfa88,
+ 0x28ea85,
+ 0x38ef06,
+ 0x293444,
+ 0x2a6c8a,
+ 0x2b1746,
+ 0x23ed0a,
+ 0x28e007,
+ 0x2d5605,
+ 0x228a85,
+ 0x240e0a,
+ 0x39e945,
+ 0x244146,
+ 0x21f304,
+ 0x2b2946,
+ 0x38cd05,
+ 0x3102c6,
+ 0x2fa2cc,
+ 0x2db94a,
+ 0x26e984,
+ 0x20fd86,
+ 0x29ecc7,
+ 0x2d7a44,
+ 0x245a08,
+ 0x2e37c6,
+ 0x382549,
+ 0x2c1b89,
+ 0x3cf549,
+ 0x2cfac6,
+ 0x3c1d46,
+ 0x21b5c7,
+ 0x32ca88,
+ 0x3c1b49,
+ 0x32d347,
+ 0x2978c6,
+ 0x3b4547,
+ 0x281405,
+ 0x2bfd04,
+ 0x21b187,
+ 0x237305,
+ 0x28a045,
+ 0x2f9e47,
+ 0x39e748,
+ 0x3ca1c6,
+ 0x299bcd,
+ 0x29be0f,
+ 0x2a064d,
+ 0x20d884,
+ 0x2347c6,
+ 0x2dbd08,
+ 0x361685,
+ 0x2a2808,
+ 0x27340a,
+ 0x28a344,
+ 0x2f1c86,
+ 0x2d8c07,
+ 0x21bb47,
+ 0x2d0bc9,
+ 0x21b445,
+ 0x2b5d04,
+ 0x2b8b8a,
+ 0x2bf109,
+ 0x369ac7,
+ 0x299e86,
+ 0x35b206,
+ 0x28b586,
+ 0x380d06,
+ 0x2db60f,
+ 0x2dbbc9,
+ 0x238a86,
+ 0x388206,
+ 0x32c149,
+ 0x2b7807,
+ 0x21a003,
+ 0x22b586,
+ 0x20ecc3,
+ 0x3590c8,
+ 0x2d4747,
+ 0x2a3789,
+ 0x2b42c8,
+ 0x3babc8,
+ 0x361906,
+ 0x30c049,
+ 0x37c885,
+ 0x2b78c4,
+ 0x2f95c7,
+ 0x26b745,
+ 0x20d884,
+ 0x232a88,
+ 0x211544,
+ 0x2b7547,
+ 0x342646,
+ 0x2a9685,
+ 0x2acc88,
+ 0x35b0cb,
+ 0x3125c7,
+ 0x241086,
+ 0x2ca444,
+ 0x327d06,
+ 0x269fc5,
+ 0x237305,
+ 0x2834c9,
+ 0x286509,
+ 0x281d84,
+ 0x281dc5,
+ 0x20fdc5,
+ 0x24bac6,
+ 0x3121c8,
+ 0x2c1646,
+ 0x3b594b,
+ 0x383c4a,
+ 0x2be905,
+ 0x290286,
+ 0x27d305,
+ 0x3c2585,
+ 0x295847,
+ 0x201688,
+ 0x2925c4,
+ 0x265cc6,
+ 0x292f06,
+ 0x20d1c7,
+ 0x31fe04,
+ 0x280786,
+ 0x3b7905,
+ 0x3b7909,
+ 0x2dc984,
+ 0x2c4a49,
+ 0x27c186,
+ 0x2c3f08,
+ 0x20fdc5,
+ 0x3827c5,
+ 0x3102c6,
+ 0x366cc9,
+ 0x2125c9,
+ 0x26bec6,
+ 0x2e89c8,
+ 0x2961c8,
+ 0x27d2c4,
+ 0x2b99c4,
+ 0x2b99c8,
+ 0x28e9c8,
+ 0x35f9c9,
+ 0x2999c6,
+ 0x2a2dc6,
+ 0x33ae0d,
+ 0x301806,
+ 0x2b32c9,
+ 0x223945,
+ 0x20ed06,
+ 0x206548,
+ 0x337dc5,
+ 0x237184,
+ 0x269fc5,
+ 0x286048,
+ 0x29d189,
+ 0x278b04,
+ 0x2bb2c6,
+ 0x30da0a,
+ 0x3029c8,
+ 0x306b49,
+ 0x26a8ca,
+ 0x3933c6,
+ 0x29bfc8,
+ 0x2439c5,
+ 0x29f608,
+ 0x2f6245,
+ 0x213109,
+ 0x33d7c9,
+ 0x219482,
+ 0x2537c5,
+ 0x270f46,
+ 0x27c0c7,
+ 0x244705,
+ 0x2f35c6,
+ 0x316b48,
+ 0x2adc06,
+ 0x2bc149,
+ 0x27ac46,
+ 0x285648,
+ 0x26c285,
+ 0x34b8c6,
+ 0x330748,
+ 0x2854c8,
+ 0x304348,
+ 0x318e48,
+ 0x20a7c4,
+ 0x250c83,
+ 0x2bc384,
+ 0x2845c6,
+ 0x281444,
+ 0x344c87,
+ 0x304609,
+ 0x2c9285,
+ 0x20a406,
+ 0x22b586,
+ 0x29c44b,
+ 0x2b54c6,
+ 0x363506,
+ 0x2cda88,
+ 0x2e6006,
+ 0x26e303,
+ 0x3da583,
+ 0x2bfd04,
+ 0x22f845,
+ 0x2edc07,
+ 0x278c88,
+ 0x278c8f,
+ 0x27f50b,
+ 0x311fc8,
+ 0x2bb346,
+ 0x3122ce,
+ 0x241243,
+ 0x2edb84,
+ 0x2b5445,
+ 0x2b5b86,
+ 0x2912cb,
+ 0x294d46,
+ 0x225b49,
+ 0x2a9685,
+ 0x253dc8,
+ 0x3c7cc8,
+ 0x21248c,
+ 0x2a2006,
+ 0x2d65c6,
+ 0x2dcb05,
+ 0x28a5c8,
+ 0x27cc85,
+ 0x35e8c8,
+ 0x29dd8a,
+ 0x2a0a89,
+ 0x731a84,
+ 0x2000c2,
+ 0x45e02782,
+ 0x200382,
+ 0x222884,
+ 0x2024c2,
+ 0x3216c4,
+ 0x202642,
+ 0x13c3,
+ 0x2003c2,
+ 0x202002,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x206b43,
+ 0x23cf83,
+ 0x240b03,
+ 0x241844,
+ 0x22d7c3,
+ 0x236204,
+ 0x233743,
+ 0x2dd2c4,
+ 0x220583,
+ 0x2449c7,
+ 0x205e03,
+ 0x2013c3,
+ 0x2fb908,
+ 0x23cf83,
+ 0x27ee0b,
+ 0x2f7043,
+ 0x239606,
+ 0x21be02,
+ 0x2f060b,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x23cf83,
+ 0x206a03,
+ 0x217583,
+ 0x2000c2,
+ 0xa14c8,
+ 0x216685,
+ 0x237388,
+ 0x300ec8,
+ 0x202782,
+ 0x32ee85,
+ 0x3b4687,
+ 0x201242,
+ 0x2421c7,
+ 0x200382,
+ 0x25d047,
+ 0x308789,
+ 0x2c99c8,
+ 0x205009,
+ 0x20b2c2,
+ 0x3c7e87,
+ 0x36b004,
+ 0x3b4747,
+ 0x383b47,
+ 0x25d602,
+ 0x205e03,
+ 0x200e82,
+ 0x202642,
+ 0x2003c2,
+ 0x202142,
+ 0x200902,
+ 0x202002,
+ 0x2abec5,
+ 0x2a9785,
+ 0x2782,
+ 0x33743,
+ 0x22d7c3,
+ 0x233743,
+ 0x2053c3,
+ 0x220583,
+ 0x209a03,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0xaec3,
+ 0x101,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x219e43,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0x214703,
+ 0x490726c6,
+ 0x45dc3,
+ 0xca685,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0x6942,
+ 0xa14c8,
+ 0x12bd03,
+ 0x13c3,
+ 0x6df83,
+ 0x47984,
+ 0x1421d04,
+ 0xe7b05,
+ 0x2000c2,
+ 0x391904,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x23d9c3,
+ 0x22e1c5,
+ 0x219e43,
+ 0x214903,
+ 0x206b43,
+ 0x251ac3,
+ 0x23cf83,
+ 0x202003,
+ 0x2418c3,
+ 0x207b83,
+ 0x5c2,
+ 0x2ebc2,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x2000c2,
+ 0x24ce83,
+ 0x202782,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x206b43,
+ 0x23cf83,
+ 0x202002,
+ 0xa14c8,
+ 0x220583,
+ 0x6df83,
+ 0xa14c8,
+ 0x6df83,
+ 0x26f283,
+ 0x22d7c3,
+ 0x230944,
+ 0x233743,
+ 0x220583,
+ 0x2067c2,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x2067c2,
+ 0x22a243,
+ 0x206b43,
+ 0x23cf83,
+ 0x2ef083,
+ 0x202003,
+ 0x2000c2,
+ 0x202782,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x239605,
+ 0x11a406,
+ 0x241844,
+ 0x21be02,
+ 0xa14c8,
+ 0x2000c2,
+ 0x12dac5,
+ 0x1cb48,
+ 0x161c03,
+ 0x202782,
+ 0x4d8947c6,
+ 0xe184,
+ 0x10cd0b,
+ 0x35246,
+ 0x5f07,
+ 0x233743,
+ 0x4c108,
+ 0x4c10b,
+ 0x4c58b,
+ 0x4cc0b,
+ 0x4cf4b,
+ 0x4d20b,
+ 0x4d64b,
+ 0x9d86,
+ 0x220583,
+ 0x1b8e85,
+ 0x131844,
+ 0x218dc3,
+ 0x118c87,
+ 0xe1284,
+ 0x6d0c4,
+ 0x206b43,
+ 0x6bfc6,
+ 0xb2bc4,
+ 0x6df83,
+ 0x23cf83,
+ 0x2f7dc4,
+ 0x12d947,
+ 0x11a009,
+ 0x10cac8,
+ 0x14a504,
+ 0xec046,
+ 0x140fc8,
+ 0x141185,
+ 0x1da6c9,
+ 0x2fe03,
+ 0x12dac5,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x2013c3,
+ 0x23cf83,
+ 0x2f7043,
+ 0x21be02,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x219c83,
+ 0x205184,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x2dd2c4,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x239606,
+ 0x233743,
+ 0x220583,
+ 0x3d443,
+ 0x6df83,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x12dac5,
+ 0x5f07,
+ 0xe9c3,
+ 0x2fe03,
+ 0xa14c8,
+ 0x220583,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x89003,
+ 0x206b43,
+ 0x23cf83,
+ 0x50e2d7c3,
+ 0x233743,
+ 0x206b43,
+ 0x23cf83,
+ 0xa14c8,
+ 0x2000c2,
+ 0x202782,
+ 0x22d7c3,
+ 0x220583,
+ 0x206b43,
+ 0x2003c2,
+ 0x23cf83,
+ 0x33dd07,
+ 0x2c67cb,
+ 0x2165c3,
+ 0x31ec48,
+ 0x32c807,
+ 0x20f286,
+ 0x215b85,
+ 0x32efc9,
+ 0x205b88,
+ 0x37ab89,
+ 0x3a5d10,
+ 0x37ab8b,
+ 0x2e1d89,
+ 0x20e9c3,
+ 0x2f0cc9,
+ 0x232006,
+ 0x23200c,
+ 0x216748,
+ 0x3d8588,
+ 0x308c49,
+ 0x2b948e,
+ 0x30854b,
+ 0x336d4c,
+ 0x20a683,
+ 0x2802cc,
+ 0x3c6089,
+ 0x306487,
+ 0x23368c,
+ 0x2b0cca,
+ 0x24ec04,
+ 0x305a8d,
+ 0x280188,
+ 0x3c544d,
+ 0x287b86,
+ 0x24184b,
+ 0x31a189,
+ 0x388487,
+ 0x372586,
+ 0x274c09,
+ 0x327eca,
+ 0x3243c8,
+ 0x2f6c44,
+ 0x38dc07,
+ 0x231447,
+ 0x201c84,
+ 0x217444,
+ 0x200ac9,
+ 0x371bc9,
+ 0x28da08,
+ 0x20ab05,
+ 0x20b205,
+ 0x3dc286,
+ 0x305949,
+ 0x27368d,
+ 0x2fdbc8,
+ 0x3dc187,
+ 0x215c08,
+ 0x250a06,
+ 0x22e3c4,
+ 0x2850c5,
+ 0x3c1a46,
+ 0x3c33c4,
+ 0x3c5f87,
+ 0x3d10ca,
+ 0x20c184,
+ 0x211146,
+ 0x212109,
+ 0x21210f,
+ 0x212e0d,
+ 0x2136c6,
+ 0x21c750,
+ 0x21cb46,
+ 0x21d247,
+ 0x21da87,
+ 0x21da8f,
+ 0x21ec49,
+ 0x224a46,
+ 0x225087,
+ 0x225088,
+ 0x225e89,
+ 0x3d2008,
+ 0x2ece07,
+ 0x216683,
+ 0x22d646,
+ 0x3c3ac8,
+ 0x2b974a,
+ 0x3785c9,
+ 0x205cc3,
+ 0x32ed86,
+ 0x265b0a,
+ 0x2f2087,
+ 0x3062ca,
+ 0x21f60e,
+ 0x21ed86,
+ 0x2df347,
+ 0x2aa086,
+ 0x242d46,
+ 0x396d8b,
+ 0x21608a,
+ 0x2c6e0d,
+ 0x3c1e07,
+ 0x268908,
+ 0x268909,
+ 0x26890f,
+ 0x2b6ecc,
+ 0x2729c9,
+ 0x2e454e,
+ 0x244aca,
+ 0x2d5a86,
+ 0x3d9b86,
+ 0x3264cc,
+ 0x33934c,
+ 0x34b0c8,
+ 0x36a8c7,
+ 0x235905,
+ 0x294b44,
+ 0x20278e,
+ 0x2663c4,
+ 0x329007,
+ 0x3d6d0a,
+ 0x22c794,
+ 0x22d08f,
+ 0x21dc48,
+ 0x22d508,
+ 0x351a8d,
+ 0x351a8e,
+ 0x22d989,
+ 0x22e808,
+ 0x22e80f,
+ 0x23338c,
+ 0x23338f,
+ 0x234507,
+ 0x236b0a,
+ 0x24748b,
+ 0x239c48,
+ 0x23ac47,
+ 0x26014d,
+ 0x336146,
+ 0x305c46,
+ 0x23c949,
+ 0x25b608,
+ 0x242b48,
+ 0x242b4e,
+ 0x2c68c7,
+ 0x2fc1c5,
+ 0x247745,
+ 0x200f04,
+ 0x20f546,
+ 0x28d908,
+ 0x30ae43,
+ 0x2cb98e,
+ 0x260508,
+ 0x2a688b,
+ 0x26f447,
+ 0x22a2c5,
+ 0x26ec06,
+ 0x2ad3c7,
+ 0x347a08,
+ 0x38ca49,
+ 0x3cee45,
+ 0x289488,
+ 0x221746,
+ 0x3a7a4a,
+ 0x202689,
+ 0x233749,
+ 0x23374b,
+ 0x30a308,
+ 0x201b49,
+ 0x20abc6,
+ 0x24998a,
+ 0x35660a,
+ 0x236d0c,
+ 0x335f07,
+ 0x2c97ca,
+ 0x346ecb,
+ 0x346ed9,
+ 0x32ab08,
+ 0x239685,
+ 0x260306,
+ 0x26aec9,
+ 0x2c9ec6,
+ 0x378d0a,
+ 0x205d86,
+ 0x202404,
+ 0x2cc70d,
+ 0x202407,
+ 0x221b09,
+ 0x24adc5,
+ 0x24b648,
+ 0x24bec9,
+ 0x24e444,
+ 0x24eb07,
+ 0x24eb08,
+ 0x24fcc7,
+ 0x267e88,
+ 0x254907,
+ 0x39fd05,
+ 0x25b10c,
+ 0x25b809,
+ 0x2e0b8a,
+ 0x3aacc9,
+ 0x2f0dc9,
+ 0x387fcc,
+ 0x25de8b,
+ 0x25f048,
+ 0x260908,
+ 0x264044,
+ 0x2872c8,
+ 0x288c09,
+ 0x2b0d87,
+ 0x212346,
+ 0x29cfc7,
+ 0x29b1c9,
+ 0x3cbb0b,
+ 0x327b87,
+ 0x38b307,
+ 0x28e147,
+ 0x3c53c4,
+ 0x3c53c5,
+ 0x2dcfc5,
+ 0x354a0b,
+ 0x3b6784,
+ 0x3a1308,
+ 0x2cb60a,
+ 0x221807,
+ 0x3d81c7,
+ 0x290a92,
+ 0x28c186,
+ 0x22fac6,
+ 0x37f0ce,
+ 0x317f46,
+ 0x295548,
+ 0x295b8f,
+ 0x3c5808,
+ 0x3979c8,
+ 0x342b4a,
+ 0x342b51,
+ 0x2a46ce,
+ 0x20434a,
+ 0x20434c,
+ 0x22ea07,
+ 0x22ea10,
+ 0x3bf148,
+ 0x2a48c5,
+ 0x2ad9ca,
+ 0x3c340c,
+ 0x297c0d,
+ 0x209a06,
+ 0x3c8207,
+ 0x3c820c,
+ 0x209a0c,
+ 0x21c44c,
+ 0x2af28b,
+ 0x38a844,
+ 0x226704,
+ 0x2b0589,
+ 0x37af87,
+ 0x39c749,
+ 0x356449,
+ 0x2b0987,
+ 0x2b0b46,
+ 0x2b0b49,
+ 0x2b0f43,
+ 0x2add0a,
+ 0x31f807,
+ 0x372e0b,
+ 0x2c6c8a,
+ 0x36b084,
+ 0x3997c6,
+ 0x284649,
+ 0x39ffc4,
+ 0x2f378a,
+ 0x241385,
+ 0x2c03c5,
+ 0x2c03cd,
+ 0x2c070e,
+ 0x2bc4c5,
+ 0x33c9c6,
+ 0x239207,
+ 0x25b38a,
+ 0x2666c6,
+ 0x2ee984,
+ 0x305e07,
+ 0x2d934b,
+ 0x267b87,
+ 0x2503c4,
+ 0x2b1a46,
+ 0x2b1a4d,
+ 0x2dfc0c,
+ 0x212a06,
+ 0x2fddca,
+ 0x2a9b06,
+ 0x2f7888,
+ 0x23aa87,
+ 0x24b30a,
+ 0x249bc6,
+ 0x2066c3,
+ 0x2066c6,
+ 0x3c3948,
+ 0x2b070a,
+ 0x287887,
+ 0x287888,
+ 0x2d4344,
+ 0x291007,
+ 0x2d87c8,
+ 0x29f788,
+ 0x292348,
+ 0x2d198a,
+ 0x2e43c5,
+ 0x30bc87,
+ 0x3a8e13,
+ 0x2588c6,
+ 0x21a048,
+ 0x222049,
+ 0x242088,
+ 0x36198b,
+ 0x3baf48,
+ 0x26a304,
+ 0x358686,
+ 0x322146,
+ 0x319089,
+ 0x3d8747,
+ 0x25b208,
+ 0x29f906,
+ 0x2f9d44,
+ 0x3a4dc5,
+ 0x2d00c8,
+ 0x203e4a,
+ 0x2cc388,
+ 0x2d1406,
+ 0x29c1ca,
+ 0x2b6a48,
+ 0x2d7848,
+ 0x2d8dc8,
+ 0x2d9886,
+ 0x2dbf06,
+ 0x3aa78c,
+ 0x2dc3d0,
+ 0x2a6345,
+ 0x31dfc8,
+ 0x31dfd0,
+ 0x3c5610,
+ 0x3a5b8e,
+ 0x3aa40e,
+ 0x3aa414,
+ 0x3b008f,
+ 0x3b0446,
+ 0x204211,
+ 0x201d53,
+ 0x2021c8,
+ 0x360c45,
+ 0x31f188,
+ 0x37e385,
+ 0x33304c,
+ 0x227989,
+ 0x294989,
+ 0x227e07,
+ 0x235fc9,
+ 0x3788c7,
+ 0x35b4c6,
+ 0x284ec7,
+ 0x2075c5,
+ 0x20af03,
+ 0x30b009,
+ 0x24c8c9,
+ 0x23d443,
+ 0x2192c4,
+ 0x21ff8d,
+ 0x38ce0f,
+ 0x2f9d85,
+ 0x332f46,
+ 0x217c47,
+ 0x2164c7,
+ 0x3da906,
+ 0x3da90b,
+ 0x2a5d05,
+ 0x25c706,
+ 0x303647,
+ 0x254e09,
+ 0x224446,
+ 0x384245,
+ 0x3cc78b,
+ 0x3b5086,
+ 0x3c7a05,
+ 0x23da48,
+ 0x28bf48,
+ 0x2a100c,
+ 0x2a1010,
+ 0x2a7a49,
+ 0x2b1e87,
+ 0x324c8b,
+ 0x2eb106,
+ 0x2eccca,
+ 0x206a8b,
+ 0x2ee08a,
+ 0x2ee306,
+ 0x2eef45,
+ 0x32c706,
+ 0x27ae08,
+ 0x227eca,
+ 0x35171c,
+ 0x2f710c,
+ 0x2f7408,
+ 0x239605,
+ 0x38a147,
+ 0x21f4c6,
+ 0x3494c5,
+ 0x215f46,
+ 0x3daac8,
+ 0x2bf387,
+ 0x2b9388,
+ 0x25898a,
+ 0x217d4c,
+ 0x2c7289,
+ 0x20a587,
+ 0x246984,
+ 0x247806,
+ 0x39754a,
+ 0x356545,
+ 0x2170cc,
+ 0x21bf48,
+ 0x2aa388,
+ 0x2d49cc,
+ 0x3587cc,
+ 0x36abc9,
+ 0x36ae07,
+ 0x24a14c,
+ 0x228184,
+ 0x24a60a,
+ 0x314a4c,
+ 0x25690b,
+ 0x256f8b,
+ 0x259b06,
+ 0x25ee87,
+ 0x22ec47,
+ 0x22ec4f,
+ 0x307851,
+ 0x2e2e12,
+ 0x2641cd,
+ 0x2641ce,
+ 0x26450e,
+ 0x3b0248,
+ 0x3b0252,
+ 0x269ac8,
+ 0x222687,
+ 0x2528ca,
+ 0x2a8108,
+ 0x317f05,
+ 0x2b4b4a,
+ 0x21cec7,
+ 0x2e8684,
+ 0x203843,
+ 0x236745,
+ 0x342dc7,
+ 0x34e287,
+ 0x297e0e,
+ 0x31d5cd,
+ 0x326a89,
+ 0x255c85,
+ 0x352a03,
+ 0x337986,
+ 0x25cd05,
+ 0x2a6ac8,
+ 0x2bcf89,
+ 0x260345,
+ 0x26034f,
+ 0x2dadc7,
+ 0x215a05,
+ 0x26fe0a,
+ 0x3bf6c6,
+ 0x2f9889,
+ 0x37b50c,
+ 0x3bcfc9,
+ 0x3d1b06,
+ 0x2cb40c,
+ 0x33b8c6,
+ 0x304fc8,
+ 0x305fc6,
+ 0x33f806,
+ 0x2b5644,
+ 0x31ddc3,
+ 0x32358a,
+ 0x28e451,
+ 0x2818ca,
+ 0x27d185,
+ 0x355ac7,
+ 0x258d07,
+ 0x2d88c4,
+ 0x2d88cb,
+ 0x204e88,
+ 0x2be3c6,
+ 0x2326c5,
+ 0x32a284,
+ 0x243089,
+ 0x2008c4,
+ 0x242987,
+ 0x380385,
+ 0x380387,
+ 0x37f305,
+ 0x2535c3,
+ 0x222548,
+ 0x31f38a,
+ 0x2166c3,
+ 0x2166ca,
+ 0x27eb06,
+ 0x2600cf,
+ 0x3d3489,
+ 0x2cb910,
+ 0x2fd448,
+ 0x2d2049,
+ 0x298b07,
+ 0x2b19cf,
+ 0x393804,
+ 0x2dd344,
+ 0x21c9c6,
+ 0x3ac106,
+ 0x2ed80a,
+ 0x2574c6,
+ 0x394fc7,
+ 0x3152c8,
+ 0x3154c7,
+ 0x316907,
+ 0x31820a,
+ 0x31720b,
+ 0x328805,
+ 0x2e2a48,
+ 0x21b2c3,
+ 0x3ba74c,
+ 0x351e0f,
+ 0x23570d,
+ 0x259307,
+ 0x326bc9,
+ 0x225547,
+ 0x23be88,
+ 0x22c98c,
+ 0x26a208,
+ 0x23d708,
+ 0x33290e,
+ 0x345b14,
+ 0x346024,
+ 0x35d98a,
+ 0x37b14b,
+ 0x378984,
+ 0x378989,
+ 0x2f1d08,
+ 0x2484c5,
+ 0x30a94a,
+ 0x260747,
+ 0x21e744,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x236204,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x219e43,
+ 0x205e03,
+ 0x2dc3c6,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x213c43,
+ 0x2000c2,
+ 0x24ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x236204,
+ 0x233743,
+ 0x220583,
+ 0x219e43,
+ 0x2dc3c6,
+ 0x206b43,
+ 0x23cf83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x2000c2,
+ 0x24de03,
+ 0x202782,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x205cc2,
+ 0x235d82,
+ 0x202782,
+ 0x22d7c3,
+ 0x206742,
+ 0x2005c2,
+ 0x222884,
+ 0x3216c4,
+ 0x228d42,
+ 0x205184,
+ 0x2003c2,
+ 0x23cf83,
+ 0x213c43,
+ 0x259b06,
+ 0x2195c2,
+ 0x207d82,
+ 0x223f82,
+ 0x5361f043,
+ 0x53a04343,
+ 0x59646,
+ 0x59646,
+ 0x241844,
+ 0x2013c3,
+ 0x8d78a,
+ 0x1721cc,
+ 0x1dca0c,
+ 0xca48d,
+ 0x12dac5,
+ 0x8cf0c,
+ 0x2afc7,
+ 0xc946,
+ 0x13848,
+ 0x1b047,
+ 0x20a08,
+ 0x18930a,
+ 0x1142c7,
+ 0x5468d145,
+ 0xdee89,
+ 0x34f8b,
+ 0x17830b,
+ 0x1c6408,
+ 0x5f89,
+ 0x18c58a,
+ 0x17598e,
+ 0x8f68d,
+ 0x1441e8b,
+ 0xdfaca,
+ 0xe184,
+ 0x5c846,
+ 0x160308,
+ 0x6c648,
+ 0x3fbc7,
+ 0xbb45,
+ 0x19447,
+ 0x80b89,
+ 0x1a0047,
+ 0x18b08,
+ 0x29009,
+ 0x4aec4,
+ 0x4fe45,
+ 0x16364e,
+ 0x6c2cd,
+ 0x5d88,
+ 0x54a6e4c6,
+ 0x55571a08,
+ 0x76248,
+ 0x13df10,
+ 0x5784c,
+ 0x65247,
+ 0x66287,
+ 0x6a407,
+ 0x70c47,
+ 0x37482,
+ 0x13be07,
+ 0x1c1f46,
+ 0x1624c,
+ 0x198c85,
+ 0x1cc607,
+ 0xa7906,
+ 0xa8549,
+ 0xaa8c8,
+ 0x373c2,
+ 0x5c2,
+ 0x18bb06,
+ 0x1c4a0b,
+ 0x1c4d06,
+ 0x1091c4,
+ 0x45647,
+ 0xe4e09,
+ 0x504c9,
+ 0x17f8c8,
+ 0x4d442,
+ 0x191789,
+ 0xc548,
+ 0xed64a,
+ 0x6d06,
+ 0xcea89,
+ 0xdfa47,
+ 0xe0189,
+ 0xe22c8,
+ 0xe32c7,
+ 0xe4349,
+ 0xe9c45,
+ 0xe9fd0,
+ 0x178f46,
+ 0x45585,
+ 0x1667c7,
+ 0xebccd,
+ 0x409c5,
+ 0xf0bc6,
+ 0xf1407,
+ 0xf7dd8,
+ 0x1a03c8,
+ 0x10ba8a,
+ 0x16f82,
+ 0x56d4a,
+ 0x6ca4d,
+ 0x1bc2,
+ 0x5bac6,
+ 0x51488,
+ 0x49f88,
+ 0x6d8c9,
+ 0x115f88,
+ 0x7b54e,
+ 0x6db08,
+ 0x137987,
+ 0x55b08104,
+ 0x10ec4d,
+ 0x100185,
+ 0x109f48,
+ 0x1abcc8,
+ 0x10f346,
+ 0xd2c2,
+ 0x53844,
+ 0x33d86,
+ 0xec046,
+ 0xa842,
+ 0x401,
+ 0x5ed07,
+ 0x117c83,
+ 0x54ef8644,
+ 0x55296943,
+ 0xc1,
+ 0x11746,
+ 0xc1,
+ 0x201,
+ 0x11746,
+ 0x117c83,
+ 0x418c3,
+ 0x9a544,
+ 0x147da45,
+ 0x52184,
+ 0x65387,
+ 0x2782,
+ 0x24ec04,
+ 0x22d7c3,
+ 0x251184,
+ 0x222884,
+ 0x206b43,
+ 0x221f05,
+ 0x214703,
+ 0x25b583,
+ 0x3da885,
+ 0x207b83,
+ 0xe583,
+ 0x56a2d7c3,
+ 0x233743,
+ 0x4183,
+ 0x220583,
+ 0x200181,
+ 0x14903,
+ 0x205e03,
+ 0x3216c4,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x202003,
+ 0xa14c8,
+ 0x2000c2,
+ 0x24ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x2005c2,
+ 0x222884,
+ 0x219e43,
+ 0x205e03,
+ 0x206b43,
+ 0x2013c3,
+ 0x23cf83,
+ 0x207b83,
+ 0xa14c8,
+ 0x1213c7,
+ 0x2782,
+ 0x1a4d45,
+ 0x5798f,
+ 0xdac46,
+ 0x144b148,
+ 0x11630e,
+ 0x57a0f9c2,
+ 0x32bd88,
+ 0x310446,
+ 0x252306,
+ 0x30fdc7,
+ 0x57e01cc2,
+ 0x583d3308,
+ 0x21538a,
+ 0x264cc8,
+ 0x200b02,
+ 0x31f649,
+ 0x328847,
+ 0x2122c6,
+ 0x222289,
+ 0x30bdc4,
+ 0x20f186,
+ 0x2c5bc4,
+ 0x2072c4,
+ 0x25ab09,
+ 0x314786,
+ 0x22c345,
+ 0x2684c5,
+ 0x22df07,
+ 0x2c2ac7,
+ 0x28c3c4,
+ 0x310006,
+ 0x2f9045,
+ 0x218c85,
+ 0x27d245,
+ 0x2af587,
+ 0x26f285,
+ 0x24c349,
+ 0x3ccec5,
+ 0x347b44,
+ 0x266607,
+ 0x330b8e,
+ 0x360849,
+ 0x37ef89,
+ 0x335d46,
+ 0x23e788,
+ 0x24378b,
+ 0x367ecc,
+ 0x34d746,
+ 0x336c07,
+ 0x2b2a45,
+ 0x21744a,
+ 0x28db09,
+ 0x203489,
+ 0x3d5546,
+ 0x303405,
+ 0x247ac5,
+ 0x34a009,
+ 0x27d3cb,
+ 0x2e1886,
+ 0x350706,
+ 0x202c44,
+ 0x290746,
+ 0x2fc248,
+ 0x3b7506,
+ 0x357086,
+ 0x3c6d48,
+ 0x3d1907,
+ 0x3d5309,
+ 0x3d7485,
+ 0xa14c8,
+ 0x3cedc4,
+ 0x316e84,
+ 0x20b085,
+ 0x343e09,
+ 0x2214c7,
+ 0x2214cb,
+ 0x2245ca,
+ 0x2278c5,
+ 0x586022c2,
+ 0x2c6b47,
+ 0x58a27bc8,
+ 0x3d5787,
+ 0x2bdf05,
+ 0x35cd4a,
+ 0x2782,
+ 0x279acb,
+ 0x27f74a,
+ 0x24c7c6,
+ 0x22a2c3,
+ 0x36f7cd,
+ 0x3a864c,
+ 0x3b568d,
+ 0x231085,
+ 0x27a785,
+ 0x30ae87,
+ 0x3dac89,
+ 0x215286,
+ 0x257345,
+ 0x2eed48,
+ 0x290643,
+ 0x3011c8,
+ 0x290648,
+ 0x2c7d47,
+ 0x32af88,
+ 0x3a8449,
+ 0x2cbec7,
+ 0x2c6347,
+ 0x27d8c8,
+ 0x31ad44,
+ 0x31ad47,
+ 0x287a88,
+ 0x35e006,
+ 0x39990f,
+ 0x2e5007,
+ 0x358d86,
+ 0x36af45,
+ 0x224103,
+ 0x249d47,
+ 0x387183,
+ 0x24ff86,
+ 0x252086,
+ 0x252f86,
+ 0x294045,
+ 0x267e83,
+ 0x391408,
+ 0x388d49,
+ 0x39a54b,
+ 0x253108,
+ 0x2545c5,
+ 0x2563c5,
+ 0x58eb06c2,
+ 0x284f89,
+ 0x222907,
+ 0x25c785,
+ 0x25aa07,
+ 0x25c046,
+ 0x380bc5,
+ 0x25cb4b,
+ 0x25f044,
+ 0x264885,
+ 0x2649c7,
+ 0x277f46,
+ 0x278385,
+ 0x2874c7,
+ 0x287e07,
+ 0x2d2944,
+ 0x28cd0a,
+ 0x28ee48,
+ 0x243a49,
+ 0x368a85,
+ 0x2b2dc6,
+ 0x2fc40a,
+ 0x2683c6,
+ 0x22cd47,
+ 0x2c9b4d,
+ 0x2a5849,
+ 0x341d45,
+ 0x202d07,
+ 0x330f88,
+ 0x330508,
+ 0x21fa47,
+ 0x32e906,
+ 0x222c87,
+ 0x251b03,
+ 0x314704,
+ 0x37d145,
+ 0x3a9b07,
+ 0x3ae709,
+ 0x22ac48,
+ 0x22cc45,
+ 0x24b544,
+ 0x24cac5,
+ 0x2532cd,
+ 0x202082,
+ 0x2c1346,
+ 0x25ba06,
+ 0x2fe5ca,
+ 0x390dc6,
+ 0x397485,
+ 0x2c6085,
+ 0x2c6087,
+ 0x3a788c,
+ 0x2760ca,
+ 0x290406,
+ 0x2dbe05,
+ 0x290586,
+ 0x2908c7,
+ 0x292046,
+ 0x293f4c,
+ 0x2223c9,
+ 0x59211bc7,
+ 0x295f45,
+ 0x295f46,
+ 0x2963c8,
+ 0x2bca45,
+ 0x2a6545,
+ 0x2a6f08,
+ 0x2a710a,
+ 0x5967a482,
+ 0x59a08402,
+ 0x300945,
+ 0x281443,
+ 0x229d88,
+ 0x20b443,
+ 0x2a7384,
+ 0x2f99cb,
+ 0x3c72c8,
+ 0x2b1588,
+ 0x59fcc049,
+ 0x2abbc9,
+ 0x2ac306,
+ 0x2ad048,
+ 0x2ad249,
+ 0x2ae3c6,
+ 0x2ae545,
+ 0x24a8c6,
+ 0x2aed09,
+ 0x2ba987,
+ 0x34b786,
+ 0x21d087,
+ 0x3731c7,
+ 0x21f1c4,
+ 0x5a3a06c9,
+ 0x349708,
+ 0x3d3208,
+ 0x23fd07,
+ 0x2caf06,
+ 0x3c7789,
+ 0x2522c7,
+ 0x348f8a,
+ 0x369508,
+ 0x212c47,
+ 0x224f06,
+ 0x2ad5ca,
+ 0x231808,
+ 0x2e8745,
+ 0x2269c5,
+ 0x351147,
+ 0x31c689,
+ 0x3208cb,
+ 0x355d88,
+ 0x3ccf49,
+ 0x253a47,
+ 0x2bbd8c,
+ 0x2bc60c,
+ 0x2bc90a,
+ 0x2bcb8c,
+ 0x2c5748,
+ 0x2c5948,
+ 0x2c5b44,
+ 0x2c74c9,
+ 0x2c7709,
+ 0x2c794a,
+ 0x2c7bc9,
+ 0x2c7f07,
+ 0x3d5b4c,
+ 0x20ca46,
+ 0x2c9508,
+ 0x268486,
+ 0x3a3386,
+ 0x341c47,
+ 0x21fbc8,
+ 0x20f74b,
+ 0x3d5647,
+ 0x25a7c9,
+ 0x285189,
+ 0x355c07,
+ 0x2c5e04,
+ 0x2fa147,
+ 0x20a286,
+ 0x20ddc6,
+ 0x2fdf85,
+ 0x2cec48,
+ 0x294884,
+ 0x294886,
+ 0x275f8b,
+ 0x2ae009,
+ 0x250ac6,
+ 0x357289,
+ 0x20b146,
+ 0x204048,
+ 0x218983,
+ 0x303585,
+ 0x222a89,
+ 0x224805,
+ 0x37e504,
+ 0x277486,
+ 0x23c705,
+ 0x257bc6,
+ 0x31a607,
+ 0x346dc6,
+ 0x22bb0b,
+ 0x249887,
+ 0x2554c6,
+ 0x210046,
+ 0x22dfc6,
+ 0x28c389,
+ 0x2fa54a,
+ 0x2be6c5,
+ 0x3b518d,
+ 0x2a7206,
+ 0x38fac6,
+ 0x2cb806,
+ 0x2f7805,
+ 0x2ea2c7,
+ 0x22a587,
+ 0x273bce,
+ 0x205e03,
+ 0x2caec9,
+ 0x245009,
+ 0x22dc47,
+ 0x226247,
+ 0x237d85,
+ 0x210205,
+ 0x5a600c0f,
+ 0x2d2287,
+ 0x2d2448,
+ 0x2d3144,
+ 0x2d3586,
+ 0x5aa477c2,
+ 0x2d9b06,
+ 0x2dc3c6,
+ 0x2451ce,
+ 0x30100a,
+ 0x2b6546,
+ 0x21ba0a,
+ 0x3c2989,
+ 0x234045,
+ 0x305488,
+ 0x31d886,
+ 0x29d808,
+ 0x329788,
+ 0x27958b,
+ 0x30fec5,
+ 0x26f308,
+ 0x3c6e8c,
+ 0x2bddc7,
+ 0x252806,
+ 0x2e5888,
+ 0x20f408,
+ 0x5ae4fd42,
+ 0x20ef4b,
+ 0x3d7689,
+ 0x28d5c9,
+ 0x21b707,
+ 0x3c4f88,
+ 0x5b397048,
+ 0x20e7cb,
+ 0x37f749,
+ 0x25db4d,
+ 0x3295c8,
+ 0x2ad7c8,
+ 0x5b601642,
+ 0x3cbec4,
+ 0x5ba2ebc2,
+ 0x3b0a06,
+ 0x5be01102,
+ 0x2f500a,
+ 0x2ab406,
+ 0x238348,
+ 0x3be948,
+ 0x248ec6,
+ 0x337106,
+ 0x2fd1c6,
+ 0x2a6a45,
+ 0x23a1c4,
+ 0x5c238884,
+ 0x355586,
+ 0x296e47,
+ 0x5c60c687,
+ 0x26c08b,
+ 0x3d5989,
+ 0x27a7ca,
+ 0x206944,
+ 0x2c61c8,
+ 0x34b54d,
+ 0x2f5b89,
+ 0x2f5dc8,
+ 0x2f6049,
+ 0x2f7dc4,
+ 0x247344,
+ 0x25ebc5,
+ 0x36824b,
+ 0x3c7246,
+ 0x3553c5,
+ 0x2eb909,
+ 0x3100c8,
+ 0x238a04,
+ 0x2175c9,
+ 0x237605,
+ 0x2c2b08,
+ 0x2c6a07,
+ 0x37f388,
+ 0x284846,
+ 0x3d1ec7,
+ 0x2e1049,
+ 0x3cc909,
+ 0x3c7a85,
+ 0x36ff45,
+ 0x5ca12cc2,
+ 0x347904,
+ 0x217fc5,
+ 0x30fcc6,
+ 0x37a1c5,
+ 0x2edec7,
+ 0x299f85,
+ 0x277f84,
+ 0x335e06,
+ 0x2573c7,
+ 0x2ff786,
+ 0x321d85,
+ 0x210608,
+ 0x310645,
+ 0x214887,
+ 0x221109,
+ 0x2ae14a,
+ 0x22b147,
+ 0x22b14c,
+ 0x22c306,
+ 0x23ce09,
+ 0x37ff05,
+ 0x38ad48,
+ 0x209f43,
+ 0x20ab85,
+ 0x209f45,
+ 0x303b07,
+ 0x5ce03542,
+ 0x2f0187,
+ 0x2e7f46,
+ 0x3ce746,
+ 0x2eb246,
+ 0x20f346,
+ 0x2ddf88,
+ 0x31f2c5,
+ 0x358e47,
+ 0x358e4d,
+ 0x203843,
+ 0x20cf05,
+ 0x26fbc7,
+ 0x2f04c8,
+ 0x26f785,
+ 0x213e88,
+ 0x39c646,
+ 0x2df047,
+ 0x2c9445,
+ 0x30ff46,
+ 0x391985,
+ 0x21504a,
+ 0x2f9406,
+ 0x282187,
+ 0x31e445,
+ 0x3a6707,
+ 0x305d84,
+ 0x37e486,
+ 0x3053c5,
+ 0x216bcb,
+ 0x20a109,
+ 0x24df0a,
+ 0x3c7b08,
+ 0x348348,
+ 0x30d40c,
+ 0x30ef47,
+ 0x311dc8,
+ 0x313f88,
+ 0x314d05,
+ 0x350f0a,
+ 0x352a09,
+ 0x5d202702,
+ 0x3c0806,
+ 0x246dc4,
+ 0x246dc9,
+ 0x270a09,
+ 0x277987,
+ 0x2b4907,
+ 0x3562c9,
+ 0x2d1b88,
+ 0x2d1b8f,
+ 0x223686,
+ 0x2deb4b,
+ 0x2669c5,
+ 0x2669c7,
+ 0x374c49,
+ 0x217546,
+ 0x217547,
+ 0x2e3185,
+ 0x230f84,
+ 0x267586,
+ 0x221684,
+ 0x2b5287,
+ 0x2b3688,
+ 0x5d703308,
+ 0x304885,
+ 0x3049c7,
+ 0x32ac89,
+ 0x20ed04,
+ 0x240588,
+ 0x5da72b88,
+ 0x2d88c4,
+ 0x347e48,
+ 0x372644,
+ 0x3b5489,
+ 0x219f85,
+ 0x5de1be02,
+ 0x2236c5,
+ 0x2e38c5,
+ 0x202b48,
+ 0x234347,
+ 0x5e2008c2,
+ 0x2389c5,
+ 0x2d76c6,
+ 0x232e06,
+ 0x3478c8,
+ 0x34ab88,
+ 0x37a186,
+ 0x37ae06,
+ 0x321489,
+ 0x3ce686,
+ 0x2195cb,
+ 0x31f585,
+ 0x2a8046,
+ 0x2755c8,
+ 0x3333c6,
+ 0x39ec86,
+ 0x21434a,
+ 0x2abf8a,
+ 0x273305,
+ 0x30dcc7,
+ 0x2f33c6,
+ 0x5e606842,
+ 0x26fd07,
+ 0x25e345,
+ 0x2fc384,
+ 0x2fc385,
+ 0x206846,
+ 0x271847,
+ 0x21c9c5,
+ 0x21fc44,
+ 0x2d39c8,
+ 0x39ed45,
+ 0x3c9707,
+ 0x3d4145,
+ 0x214f85,
+ 0x2ae9c4,
+ 0x2e6ac9,
+ 0x2f8e88,
+ 0x23a946,
+ 0x3b7ec6,
+ 0x3cae86,
+ 0x5eb0f4c8,
+ 0x30f6c7,
+ 0x31174d,
+ 0x312c4c,
+ 0x313249,
+ 0x313489,
+ 0x5ef73c82,
+ 0x3d2fc3,
+ 0x20a343,
+ 0x20a345,
+ 0x3a9c0a,
+ 0x33fbc6,
+ 0x24e305,
+ 0x31af04,
+ 0x31af0b,
+ 0x3340cc,
+ 0x33534c,
+ 0x335655,
+ 0x337b4d,
+ 0x33964f,
+ 0x339a12,
+ 0x339e8f,
+ 0x33a252,
+ 0x33a6d3,
+ 0x33ab8d,
+ 0x33b14d,
+ 0x33b4ce,
+ 0x33ba4e,
+ 0x33c78c,
+ 0x33cb4c,
+ 0x33cf8b,
+ 0x33da0e,
+ 0x33e312,
+ 0x33f98c,
+ 0x33fe90,
+ 0x34ba52,
+ 0x34c6cc,
+ 0x34cd8d,
+ 0x34d0cc,
+ 0x34f611,
+ 0x35088d,
+ 0x352c4d,
+ 0x35324a,
+ 0x3534cc,
+ 0x3547cc,
+ 0x3550cc,
+ 0x35688c,
+ 0x35a253,
+ 0x35a8d0,
+ 0x35acd0,
+ 0x35b64d,
+ 0x35bc4c,
+ 0x35d6c9,
+ 0x35ef4d,
+ 0x35f293,
+ 0x361fd1,
+ 0x3627d3,
+ 0x363c8f,
+ 0x36404c,
+ 0x36434f,
+ 0x36470d,
+ 0x364d0f,
+ 0x3650d0,
+ 0x365b4e,
+ 0x369c8e,
+ 0x36b490,
+ 0x36bf4d,
+ 0x36c8ce,
+ 0x36cc4c,
+ 0x36dc13,
+ 0x37028e,
+ 0x370910,
+ 0x370d11,
+ 0x37114f,
+ 0x371513,
+ 0x37380d,
+ 0x373b4f,
+ 0x373f0e,
+ 0x374490,
+ 0x374889,
+ 0x3761d0,
+ 0x3767cf,
+ 0x376e4f,
+ 0x377212,
+ 0x37940e,
+ 0x379e0d,
+ 0x37a54d,
+ 0x37a88d,
+ 0x37b80d,
+ 0x37bb4d,
+ 0x37be90,
+ 0x37c28b,
+ 0x37cf0c,
+ 0x37d28c,
+ 0x37d88c,
+ 0x37db8e,
+ 0x38b4d0,
+ 0x38ddd2,
+ 0x38e24b,
+ 0x38e58e,
+ 0x38e90e,
+ 0x38f18e,
+ 0x38f60b,
+ 0x5f38fc56,
+ 0x390acd,
+ 0x390f54,
+ 0x391c4d,
+ 0x3939d5,
+ 0x39554d,
+ 0x395ecf,
+ 0x39654f,
+ 0x39a80f,
+ 0x39abce,
+ 0x39b14d,
+ 0x39cc91,
+ 0x3a2b4c,
+ 0x3a2e4c,
+ 0x3a314b,
+ 0x3a370c,
+ 0x3a3d8f,
+ 0x3a4152,
+ 0x3a480d,
+ 0x3a590c,
+ 0x3a68cc,
+ 0x3a6bcd,
+ 0x3a6f0f,
+ 0x3a72ce,
+ 0x3a98cc,
+ 0x3a9e8d,
+ 0x3aa1cb,
+ 0x3aaa8c,
+ 0x3ab38d,
+ 0x3ab6ce,
+ 0x3aba49,
+ 0x3ad093,
+ 0x3ad7cd,
+ 0x3adecd,
+ 0x3ae4cc,
+ 0x3ae94e,
+ 0x3af04f,
+ 0x3af40c,
+ 0x3af70d,
+ 0x3afa4f,
+ 0x3afe0c,
+ 0x3b0c4c,
+ 0x3b110c,
+ 0x3b140c,
+ 0x3b1acd,
+ 0x3b1e12,
+ 0x3b2b8c,
+ 0x3b2e8c,
+ 0x3b3191,
+ 0x3b35cf,
+ 0x3b398f,
+ 0x3b3d53,
+ 0x3b5e0e,
+ 0x3b618f,
+ 0x3b654c,
+ 0x5f7b688e,
+ 0x3b6c0f,
+ 0x3b6fd6,
+ 0x3b9f92,
+ 0x3bc7cc,
+ 0x3bd60f,
+ 0x3bdc8d,
+ 0x3c878f,
+ 0x3c8b4c,
+ 0x3c8e4d,
+ 0x3c918d,
+ 0x3caa4e,
+ 0x3cdecc,
+ 0x3d044c,
+ 0x3d0750,
+ 0x3d2351,
+ 0x3d278b,
+ 0x3d2bcc,
+ 0x3d2ece,
+ 0x3d4591,
+ 0x3d49ce,
+ 0x3d4d4d,
+ 0x3d894b,
+ 0x3d924f,
+ 0x3d9e54,
+ 0x2068c2,
+ 0x2068c2,
+ 0x202e03,
+ 0x2068c2,
+ 0x202e03,
+ 0x2068c2,
+ 0x20c682,
+ 0x24a905,
+ 0x3d428c,
+ 0x2068c2,
+ 0x2068c2,
+ 0x20c682,
+ 0x2068c2,
+ 0x296a45,
+ 0x2ae145,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2010c2,
+ 0x296a45,
+ 0x338309,
+ 0x361ccc,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2068c2,
+ 0x24a905,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2010c2,
+ 0x338309,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2068c2,
+ 0x2ae145,
+ 0x2068c2,
+ 0x2ae145,
+ 0x361ccc,
+ 0x3d428c,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x206b43,
+ 0x23cf83,
+ 0x60314887,
+ 0x1c618f,
+ 0x24c8,
+ 0x7b684,
+ 0x13c3,
+ 0x1a20c8,
+ 0x7c44,
+ 0x2000c2,
+ 0x60a02782,
+ 0x23fec3,
+ 0x250604,
+ 0x204183,
+ 0x3dc504,
+ 0x22fac6,
+ 0x20ad83,
+ 0x30e184,
+ 0x24d985,
+ 0x205e03,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0x21d60a,
+ 0x259b06,
+ 0x38ec8c,
+ 0xa14c8,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x22a243,
+ 0x2dc3c6,
+ 0x206b43,
+ 0x23cf83,
+ 0x213c43,
+ 0x2fe03,
+ 0xa7c88,
+ 0x6157eac5,
+ 0x4b8c7,
+ 0x12dac5,
+ 0x178449,
+ 0xdcc2,
+ 0x6237e2c5,
+ 0x12dac5,
+ 0x2afc7,
+ 0x6da08,
+ 0x820e,
+ 0x8abd2,
+ 0x11f94b,
+ 0x1143c6,
+ 0x6268d145,
+ 0x62a8d14c,
+ 0x5e4c7,
+ 0x14c47,
+ 0x1a0eca,
+ 0x3b650,
+ 0x173345,
+ 0x10cd0b,
+ 0x6c648,
+ 0x3fbc7,
+ 0x19ee0b,
+ 0x80b89,
+ 0x4aac7,
+ 0x1a0047,
+ 0xe1ac7,
+ 0x35186,
+ 0x18b08,
+ 0x63029f46,
+ 0x49ec7,
+ 0x15c646,
+ 0x6c2cd,
+ 0x1a0890,
+ 0x634758c2,
+ 0x5d88,
+ 0x3c010,
+ 0x1818cc,
+ 0x63b89fcd,
+ 0x5d348,
+ 0x5d7cb,
+ 0x6ad07,
+ 0x16a549,
+ 0x59706,
+ 0x965c8,
+ 0x7102,
+ 0x8898a,
+ 0xde307,
+ 0x1cc607,
+ 0xa8549,
+ 0xaa8c8,
+ 0x1b8e85,
+ 0x18bb06,
+ 0x1c4d06,
+ 0xf6cce,
+ 0x23b4e,
+ 0xa9f4f,
+ 0xe4e09,
+ 0x504c9,
+ 0x8850b,
+ 0xa224f,
+ 0xc334c,
+ 0xbb64b,
+ 0xe0ac8,
+ 0x144707,
+ 0x166308,
+ 0x18da0b,
+ 0x194d8c,
+ 0x19bd4c,
+ 0x1a3a8c,
+ 0xafccd,
+ 0x17f8c8,
+ 0xefdc2,
+ 0x191789,
+ 0xf9708,
+ 0x1921cb,
+ 0xcb106,
+ 0xd6f8b,
+ 0x13de4b,
+ 0xe28ca,
+ 0xe3485,
+ 0xe9fd0,
+ 0xec646,
+ 0x12e406,
+ 0x45585,
+ 0x1667c7,
+ 0xfd6c8,
+ 0xf1407,
+ 0xf16c7,
+ 0x1c6647,
+ 0x1b084a,
+ 0xa134a,
+ 0x5bac6,
+ 0x94ecd,
+ 0x49f88,
+ 0x115f88,
+ 0xae909,
+ 0xbacc5,
+ 0x1aed4c,
+ 0xafecb,
+ 0x10d704,
+ 0x10f109,
+ 0x10f346,
+ 0x159546,
+ 0x1b4886,
+ 0x7d82,
+ 0xec046,
+ 0x10b9cb,
+ 0x11d447,
+ 0xa842,
+ 0xcd9c5,
+ 0x26c44,
+ 0x101,
+ 0x568c3,
+ 0x62e81606,
+ 0x96943,
+ 0x382,
+ 0x29144,
+ 0xb02,
+ 0x41844,
+ 0x882,
+ 0x2202,
+ 0x2c42,
+ 0x25a42,
+ 0x5cc2,
+ 0x8d142,
+ 0x14c2,
+ 0xd5e42,
+ 0x36d82,
+ 0x37982,
+ 0x2942,
+ 0x52282,
+ 0x33743,
+ 0x942,
+ 0x1242,
+ 0x19d02,
+ 0xe282,
+ 0x642,
+ 0x320c2,
+ 0x373c2,
+ 0x3d82,
+ 0x5e42,
+ 0x5c2,
+ 0x19e43,
+ 0x1b82,
+ 0x6102,
+ 0x4d442,
+ 0x53a42,
+ 0xb42,
+ 0x8002,
+ 0xf1c2,
+ 0xdf302,
+ 0x24c2,
+ 0x1582,
+ 0x6cec2,
+ 0x45ec2,
+ 0x6b43,
+ 0x602,
+ 0x4fd42,
+ 0x13c2,
+ 0xcc82,
+ 0x1c7a05,
+ 0x6a82,
+ 0x41f42,
+ 0x3c883,
+ 0x682,
+ 0x16f82,
+ 0x1bc2,
+ 0x37c2,
+ 0x3842,
+ 0x8c2,
+ 0xd2c2,
+ 0x7d82,
+ 0x5f85,
+ 0x63e0c682,
+ 0x642cfe83,
+ 0x20c3,
+ 0x6460c682,
+ 0x20c3,
+ 0x83cc7,
+ 0x20c443,
+ 0x2000c2,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x2005c3,
+ 0x22a243,
+ 0x206b43,
+ 0x2013c3,
+ 0x23cf83,
+ 0x296983,
+ 0xfc105,
+ 0x1083,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x205e03,
+ 0x206b43,
+ 0x2013c3,
+ 0x6df83,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x200181,
+ 0x205e03,
+ 0x206b43,
+ 0x251ac3,
+ 0x23cf83,
+ 0x10c9c4,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x233743,
+ 0x205d83,
+ 0x228843,
+ 0x251383,
+ 0x22f503,
+ 0x2ab3c3,
+ 0x249743,
+ 0x220583,
+ 0x222884,
+ 0x206b43,
+ 0x23cf83,
+ 0x207b83,
+ 0x201844,
+ 0x2534c3,
+ 0xa683,
+ 0x3c38c3,
+ 0x32a148,
+ 0x2ad604,
+ 0x20020a,
+ 0x250846,
+ 0x12aa84,
+ 0x383407,
+ 0x21dd8a,
+ 0x223549,
+ 0x3ad507,
+ 0x3b41ca,
+ 0x24ce83,
+ 0x3009cb,
+ 0x2d5809,
+ 0x2d86c5,
+ 0x3b0f47,
+ 0x2782,
+ 0x22d7c3,
+ 0x237987,
+ 0x2e5505,
+ 0x2c5cc9,
+ 0x233743,
+ 0x308386,
+ 0x2c5103,
+ 0xa1c3,
+ 0x119746,
+ 0x10b206,
+ 0xad07,
+ 0x221986,
+ 0x225a85,
+ 0x3d7547,
+ 0x316747,
+ 0x67220583,
+ 0x34c907,
+ 0x3b4983,
+ 0x20be85,
+ 0x222884,
+ 0x26ef88,
+ 0x379b0c,
+ 0x2b12c5,
+ 0x2a59c6,
+ 0x237847,
+ 0x20a647,
+ 0x2660c7,
+ 0x270048,
+ 0x31868f,
+ 0x223785,
+ 0x23ffc7,
+ 0x20d547,
+ 0x2a74ca,
+ 0x2eeb89,
+ 0x322805,
+ 0x32484a,
+ 0x130246,
+ 0xbb147,
+ 0x2c5185,
+ 0x38e484,
+ 0x248e06,
+ 0xbdfc6,
+ 0x381b47,
+ 0x2efcc7,
+ 0x3dae88,
+ 0x21a205,
+ 0x2e5406,
+ 0x25388,
+ 0x357005,
+ 0x1571c6,
+ 0x23bd85,
+ 0x28ca84,
+ 0x2376c7,
+ 0x2dddca,
+ 0x255988,
+ 0x361386,
+ 0x2a243,
+ 0x2e43c5,
+ 0x3291c6,
+ 0x3d5d86,
+ 0x245486,
+ 0x205e03,
+ 0x3a4a87,
+ 0x20d4c5,
+ 0x206b43,
+ 0x2e2b8d,
+ 0x2013c3,
+ 0x3daf88,
+ 0x219344,
+ 0x278245,
+ 0x2a73c6,
+ 0x394206,
+ 0x2a7f47,
+ 0x25da07,
+ 0x283385,
+ 0x23cf83,
+ 0x2e9987,
+ 0x344809,
+ 0x36a6c9,
+ 0x32e64a,
+ 0x2434c2,
+ 0x20be44,
+ 0x2ecbc4,
+ 0x2efb87,
+ 0x2f0048,
+ 0x2f24c9,
+ 0x20cdc9,
+ 0x2f3a07,
+ 0xffc09,
+ 0x3720c6,
+ 0xf6a46,
+ 0x2f7dc4,
+ 0x2f83ca,
+ 0x2fb488,
+ 0x2fd089,
+ 0x3ac386,
+ 0x2b5e85,
+ 0x255848,
+ 0x2cc48a,
+ 0x210f43,
+ 0x2019c6,
+ 0x2f3b07,
+ 0x357785,
+ 0x390485,
+ 0x239703,
+ 0x23d804,
+ 0x226985,
+ 0x287f07,
+ 0x2f8fc5,
+ 0x2eea46,
+ 0x13c285,
+ 0x28a243,
+ 0x2b6609,
+ 0x27800c,
+ 0x2b9f4c,
+ 0x2d6d88,
+ 0x2a4b47,
+ 0x306148,
+ 0x106787,
+ 0x306fca,
+ 0x30768b,
+ 0x2d5948,
+ 0x394308,
+ 0x239106,
+ 0x3cad45,
+ 0x30a10a,
+ 0x2cfec5,
+ 0x21be02,
+ 0x2c9307,
+ 0x251646,
+ 0x375145,
+ 0x30de89,
+ 0x206145,
+ 0x31fec5,
+ 0x2752c9,
+ 0x329106,
+ 0x3ba5c8,
+ 0x26a183,
+ 0x209046,
+ 0x2773c6,
+ 0x31c485,
+ 0x31c489,
+ 0x2f2c09,
+ 0x27e387,
+ 0x11d2c4,
+ 0x31d2c7,
+ 0x20ccc9,
+ 0x21df85,
+ 0x3a2c8,
+ 0x340ec5,
+ 0x274b05,
+ 0x377a09,
+ 0x2020c2,
+ 0x2e4884,
+ 0x203f42,
+ 0x201b82,
+ 0x38c145,
+ 0x32a808,
+ 0x2bac05,
+ 0x2c80c3,
+ 0x2c80c5,
+ 0x2d9d03,
+ 0x209002,
+ 0x302284,
+ 0x2b69c3,
+ 0x201002,
+ 0x3cb604,
+ 0x2ed143,
+ 0x204f02,
+ 0x2bac83,
+ 0x303a84,
+ 0x2fd643,
+ 0x25cfc4,
+ 0x209482,
+ 0x213b43,
+ 0x21bb03,
+ 0x203002,
+ 0x308102,
+ 0x2f2a49,
+ 0x219082,
+ 0x28ba04,
+ 0x202242,
+ 0x2556c4,
+ 0x372084,
+ 0x206f04,
+ 0x207d82,
+ 0x238d42,
+ 0x36ad83,
+ 0x307443,
+ 0x237b44,
+ 0x248804,
+ 0x2ba344,
+ 0x2d1544,
+ 0x2fb643,
+ 0x2446c3,
+ 0x3301c4,
+ 0x31fdc4,
+ 0x3203c6,
+ 0x22c202,
+ 0x2782,
+ 0x409c3,
+ 0x202782,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x2000c2,
+ 0x24ce83,
+ 0x22d7c3,
+ 0x233743,
+ 0x208903,
+ 0x220583,
+ 0x222884,
+ 0x2f2d04,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x213c43,
+ 0x2f8984,
+ 0x32bd43,
+ 0x2a8fc3,
+ 0x37a0c4,
+ 0x340cc6,
+ 0x218a43,
+ 0x12dac5,
+ 0x14c47,
+ 0x2e6e03,
+ 0x68a4abc8,
+ 0x2416c3,
+ 0x2b3883,
+ 0x20bec3,
+ 0x22a243,
+ 0x35ff85,
+ 0x1b0f03,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x3410c3,
+ 0x22f0c3,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x219e43,
+ 0x206b43,
+ 0x23b484,
+ 0x6df83,
+ 0x23cf83,
+ 0x21f4c4,
+ 0x12dac5,
+ 0x2c1745,
+ 0x14c47,
+ 0x202782,
+ 0x203dc2,
+ 0x200382,
+ 0x202642,
+ 0x13c3,
+ 0x2003c2,
+ 0x3304,
+ 0x22d7c3,
+ 0x236204,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x205184,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x202003,
+ 0x241844,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x2013c3,
+ 0x1083,
+ 0x14d5c4,
+ 0x24ec04,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x251184,
+ 0x222884,
+ 0x2013c3,
+ 0x201642,
+ 0x6df83,
+ 0x23cf83,
+ 0x25b583,
+ 0x3d804,
+ 0x3da885,
+ 0x21be02,
+ 0x3094c3,
+ 0x131949,
+ 0xdff06,
+ 0x109548,
+ 0x2000c2,
+ 0xa14c8,
+ 0x202782,
+ 0x233743,
+ 0x220583,
+ 0x2005c2,
+ 0x13c3,
+ 0x23cf83,
+ 0x79c2,
+ 0x82,
+ 0x2000c2,
+ 0x1b4387,
+ 0x135b49,
+ 0x7c303,
+ 0xa14c8,
+ 0x25a03,
+ 0x6c356e87,
+ 0x2d7c3,
+ 0x1c0708,
+ 0x233743,
+ 0x220583,
+ 0x3d346,
+ 0x219e43,
+ 0x95988,
+ 0xc4108,
+ 0x11f086,
+ 0x205e03,
+ 0xcf188,
+ 0xedf43,
+ 0x6c4e3d46,
+ 0xea9c5,
+ 0x33947,
+ 0x6b43,
+ 0x4e283,
+ 0x3cf83,
+ 0x2102,
+ 0x19c44a,
+ 0x4cc3,
+ 0x18c203,
+ 0x300204,
+ 0x11848b,
+ 0x118a48,
+ 0x91a82,
+ 0x1457987,
+ 0x1530e07,
+ 0x14c8188,
+ 0x151e703,
+ 0x1289cb,
+ 0x12d947,
+ 0x6a04,
+ 0x2000c2,
+ 0x202782,
+ 0x236204,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x22a243,
+ 0x206b43,
+ 0x23cf83,
+ 0x21f4c3,
+ 0x202003,
+ 0x2fe03,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x1083,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x22a243,
+ 0x206b43,
+ 0x23cf83,
+ 0x2195c2,
+ 0x2000c1,
+ 0x2000c2,
+ 0x200201,
+ 0x339742,
+ 0xa14c8,
+ 0x21c745,
+ 0x200101,
+ 0x2d7c3,
+ 0x30944,
+ 0x200f01,
+ 0x200501,
+ 0x202401,
+ 0x24a882,
+ 0x387184,
+ 0x24a883,
+ 0x200041,
+ 0x200801,
+ 0x200181,
+ 0x200701,
+ 0x37e6c7,
+ 0x31d9cf,
+ 0x319886,
+ 0x2004c1,
+ 0x34d606,
+ 0x200c01,
+ 0x200581,
+ 0x3d8b8e,
+ 0x2003c1,
+ 0x23cf83,
+ 0x201001,
+ 0x2e4d05,
+ 0x202102,
+ 0x239605,
+ 0x200401,
+ 0x200741,
+ 0x2007c1,
+ 0x21be02,
+ 0x200081,
+ 0x201ec1,
+ 0x203301,
+ 0x201081,
+ 0x20a781,
+ 0x54389,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x214703,
+ 0x22d7c3,
+ 0x220583,
+ 0x919c8,
+ 0x205e03,
+ 0x206b43,
+ 0x4e703,
+ 0x23cf83,
+ 0x14ee5c8,
+ 0x140fc8,
+ 0x12dac5,
+ 0xa14c8,
+ 0x13c3,
+ 0x12dac5,
+ 0x43fc4,
+ 0x3c2c8,
+ 0x47984,
+ 0x54389,
+ 0x14ee5ca,
+ 0xa14c8,
+ 0x6df83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x206b43,
+ 0x23cf83,
+ 0x20a683,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x2dd2c4,
+ 0x23cf83,
+ 0x3451c5,
+ 0x31f384,
+ 0x22d7c3,
+ 0x206b43,
+ 0x23cf83,
+ 0x2003,
+ 0xa7d8a,
+ 0xf3e84,
+ 0x122c86,
+ 0x202782,
+ 0x22d7c3,
+ 0x230ec9,
+ 0x233743,
+ 0x2ab989,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x6bfc4,
+ 0x13c3,
+ 0x23cf83,
+ 0x2f7bc8,
+ 0x2319c7,
+ 0x3da885,
+ 0x1d29c8,
+ 0x1b4387,
+ 0xf02ca,
+ 0x6f54b,
+ 0x14d847,
+ 0x3e648,
+ 0x1a050a,
+ 0x11808,
+ 0x135b49,
+ 0x26847,
+ 0x374c7,
+ 0x14c8,
+ 0x1c0708,
+ 0x4028f,
+ 0x19a45,
+ 0x18b307,
+ 0x3d346,
+ 0x4e1c7,
+ 0x122946,
+ 0x95988,
+ 0x9e786,
+ 0x128f07,
+ 0x12ea49,
+ 0x10ec7,
+ 0xb2f09,
+ 0xbb909,
+ 0xc14c6,
+ 0xc4108,
+ 0xc2c45,
+ 0x7a30a,
+ 0xcf188,
+ 0xedf43,
+ 0xdaa88,
+ 0x33947,
+ 0x172945,
+ 0x5f550,
+ 0x4e283,
+ 0x6df83,
+ 0x128d87,
+ 0x22d85,
+ 0xf19c8,
+ 0x68885,
+ 0x18c203,
+ 0x7048,
+ 0xc0246,
+ 0x17c949,
+ 0xad447,
+ 0x131c0b,
+ 0x6d144,
+ 0x10e984,
+ 0x11848b,
+ 0x118a48,
+ 0x119647,
+ 0x12dac5,
+ 0x22d7c3,
+ 0x233743,
+ 0x228843,
+ 0x23cf83,
+ 0x23de43,
+ 0x220583,
+ 0x6df83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x8864b,
+ 0x2000c2,
+ 0x202782,
+ 0x23cf83,
+ 0xa14c8,
+ 0x2782,
+ 0x2000c2,
+ 0x202782,
+ 0x200382,
+ 0x2005c2,
+ 0x205e02,
+ 0x206b43,
+ 0x132f46,
+ 0x2003c2,
+ 0x3d804,
+ 0x2000c2,
+ 0x24ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x200382,
+ 0x220583,
+ 0x219e43,
+ 0x205e03,
+ 0x205184,
+ 0x206b43,
+ 0x212203,
+ 0x13c3,
+ 0x23cf83,
+ 0x300204,
+ 0x207b83,
+ 0x220583,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x2013c3,
+ 0x23cf83,
+ 0x3bcc87,
+ 0x22d7c3,
+ 0x27c507,
+ 0x366486,
+ 0x201f83,
+ 0x219d03,
+ 0x220583,
+ 0x209a03,
+ 0x222884,
+ 0x3975c4,
+ 0x2df1c6,
+ 0x201d43,
+ 0x206b43,
+ 0x23cf83,
+ 0x3451c5,
+ 0x309e84,
+ 0x3a13c3,
+ 0x2c7183,
+ 0x2c9307,
+ 0x2c6985,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x52507,
+ 0x1667c7,
+ 0x1a2a05,
+ 0x20c882,
+ 0x24a0c3,
+ 0x20ee03,
+ 0x24ce83,
+ 0x7622d7c3,
+ 0x206742,
+ 0x233743,
+ 0x204183,
+ 0x220583,
+ 0x222884,
+ 0x37fa83,
+ 0x223783,
+ 0x205e03,
+ 0x205184,
+ 0x76602a42,
+ 0x206b43,
+ 0x23cf83,
+ 0x204f03,
+ 0x21c4c3,
+ 0x212bc3,
+ 0x2195c2,
+ 0x207b83,
+ 0xa14c8,
+ 0x220583,
+ 0x1083,
+ 0x21e744,
+ 0x24ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x236204,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x219e43,
+ 0x3b7d44,
+ 0x3216c4,
+ 0x2dc3c6,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x213c43,
+ 0x251646,
+ 0x3540b,
+ 0x29f46,
+ 0xebe8a,
+ 0x11c10a,
+ 0xa14c8,
+ 0x225344,
+ 0x77a2d7c3,
+ 0x329384,
+ 0x233743,
+ 0x2aea44,
+ 0x220583,
+ 0x2067c3,
+ 0x205e03,
+ 0x206b43,
+ 0x6df83,
+ 0x23cf83,
+ 0x4b283,
+ 0x3487cb,
+ 0x3c94ca,
+ 0x3db44c,
+ 0xe4148,
+ 0x2000c2,
+ 0x202782,
+ 0x200382,
+ 0x22e1c5,
+ 0x222884,
+ 0x2024c2,
+ 0x205e03,
+ 0x3216c4,
+ 0x202642,
+ 0x2003c2,
+ 0x202002,
+ 0x2195c2,
+ 0x4ce83,
+ 0x35d82,
+ 0x2c1f89,
+ 0x33f688,
+ 0x2294c9,
+ 0x21f009,
+ 0x2b718a,
+ 0x32324a,
+ 0x20a602,
+ 0x2d5e42,
+ 0x2782,
+ 0x22d7c3,
+ 0x22bdc2,
+ 0x240186,
+ 0x376cc2,
+ 0x203742,
+ 0x26f8ce,
+ 0x213b8e,
+ 0x281287,
+ 0x212ac7,
+ 0x251bc2,
+ 0x233743,
+ 0x220583,
+ 0x2191c2,
+ 0x2005c2,
+ 0x19c83,
+ 0x23640f,
+ 0x237542,
+ 0x355f47,
+ 0x2b5707,
+ 0x2c8c47,
+ 0x2d164c,
+ 0x2d36cc,
+ 0x21e404,
+ 0x25ea0a,
+ 0x213ac2,
+ 0x253a42,
+ 0x2bd1c4,
+ 0x200702,
+ 0x2af602,
+ 0x2d3904,
+ 0x212302,
+ 0x200b42,
+ 0x14903,
+ 0x29e807,
+ 0x23f2c5,
+ 0x20f1c2,
+ 0x24e144,
+ 0x201582,
+ 0x2e3ec8,
+ 0x206b43,
+ 0x3754c8,
+ 0x204082,
+ 0x21e5c5,
+ 0x394b06,
+ 0x23cf83,
+ 0x206a82,
+ 0x2f2707,
+ 0x2102,
+ 0x3a46c5,
+ 0x21fe85,
+ 0x213f82,
+ 0x202c02,
+ 0x204d4a,
+ 0x28320a,
+ 0x2801c2,
+ 0x29ce84,
+ 0x201202,
+ 0x20bd08,
+ 0x20a742,
+ 0x304d48,
+ 0x314187,
+ 0x315089,
+ 0x21ff02,
+ 0x31a585,
+ 0x36a1c5,
+ 0x21a2cb,
+ 0x2df74c,
+ 0x22b8c8,
+ 0x32d788,
+ 0x22c202,
+ 0x2a8002,
+ 0x2000c2,
+ 0xa14c8,
+ 0x202782,
+ 0x22d7c3,
+ 0x200382,
+ 0x202642,
+ 0x13c3,
+ 0x2003c2,
+ 0x23cf83,
+ 0x202002,
+ 0x2000c2,
+ 0x12dac5,
+ 0x78e02782,
+ 0x79620583,
+ 0x214903,
+ 0x2024c2,
+ 0x206b43,
+ 0x379083,
+ 0x79a3cf83,
+ 0x2ef083,
+ 0x283dc6,
+ 0x1602003,
+ 0x12dac5,
+ 0x132e0b,
+ 0xa14c8,
+ 0x793caf88,
+ 0x60ac7,
+ 0x6d807,
+ 0x45585,
+ 0xaafcd,
+ 0x3d142,
+ 0x119042,
+ 0xa8a0a,
+ 0x83047,
+ 0x256c4,
+ 0x25703,
+ 0x1b4904,
+ 0x7a205342,
+ 0x7a600b02,
+ 0x7aa02442,
+ 0x7ae026c2,
+ 0x7b20d242,
+ 0x7b605cc2,
+ 0x14c47,
+ 0x7ba02782,
+ 0x7be2eec2,
+ 0x7c21ed42,
+ 0x7c602942,
+ 0x213b83,
+ 0x16f44,
+ 0x2399c3,
+ 0x7ca0dd82,
+ 0x5d348,
+ 0x7ce05282,
+ 0x71d87,
+ 0x7d200042,
+ 0x7d6012c2,
+ 0x7da00182,
+ 0x7de067c2,
+ 0x7e205e42,
+ 0x7e6005c2,
+ 0xd8605,
+ 0x251e03,
+ 0x39ffc4,
+ 0x7ea00702,
+ 0x7ee03942,
+ 0x7f206ac2,
+ 0x7af0b,
+ 0x7f601442,
+ 0x7fe4ab82,
+ 0x802024c2,
+ 0x80605e02,
+ 0x80a02dc2,
+ 0x80e00c02,
+ 0x81200e82,
+ 0x8166cec2,
+ 0x81a02a42,
+ 0x81e09a42,
+ 0x82202642,
+ 0x82616202,
+ 0x82a6ef42,
+ 0x82e09b42,
+ 0xb2bc4,
+ 0x217a43,
+ 0x8320a302,
+ 0x836137c2,
+ 0x83a11b82,
+ 0x83e006c2,
+ 0x842003c2,
+ 0x84601002,
+ 0x887c7,
+ 0x84a13c42,
+ 0x84e04482,
+ 0x85202002,
+ 0x85600ec2,
+ 0x1aed4c,
+ 0x85a43982,
+ 0x85e28202,
+ 0x86203082,
+ 0x86606842,
+ 0x86a0a342,
+ 0x86e76c02,
+ 0x87205302,
+ 0x8760adc2,
+ 0x87a77742,
+ 0x87e77c82,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x17343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x7fb7fa83,
+ 0x217343,
+ 0x360004,
+ 0x2293c6,
+ 0x2fe843,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x308b49,
+ 0x235d82,
+ 0x3d3c43,
+ 0x2bbc03,
+ 0x202ac5,
+ 0x204183,
+ 0x37fa83,
+ 0x217343,
+ 0x2a6343,
+ 0x243283,
+ 0x245b89,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x235d82,
+ 0x235d82,
+ 0x37fa83,
+ 0x217343,
+ 0x8862d7c3,
+ 0x233743,
+ 0x21f243,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0xa14c8,
+ 0x202782,
+ 0x22d7c3,
+ 0x206b43,
+ 0x23cf83,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x205e03,
+ 0x206b43,
+ 0x13c3,
+ 0x23cf83,
+ 0x24ec04,
+ 0x202782,
+ 0x22d7c3,
+ 0x309703,
+ 0x233743,
+ 0x251184,
+ 0x228843,
+ 0x220583,
+ 0x222884,
+ 0x219e43,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x25b583,
+ 0x3da885,
+ 0x243283,
+ 0x207b83,
+ 0x13c3,
+ 0x202782,
+ 0x22d7c3,
+ 0x37fa83,
+ 0x206b43,
+ 0x23cf83,
+ 0x2000c2,
+ 0x24ce83,
+ 0xa14c8,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x22fac6,
+ 0x222884,
+ 0x219e43,
+ 0x205184,
+ 0x206b43,
+ 0x23cf83,
+ 0x213c43,
+ 0x22d7c3,
+ 0x233743,
+ 0x206b43,
+ 0x23cf83,
+ 0x2ebc2,
+ 0x2b42,
+ 0x144de07,
+ 0x492c7,
+ 0x22d7c3,
+ 0x29f46,
+ 0x233743,
+ 0x220583,
+ 0xe7e06,
+ 0x206b43,
+ 0x23cf83,
+ 0x329fc8,
+ 0x32d5c9,
+ 0x341f49,
+ 0x34a9c8,
+ 0x396bc8,
+ 0x396bc9,
+ 0x323aca,
+ 0x35d44a,
+ 0x391f8a,
+ 0x39858a,
+ 0x3c94ca,
+ 0x3d680b,
+ 0x24704d,
+ 0x3676cf,
+ 0x272190,
+ 0x35eacd,
+ 0x37d58c,
+ 0x3982cb,
+ 0x6da08,
+ 0x147d48,
+ 0xb1005,
+ 0x1489947,
+ 0xcd9c5,
+ 0x2000c2,
+ 0x2c67c5,
+ 0x200b03,
+ 0x8c202782,
+ 0x233743,
+ 0x220583,
+ 0x38d5c7,
+ 0x20bec3,
+ 0x205e03,
+ 0x206b43,
+ 0x251ac3,
+ 0x20c243,
+ 0x2013c3,
+ 0x23cf83,
+ 0x259b06,
+ 0x21be02,
+ 0x207b83,
+ 0xa14c8,
+ 0x2000c2,
+ 0x24ce83,
+ 0x202782,
+ 0x22d7c3,
+ 0x233743,
+ 0x220583,
+ 0x222884,
+ 0x205e03,
+ 0x206b43,
+ 0x23cf83,
+ 0x202003,
+ 0x492c7,
+ 0x131944,
+ 0x153fd06,
+ 0x2000c2,
+ 0x202782,
+ 0x220583,
+ 0x205e03,
+ 0x23cf83,
}
// children is the list of nodes' children, the parent's wildcard bit and the
@@ -9289,541 +9395,568 @@ var children = [...]uint32{
0x40000000,
0x50000000,
0x60000000,
- 0x182c605,
- 0x183060b,
- 0x183460c,
- 0x185860d,
- 0x19b4616,
- 0x19cc66d,
- 0x19e0673,
- 0x19f4678,
- 0x1a1467d,
- 0x1a18685,
- 0x1a30686,
- 0x1a3c68c,
- 0x1a4068f,
- 0x1a68690,
- 0x1a6c69a,
- 0x1a8469b,
+ 0x1824603,
+ 0x1828609,
+ 0x182c60a,
+ 0x185060b,
+ 0x19ac614,
+ 0x19c466b,
+ 0x19d8671,
+ 0x19f0676,
+ 0x1a1067c,
+ 0x1a28684,
+ 0x1a4068a,
+ 0x1a58690,
+ 0x1a5c696,
+ 0x1a84697,
0x1a886a1,
- 0x1a8c6a2,
- 0x1ac86a3,
- 0x1acc6b2,
- 0x61ad46b3,
- 0x21adc6b5,
- 0x1b246b7,
- 0x1b286c9,
- 0x1b486ca,
- 0x1b5c6d2,
- 0x1b606d7,
- 0x1b906d8,
- 0x1bac6e4,
- 0x1bd46eb,
- 0x1be46f5,
- 0x1be86f9,
- 0x1c806fa,
- 0x1c94720,
- 0x1ca8725,
- 0x1cd872a,
- 0x1ce8736,
- 0x1cfc73a,
- 0x1d1073f,
- 0x1db4744,
- 0x1fb476d,
- 0x1fb87ed,
- 0x20247ee,
- 0x2090809,
- 0x20a8824,
- 0x20bc82a,
- 0x20c082f,
- 0x20c8830,
- 0x20dc832,
- 0x20e0837,
- 0x20fc838,
- 0x214883f,
- 0x2164852,
- 0x2168859,
- 0x216c85a,
- 0x219085b,
- 0x21cc864,
- 0x621d0873,
- 0x21e8874,
- 0x220087a,
- 0x2208880,
- 0x2218882,
- 0x22cc886,
- 0x22d08b3,
- 0x222e08b4,
- 0x222e48b8,
- 0x222ec8b9,
- 0x233c8bb,
- 0x23408cf,
- 0x28108d0,
- 0x228b8a04,
- 0x228bca2e,
- 0x228c0a2f,
- 0x228cca30,
- 0x228d0a33,
- 0x228dca34,
- 0x228e0a37,
- 0x228e4a38,
- 0x228e8a39,
- 0x228eca3a,
- 0x228f0a3b,
- 0x228fca3c,
- 0x22900a3f,
- 0x2290ca40,
- 0x22910a43,
- 0x22914a44,
- 0x22918a45,
- 0x22924a46,
- 0x22928a49,
- 0x22934a4a,
- 0x22938a4d,
- 0x2293ca4e,
- 0x22940a4f,
- 0x2944a50,
- 0x22948a51,
- 0x22954a52,
+ 0x1aa06a2,
+ 0x1aa46a8,
+ 0x1aa86a9,
+ 0x1ae46aa,
+ 0x1ae86b9,
+ 0x61af06ba,
+ 0x21af86bc,
+ 0x1b406be,
+ 0x1b446d0,
+ 0x1b646d1,
+ 0x1b786d9,
+ 0x1b7c6de,
+ 0x1bac6df,
+ 0x1bc86eb,
+ 0x1bf06f2,
+ 0x1c006fc,
+ 0x1c04700,
+ 0x1c9c701,
+ 0x1cb0727,
+ 0x1cc472c,
+ 0x1cfc731,
+ 0x1d0c73f,
+ 0x1d20743,
+ 0x1d38748,
+ 0x1ddc74e,
+ 0x1fe0777,
+ 0x1fe47f8,
+ 0x20507f9,
+ 0x20bc814,
+ 0x20d482f,
+ 0x20e8835,
+ 0x20ec83a,
+ 0x20f483b,
+ 0x210883d,
+ 0x210c842,
+ 0x2128843,
+ 0x217884a,
+ 0x217c85e,
+ 0x2218085f,
+ 0x219c860,
+ 0x21a0867,
+ 0x21a4868,
+ 0x21c8869,
+ 0x2208872,
+ 0x220c882,
+ 0x62210883,
+ 0x2228884,
+ 0x224888a,
+ 0x2254892,
+ 0x2264895,
+ 0x2318899,
+ 0x231c8c6,
+ 0x2232c8c7,
+ 0x223308cb,
+ 0x223388cc,
+ 0x23948ce,
+ 0x23988e5,
+ 0x28848e6,
+ 0x2292ca21,
+ 0x22930a4b,
+ 0x22934a4c,
+ 0x22940a4d,
+ 0x22944a50,
+ 0x22950a51,
+ 0x22954a54,
0x22958a55,
- 0x2960a56,
- 0x29a4a58,
- 0x229c4a69,
- 0x229c8a71,
+ 0x2295ca56,
+ 0x22960a57,
+ 0x22964a58,
+ 0x22970a59,
+ 0x22974a5c,
+ 0x22980a5d,
+ 0x22984a60,
+ 0x22988a61,
+ 0x2298ca62,
+ 0x22998a63,
+ 0x2299ca66,
+ 0x229a8a67,
+ 0x229aca6a,
+ 0x229b0a6b,
+ 0x229b4a6c,
+ 0x29b8a6d,
+ 0x229bca6e,
+ 0x229c8a6f,
0x229cca72,
- 0x229d0a73,
- 0x29d4a74,
- 0x229d8a75,
- 0x229dca76,
- 0x29e4a77,
- 0x29e8a79,
- 0x29eca7a,
- 0x2a08a7b,
- 0x2a20a82,
- 0x2a24a88,
- 0x2a34a89,
- 0x2a40a8d,
- 0x2a74a90,
- 0x2a78a9d,
- 0x2a90a9e,
- 0x22a98aa4,
- 0x22a9caa6,
- 0x22aa4aa7,
- 0x2b94aa9,
- 0x22b98ae5,
- 0x2ba0ae6,
- 0x2ba4ae8,
- 0x22ba8ae9,
- 0x2bacaea,
- 0x2bb0aeb,
- 0x2bc8aec,
- 0x2bdcaf2,
- 0x2c04af7,
- 0x2c24b01,
- 0x2c28b09,
- 0x62c2cb0a,
- 0x2c5cb0b,
- 0x2c60b17,
- 0x2c88b18,
- 0x2c8cb22,
- 0x2cb0b23,
- 0x2cb4b2c,
- 0x2cc8b2d,
- 0x2cccb32,
- 0x2cd0b33,
- 0x2cf0b34,
- 0x2d0cb3c,
- 0x2d10b43,
- 0x22d14b44,
- 0x2d18b45,
- 0x2d1cb46,
- 0x2d20b47,
- 0x2d30b48,
- 0x2d34b4c,
- 0x2d38b4d,
- 0x2db0b4e,
- 0x2db4b6c,
+ 0x29d4a73,
+ 0x2a18a75,
+ 0x22a38a86,
+ 0x22a3ca8e,
+ 0x22a40a8f,
+ 0x22a48a90,
+ 0x22a4ca92,
+ 0x2a50a93,
+ 0x22a54a94,
+ 0x22a58a95,
+ 0x22a5ca96,
+ 0x2a64a97,
+ 0x2a68a99,
+ 0x2a6ca9a,
+ 0x2a88a9b,
+ 0x2aa0aa2,
+ 0x2aa4aa8,
+ 0x2ab4aa9,
+ 0x2ac0aad,
+ 0x2af4ab0,
+ 0x2af8abd,
+ 0x2b10abe,
+ 0x22b18ac4,
+ 0x22b1cac6,
+ 0x22b24ac7,
+ 0x2c14ac9,
+ 0x22c18b05,
+ 0x2c20b06,
+ 0x2c24b08,
+ 0x22c28b09,
+ 0x2c2cb0a,
+ 0x2c3cb0b,
+ 0x2c40b0f,
+ 0x2c44b10,
+ 0x2c48b11,
+ 0x2c60b12,
+ 0x2c74b18,
+ 0x2c9cb1d,
+ 0x2cbcb27,
+ 0x2cc0b2f,
+ 0x62cc4b30,
+ 0x2cf4b31,
+ 0x2cf8b3d,
+ 0x22cfcb3e,
+ 0x2d00b3f,
+ 0x2d28b40,
+ 0x2d2cb4a,
+ 0x2d50b4b,
+ 0x2d54b54,
+ 0x2d68b55,
+ 0x2d6cb5a,
+ 0x2d70b5b,
+ 0x2d90b5c,
+ 0x2dacb64,
+ 0x2db0b6b,
+ 0x22db4b6c,
0x2db8b6d,
- 0x2dd8b6e,
- 0x2de8b76,
- 0x2dfcb7a,
- 0x2e14b7f,
- 0x2e2cb85,
- 0x2e44b8b,
- 0x2e48b91,
- 0x2e60b92,
- 0x2e7cb98,
- 0x2e9cb9f,
- 0x2ebcba7,
- 0x2ed8baf,
- 0x2f38bb6,
- 0x2f54bce,
- 0x2f64bd5,
- 0x2f68bd9,
- 0x2f7cbda,
- 0x2fc0bdf,
- 0x3040bf0,
- 0x3074c10,
- 0x3078c1d,
- 0x3084c1e,
- 0x30a4c21,
- 0x30a8c29,
- 0x30ccc2a,
- 0x30d4c33,
- 0x3110c35,
- 0x3160c44,
- 0x3164c58,
- 0x3200c59,
- 0x3204c80,
- 0x23208c81,
- 0x2320cc82,
- 0x23210c83,
- 0x23220c84,
- 0x23224c88,
- 0x23228c89,
- 0x2322cc8a,
- 0x23230c8b,
- 0x3248c8c,
- 0x326cc92,
- 0x328cc9b,
- 0x38f4ca3,
- 0x3900e3d,
- 0x3920e40,
- 0x3adce48,
- 0x3baceb7,
- 0x3c1ceeb,
- 0x3c74f07,
- 0x3d5cf1d,
- 0x3db4f57,
- 0x3df0f6d,
- 0x3eecf7c,
- 0x3fb8fbb,
- 0x4050fee,
- 0x40e1014,
- 0x4145038,
- 0x437d051,
- 0x44350df,
- 0x450110d,
- 0x454d140,
- 0x45d5153,
- 0x4611175,
- 0x4661184,
- 0x46d9198,
- 0x646dd1b6,
- 0x646e11b7,
- 0x646e51b8,
- 0x47611b9,
- 0x47bd1d8,
- 0x48391ef,
- 0x48b120e,
- 0x493122c,
- 0x499d24c,
- 0x4ac9267,
- 0x4b212b2,
- 0x64b252c8,
- 0x4bbd2c9,
- 0x4c452ef,
- 0x4c91311,
- 0x4cf9324,
- 0x4da133e,
- 0x4e69368,
- 0x4ed139a,
- 0x4fe53b4,
- 0x64fe93f9,
- 0x64fed3fa,
- 0x50493fb,
- 0x50a5412,
- 0x5135429,
- 0x51b144d,
- 0x51f546c,
- 0x52d947d,
- 0x530d4b6,
- 0x536d4c3,
- 0x53e14db,
- 0x54694f8,
- 0x54a951a,
- 0x551952a,
- 0x6551d546,
- 0x5545547,
- 0x5549551,
- 0x5561552,
- 0x557d558,
- 0x55c155f,
- 0x55d1570,
- 0x55e9574,
- 0x566157a,
- 0x5669598,
- 0x568559a,
- 0x56995a1,
- 0x56b55a6,
- 0x56e15ad,
- 0x56e55b8,
- 0x56ed5b9,
- 0x57015bb,
- 0x57215c0,
- 0x572d5c8,
- 0x57355cb,
- 0x57715cd,
- 0x57855dc,
- 0x57a95e1,
- 0x57b55ea,
- 0x57bd5ed,
- 0x57e15ef,
- 0x58055f8,
- 0x581d601,
- 0x5821607,
- 0x5829608,
- 0x582d60a,
- 0x58c160b,
- 0x58c5630,
- 0x58c9631,
- 0x58ed632,
- 0x591163b,
- 0x592d644,
- 0x594164b,
- 0x5955650,
- 0x595d655,
- 0x5965657,
- 0x5979659,
- 0x598965e,
- 0x598d662,
- 0x59a9663,
- 0x623966a,
- 0x627188e,
- 0x629d89c,
- 0x62b98a7,
- 0x62d98ae,
- 0x62f98b6,
- 0x633d8be,
- 0x63458cf,
- 0x263498d1,
- 0x2634d8d2,
- 0x63558d3,
- 0x65098d5,
- 0x2650d942,
- 0x2651d943,
- 0x26525947,
- 0x26531949,
- 0x653594c,
- 0x653d94d,
- 0x656594f,
- 0x658d959,
- 0x6591963,
- 0x65c9964,
- 0x65e5972,
- 0x713d979,
- 0x7141c4f,
- 0x7145c50,
- 0x27149c51,
- 0x714dc52,
- 0x27151c53,
- 0x7155c54,
- 0x27161c55,
- 0x7165c58,
- 0x7169c59,
- 0x2716dc5a,
- 0x7171c5b,
- 0x27179c5c,
- 0x717dc5e,
- 0x7181c5f,
- 0x27191c60,
- 0x7195c64,
- 0x7199c65,
- 0x719dc66,
- 0x71a1c67,
- 0x271a5c68,
- 0x71a9c69,
- 0x71adc6a,
- 0x71b1c6b,
- 0x71b5c6c,
- 0x271bdc6d,
- 0x71c1c6f,
- 0x71c5c70,
- 0x71c9c71,
- 0x271cdc72,
- 0x71d1c73,
- 0x271d9c74,
- 0x271ddc76,
- 0x71f9c77,
- 0x7209c7e,
- 0x724dc82,
- 0x7251c93,
- 0x7275c94,
- 0x7279c9d,
- 0x727dc9e,
- 0x742dc9f,
- 0x27431d0b,
- 0x27439d0c,
- 0x2743dd0e,
- 0x27441d0f,
- 0x7449d10,
- 0x7525d12,
- 0x27531d49,
- 0x27535d4c,
- 0x27539d4d,
- 0x2753dd4e,
- 0x7541d4f,
- 0x756dd50,
- 0x7571d5b,
- 0x7595d5c,
- 0x75a1d65,
- 0x75c1d68,
- 0x75c5d70,
- 0x75fdd71,
- 0x78add7f,
- 0x7969e2b,
- 0x796de5a,
- 0x7971e5b,
- 0x7985e5c,
- 0x79b9e61,
- 0x79f1e6e,
- 0x279f5e7c,
- 0x7a11e7d,
- 0x7a39e84,
- 0x7a3de8e,
- 0x7a61e8f,
- 0x7a7de98,
- 0x7aa5e9f,
- 0x7ab5ea9,
- 0x7ab9ead,
- 0x7abdeae,
- 0x7af5eaf,
- 0x7b01ebd,
- 0x7b25ec0,
- 0x7ba5ec9,
- 0x27ba9ee9,
- 0x7bb9eea,
- 0x7bc1eee,
- 0x7be5ef0,
- 0x7c05ef9,
- 0x7c19f01,
- 0x7c2df06,
+ 0x2dbcb6e,
+ 0x2dc0b6f,
+ 0x2dc8b70,
+ 0x2ddcb72,
+ 0x2de0b77,
+ 0x2de4b78,
+ 0x2de8b79,
+ 0x2e58b7a,
+ 0x2e5cb96,
+ 0x2e60b97,
+ 0x2e80b98,
+ 0x2e94ba0,
+ 0x2ea8ba5,
+ 0x2ec0baa,
+ 0x2edcbb0,
+ 0x2ef4bb7,
+ 0x2ef8bbd,
+ 0x2f10bbe,
+ 0x2f2cbc4,
+ 0x2f30bcb,
+ 0x2f50bcc,
+ 0x2f70bd4,
+ 0x2f8cbdc,
+ 0x2fecbe3,
+ 0x3008bfb,
+ 0x3018c02,
+ 0x301cc06,
+ 0x3034c07,
+ 0x3078c0d,
+ 0x30f8c1e,
+ 0x312cc3e,
+ 0x3130c4b,
+ 0x313cc4c,
+ 0x315cc4f,
+ 0x3160c57,
+ 0x3184c58,
+ 0x318cc61,
+ 0x31c8c63,
+ 0x3218c72,
+ 0x321cc86,
+ 0x3220c87,
+ 0x32e4c88,
+ 0x232e8cb9,
+ 0x232eccba,
+ 0x32f0cbb,
+ 0x232f4cbc,
+ 0x232f8cbd,
+ 0x232fccbe,
+ 0x2330ccbf,
+ 0x23310cc3,
+ 0x23314cc4,
+ 0x23318cc5,
+ 0x2331ccc6,
+ 0x3334cc7,
+ 0x3358ccd,
+ 0x3378cd6,
+ 0x39e4cde,
+ 0x39f0e79,
+ 0x3a10e7c,
+ 0x3bd0e84,
+ 0x3ca0ef4,
+ 0x3d10f28,
+ 0x3d68f44,
+ 0x3e50f5a,
+ 0x3ea8f94,
+ 0x3ee4faa,
+ 0x3fe0fb9,
+ 0x40acff8,
+ 0x414502b,
+ 0x41d5051,
+ 0x4239075,
+ 0x447108e,
+ 0x452911c,
+ 0x45f514a,
+ 0x464117d,
+ 0x46c9190,
+ 0x47051b2,
+ 0x47551c1,
+ 0x47cd1d5,
+ 0x647d11f3,
+ 0x647d51f4,
+ 0x647d91f5,
+ 0x48551f6,
+ 0x48b1215,
+ 0x492d22c,
+ 0x49a524b,
+ 0x4a25269,
+ 0x4a91289,
+ 0x4bbd2a4,
+ 0x4c152ef,
+ 0x64c19305,
+ 0x4cb1306,
+ 0x4cb532c,
+ 0x4d3d32d,
+ 0x4d8934f,
+ 0x4df1362,
+ 0x4e9937c,
+ 0x4f613a6,
+ 0x4fc93d8,
+ 0x50dd3f2,
+ 0x650e1437,
+ 0x650e5438,
+ 0x5141439,
+ 0x519d450,
+ 0x522d467,
+ 0x52a948b,
+ 0x52ed4aa,
+ 0x53d14bb,
+ 0x54054f4,
+ 0x5465501,
+ 0x54d9519,
+ 0x5561536,
+ 0x55a1558,
+ 0x5611568,
+ 0x65615584,
+ 0x563d585,
+ 0x564158f,
+ 0x5659590,
+ 0x5675596,
+ 0x56b959d,
+ 0x56c95ae,
+ 0x56e15b2,
+ 0x57595b8,
+ 0x57615d6,
+ 0x577d5d8,
+ 0x57915df,
+ 0x57ad5e4,
+ 0x57d95eb,
+ 0x57dd5f6,
+ 0x57e55f7,
+ 0x57f95f9,
+ 0x58195fe,
+ 0x5829606,
+ 0x583560a,
+ 0x587160d,
+ 0x587961c,
+ 0x588d61e,
+ 0x58b1623,
+ 0x58bd62c,
+ 0x58c562f,
+ 0x58e9631,
+ 0x590d63a,
+ 0x5925643,
+ 0x5929649,
+ 0x593164a,
+ 0x593564c,
+ 0x59d164d,
+ 0x59d5674,
+ 0x59d9675,
+ 0x59dd676,
+ 0x5a01677,
+ 0x5a25680,
+ 0x5a41689,
+ 0x5a55690,
+ 0x5a69695,
+ 0x5a7169a,
+ 0x5a7969c,
+ 0x5a8169e,
+ 0x5a996a0,
+ 0x5aa96a6,
+ 0x5aad6aa,
+ 0x5ac96ab,
+ 0x63596b2,
+ 0x63918d6,
+ 0x63bd8e4,
+ 0x63d98ef,
+ 0x63f98f6,
+ 0x64198fe,
+ 0x645d906,
+ 0x6465917,
+ 0x26469919,
+ 0x2646d91a,
+ 0x647591b,
+ 0x663d91d,
+ 0x2664198f,
+ 0x26651990,
+ 0x26659994,
+ 0x26665996,
+ 0x6669999,
+ 0x2667199a,
+ 0x668199c,
+ 0x66a99a0,
+ 0x66dd9aa,
+ 0x66e19b7,
+ 0x67199b8,
+ 0x67399c6,
+ 0x72919ce,
+ 0x7295ca4,
+ 0x7299ca5,
+ 0x2729dca6,
+ 0x72a1ca7,
+ 0x272a5ca8,
+ 0x72a9ca9,
+ 0x272b5caa,
+ 0x72b9cad,
+ 0x72bdcae,
+ 0x272c1caf,
+ 0x72c5cb0,
+ 0x272cdcb1,
+ 0x72d1cb3,
+ 0x72d5cb4,
+ 0x272e5cb5,
+ 0x72e9cb9,
+ 0x72edcba,
+ 0x72f1cbb,
+ 0x72f5cbc,
+ 0x272f9cbd,
+ 0x72fdcbe,
+ 0x7301cbf,
+ 0x7305cc0,
+ 0x7309cc1,
+ 0x27311cc2,
+ 0x7315cc4,
+ 0x7319cc5,
+ 0x731dcc6,
+ 0x27321cc7,
+ 0x7325cc8,
+ 0x2732dcc9,
+ 0x27331ccb,
+ 0x734dccc,
+ 0x7365cd3,
+ 0x27369cd9,
+ 0x73adcda,
+ 0x73b1ceb,
+ 0x73d5cec,
+ 0x73e1cf5,
+ 0x73e5cf8,
+ 0x73e9cf9,
+ 0x759dcfa,
+ 0x275a1d67,
+ 0x275a9d68,
+ 0x275add6a,
+ 0x275b1d6b,
+ 0x75b9d6c,
+ 0x7695d6e,
+ 0x276a1da5,
+ 0x276a5da8,
+ 0x276a9da9,
+ 0x276addaa,
+ 0x76b1dab,
+ 0x76dddac,
+ 0x76e1db7,
+ 0x76e5db8,
+ 0x7709db9,
+ 0x7715dc2,
+ 0x7735dc5,
+ 0x7739dcd,
+ 0x7771dce,
+ 0x7a21ddc,
+ 0x7adde88,
+ 0x7ae1eb7,
+ 0x7ae5eb8,
+ 0x7af9eb9,
+ 0x7b2debe,
+ 0x7b65ecb,
+ 0x27b69ed9,
+ 0x7b85eda,
+ 0x7badee1,
+ 0x7bb1eeb,
+ 0x7bd5eec,
+ 0x7bf1ef5,
+ 0x7c19efc,
+ 0x7c29f06,
+ 0x7c2df0a,
0x7c31f0b,
- 0x7c51f0c,
- 0x7cf5f14,
- 0x7d11f3d,
- 0x7d35f44,
- 0x7d39f4d,
- 0x7d41f4e,
- 0x7d51f50,
- 0x7d59f54,
- 0x7d6df56,
- 0x7d8df5b,
- 0x7d99f63,
- 0x7da5f66,
- 0x7dddf69,
- 0x7eb1f77,
- 0x7eb5fac,
- 0x7ec9fad,
- 0x7ed1fb2,
- 0x7ee9fb4,
- 0x7eedfba,
- 0x7ef9fbb,
- 0x7efdfbe,
- 0x7f01fbf,
- 0x7f25fc0,
- 0x7f65fc9,
- 0x7f69fd9,
- 0x7f89fda,
- 0x7fd9fe2,
- 0x7ff5ff6,
- 0x7ffdffd,
- 0x8051fff,
- 0x8056014,
- 0x805a015,
- 0x805e016,
- 0x80a2017,
- 0x80b2028,
+ 0x7c69f0c,
+ 0x7c75f1a,
+ 0x7c9df1d,
+ 0x7d1df27,
+ 0x27d21f47,
+ 0x7d31f48,
+ 0x7d3df4c,
+ 0x7d59f4f,
+ 0x7d79f56,
+ 0x7d7df5e,
+ 0x7d91f5f,
+ 0x7da5f64,
+ 0x7da9f69,
+ 0x7dc9f6a,
+ 0x7e71f72,
+ 0x7e75f9c,
+ 0x7e91f9d,
+ 0x7eb5fa4,
+ 0x7eb9fad,
+ 0x7ec1fae,
+ 0x7ed9fb0,
+ 0x7ee1fb6,
+ 0x7ef5fb8,
+ 0x7f15fbd,
+ 0x7f25fc5,
+ 0x7f31fc9,
+ 0x7f69fcc,
+ 0x803dfda,
+ 0x804200f,
+ 0x8056010,
+ 0x805e015,
+ 0x8076017,
+ 0x807a01d,
+ 0x808601e,
+ 0x808a021,
+ 0x808e022,
+ 0x80b2023,
0x80f202c,
0x80f603c,
- 0x812603d,
- 0x826e049,
- 0x829609b,
- 0x82c60a5,
- 0x82e60b1,
- 0x282ee0b9,
- 0x82f60bb,
- 0x83020bd,
- 0x84160c0,
- 0x8422105,
- 0x842e108,
- 0x843a10b,
- 0x844610e,
- 0x8452111,
- 0x845e114,
- 0x846a117,
- 0x847611a,
- 0x848211d,
- 0x848e120,
- 0x849a123,
- 0x84a6126,
- 0x84b2129,
- 0x84ba12c,
- 0x84c612e,
- 0x84d2131,
- 0x84de134,
- 0x84ea137,
- 0x84f613a,
- 0x850213d,
- 0x850e140,
- 0x851a143,
- 0x8526146,
- 0x8532149,
- 0x853e14c,
- 0x856a14f,
- 0x857615a,
- 0x858215d,
- 0x858e160,
- 0x859a163,
- 0x85a6166,
- 0x85ae169,
- 0x85ba16b,
- 0x85c616e,
- 0x85d2171,
- 0x85de174,
- 0x85ea177,
- 0x85f617a,
- 0x860217d,
- 0x860e180,
- 0x861a183,
- 0x8626186,
- 0x8632189,
- 0x863e18c,
- 0x864a18f,
- 0x8652192,
- 0x865e194,
- 0x866a197,
- 0x867619a,
- 0x868219d,
- 0x868e1a0,
- 0x869a1a3,
- 0x86a61a6,
- 0x86b21a9,
- 0x86b61ac,
+ 0x811603d,
+ 0x8166045,
+ 0x8182059,
+ 0x818a060,
+ 0x81e2062,
+ 0x81e6078,
+ 0x81ea079,
+ 0x81ee07a,
+ 0x823207b,
+ 0x824208c,
+ 0x8282090,
+ 0x82860a0,
+ 0x82b60a1,
+ 0x83fe0ad,
+ 0x84260ff,
+ 0x8456109,
+ 0x8476115,
+ 0x2847e11d,
+ 0x848611f,
+ 0x8492121,
+ 0x85a6124,
+ 0x85b2169,
+ 0x85be16c,
+ 0x85ca16f,
+ 0x85d6172,
+ 0x85e2175,
+ 0x85ee178,
+ 0x85fa17b,
+ 0x860617e,
+ 0x8612181,
+ 0x861e184,
+ 0x862a187,
+ 0x863618a,
+ 0x864218d,
+ 0x864a190,
+ 0x8656192,
+ 0x8662195,
+ 0x866e198,
+ 0x867a19b,
+ 0x868619e,
+ 0x86921a1,
+ 0x869e1a4,
+ 0x86aa1a7,
+ 0x86b61aa,
0x86c21ad,
- 0x86de1b0,
- 0x86e21b7,
- 0x86f21b8,
- 0x870e1bc,
- 0x87521c3,
- 0x87561d4,
- 0x876a1d5,
- 0x879e1da,
- 0x87ae1e7,
- 0x87d21eb,
- 0x87ea1f4,
- 0x88021fa,
- 0x881a200,
- 0x882e206,
- 0x2887220b,
- 0x887621c,
- 0x88a221d,
- 0x88aa228,
- 0x88be22a,
+ 0x86ce1b0,
+ 0x86fa1b3,
+ 0x87061be,
+ 0x87121c1,
+ 0x871e1c4,
+ 0x872a1c7,
+ 0x87361ca,
+ 0x873e1cd,
+ 0x874a1cf,
+ 0x87561d2,
+ 0x87621d5,
+ 0x876e1d8,
+ 0x877a1db,
+ 0x87861de,
+ 0x87921e1,
+ 0x879e1e4,
+ 0x87aa1e7,
+ 0x87b61ea,
+ 0x87c21ed,
+ 0x87ce1f0,
+ 0x87da1f3,
+ 0x87e21f6,
+ 0x87ee1f8,
+ 0x87fa1fb,
+ 0x88061fe,
+ 0x8812201,
+ 0x881e204,
+ 0x882a207,
+ 0x883620a,
+ 0x884220d,
+ 0x8846210,
+ 0x8852211,
+ 0x886e214,
+ 0x887221b,
+ 0x888221c,
+ 0x889e220,
+ 0x88e2227,
+ 0x88e6238,
+ 0x88fa239,
+ 0x892e23e,
+ 0x893e24b,
+ 0x894624f,
+ 0x896a251,
+ 0x898225a,
+ 0x899a260,
+ 0x89b2266,
+ 0x89c626c,
+ 0x28a0a271,
+ 0x8a0e282,
+ 0x8a3a283,
+ 0x8a4628e,
+ 0x8a5a291,
}
-// max children 536 (capacity 1023)
-// max text offset 30294 (capacity 32767)
+// max children 563 (capacity 1023)
+// max text offset 30521 (capacity 32767)
// max text length 36 (capacity 63)
-// max hi 8751 (capacity 16383)
-// max lo 8746 (capacity 16383)
+// max hi 8854 (capacity 16383)
+// max lo 8849 (capacity 16383)
diff --git a/vendor/golang.org/x/sys/cpu/byteorder.go b/vendor/golang.org/x/sys/cpu/byteorder.go
index da6b9e4363..ed8da8deac 100644
--- a/vendor/golang.org/x/sys/cpu/byteorder.go
+++ b/vendor/golang.org/x/sys/cpu/byteorder.go
@@ -5,26 +5,56 @@
package cpu
import (
- "encoding/binary"
"runtime"
)
+// byteOrder is a subset of encoding/binary.ByteOrder.
+type byteOrder interface {
+ Uint32([]byte) uint32
+ Uint64([]byte) uint64
+}
+
+type littleEndian struct{}
+type bigEndian struct{}
+
+func (littleEndian) Uint32(b []byte) uint32 {
+ _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
+}
+
+func (littleEndian) Uint64(b []byte) uint64 {
+ _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
+ uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
+}
+
+func (bigEndian) Uint32(b []byte) uint32 {
+ _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
+}
+
+func (bigEndian) Uint64(b []byte) uint64 {
+ _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
+ uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
+}
+
// hostByteOrder returns binary.LittleEndian on little-endian machines and
// binary.BigEndian on big-endian machines.
-func hostByteOrder() binary.ByteOrder {
+func hostByteOrder() byteOrder {
switch runtime.GOARCH {
case "386", "amd64", "amd64p32",
"arm", "arm64",
"mipsle", "mips64le", "mips64p32le",
"ppc64le",
"riscv", "riscv64":
- return binary.LittleEndian
+ return littleEndian{}
case "armbe", "arm64be",
"mips", "mips64", "mips64p32",
"ppc", "ppc64",
"s390", "s390x",
"sparc", "sparc64":
- return binary.BigEndian
+ return bigEndian{}
}
panic("unknown architecture")
}
diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go
index 679e78c2ce..b4e6ecb2dc 100644
--- a/vendor/golang.org/x/sys/cpu/cpu.go
+++ b/vendor/golang.org/x/sys/cpu/cpu.go
@@ -78,6 +78,42 @@ var ARM64 struct {
_ CacheLinePad
}
+// ARM contains the supported CPU features of the current ARM (32-bit) platform.
+// All feature flags are false if:
+// 1. the current platform is not arm, or
+// 2. the current operating system is not Linux.
+var ARM struct {
+ _ CacheLinePad
+ HasSWP bool // SWP instruction support
+ HasHALF bool // Half-word load and store support
+ HasTHUMB bool // ARM Thumb instruction set
+ Has26BIT bool // Address space limited to 26-bits
+ HasFASTMUL bool // 32-bit operand, 64-bit result multiplication support
+ HasFPA bool // Floating point arithmetic support
+ HasVFP bool // Vector floating point support
+ HasEDSP bool // DSP Extensions support
+ HasJAVA bool // Java instruction set
+ HasIWMMXT bool // Intel Wireless MMX technology support
+ HasCRUNCH bool // MaverickCrunch context switching and handling
+ HasTHUMBEE bool // Thumb EE instruction set
+ HasNEON bool // NEON instruction set
+ HasVFPv3 bool // Vector floating point version 3 support
+ HasVFPv3D16 bool // Vector floating point version 3 D8-D15
+ HasTLS bool // Thread local storage support
+ HasVFPv4 bool // Vector floating point version 4 support
+ HasIDIVA bool // Integer divide instruction support in ARM mode
+ HasIDIVT bool // Integer divide instruction support in Thumb mode
+ HasVFPD32 bool // Vector floating point version 3 D15-D31
+ HasLPAE bool // Large Physical Address Extensions
+ HasEVTSTRM bool // Event stream support
+ HasAES bool // AES hardware implementation
+ HasPMULL bool // Polynomial multiplication instruction set
+ HasSHA1 bool // SHA1 hardware implementation
+ HasSHA2 bool // SHA2 hardware implementation
+ HasCRC32 bool // CRC32 hardware implementation
+ _ CacheLinePad
+}
+
// PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms.
// If the current platform is not ppc64/ppc64le then all feature flags are false.
//
diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm.go b/vendor/golang.org/x/sys/cpu/cpu_arm.go
index 7f2348b7d4..981af6818c 100644
--- a/vendor/golang.org/x/sys/cpu/cpu_arm.go
+++ b/vendor/golang.org/x/sys/cpu/cpu_arm.go
@@ -6,4 +6,35 @@ package cpu
const cacheLineSize = 32
-func doinit() {}
+// HWCAP/HWCAP2 bits.
+// These are specific to Linux.
+const (
+ hwcap_SWP = 1 << 0
+ hwcap_HALF = 1 << 1
+ hwcap_THUMB = 1 << 2
+ hwcap_26BIT = 1 << 3
+ hwcap_FAST_MULT = 1 << 4
+ hwcap_FPA = 1 << 5
+ hwcap_VFP = 1 << 6
+ hwcap_EDSP = 1 << 7
+ hwcap_JAVA = 1 << 8
+ hwcap_IWMMXT = 1 << 9
+ hwcap_CRUNCH = 1 << 10
+ hwcap_THUMBEE = 1 << 11
+ hwcap_NEON = 1 << 12
+ hwcap_VFPv3 = 1 << 13
+ hwcap_VFPv3D16 = 1 << 14
+ hwcap_TLS = 1 << 15
+ hwcap_VFPv4 = 1 << 16
+ hwcap_IDIVA = 1 << 17
+ hwcap_IDIVT = 1 << 18
+ hwcap_VFPD32 = 1 << 19
+ hwcap_LPAE = 1 << 20
+ hwcap_EVTSTRM = 1 << 21
+
+ hwcap2_AES = 1 << 0
+ hwcap2_PMULL = 1 << 1
+ hwcap2_SHA1 = 1 << 2
+ hwcap2_SHA2 = 1 << 3
+ hwcap2_CRC32 = 1 << 4
+)
diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux.go b/vendor/golang.org/x/sys/cpu/cpu_linux.go
index 76b5f507fa..10e712dc5d 100644
--- a/vendor/golang.org/x/sys/cpu/cpu_linux.go
+++ b/vendor/golang.org/x/sys/cpu/cpu_linux.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//+build !amd64,!amd64p32,!386
+// +build !amd64,!amd64p32,!386
package cpu
diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go
new file mode 100644
index 0000000000..2057006dce
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go
@@ -0,0 +1,39 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+func doinit() {
+ ARM.HasSWP = isSet(hwCap, hwcap_SWP)
+ ARM.HasHALF = isSet(hwCap, hwcap_HALF)
+ ARM.HasTHUMB = isSet(hwCap, hwcap_THUMB)
+ ARM.Has26BIT = isSet(hwCap, hwcap_26BIT)
+ ARM.HasFASTMUL = isSet(hwCap, hwcap_FAST_MULT)
+ ARM.HasFPA = isSet(hwCap, hwcap_FPA)
+ ARM.HasVFP = isSet(hwCap, hwcap_VFP)
+ ARM.HasEDSP = isSet(hwCap, hwcap_EDSP)
+ ARM.HasJAVA = isSet(hwCap, hwcap_JAVA)
+ ARM.HasIWMMXT = isSet(hwCap, hwcap_IWMMXT)
+ ARM.HasCRUNCH = isSet(hwCap, hwcap_CRUNCH)
+ ARM.HasTHUMBEE = isSet(hwCap, hwcap_THUMBEE)
+ ARM.HasNEON = isSet(hwCap, hwcap_NEON)
+ ARM.HasVFPv3 = isSet(hwCap, hwcap_VFPv3)
+ ARM.HasVFPv3D16 = isSet(hwCap, hwcap_VFPv3D16)
+ ARM.HasTLS = isSet(hwCap, hwcap_TLS)
+ ARM.HasVFPv4 = isSet(hwCap, hwcap_VFPv4)
+ ARM.HasIDIVA = isSet(hwCap, hwcap_IDIVA)
+ ARM.HasIDIVT = isSet(hwCap, hwcap_IDIVT)
+ ARM.HasVFPD32 = isSet(hwCap, hwcap_VFPD32)
+ ARM.HasLPAE = isSet(hwCap, hwcap_LPAE)
+ ARM.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM)
+ ARM.HasAES = isSet(hwCap2, hwcap2_AES)
+ ARM.HasPMULL = isSet(hwCap2, hwcap2_PMULL)
+ ARM.HasSHA1 = isSet(hwCap2, hwcap2_SHA1)
+ ARM.HasSHA2 = isSet(hwCap2, hwcap2_SHA2)
+ ARM.HasCRC32 = isSet(hwCap2, hwcap2_CRC32)
+}
+
+func isSet(hwc uint, value uint) bool {
+ return hwc&value != 0
+}
diff --git a/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/golang.org/x/sys/unix/affinity_linux.go
index 72afe3338c..6e5c81acd0 100644
--- a/vendor/golang.org/x/sys/unix/affinity_linux.go
+++ b/vendor/golang.org/x/sys/unix/affinity_linux.go
@@ -7,6 +7,7 @@
package unix
import (
+ "math/bits"
"unsafe"
)
@@ -79,46 +80,7 @@ func (s *CPUSet) IsSet(cpu int) bool {
func (s *CPUSet) Count() int {
c := 0
for _, b := range s {
- c += onesCount64(uint64(b))
+ c += bits.OnesCount64(uint64(b))
}
return c
}
-
-// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64.
-// Once this package can require Go 1.9, we can delete this
-// and update the caller to use bits.OnesCount64.
-func onesCount64(x uint64) int {
- const m0 = 0x5555555555555555 // 01010101 ...
- const m1 = 0x3333333333333333 // 00110011 ...
- const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ...
- const m3 = 0x00ff00ff00ff00ff // etc.
- const m4 = 0x0000ffff0000ffff
-
- // Implementation: Parallel summing of adjacent bits.
- // See "Hacker's Delight", Chap. 5: Counting Bits.
- // The following pattern shows the general approach:
- //
- // x = x>>1&(m0&m) + x&(m0&m)
- // x = x>>2&(m1&m) + x&(m1&m)
- // x = x>>4&(m2&m) + x&(m2&m)
- // x = x>>8&(m3&m) + x&(m3&m)
- // x = x>>16&(m4&m) + x&(m4&m)
- // x = x>>32&(m5&m) + x&(m5&m)
- // return int(x)
- //
- // Masking (& operations) can be left away when there's no
- // danger that a field's sum will carry over into the next
- // field: Since the result cannot be > 64, 8 bits is enough
- // and we can ignore the masks for the shifts by 8 and up.
- // Per "Hacker's Delight", the first line can be simplified
- // more, but it saves at best one instruction, so we leave
- // it alone for clarity.
- const m = 1<<64 - 1
- x = x>>1&(m0&m) + x&(m0&m)
- x = x>>2&(m1&m) + x&(m1&m)
- x = (x>>4 + x) & (m2 & m)
- x += x >> 8
- x += x >> 16
- x += x >> 32
- return int(x) & (1<<7 - 1)
-}
diff --git a/vendor/golang.org/x/sys/unix/dirent.go b/vendor/golang.org/x/sys/unix/dirent.go
index 4407c505a3..304016b688 100644
--- a/vendor/golang.org/x/sys/unix/dirent.go
+++ b/vendor/golang.org/x/sys/unix/dirent.go
@@ -2,16 +2,101 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
package unix
-import "syscall"
+import "unsafe"
+
+// readInt returns the size-bytes unsigned integer in native byte order at offset off.
+func readInt(b []byte, off, size uintptr) (u uint64, ok bool) {
+ if len(b) < int(off+size) {
+ return 0, false
+ }
+ if isBigEndian {
+ return readIntBE(b[off:], size), true
+ }
+ return readIntLE(b[off:], size), true
+}
+
+func readIntBE(b []byte, size uintptr) uint64 {
+ switch size {
+ case 1:
+ return uint64(b[0])
+ case 2:
+ _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[1]) | uint64(b[0])<<8
+ case 4:
+ _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24
+ case 8:
+ _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
+ uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
+ default:
+ panic("syscall: readInt with unsupported size")
+ }
+}
+
+func readIntLE(b []byte, size uintptr) uint64 {
+ switch size {
+ case 1:
+ return uint64(b[0])
+ case 2:
+ _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[0]) | uint64(b[1])<<8
+ case 4:
+ _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24
+ case 8:
+ _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
+ return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
+ uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
+ default:
+ panic("syscall: readInt with unsupported size")
+ }
+}
// ParseDirent parses up to max directory entries in buf,
// appending the names to names. It returns the number of
// bytes consumed from buf, the number of entries added
// to names, and the new names slice.
func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {
- return syscall.ParseDirent(buf, max, names)
+ origlen := len(buf)
+ count = 0
+ for max != 0 && len(buf) > 0 {
+ reclen, ok := direntReclen(buf)
+ if !ok || reclen > uint64(len(buf)) {
+ return origlen, count, names
+ }
+ rec := buf[:reclen]
+ buf = buf[reclen:]
+ ino, ok := direntIno(rec)
+ if !ok {
+ break
+ }
+ if ino == 0 { // File absent in directory.
+ continue
+ }
+ const namoff = uint64(unsafe.Offsetof(Dirent{}.Name))
+ namlen, ok := direntNamlen(rec)
+ if !ok || namoff+namlen > uint64(len(rec)) {
+ break
+ }
+ name := rec[namoff : namoff+namlen]
+ for i, c := range name {
+ if c == 0 {
+ name = name[:i]
+ break
+ }
+ }
+ // Check for useless names before allocating a string.
+ if string(name) == "." || string(name) == ".." {
+ continue
+ }
+ max--
+ count++
+ names = append(names, string(name))
+ }
+ return origlen - len(buf), count, names
}
diff --git a/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/golang.org/x/sys/unix/endian_little.go
index 085df2d8dd..bcdb5d30eb 100644
--- a/vendor/golang.org/x/sys/unix/endian_little.go
+++ b/vendor/golang.org/x/sys/unix/endian_little.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
-// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le
+// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le riscv64
package unix
diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go
index f121a8d64b..3559e5dcb2 100644
--- a/vendor/golang.org/x/sys/unix/ioctl.go
+++ b/vendor/golang.org/x/sys/unix/ioctl.go
@@ -6,7 +6,19 @@
package unix
-import "runtime"
+import (
+ "runtime"
+ "unsafe"
+)
+
+// ioctl itself should not be exposed directly, but additional get/set
+// functions for specific types are permissible.
+
+// IoctlSetInt performs an ioctl operation which sets an integer value
+// on fd, using the specified request number.
+func IoctlSetInt(fd int, req uint, value int) error {
+ return ioctl(fd, req, uintptr(value))
+}
// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument.
//
@@ -14,7 +26,7 @@ import "runtime"
func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
// TODO: if we get the chance, remove the req parameter and
// hardcode TIOCSWINSZ.
- err := ioctlSetWinsize(fd, req, value)
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
runtime.KeepAlive(value)
return err
}
@@ -24,7 +36,30 @@ func IoctlSetWinsize(fd int, req uint, value *Winsize) error {
// The req value will usually be TCSETA or TIOCSETA.
func IoctlSetTermios(fd int, req uint, value *Termios) error {
// TODO: if we get the chance, remove the req parameter.
- err := ioctlSetTermios(fd, req, value)
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(value)))
runtime.KeepAlive(value)
return err
}
+
+// IoctlGetInt performs an ioctl operation which gets an integer value
+// from fd, using the specified request number.
+//
+// A few ioctl requests use the return value as an output parameter;
+// for those, IoctlRetInt should be used instead of this function.
+func IoctlGetInt(fd int, req uint) (int, error) {
+ var value int
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return value, err
+}
+
+func IoctlGetWinsize(fd int, req uint) (*Winsize, error) {
+ var value Winsize
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
+
+func IoctlGetTermios(fd int, req uint) (*Termios, error) {
+ var value Termios
+ err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
+ return &value, err
+}
diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh
index 5a22eca967..890ec464c7 100644
--- a/vendor/golang.org/x/sys/unix/mkall.sh
+++ b/vendor/golang.org/x/sys/unix/mkall.sh
@@ -212,9 +212,11 @@ esac
echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ;
elif [ "$GOOS" == "darwin" ]; then
# pre-1.12, direct syscalls
- echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go";
+ echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos syscall_darwin_${GOARCH}.1_11.go $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go";
# 1.12 and later, syscalls via libSystem
echo "$mksyscall -tags $GOOS,$GOARCH,go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go";
+ # 1.13 and later, syscalls via libSystem (including syscallPtr)
+ echo "$mksyscall -tags $GOOS,$GOARCH,go1.13 syscall_darwin.1_13.go |gofmt >zsyscall_$GOOSARCH.1_13.go";
else
echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go";
fi
diff --git a/vendor/golang.org/x/sys/unix/mkasm_darwin.go b/vendor/golang.org/x/sys/unix/mkasm_darwin.go
deleted file mode 100644
index 4548b993db..0000000000
--- a/vendor/golang.org/x/sys/unix/mkasm_darwin.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build ignore
-
-// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go.
-//This program must be run after mksyscall.go.
-package main
-
-import (
- "bytes"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "strings"
-)
-
-func main() {
- in1, err := ioutil.ReadFile("syscall_darwin.go")
- if err != nil {
- log.Fatalf("can't open syscall_darwin.go: %s", err)
- }
- arch := os.Args[1]
- in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch))
- if err != nil {
- log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err)
- }
- in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch))
- if err != nil {
- log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err)
- }
- in := string(in1) + string(in2) + string(in3)
-
- trampolines := map[string]bool{}
-
- var out bytes.Buffer
-
- fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " "))
- fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n")
- fmt.Fprintf(&out, "\n")
- fmt.Fprintf(&out, "// +build go1.12\n")
- fmt.Fprintf(&out, "\n")
- fmt.Fprintf(&out, "#include \"textflag.h\"\n")
- for _, line := range strings.Split(in, "\n") {
- if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") {
- continue
- }
- fn := line[5 : len(line)-13]
- if !trampolines[fn] {
- trampolines[fn] = true
- fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn)
- fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn)
- }
- }
- err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644)
- if err != nil {
- log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err)
- }
-}
diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh
index 4c91159c12..67b84828ac 100644
--- a/vendor/golang.org/x/sys/unix/mkerrors.sh
+++ b/vendor/golang.org/x/sys/unix/mkerrors.sh
@@ -60,6 +60,7 @@ includes_Darwin='
#include
#include
#include
+#include
#include
#include
#include
@@ -80,6 +81,7 @@ includes_Darwin='
includes_DragonFly='
#include
#include
+#include
#include
#include
#include
@@ -103,6 +105,7 @@ includes_FreeBSD='
#include
#include
#include
+#include
#include
#include
#include
@@ -179,51 +182,57 @@ struct ltchars {
#include
#include
#include
+#include
#include
#include
#include
#include
+#include
+#include
+#include
#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include
+#include
#include
#include
#include
#include
#include
#include
-#include
-#include
-#include
-#include
-#include
+#include
#include
#include
+#include
#include
#include
#include
#include
#include
#include
+#include
#include
+#include
#include
#include
+#include
#include
-#include
#include
#include
-#include
-#include
-#include
#include
-#include
-#include
+#include
#include
-#include
+#include
+#include
+#include
#include
-#include
-#include
-#include
-#include
+
#include
#include
@@ -262,6 +271,11 @@ struct ltchars {
#define FS_KEY_DESC_PREFIX "fscrypt:"
#define FS_KEY_DESC_PREFIX_SIZE 8
#define FS_MAX_KEY_SIZE 64
+
+// The code generator produces -0x1 for (~0), but an unsigned value is necessary
+// for the tipc_subscr timeout __u32 field.
+#undef TIPC_WAIT_FOREVER
+#define TIPC_WAIT_FOREVER 0xffffffff
'
includes_NetBSD='
@@ -271,6 +285,7 @@ includes_NetBSD='
#include
#include
#include
+#include
#include
#include